雷锋网按:本文作者傲客,i春秋授权雷锋网独家首发。
微信作为时下最in最热的移动端即时通讯App,把我们的工作和生活紧密联系到了一起。一个脑洞大开的程序猿写了用开源程序改了一个微信聊天机器人,并且在不断调试中给它赋予了n多好玩的功能譬如防撤回信息之类。然后好死不死他在号称白帽黑客欢喜地的 “i春秋-信息安全魔法学院”微信群中做机器人的调试,于是分分钟被凶残的坏蛋们玩坏,这个小程序猿也被微信封号处理,结果顽强不息的程序员为了突破微信封锁又做了很多逗逼尝试……因为事情过于搞笑,雷锋网特意向i春秋学院约稿,把故事前因后果梳理出来。截图比较多,但是高潮迭起,值得看完。
前段时间用开源程序做了一个微信聊天机器人,放到i春秋魔法学院群里做调试。然后被一群黑客玩坏了。但是整个过程还是比较好玩的,所以记录下来这个事情的来龙去脉,不过提前声明,这样做是不对的,没有考虑后果就贸然跑代码测试也是不负责任的,尤其是你不知道黑客们会用什么方法帮你测试,真的有封号的风险哦,请大家不要学我!(真要测试也要用小号测试�)
最近因为某些原因,想给自己找点事情干填补空闲时间,前一段时间在Github上看到一个微信机器人的代码,代码链接:Urinx/WeixinBot,大致功能就是用python实现一个命令行版的微信,内置了两个聊天机器人的API可以实现自动回复,但默认不开启,于是打算试一下。程序跑起来大概就是这个样子:
微信扫码登录后:
去小黄鸡和小逗机器人API网站注册两个测试key,在代码中找到自动回复的变量设置成true就可以实现消息自动回复,改好代码运行,在群里稍加引导,就被人们玩起来了。
群里正玩着高兴,我开始看代码,消息监听部分的代码大致是这样的:
分类那么细致,还有撤回消息,我果断动起了做防撤回机器人的念头,就是在有人撤回消息的时候用这个聊天机器人把撤回的消息原封不动地发回来,这个念头出来后我就离作死越来越近了。
有了上面代码的基础,撤回机器人的实现就不是难事了。最先解决最简单的文字撤回,在第一个消息分类中加入代码逻辑,将所有文字消息的文字和发信人缓存到一个字典中,形成这样一个字典结构:
{'某S': '各位表哥,有机会一起睡觉', '某客': '好啊好啊', '大叔': 'py交易'}
当有人撤回时,程序执行到撤回分支中,用撤回的人去找刚才字典的key,取出字典中的value发送出去,拼接成如下代码:
self.webwxsendmsg('\"'+celSrc+'\"撤回了消息,撤回的消息是:'+self.msgdic.get(celSrc), msg['FromUserName'])
其中celSrc是撤回人,比如大叔撤回了消息,那么“celSrc”就是大叔,从字典中找到key为“大叔”的对象,对应的value就是“py交易”这样再把消息发回到消息源中就实现了这样的效果:“大叔”撤回了消息,撤回的消息是:py交易。其实这种写法是有bug的,我先不说,可以在下面回复我,最好带解决方案哦。
我并没有特别好的python功底(我是做.NET、前端和node.js的,不过我胆大,啥代码都敢碰),而且手头没有python断点调试工具,只能通过print打印调试,并且犯二的用了自己的微信号调试,调试过程还算顺利,很快就满足了基本需求:
看着代码稳定运行了,我就去干别的了,就在这时候被群友玩坏了:
类似的超长消息发了十几条左右被我发现了,马上关闭了程序,但已经晚了,我被微信关了小黑屋……
我意识到我没有写字数限制,导致群里发多长的消息再撤回我都原封不动的发出来,构成炸群行为。记得我被封杀前的最后几条消息就是说我要写字数限制,然而微信并没有给我这个改正的机会。
微信被封是啥滋味的?首先,发消息肯定没戏。
发个朋友圈通知下大家吧,门都没有。
我基本与外界隔绝了联系,放弃了任何希望,只望老实改过,好好做人,就在这时,傲客(注:i春秋魔法学院微信群群主)给我发了个红包,我发现我竟然可以正常抢红包。
红包功能不受限制的话,我是不是可以利用一下?
哈哈哈,机(dou)智(bi)的傲客,我发红包他也发红包。发现这个新大陆之后我至少可以用红包简单地跟我的微信好友沟通了,可以让常联系的人加我小号,不会以为我消失。我找到了封号后的沟通方式。
曾经在知乎上看到这样一篇文章,一个俄罗斯程序员,生活在终端里,只要任何事情花费时间超过了90秒,他一定会写一个脚本自动化实现。
比如工作日晚上九点之后这名程序员的运维服务器中还有正在运行的SSH进程,就会给妻子发一个今天加班的短信,并从文本库中随机选取一句加班理由。早上8点45分服务器中依然没有活动的SSH进程会自动向BOSS发一封“今天我身体不适的”的邮件,并随机附上一段请假理由。
还有一个老子要喝咖啡的脚本,这个脚本在执行之后,会先精确等候17秒,然后打开一个SSH进程,远程连接到公司的咖啡机,然后传送一堆代码过去,咖啡机就会煮一份中杯半咖啡因的拿铁咖啡,然后精确等待24秒后,再倒进咖啡杯里。这个脚本运行的全程,正好是这名程序员从自己的办公桌前起身,走到咖啡机前所需要花费的时间。(此项目开源在github中:hacker-scripts)
我的这次作死经历也可以探索出更多的自动化解决方案,防撤回只是微信机器人的一个有趣的玩法,自动请假完全不在话下,抛开微信,生活中那么多重复性操作也可以作为探索用代码去实现。
试想一个iOS开发狗的某一天,清晨,音箱从你最近听过的播放列表中挑选你最喜欢的歌曲叫你起床,并自动播报当天天气和空气质量,提醒你是否需要带伞带口罩,面包机早已烤好面包。出门后服务器自动向优步发出叫车请求。到公司后自动将未完成的工作发到你的邮箱,并自动从项目管理系统中收集新的bug,从AppStore中抓取低星评价并告知你。你的微信可以自动回复客服推上来的重复性问题,工作时间长了自动提醒你活动一下,女神来消息自动回复永不错过,写好的PPT、报告、流程图放到某个文件夹中自动发送邮件给相关人,晚上加班晚了自动发微信告知老婆/父母……这一切都来自你的代码,想想是不是蛮激动的?(雷锋网注:神奇的代码,跪服)
高中时,晚上做完作业,窝在一间小屋子中,拿着父母换下来的单色屏旧手机,背着父母偷偷的给心动的女生发短信,或核对当天的作业,或含蓄的聊天表达心中的波澜。每条一毛钱,70字以内,安全的送达到对方的手机上,安心、踏实。如今,微信成为了我们最重要的沟通方式。我们多久没有发过短信,多久没有登过QQ?我们的手机号码都已不再重要了,有微信就够了。微信提供的服务固然便捷,我们的社交圈子大了,微信加的好友越来越多,人与人之间似乎也越来越近,我们好像可以联通整个世界。但当微信真的无法为我们服务的时候,会发现,有那么一部分人只能存在你的记忆中了……
编者语
此次“作死”事件的主角图南是一枚浸淫多年的程序猿,由于兴趣,在i春秋进行了网络安全方面的学习,而这次破坏微信撤回机制的恶作剧也从一个侧面反映了微信的安全漏洞,设想如果每个人都把这个防撤回机制编写入自己的微信,那么我们平常聊天会因为错发、误发泄露多少隐私。嗯,这里给i春秋点个赞,培养“人”的安全基因,让开发工程师具备安全意识,这样,在软件的开发过程中未雨绸缪,解决隐患于未然,才让信息时代充满安全感。