目前网上有很多第三方的飞信接口。缺点是都不太稳定,很多到现在都失效无法使用了,另外我们还会担心信息的外泄。其实我们可以自己动手实现一个这样的一个接口,我这里给出的思路非常简单:通过模拟登录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可以看出:

共有3个字段:pass(密码)、loginstatus(登录状态)、m(手机号)
提交到的action:http://f.10086.cn/im/login/inputpasssubmit1.action

其实获取表单提交的字段,这里有一种取巧的办法:修改action,让它指向自己的程序,如下图:

我把action改为了本地的一个php程序,这个程序只是简单的一句print_r($_POST),得到的结果为:

这些内容就是表单要提交的数据。

3. 用CURL实现模拟登录操作

从上面的分析看,登录时提交的内容还是比较简单的,没有验证码,也没有防跨域提交的hash值的校验。然后我们用CURL模拟提交这个登录表单。其实就是发送了一个POST方式的HTTP请求,CURL可以把返回的Cookie保存成一个文件。之后的发送飞信等操作将会用到这个Cookie文件。

代码如下:

01 $cookie = dirname(__FILE__).'/cookie.txt';
02 $post array(
03     'm' => '13700001234',
04     'pass' => '123456',
05     'loginstatus' => 1,
06 );
07  
08 $curl = curl_init('http://f.10086.cn/im/login/inputpasssubmit1.action');
09 curl_setopt($curl, CURLOPT_HEADER, 0);
10 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
11 curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); // 注意这里!保存Cookie
12 curl_setopt($curl, CURLOPT_POST, 1);
13 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
14 $result = curl_exec($curl);
15 curl_close($curl);

是否登录成功,可以判断$result的值。

4. 携带Cookie,给自己发送飞信

给自己发飞信比给好友发相对简单一些,有个专门的页面。可以从“登录后的首页 => 资料 => 给自己发短信”进入,地址为:
http://f.10086.cn/im/user/sendMsgToMyself.action。

用上面同样的方法分析表单:

只有一个字段:msg (短信内容)
提交到的action:http://f.10086.cn/im/user/sendMsgToMyselfs.action

利用CURL向这个URL发送POST方式的请求,并加上上面保存到的Cookie,下面是代码:

01 $post array(
02     'msg' => 'Hello Fetion',
03 );
04  
05 $curl = curl_init('http://f.10086.cn/im/user/sendMsgToMyselfs.action');
06 curl_setopt($curl, CURLOPT_HEADER, 0);
07 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
08 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
09 curl_setopt($curl, CURLOPT_POST, 1);
10 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
11 $result = curl_exec($curl);
12 curl_close($curl);

根据返回的$result可以判断出是否发送成功。

5. 给好友发送飞信之前,先获得好友手机号对应的userid

因为给好友发送飞信的表单提交的是userid而不是手机号(这个表单的分析在下一步),所以我们必须想办法找出手机号所对应的userid。我这里利用的是“搜索好友”的功能,就在飞信登录后的首页,如下图:

按手机号搜索可以得到一个唯一并准确的结果,然后我们再用正则把结果页中的userid匹配出来。

首先分析这个表单:

发送的字段:searchText (只有一个)
提交到的action:http://f.10086.cn/im/index/searchOtherInfoList.action

用CURL模拟发送请求,代码如下:

01 $post array(
02     'searchText' => '18700008888',
03 );
04  
05 $curl = curl_init('http://f.10086.cn/im/index/searchOtherInfoList.action');
06 curl_setopt($curl, CURLOPT_HEADER, 0);
07 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
08 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
09 curl_setopt($curl, CURLOPT_POST, 1);
10 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
11 $result = curl_exec($curl);
12 curl_close($curl);

用正则获得结果中的userid:

1 preg_match('/toinputMsg\.action\?touserid=(\d+)/si'$result$matches);
2 $userid = isset($matches[1]) ? $matches[1] : '';

这块可以做一个当找不到userid时的提示。

6. 给好友发送飞信

给好友发飞信的界面,可以随便点一个好友进入。表单HTML如下图:

分析这个表单:

提交的字段:backUrl、touchTitle、touchTextLength、msg
action:http://f.10086.cn/im/chat/sendMsg.action?touserid=上面取得的userid

代码如下:

01 $post array(
02     'msg' => 'Hello Fetion',
03 );
04  
05 $curl = curl_init('http://f.10086.cn/im/chat/sendMsg.action?touserid='.$userid);     // 注意这里!
06 curl_setopt($curl, CURLOPT_HEADER, 0);
07 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
08 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
09 curl_setopt($curl, CURLOPT_POST, 1);
10 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
11 $result = curl_exec($curl);
12 curl_close($curl);

上面的$post只包含了一个字段,因为试验的时候我发现其他字段不是必须的。可以根据返回的$result判断发送成功与否。

7. 退出飞信

如果不退出的话,则登录后的短时间内如果正好有人给你发飞信,就只能在WAP飞信上查看了,而不能自动发到你的手机上。退出的操作比较简单,只是发送了一个GET方式的请求。“退出”的链接可以在登录后首页的右下角看到,如图:

代码如下:

