项目地址:https://github.com/Makiras/express-subscribe-bot
Key Word: “Telegram”, “kuaidi100”, “bot”
序章
强迫症总是有很奇怪的要求,像我这种经常在淘宝上一买一大把快递的同志就经常受快递状态的折磨。每5分钟看看自己的快递状态怎么样,每10分钟盯着地图看半天,严重的影响了我的日常生活。而我在Gayhub上找的bot也不能用,正好之前我也没写过电报的bot,就自己手撸了一个,解决精神需求。效果图如右下。
正文
Bot的工作原理
Bot的工作原理非常简单,接收信息-处理信息-发送信息。而电报给Bot提供了大量API方便我们接受和发送消息。主要有两种接收信息的方法:poll和WebHook。详细对比见 http://t.cn/A6hjQYr8
- poll,你个人的服务器通过循环来请求电报的服务器,每次请求没处理的消息列表。简单方便/性能差。
- webhook,给你的服务器设一个HTTPS URL,当有新消息传入时向该URL请求一个json,内含信息。如果服务器没给出200答复就重试一定次数。性能高/需要https
- 因为众所周知的原因,国内无法接受和发送消息,也不建议在国内使用手段绕开。
发送消息则是直接向电报服务器的指定URL进行请求(根据HTTP规范建议使用POST)。根据不同的消息类型请求不同的API。但是因为API是公共的,所以需要一个TOKEN来确认消息的来源,token的形式例如 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
,token就相当于你的bot密码,请务必保存好。
我如何处理数据?
这个Bot实现的功能是快递动态变化主动推送。但是因为主动推送需要企业接口,我就只能用轮询来代替主动推
def __init__(self, db_name: str, inc: int):
'''
db instance & time gap(s)
'''
super().__init__()
self.db = SqLiteDb(db_name)
self.inc = inc
self.timer = BackgroundScheduler(timezone='Asia/Shanghai')
self.timer.add_job(self.check_track, 'interval', id="Corntab_Check", \
seconds=self.inc, coalesce=True, misfire_grace_time=self.inc-20)
同时,因为需要记录不同用户的快递(不能让别人查到你的快递),我需要用数据库来储存快递数据。Mysql系列开起来就是500M出去了…我用的AWS t2.nano欲哭无泪(5%性能限制),想着反正数据不多,就拿sqlite3先糊弄着。数据库结构如下,增删改查因为太简单了…直接抄源码即可
Table: user_list, track_list
Co: user_list -> userid, phone
track_list -> userid, track_number, phone, trace_route, ins_time
这些操作都非常普遍,哪怕是设置Webhook URL的时候需要设的和密码一样也只是基本操作XD。从快递100的官网上可以看到他提供的API返回值是JSON,快递进度放在一个json array里面。因为是快递订阅,我每次仅推送新更新的快递消息,所以我需要把进度存起来。
然后就到了我推送新消息的时候,如果有人以为我要str.find()
那就错了,len(array)
它又快又香啊,配合Python的数组切片非常舒适!
if len(old_) == len(new_["data"]):
pass
else:
self.db.update_track(nu, new_["data"])
sendTrackUpdate(userid, (nu, new_["data"][::-1][len(old_):]))
os.system("echo $(date '+%m/%d/%Y %H:%M:%S') '"+ \
json.dumps(new_["data"][::-1][len(old_):]) +"' >> corntab.log")
看上面的代码是不是又发现了os.system()?因为性能限制的关系我并不是很乐意起一个logger来记录日志,考虑到linux的echo它又香又快,我就打算直接使用echo来记录日志。
这里要注意!偷懒也是要有基本法的,这类字符串拼接非常容易造成泄露而引发对系统的攻击,而很多同学因为懒就直接以root权限在跑脚本。如果出现了问题后果不堪设想,所以需要提前做好Unicode编码,注入木大木大木大木大木大木大
我如何获取数据?
获取数据这块我并不打算详细讲因为比较容易引火烧身(谁知道自己会不会因为爬虫进局子)
但是MAC OS的UA是真的香啊
我是使用Request来获取数据的,详情请直接去看并不漂亮的代码吧
在最后欢迎迁移到别的平台上面去(用酷Q之类的机器人搬到国内之类的)
想换家场子用bot的可以直接给[email protected]发邮件或者私信(ultimate 20CNY起,国内ip无法注册)
很棒,但是建议README添加一些必要步骤, 比如setWebhook API,以防有人绕远路(比如我
嘛偷了个懒(我以为没人会看到这篇文章的∠(ᐛ 」∠)_
最近还要改代理IP池(封ip)和UA的问题,等ddl改完了会好好重构一下
RSSbot他不香吗