第三方飞信设计思路(php实现)
作者:linger
另一篇:《第三方飞信抓包分析和实现》http://blog.csdn.net/linger2012liu/article/details/7799406
貌似在大二的时候就想做一个,当时找到一个叫可可熊的网友用python写的版本,甚是佩服。不过当时发现飞信有个不足之处,为毛不能群发短信,自动添加收信者的姓名呢,如果可以,那么短信就看起来不是群发的了。当时研究了一下,发现PC版本的飞信的通信协议还是挺复杂的,加上自己计算机网络都没学好,去逆向飞信的协议,谈何容易。于是停下来了,没有弄。后来,就是最近,发现有人分析手机版的飞信http://blog.quanhz.com/archives/118。手机版的飞信就简单很多了,就是http协议。不过人家是很久之前分析的,现在已不能使用了。那哥们写的时候,还不用输入验证码,飞信当时也没有防止跨域提交,所以要自己重新分析。现在连域名都变了,http://f.10086.cn/im5/login/login.action这个为登陆页面。
这里是源代码下载地址:http://vdisk.weibo.com/s/9B45G
使用环境需求:浏览器,apache服务器+PHP。由于我用了php的curl库,而curl默认是关闭使用的,所以要启用curl才能运行代码。具体怎么做,可以google之或者baidu之。本来想直接用socket的,但socket太底层,需要自己动手处理cookie,后来发现curl对socket封装了一下,更方便使用。
有兴趣可以到这里体验以下:http://anglea.sinaapp.com/fetion/login.php
读者如果有兴趣可以改写或者重写一个,在我看来,我的这个版本存在以下问题:
1用户体验,可以把界面写好看点,可以添加一次性选一组好友的功能
2响应较久,特别是登陆的时候,网络编程学得不太好,不会处理
3不能多人同时使用,因为飞信登陆后的cookie信息存在apache服务器上的cookie.txt,而我没有为不同的请求重新生成一个保存cookie信息的文件
我实现的群发短息自动带收信人姓名,其实是这样子的,重复发送短信,每个人的发飞信的请求是分开的。
以下是所谓的sequence diagram。不知道画得对不对,不过看了至少知道整个通信的逻辑过程。
以下是文字说明:
Login.php页面html表单提交登陆信息给 index.php
于是页面会跳转到index.php这一页
index.php接受到登陆信息
跟飞信服务端通信
登陆(post)
获取好友信息(get)
把这些好友信息通过html代码分组打印出来
每一组的格式这样子:
组名
好友备注名
好友touserid(这个隐藏)
用户通过checkbox选择要发送信息好友的对象
通过ajax把好友的touserid和备注名,信息内容发给proxy.Php这一页
proxy.Php通过get方法,获取csrfToken码
再通过post方法发短信
我的技术博客:http://linger.devhub.com/blog/925120-php/