1 $curl = curl_init('http://f.10086.cn/im/index/logoutsubmit.action');
2 curl_setopt($curl, CURLOPT_HEADER, 0);
3 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
4 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
5 $result = curl_exec($curl);
6 curl_close($curl);

8. 总结

通过对以上代码的整理,可以做出一个飞信发送类。也可以做成一个飞信发送的服务,如简单易用的HTTP方式的接口。飞信最大的好处就在于免费,并能实时将信息发送到手机上,可以做一些类似定时短信或监测提醒的功能。

我这里封装成了一个PHP飞信类,可以从Google Code上下载:http://code.google.com/p/php-fetion/downloads/list。注意请勿滥用,以避免封号之类的麻烦。

from:  http://blog.quanhz.com/archives/118

php飞信下载地址:http://www.oschina.net/code/snippet_114572_12155

用PHP模拟登录WAP飞信实现飞信发送相关推荐

  1. php提交飞信,用PHP模拟登录WAP飞信实现飞信发送

    [php]代码库$post = array( 'msg' => 'Hello Fetion', ); $curl = curl_init('http://f.10086.cn/im/user/s ...

  2. python模拟登录网易163邮箱并发送SOS邮件

    基本环境配置 1. Selenium - 建议使用低版本的Python-Selenium库,因为高版本在Chrome中不支持. pip3 install selenium==2.48.0 2. chr ...

  3. C#实现飞信短信发送

    第一篇博客,无聊地尝试了一下利用C#来发送飞信. 2012.09.29  现在这种方式由于加了验证码,所以要想方法绕过...所以,蛋疼.. 实现的原理 参考了一篇博客:用PHP模拟登录WAP飞信实现飞 ...

  4. 使用ImitateLogin模拟登录百度

    在之前的文章中,我已经介绍过一个社交网站模拟登录的类库:imitate-login ,这是一个通过c#的HttpWebRequest来模拟网站登录的库,之前实现了微博网页版和微博Wap版:现在,模拟百 ...

  5. js 分析——百度模拟登录(二)

    上一篇百度模拟登录(一)主要讲解了 token.gid.rsakey 以及 password 等参数的产生.好了,废话不多说,咱们进入今天的主题,主要分析 ppui_logintime.ds.tk.d ...

  6. Python:模拟登录、点击和执行 JavaScript 语句案例

    案例一:网站模拟登录 # douban.pyfrom selenium import webdriver from selenium.webdriver.common.keys import Keys ...

  7. Python培训分享:python如何用cookie实现自动模拟登录?

    本期教程Python培训教程为大家带来的是python如何用cookie实现自动模拟登录?据小编的了解,python实现cookie自动登录,目前来说有许多第三方库都可以直接使用,这里以常用的requ ...

  8. 手把手教你用Python模拟登录淘宝

    作者 | 猪哥66 来源 | 裸睡的猪(ID:IT--Pig) 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! 看了下网上有很多关于模拟 ...

  9. python 提交表单登录不成功_Python http requests模拟登录与提交表单的实现问题

    以前写小应用只写过简单的http请求,最近有一些需要复杂的实现,遇到一些问题,还希望得到大家指点. 我的疑问点在于如何实现模拟登录,cookie应该可以实现,但是每台pc的cookie不同,我想有一个 ...

最新文章

  1. 编程实现路由算法 实验报告_lt;中国通信专刊gt; EARS:用于软件定义网络中自动路由的智能驱动体验网络架构...
  2. 67道 Python自动化面试题
  3. Eclipse——e(fx)clipse下载错误导致的安装失败解决方案
  4. [hihoCoder]无间道之并查集
  5. 【转】HashSet的用法
  6. MySQL 5.7.18的安装与主从复制
  7. 用c语言对文件读取,并使用链表,和顺序表进行存储,操作
  8. 基于Hadoop集群的Spark集群搭建
  9. 能够兼容ViewPager的ScrollView
  10. ioca0中断 pic单片机_关于PIC单片机的一些经验总结
  11. Windows安装Redis新手教程
  12. sql注入漏洞--sqlmap使用
  13. cad化工设备绘图_化工CAD制图基础篇,管道布置图学起来
  14. UTF-8编码的原理
  15. 最主流的五个大数据处理框架的优势对比
  16. java实现文件管理
  17. 线程、进程(2)----- 从计算机物理层面分析
  18. 计算机基础三: 二进制减法实现
  19. 写文本到txt文件的Sub过程
  20. dell主板40针开机针脚_戴尔 OptiPlex 390 790 990主板34针前置 面板针脚 接口定义

热门文章

  1. gitlab 修改项目备注
  2. 羽毛球是世界上飞行最快的球
  3. 如何利用手机蓝牙与第三方进行数据交互?
  4. 车仪表台上的装饰_你们仪表台习惯放一些有什么装饰?中控台上呢?
  5. 挨踢项目求生法则(4)——设计篇
  6. 寻路算法--深度寻路算法
  7. DevOps工具链学习——什么是DevOps
  8. C++性能优化(四)——C++常用数据结构性能分析
  9. RHCE(一)--- at、crontab、网卡绑定
  10. 皮卡丘Unsafe Filedownload