被黑客分分鐘玩死的微信聊天機器人
雷鋒網按:本文作者傲客,i春秋授權雷鋒網獨家首發。
寫在前面
微信作為時下最in最熱的移動端即時通訊App,把我們的工作和生活緊密聯繫到了一起。一個腦洞大開的程序猿寫了用開源程序改了一個微信聊天機器人,並且在不斷調試中給它賦予了n多好玩的功能譬如防撤回信息之類。然後好死不死他在號稱白帽黑客歡喜地的 “i春秋-信息安全魔法學院”微信羣中做機器人的調試,於是分分鐘被兇殘的壞蛋們玩壞,這個小程序猿也被微信封號處理,結果頑強不息的程序員為了突破微信封鎖又做了很多逗逼嘗試……因為事情過於搞笑,雷鋒網特意向i春秋學院約稿,把故事前因後果梳理出來。截圖比較多,但是高潮迭起,值得看完。
以下是正文:
前段時間用開源程序做了一個微信聊天機器人,放到i春秋魔法學院羣裏做調試。然後被一羣黑客玩壞了。但是整個過程還是比較好玩的,所以記錄下來這個事情的來龍去脈,不過提前聲明,這樣做是不對的,沒有考慮後果就貿然跑代碼測試也是不負責任的,尤其是你不知道黑客們會用什麼方法幫你測試,真的有封號的風險哦,請大家不要學我!(真要測試也要用小號測試�)
最近因為某些原因,想給自己找點事情幹填補空閒時間,前一段時間在Github上看到一個微信機器人的代碼,代碼鏈接:Urinx/WeixinBot,大致功能就是用python實現一個命令行版的微信,內置了兩個聊天機器人的API可以實現自動回覆,但默認不開啟,於是打算試一下。程序跑起來大概就是這個樣子:
微信掃碼登錄後:
去小黃雞和小逗機器人API網站註冊兩個測試key,在代碼中找到自動回覆的變量設置成true就可以實現消息自動回覆,改好代碼運行,在羣裏稍加引導,就被人們玩起來了。
羣里正玩着高興,我開始看代碼,消息監聽部分的代碼大致是這樣的:
分類那麼細緻,還有撤回消息,我果斷動起了做防撤回機器人的念頭,就是在有人撤回消息的時候用這個聊天機器人把撤回的消息原封不動地發回來,這個念頭出來後我就離作死越來越近了。
有了上面代碼的基礎,撤回機器人的實現就不是難事了。最先解決最簡單的文字撤回,在第一個消息分類中加入代碼邏輯,將所有文字消息的文字和發信人緩存到一個字典中,形成這樣一個字典結構:
當有人撤回時,程序執行到撤回分支中,用撤回的人去找剛才字典的key,取出字典中的value發送出去,拼接成如下代碼:
其中celSrc是撤回人,比如大叔撤回了消息,那麼“celSrc”就是大叔,從字典中找到key為“大叔”的對象,對應的value就是“py交易”這樣再把消息發回到消息源中就實現了這樣的效果:“大叔”撤回了消息,撤回的消息是:py交易。其實這種寫法是有bug的,我先不説,可以在下面回覆我,最好帶解決方案哦。
我並沒有特別好的python功底(我是做.NET、前端和node.js的,不過我膽大,啥代碼都敢碰),而且手頭沒有python斷點調試工具,只能通過print打印調試,並且犯二的用了自己的微信號調試,調試過程還算順利,很快就滿足了基本需求:
看着代碼穩定運行了,我就去幹別的了,就在這時候被羣友玩壞了:
類似的超長消息發了十幾條左右被我發現了,馬上關閉了程序,但已經晚了,我被微信關了小黑屋……
我意識到我沒有寫字數限制,導致羣裏發多長的消息再撤回我都原封不動的發出來,構成炸羣行為。記得我被封殺前的最後幾條消息就是説我要寫字數限制,然而微信並沒有給我這個改正的機會。
微信被封是啥滋味的?首先,發消息肯定沒戲。
發個朋友圈通知下大家吧,門都沒有。
我基本與外界隔絕了聯繫,放棄了任何希望,只望老實改過,好好做人,就在這時,傲客(注:i春秋魔法學院微信羣羣主)給我發了個紅包,我發現我竟然可以正常搶紅包。
紅包功能不受限制的話,我是不是可以利用一下?
哈哈哈,機(dou)智(bi)的傲客,我發紅包他也發紅包。發現這個新大陸之後我至少可以用紅包簡單地跟我的微信好友溝通了,可以讓常聯繫的人加我小號,不會以為我消失。我找到了封號後的溝通方式。
曾經在知乎上看到這樣一篇文章,一個俄羅斯程序員,生活在終端裏,只要任何事情花費時間超過了90秒,他一定會寫一個腳本自動化實現。
我的這次作死經歷也可以探索出更多的自動化解決方案,防撤回只是微信機器人的一個有趣的玩法,自動請假完全不在話下,拋開微信,生活中那麼多重複性操作也可以作為探索用代碼去實現。
試想一個iOS開發狗的某一天,清晨,音箱從你最近聽過的播放列表中挑選你最喜歡的歌曲叫你起床,並自動播報當天天氣和空氣質量,提醒你是否需要帶傘帶口罩,麪包機早已烤好麪包。出門後服務器自動向優步發出叫車請求。到公司後自動將未完成的工作發到你的郵箱,並自動從項目管理系統中收集新的bug,從AppStore中抓取低星評價並告知你。你的微信可以自動回覆客服推上來的重複性問題,工作時間長了自動提醒你活動一下,女神來消息自動回覆永不錯過,寫好的PPT、報告、流程圖放到某個文件夾中自動發送郵件給相關人,晚上加班晚了自動發微信告知老婆/父母……這一切都來自你的代碼,想想是不是蠻激動的?(雷鋒網(搜索“雷鋒網”公眾號關注)注:神奇的代碼,跪服)
高中時,晚上做完作業,窩在一間小屋子中,拿着父母換下來的單色屏舊手機,揹着父母偷偷的給心動的女生髮短信,或核對當天的作業,或含蓄的聊天表達心中的波瀾。每條一毛錢,70字以內,安全的送達到對方的手機上,安心、踏實。如今,微信成為了我們最重要的溝通方式。我們多久沒有發過短信,多久沒有登過QQ?我們的手機號碼都已不再重要了,有微信就夠了。微信提供的服務固然便捷,我們的社交圈子大了,微信加的好友越來越多,人與人之間似乎也越來越近,我們好像可以聯通整個世界。但當微信真的無法為我們服務的時候,會發現,有那麼一部分人只能存在你的記憶中了……
編者語
此次“作死”事件的主角圖南是一枚浸淫多年的程序猿,由於興趣,在i春秋進行了網絡安全方面的學習,而這次破壞微信撤回機制的惡作劇也從一個側面反映了微信的安全漏洞,設想如果每個人都把這個防撤回機制編寫入自己的微信,那麼我們平常聊天會因為錯發、誤發泄露多少隱私。嗯,這裏給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春秋點個贊,培養“人”的安全基因,讓開發工程師具備安全意識,這樣,在軟件的開發過程中未雨綢繆,解決隱患於未然,才讓信息時代充滿安全感。
資料來源:雷鋒網
作者/編輯:傲客