PHP飞信发送类 -- 来自 blog.quanhz.com

简爱分享2013-4-6 10:3076346


(一)使用说明

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;
    }
}


自己手机使用的发送页面

本文出自简爱博客,转载时请注明出处及相应链接。

评论

  1. 树篦子2014-04-30 14:55回复

    不错的样子

  2. 孤独的北极狐2013-06-17 22:51回复

    我用这个东西做了个插件还。。。评论发送飞信通知。。

    1. 简爱2013-06-18 02:08回复

      @孤独的北极狐:最简单的 做法就是  改邮件通知

      1. 简爱2013-06-18 22:26回复

        @简爱:df

  3. 黎健雄2013-04-06 14:10回复

    这个用处是什么?

    1. 简爱2013-04-07 13:25回复

      @黎健雄:用处?
      或许可以为后台登陆添加手机验证。。。

发表评论

电子邮件地址不会被公开。必填项已用*标注