简爱博客
PHP飞信发送类 -- 来自 blog.quanhz.com
2013-4-6 简爱



(一)使用说明



1. 需要包含进你的程序的文件只有一个:PHPFetion.php。如:

    require 'PHPFetion.php';



2. 调用方法如:

    $fetion = new PHPFetion('13500001111', '123123');    // 手机号、飞信密码

    $fetion->send('13500001111', 'Hello!');    // 接收人手机号、飞信内容



3. 注意事项

    (1) 保证你的程序是utf-8编码(或更改飞信类文件编码,但飞信内容必须为utf-8编码);

    (2) send()方法是有返回值的,可以通过分析文本判断是否发送成功。考虑到wap界面会改动,所以没有在类里写死关于发送成功的判断;





(二)实现原理



1. 利用socket模拟登录wap版飞信,并模拟发送飞信,好处是不会有验证码,也比较稳定。





(三)其他



1. wap飞信登录地址:http://f.10086.cn

2. 作者博客:http://blog.quanhz.com



代码如下:


<?php
/**
* PHP飞信发送类
*
* @author quanhengzhuang <blog.quanhz.com>
* @version 1.5.0
*/
class PHPFetion
{
/**
* 发送者手机号
* @var string
*/
protected $_mobile;
/**
* 飞信密码
* @var string
*/
protected $_password;
/**
* Cookie字符串
* @var string
*/
protected $_cookie = '';
/**
* Uid缓存
* @var array
*/
protected $_uids = array();
/**
* csrfToken
* @var string
*/
protected $_csrfToten = null;
/**
* 构造函数
* @param string $mobile 手机号(登录者)
* @param string $password 飞信密码
*/
public function __construct($mobile, $password)
{
if ($mobile === '' || $password === '')
{
return;
}

$this->_mobile = $mobile;
$this->_password = $password;

$this->_login();
}
/**
* 析构函数
*/
public function __destruct()
{
$this->_logout();
}
/**
* 登录
* @return string
*/
protected function _login()
{
$uri = '/huc/user/space/login.do?m=submit&fr=space';
$data = 'mobilenum='.$this->_mobile.'&password='.urlencode($this->_password);

$result = $this->_postWithCookie($uri, $data);
//解析Cookie
preg_match_all('/.*?\r\nSet-Cookie: (.*?);.*?/si', $result, $matches);
if (isset($matches[1]))
{
$this->_cookie = implode('; ', $matches[1]);
}

$result = $this->_postWithCookie('/im/login/cklogin.action', '');
return $result;
}
/**
* 向指定的手机号发送飞信
* @param string $mobile 手机号(接收者)
* @param string $message 短信内容
* @return string
*/
public function send($mobile, $message)
{
if ($message === '')
{
return '';
}
//判断是给自己发还是给好友发
if ($mobile == $this->_mobile)
{
return $this->_toMyself($message);
}
else
{
$uid = $this->_getUid($mobile);
return $uid === '' ? '' : $this->_toUid($uid, $message);
}
}
/**
* 获取飞信ID
* @param string $mobile 手机号
* @return string
*/
protected function _getUid($mobile)
{
if (empty($this->_uids[$mobile]))
{
$uri = '/im/index/searchOtherInfoList.action';
$data = 'searchText='.$mobile;

$result = $this->_postWithCookie($uri, $data);

//匹配
preg_match('/toinputMsg\.action\?touserid=(\d+)/si', $result, $matches);
$this->_uids[$mobile] = isset($matches[1]) ? $matches[1] : '';
}

return $this->_uids[$mobile];
}
/**
* 获取csrfToken,给好友发飞信时需要这个字段
* @param string $uid 飞信ID
* @return string
*/
protected function _getCsrfToken($uid)
{
if ($this->_csrfToten === null)
{
$uri = '/im/chat/toinputMsg.action?touserid='.$uid;

$result = $this->_postWithCookie($uri, '');

preg_match('/name="csrfToken".*?value="(.*?)"/', $result, $matches);
$this->_csrfToten = isset($matches[1]) ? $matches[1] : '';
}
return $this->_csrfToten;
}
/**
* 向好友发送飞信
* @param string $uid 飞信ID
* @param string $message 短信内容
* @return string
*/
protected function _toUid($uid, $message)
{
$uri = '/im/chat/sendMsg.action?touserid='.$uid;
$csrfToken = $this->_getCsrfToken($uid);
$data = 'msg='.urlencode($message).'&csrfToken='.$csrfToken;

$result = $this->_postWithCookie($uri, $data);

return $result;
}
/**
* 给自己发飞信
* @param string $message
* @return string
*/
protected function _toMyself($message)
{
$uri = '/im/user/sendMsgToMyselfs.action';
$result = $this->_postWithCookie($uri, 'msg='.urlencode($message));
return $result;
}
/**
* 退出飞信
* @return string
*/
protected function _logout()
{
$uri = '/im/index/logoutsubmit.action';
$result = $this->_postWithCookie($uri, '');

return $result;
}
/**
* 携带Cookie向f.10086.cn发送POST请求
* @param string $uri
* @param string $data
*/
protected function _postWithCookie($uri, $data)
{
$fp = fsockopen('f.10086.cn', 80);
fputs($fp, "POST $uri HTTP/1.1\r\n");
fputs($fp, "Host: f.10086.cn\r\n");
fputs($fp, "Cookie: {$this->_cookie}\r\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fputs($fp, "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1\r\n");
fputs($fp, "Content-Length: ".strlen($data)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
$result = '';
while (!feof($fp))
{
$result .= fgets($fp);
}
fclose($fp);
return $result;
}
}




自己手机使用的发送页面


评论:
树篦子
2014-04-30 14:55 回复
不错的样子
简爱
2013-06-18 22:26 回复
@简爱:df
简爱
2013-06-18 02:08 回复
@孤独的北极狐:最简单的 做法就是  改邮件通知
孤独的北极狐
2013-06-17 22:51 回复
我用这个东西做了个插件还。。。评论发送飞信通知。。
简爱
2013-04-07 13:25 回复
@黎健雄:用处?
或许可以为后台登陆添加手机验证。。。
黎健雄
2013-04-06 14:10 回复
这个用处是什么?