Abstract
My first submission to “Matrix”, a private product sharing platform built by SSPai (in zh-CN). This article introduces some of my recent bots or project related to Telegram, including the following stuff:
- EH Forwarder Bot: an extensible tunnel bot framework.
- Big Text Bot: A pure text sticker Telegram inline bot. Source.
- BankComm Rate Monitor: Log, monitor, and alert for exchange rate from Bank of Communication. Source.
-
Telegram Sticker Removal bot (tg-cli interface): Remove stickers from group chat with 60s TTL.
tg-cli
and normal user account required. - FanfouBot (电磁炉): A Fanfou tweet bot on Telegram (@FanfouBot)
我的 Telegram 小工具集:「统一聊天平台,各种工具,和监控提醒」
本文参与少数派 2016 年度征文,并同步发布于少数派 Matrix。
第一次来 Matrix,首先自我介绍一下吧。Eana Hufwe,留学狗,所谓独立程序员,1A23 工作室室长兼全体成员,Telegram 重度用户,平时喜欢自己搞一些有的没的各种小玩具。差不多是三年前,有同学推荐用 Telegram 之后就变得无法自拔。作为一个即时消息平台,Telegram 可能不是最安全的(肯定不是,因为还有 Signal 等一票所有会话端对端加密的其他平台),但它绝对是我目前用过的所有 IM 里面用户体验做的最好的一个。当然至于 Telegram 如何好用,目前互联网上有很多在介绍 Telegram 各种特性的文章,我就不在此赘述了。
「统一聊天平台」
在某一个软件里面统一所有聊天平台和社交网络一直是我的一个愿望。大概是十几年前,看到 Jabber 能用 XMPP 连接 QQ、Skype 和 Google Talk,感觉很有意思。虽然各种功能兼容的不是很完善,但是还是很有意思。到后来各大平台都在用自己的协议,甚至是封闭协议开发各种平台,类似的项目也慢慢地销声匿迹了。
其实若不是家里的人各种「要求」的话,我手机上的 IM 估计只会有 Telegram。不过依旧是「实在看不下去微信」(参阅这篇博文),于是乎在做完各种调研之后我启动了 EH Forwarder Bot 项目。
EH Forwarder Bot(以下简称 EFB)是一个开源、可扩展的聊天平台隧道 Bot 框架,基于 Python 3,旨在让用户从一个平台上收发其他平台的消息,最终达到远程遥控其他平台账号的效果。
最开始启动这个项目的时候也没多想,之前开的各种 Bot 都是 EH + 用途 + bot 这样的名字(Telegram 要求所有 Bot 的用户名以 bot
结尾),所以这个也就用的这样的名字。最初开发这个的时候,因为本来也有考虑兼容各种平台(当时的野心是兼容所有在用的 IM:微信、WhatsApp、Facebook Messenger)。不过若是我一个人做的话,兼容起所有平台估计要几年(毕竟还是要上学的)。所以就认认真真写了文档,期待着有谁能一起来开发插件。
目前 EFB 能够较为稳定的收发微信消息。支持微信网页版的大部分功能,并且能够利用 Telegram Bot 的各种高级功能来进行各种管理操作。当然,网页版微信办不到的,EFB 微信从端亦办不到。现在的 EFB 基本上能够实现大部分基于微信的通讯需求,且在圈子里面小有好评。关于如何安装使用,以及如何扩展 EFB 以支持其他的平台,请参见文档说明。如果再有时间的话,估计我会从 Facebook Messenger 和 WhatsApp 里面选一个,向英语圈推广一下。
「监控与提醒」
虽然对于提醒这一任务来说,市面上还有许多其他类似的服务,比如说 PushBullet 之类的,也提供了开放的接口来对接其他的服务,也不乏像 IFTTT 这样的用户友好型的联动服务。不过对于我来说 Telegram 作为我的常用客户端,提醒的比较及时,而且相比于其他的方式定制性更强。再加上我要监控的东西都是比较冷门的,也不会在 IFTTT 上面找到合适的 Recipe。(有人可能会说 IFTTT 和 Zapier 有 HTTP API 可以用啊,Telegram 的 Bot API 也是 HTTP 的,何必让中间服务捯一遍手呢。)
目前写了两个小脚本:首先一个是监控交行的外汇牌价的。前一阵子要换外汇交学费,就想着写一个爬虫爬这个牌价。虽然网上的各种汇率监控应该说是不胜枚举,不过毕竟自己写出来的还是比较方便定制和修改,而且「所见即所得」——看到的数字就是即时的交易数额。顺便还能把以往的数据记录下来画出曲线图。(没学过金融,不太懂这方面,不过感觉虽然整体趋势应该是统一的,单各个银行的浮动应该有所区别吧。)目前设定的的提醒频率是这样的
- 需要密切关注的时候:每小时每越过 0.01 单位线时提醒一次
- 无需密切关注的时候:每小时每越过 0.10 单位线时提醒一次
当然,爬虫自然是每五分钟从交行更新一下数据。(因为交行的数据每五分钟更新一次。)幸运的是,交行的外汇牌价页面可以直接访问(普通 GET 请求),而且看起来没有设什么限制。
然后顺便为了画曲线图方便,顺便写了一个简单的页面来显示实时数据以及自动刷新。
另外一个脚本的通用性实在是有些小:在我们学校监控抢课的脚本。(我们学校的课程注册是不限名额的,只有好的上课时间需要抢)其实本来一开始是可以手工抢到理想的时间的,不过其中的经纬就不详述了,简单来说就是有一门课临时改时间,然后撞车了。目前留给我的方法是:
- 盯着抢课页面,什么时候有人放出来了那个时间就注册上。
- 到月底放出最后四个名额的时候去抢
- 实在抢不到就只能上那个(几乎到了晚上的)课时了。
可惜的是,刚好放名额的那天我在飞机上。虽然不是说完全赶不上,但也是ギリギリ(girigiri,在时间、数量、场景或阶段变换的最后分界的那个点上)。所以我就需要实时监视着抢课页面以防万一。不过和交行的牌价页面不同的是,学校的信息管理页面实用的是 ASP.net 构建的服务与界面,还有各种晦 (e) 涩 (xin) 的表单元素操作和 __VIEWSTATE
。囿于时间上的限制,我没有一步步的解析整个参数传递的过程,而是直接用上了模拟浏览器操作(Selenium + PhantomJS)。虽然这种方式会导致运行效率低下,不过对于复杂的请求来说很好写。从刚开始看 Selenium 的文档开始,到做成一个能用的东西,总共用了大概 30 分钟。至于循环运行的话,和刚才的交行的爬虫一样,就直接交给系统的 Cron Job 了,每五分钟运行一次。
除了这两个小脚本以外,另外我还开了一个降价提醒:Skins A400。前一阵子准备买一套压缩服,看了看「S某ZDM」上面的各种文章推荐,也对 Skins A400 心里长草,不过还是太贵。于是就在「S某ZDM」和「某zBargain」(当地的打折信息网站)开了两个监控。借用这两个网站的 RSS 消息源,然后使用了 FeedRinse 的 RSS/Atom 订阅重组过滤服务,设定好关键词(比如说「SKINS && A400 && 男」)这样,然后 FeedRinse 就可以生成一个新的订阅地址,把符合筛选条件的条目列出来。对于这种偶尔才会出一条,而且需要关注的条目,我直接是在 Telegram 上面订阅的。Telegram 上面也有不少的 RSS Bot,目前我在用的是 iovxw 开发的 RSSBot (@TheBlackRSSbot)。用起来也不错。
顺便也来推荐一个可以追踪快递状态的 RSS 源:https://ifttt.imlonghao.com/
。用法是 https://ifttt.imlonghao.com/快递号?totitle=1&title=订阅名称
。 如果不需要把快递状态写进标题的话可以去掉 totitle=1&
的部分。记得在快件签收之后退订以节省服务器资源。利用的是快递 100 的接口,所以大部分的常见国内快递都能支持。
「各种小工具」
Telegram 作为一个易用、开放的即时消息平台,其一大优势就是上面的各种 Bot,在不影响正常的聊天体验的基础上,可以很好的提升消息体验,还有一些其他的小工具。在这边介绍几个我常用的:
- 搜索类
- 聊天辅助类
- @TextEmojiBot:输入各种文字表情(顔文字)时可用。
- @big_text_bot:生成大字贴纸用 Bot。(自作)
- @like/@vote/@groupagreebot:各种用于征集意见用的 Bot,包括投票,收集信息,甚至单纯的点赞。
- 客户端类
- @GmailBot:Gmail 迷你客户端,基于 Google Oauth 授权,Telegram 官方推荐,安全性未知。
- @GithubBot:GitHub Commit 和 Issue 更新提醒,基于 GitHub Oauth 授权。
- @FanfouBot:电磁炉,一个饭否发饭用 Bot。(自作)
- @TheBlackRSSbot:RSS 订阅。
- 工具类
- @Weatherman_bot:天气预报,信息来源未知。
- @AirPollution_bot:空气污染指数,数据来源为 aqicn.org。
- @WolframBot:WolframAlpha 的非官方 Bot。
此外之前我还写了一个用来主动删除群组里面贴纸的小脚本,基于 tg-cli
和 Telegram 一般用户账号,需要赋予该账号群管理员权限。主要是用在 EFB 的支持群里面。贴纸太多看起来总像闲聊群。
嗯,这篇文章大概就是这样了。希望我 2017 年能给 EFB 再写出一个模块。加油!
发表回复