枫声 Yongfeng's Blog

微信联系人检测工具开发手记

January 13, 2016

开发记录

一大早来到公司廖大师就把我拉到他的电脑前,给我看了一个 Git 上的开源项目:wechat-deleted-friends。是用 Python 写的,调用了微信网页版的接口。真的是天才,一个非常棒的想法。短短一天,在 Github 上就已经接近两千个星了。

廖大师已经开始在他的 Mac 上着手写 Chrome 插件版,旁边还放了一台 PC,正紧锣密鼓的在装 VS,一脸坏笑。我之前虽然没有接触过 C#,但是知道跟 Java 很像,上手不会太慢。并且这么好的项目,当然要拿来试一试。

开始看源代码。非常简单清晰,几个微信网页接口的调用而已。快速上手 C#,拿过廖大师的 PC,几个晚上之后搞出了原型,并且在原版的基础上,还增加了检测拉黑的功能(接口信息从廖大师处获取)。

然后就是测试了。我们自己的微信号的接口由于调用太频繁已经被封,不过没有关系,淘宝上几毛钱一个的微信号让我们的开发得以持续。最后终于做出了产品。

原理

原理非常简单,源代码大概也就五六百行。主要就是调用网页版的建群、加人,和删除这几个 API。把你删除或者屏蔽掉的好友仍然会在联系人列表中,但是无法将他们加入到群聊中来。发送加群请求之后,服务器会返回一个状态参数,0 代表成功,4 代表被邀请的人已经将发送请求者删除,3 则是屏蔽。

挑战

测试到后期的时候,微信对网页版接口的调用频率限制已经明显加强了,通常一遍联系人列表都跑不完就会被封。后面我们即使将接口调用的时间间隔设置到了一分钟,但是仍然没有用。廖大师用了一个本地缓存,来记忆每次被封的时候所查询到的位置,这样下次解封之后再查询时,就不用从头再来。但是如果调用太频繁,一个号通常一整天都没办法再使用网页版接口了,这个办法并不能解决根本问题。开发做到这里已经面临了瓶颈。

可能的解决办法

  1. 使用其它接口。我们通过测试发现,只有网页版接口会被封,PC、MAC 和手机端的客户端都没有限制。在 PC 端尝试抓包,分析微信的通信协议。大部分请求走 TCP 8080 端口。具体协议细节非常复杂,应该有微信自己定义的协议,wireshark 不能正确解析。这条路难度很大,太 hack 了,如果破解的话微信也就不再安全了

  2. 反编译 WindowsPhone 版微信,分析出 API。如果是 C# 的话,反编译是很有可能的,这样就能获取其移动端的接口信息了。

  3. 做一个安卓机器人。思路来源于安卓上的微信自动抢红包软件。模拟人工的操作,去建群和加人。逻辑应该会比较复杂,但时间足够的话是可行的。缺点是只能用于安卓。

以上即是我们能想到的避开网页接口的办法,欢迎大家一起探讨,集思广路。最后,Windows 版本下载地址:

https://github.com/freedombird9/wechat-deletion-check/releases

comments powered by Disqus