PHP模拟登录WAP飞信发送短信

时间:2012-05-04 | 分类:学习园地,网络文摘 | 浏览:8267 | 评论:9 | 发表评论

目前网上有很多第三方的飞信接口。缺点是都不太稳定,很多到现在都失效无法使用了,另外我们还会担心信息的外泄。其实我们可以自己动手实现一个这样的一个接口,我这里给出的思路非常简单:通过模拟登录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。
通过查看网页源码可以看出:
共有3个字段:pass(密码)、loginstatus(登录状态)、m(手机号)
提交到的action:http://f.10086.cn/im/login/inputpasssubmit1.action

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

$cookie = dirname(__FILE__).'/cookie.txt'
$post = array(
    'm' => '13800138000',
    '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); // 注意这里!保存Cookie
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
$result = curl_exec($curl);
curl_close($curl);
//是否登录成功,可以判断$result的值。

4、携带Cookie,给自己发送飞信
给自己发飞信比给好友发相对简单一些,有个专门的页面。可以从“登录后的首页 => 资料 => 给自己发短信”进入,地址为:http://f.10086.cn/im/user/sendMsgToMyself.action
用上面同样的方法分析表单:
(1)只有一个字段:msg (短信内容)。
(2)提交到的action:http://f.10086.cn/im/user/sendMsgToMyselfs.action

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

$post = array(
    'msg' => 'Hello Fetion',
);

$curl = curl_init('http://f.10086.cn/im/user/sendMsgToMyselfs.action');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
$result = curl_exec($curl);
curl_close($curl);
//根据返回的$result可以判断出是否发送成功。 

5、给好友发送飞信之前,先获得好友手机号对应的userid
因为给好友发送飞信的表单提交的是userid而不是手机号(这个表单的分析在下一步),所以我们必须想办法找出手机号所对应的userid。
我这里利用的是“搜索好友”的功能,就在飞信登录后的首页,按手机号搜索可以得到一个唯一并准确的结果,然后我们再用正则把结果页中的userid匹配出来。

<anchor>搜友<go method="post" href="/im/index/searchOtherInfoList.action">
<postfield name="searchText" value="$(searchText)"/></go></anchor>

首先分析这个表单:
(1)发送的字段:searchText (只有一个)
(2)提交到的action:http://f.10086.cn/im/index/searchOtherInfoList.action

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

$post = array(
    'searchText' => '13800138000',
);

$curl = curl_init('http://f.10086.cn/im/index/searchOtherInfoList.action');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 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如下:

<anchor>发送短信给TA<go method="post" href="/im/chat/sendShortMsg.action?touserid=XXXXXXXX" accept-charset="utf-8" ><postfield name="backUrl" value=""/><postfield name="touchTitle" value=""/><postfield name="touchTextLength" value=""/><postfield name="msg" value="$(msgXXXXXXXXXXX)"/></go></anchor>

分析这个表单:
(1)提交的字段:backUrl、touchTitle、touchTextLength、msg
(2)提交到的aaction:http://f.10086.cn/im/chat/sendMsg.action?touserid=上面取得的userid
代码如下: 

$post = array(
    'msg' => 'Hello Fetion',
);

$curl = curl_init('http://f.10086.cn/im/chat/sendMsg.action?touserid='.$userid);     // 注意这里!
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);    // 注意这里!
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
$result = curl_exec($curl);
curl_close($curl);
//上面的$post只包含了一个字段,因为试验的时候我发现其他字段不是必须的。
//可以根据返回的$result判断发送成功与否。 

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

<a href="/im/index/logout.action">退出</a>

代码如下: 

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

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

9、附带一个php飞信发送类
PHP飞信发送类下载地址:http://code.google.com/p/php-fetion/downloads/list

10、使用说明
(1)需要包含进你的程序的文件只有一个:PHPFetion.php。如:

require 'PHPFetion.php'; 

(2)调用方法如:

$fetion = new PHPFetion('13800138000', '123456');    //手机号、飞信密码 
$fetion->send('13800138000', 'Hello Fetion!');      // 接收人手机号、飞信内容 

(3)其他:
你的网页需要是utf-8编码的。
send()方法是有返回值的,可以通过分析文本判断是否发送成功。
考虑到wap界面会改动,所以没有在类里写死关于发送成功的判断。

标签: , ,
本文链接: PHP模拟登录WAP飞信发送短信
版权所有: 破博客, 转载请注明本文出处。

9个评论

  1. L
    2014/10/14 09:08:55

    现在不能用了吧- –

  2. Love 梦想
    2012/10/13 15:57:57

    如果用C的方式,使用SOCKET的话~~去操作可以吗? 主要是那个Cookie文件不知道如何操作…不想用CURL

    • 大叔
      2013/05/02 13:14:48

      去看看http协议就知道怎么操作了。
      都是基于SOCKET的

    • admin
      2012/10/16 21:55:55

      要自己构造请求头,下载的PHP飞信发送类就是用SOCKET的

  3. 小辉
    2012/06/30 08:42:42

    太厉害了。。。。

    • admin
      2012/06/30 21:00:00

      大部分网站都可以模拟登陆的

  4. CplusHua
    2012/05/17 12:37:00

    有办法接收短信吗?

    • admin
      2012/05/17 12:56:12

      不退出登陆,收到的短信会显示在网页上,每隔1分钟获取一次网页内容就能得到了

发表评论

您的昵称: *

您的邮箱: * (显示gravatar头像)

联系方式: