用PHP模拟登录WAP飞信实现飞信发送
目前网上有很多第三方的飞信接口。缺点是都不太稳定,很多到现在都失效无法使用了,另外我们还会担心信息的外泄。其实我们可以自己动手实现一个这样的一个接口,我这里给出的思路非常简单:通过模拟登录WAP版飞信,来实现发飞信等操作。选择WAP飞信主要是因为其界面比较简单,容易分析,并且没有验证码。 1. 安装Firefox插件wmlbrowser 这样我们就能直接用Firefox浏览WAP网页了,并且还可以利用Firebug对界面进行分析。下载地址:https://addons.mozilla.org/zh-CN/firefox/search/?q=wmlbrowser&cat=all&x=17&y=11 2. 登录页面的分析 WAP飞信入口为http://f.10086.cn/,点击“畅聊WAP飞信”进入登录页面(http://f.10086.cn/im/login/login.action)。通过Firebug可以看出:
其实获取表单提交的字段,这里有一种取巧的办法:修改action,让它指向自己的程序,如下图: 我把action改为了本地的一个php程序,这个程序只是简单的一句print_r($_POST),得到的结果为: 这些内容就是表单要提交的数据。 3. 用CURL实现模拟登录操作 从上面的分析看,登录时提交的内容还是比较简单的,没有验证码,也没有防跨域提交的hash值的校验。然后我们用CURL模拟提交这个登录表单。其实就是发送了一个POST方式的HTTP请求,CURL可以把返回的Cookie保存成一个文件。之后的发送飞信等操作将会用到这个Cookie文件。 代码如下: $cookie = dirname(__FILE__).'/cookie.txt';$post = array( 'm' => '13700001234','pass' => '123456','loginstatus' => 1,);$curl = curl_init('http://f.10086.cn/im/login/inputpasssubmit1.action');curl_setopt($curl,CURLOPT_HEADER,0);curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);curl_setopt($curl,CURLOPT_COOKIEJAR,$cookie); // 注意这里!保存Cookiecurl_setopt($curl,CURLOPT_POST,CURLOPT_POSTFIELDS,http_build_query($post));$result = curl_exec($curl);curl_close($curl); 是否登录成功,可以判断$result的值。 4. 携带Cookie,给自己发送飞信 给自己发飞信比给好友发相对简单一些,有个专门的页面。可以从“登录后的首页 => 资料 => 给自己发短信”进入,地址为: 用上面同样的方法分析表单:
利用CURL向这个URL发送POST方式的请求,并加上上面保存到的Cookie,下面是代码: $post = array( 'msg' => 'Hello Fetion',);$curl = curl_init('http://f.10086.cn/im/user/sendMsgToMyselfs.action');curl_setopt($curl,CURLOPT_COOKIEFILE,$cookie); // 注意这里!curl_setopt($curl,http_build_query($post));$result = curl_exec($curl);curl_close($curl); 根据返回的$result可以判断出是否发送成功。 5. 给好友发送飞信之前,先获得好友手机号对应的userid 因为给好友发送飞信的表单提交的是userid而不是手机号(这个表单的分析在下一步),所以我们必须想办法找出手机号所对应的userid。我这里利用的是“搜索好友”的功能,就在飞信登录后的首页,如下图: 按手机号搜索可以得到一个唯一并准确的结果,然后我们再用正则把结果页中的userid匹配出来。 首先分析这个表单:
用CURL模拟发送请求,代码如下: $post = array( 'searchText' => '18700008888',);$curl = curl_init('http://f.10086.cn/im/index/searchOtherInfoList.action');curl_setopt($curl,http_build_query($post));$result = curl_exec($curl);curl_close($curl); 用正则获得结果中的userid: preg_match('/toinputMsg.action?touserid=(d+)/si',$result,$matches);$userid = isset($matches[1]) ? $matches[1] : ''; 这块可以做一个当找不到userid时的提示。 6. 给好友发送飞信 给好友发飞信的界面,可以随便点一个好友进入。表单HTML如下图: 分析这个表单:
代码如下: $post = array( 'msg' => 'Hello Fetion',);$curl = curl_init('http://f.10086.cn/im/chat/sendMsg.action?touserid='.$userid); // 注意这里!curl_setopt($curl,http_build_query($post));$result = curl_exec($curl);curl_close($curl); 上面的$post只包含了一个字段,因为试验的时候我发现其他字段不是必须的。可以根据返回的$result判断发送成功与否。 7. 退出飞信 如果不退出的话,则登录后的短时间内如果正好有人给你发飞信,就只能在WAP飞信上查看了,而不能自动发到你的手机上。退出的操作比较简单,只是发送了一个GET方式的请求。“退出”的链接可以在登录后首页的右下角看到,如图: 代码如下: $curl = curl_init('http://f.10086.cn/im/index/logoutsubmit.action');curl_setopt($curl,$cookie); // 注意这里!$result = curl_exec($curl);curl_close($curl); 8. 总结 通过对以上代码的整理,可以做出一个飞信发送类。也可以做成一个飞信发送的服务,如简单易用的HTTP方式的接口。飞信最大的好处就在于免费,并能实时将信息发送到手机上,可以做一些类似定时短信或监测提醒的功能。 我这里封装成了一个PHP飞信类。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |