PHP微信网页版功能分析

PHP微信网页版功能分析

提供微信网页版接口分析:
全部接口参照:http://blog.csdn.net/qq_27263649/article/details/52750877
- 首先说明一点:微信目前分为2个版本,所以在获取接口时候请求的路径也不一样,很早以前注册的用户请求地址一般为wx.qq.com,新注册用户为wx2.qq.com,导致很多开发者在开发微信网页版的时候返现有些用户能登录并获取到消息,有的只能登录不能获取到消息
- 第二点:给大家介绍一下微信返回码RetCode和相应的解决方案:0-正常;1-失败,refresh;1101/1100-登出/失败,refresh/重新登录;1203-恭喜您,几个小时后重试,没有解决方案;Selector:2-新消息,6/7-进入/离开聊天界面通常是在手机上进行操作,重新初始化即可,0-正常;话不多说,上代码!


登录

/**
 * 获取uuid
 * @param: appid = 'wx782c26e4c19acffb'
 */
public function get_uuid($appid)
{
    $url = 'https://login.weixin.qq.com/jslogin';
    $url .= '?appid=' . $appid;
    $url .= '&fun=new';
    $url .= '&lang=zh_CN';
    $url .= '&_=' . time();
    //使用curl进行抓取页面信息
    $content = $this->curlPost($url);
    //抓取出来的信息使用正则匹配,正则不好的同学也可以学我这样
    $content = explode(';', $content);
    $content_uuid = explode('"', $content[1]);
    $uuid = $content_uuid[1];
    return $uuid;
}

生成登录二维码

 /**
 * 生成登录二维码
 * @param:uuid
 */
public function qrcode($uuid)
{
    $url = 'https://login.weixin.qq.com/qrcode/' . $uuid . '?t=webwx';
    $html = "<img class='img' src=" . $url . "/>";
    return $html;
}

这部分很简单不多解释。

获取回调地址

/**
 * 获取回调地址
 * @param:uuid
 */
  public function get_uri($uuid)
{
    $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=' . $uuid. '&tip=0&_=e' . time();
    $content = $this->curlPost($url);
    $content = explode(';', $content);
    $content_uri = explode('"', $content[1]);
    $uri = $content_uri[1];
    //重点:根据不同版本的微信返回的回调地址是不同的匹配出相应的回调头地址
    preg_match("~^https:?(//([^/?#]*))?~", $uri, $match);
    $https_header = $match[0];
    session('https_header', $https_header);
    $base_url = $_SESSION['https_header'] . "/cgi-bin/mmwebwx-bin";
    session('base_url', $base_url);
    $new_uri = explode('scan', $uri);
    $uri = $new_uri[0] . 'fun=new&scan=' . time();
    $res = $this->curlPost($uri);
    if (!$res) {
        $this->error("登录超时", 'index');
    }
    $res = simplexml_load_string($res);
    $data = (array)$res;
    return $data;
}

初始化

    /**
 * 初始化
 */
/**
 * 获取post数据
 */
public function get_self($data)
{
    $ret = $data['ret'];
    if ($ret == '1203') {
        $this->error('未知错误,请2小时后重试', 'index');
    }
    if ($ret == '0') {
        $this->self->BaseRequest = array(
            'Uin' => $data['wxuin'],
            'Sid' => $data['wxsid'],
            'Skey' => $data['skey'],
            'DeviceID' => 'e' . rand(10000000, 99999999) . rand(1000000, 9999999),
            //16位
        );

        $this->self->skey = $data['skey'];

        $this->self->pass_ticket = $data['pass_ticket'];

        $this->self->sid = $data['wxsid'];

        $this->self->uin = $data['wxuin'];

        session('self', $this->self);

        return $this->self;
    } else {
        return $ret;
    }
}

 /**
 * 获取MsgId
 */
public
function wxstatusnotify()
{
    $self = $_SESSION['self'];
    $User = $self->User;

    $url = $_SESSION['base_url'] . '/webwxstatusnotify?lang=zh_CN&pass_ticket=' . $self->pass_ticket;

    $params = array(
        'BaseRequest' => $self->BaseRequest,
        "Code" => 3,
        "FromUserName" => $User['UserName'],
        "ToUserName" => $User['UserName'],
        "ClientMsgId" => time()
    );

    $res = $this->curlPost($url, $params);

    $res = json_decode($res, true);

    return $res;
}

/**
 * 获取联系人
 *params:JSON
 */
public function webwxgetcontact()
{
    $self = $_SESSION['self'];

    $url = $_SESSION['base_url'] . '/webwxgetcontact?pass_ticket=' . $self->pass_ticket . '&seq=0&skey=' . $self->skey . '&r=' . time();

    $params['BaseRequest'] = $self->BaseRequest;

    $data = $this->curlPost($url, $params);

    return $data;
}

/**
 * 获取当前活跃群信息
 */
public function webwxbatchgetcontact($self, $group_list)
{
    $url = $_SESSION['base_url'] . '/webwxbatchgetcontact?type=ex&lang=zh_CN&r=' . time() . '&pass_ticket=' . $self->pass_ticket;

    $params['BaseRequest'] = $self->BaseRequest;

    $params['Count'] = count($group_list);

    foreach ($group_list as $key => $value) {
        if ($value[MemberCount] == 0) {
            $params['List'][] = array(
                'UserName' => $value['UserName'],
                'ChatRoomId' => "",
            );
        }
        $params['List'][] = array(
            'UserName' => $value['UserName'],
            'EncryChatRoomId' => "",
        );

    }

    $data = $this->curlPost($url, $params);

    $data = json_decode($data, true);


    if ($data['BaseResponse']['Ret'] == '1205') {
        foreach ($group_list['MemberList'] as $key => $value) {
            $value['NickName'] = $this->getFriend($value['UserName']);
            if (!$value['NickName']) {
                $value['NickName'] = '非好友';
            }
        }
        $data = $group_list;
    }

    return $data;
}

 /**
 * 心跳检测 0正常;1101失败/登出;2新消息;7不要耍手机了我都收不到消息了;
 */
public
function synccheck()
{

    $self = $_SESSION['self'];

    $SyncKey = $_SESSION['synckey'];
    if (!$SyncKey['List']) {
        $SyncKey = $_SESSION['json']['SyncKey'];
    }
    foreach ($SyncKey['List'] as $key => $value) {

        if ($key == 1) {
            $SyncKey_value = $value['Key'] . '_' . $value['Val'];
        } else {
            $SyncKey_value .= '|' . $value['Key'] . '_' . $value['Val'];
        }

    }

    $header = array(
        '0' => 'https://webpush.wx2.qq.com',
        '1' => 'https://webpush.wx.qq.com',
    );

    foreach ($header as $key => $value) {

        $url = $value . "/cgi-bin/mmwebwx-bin/synccheck?r=" . getMillisecond() . "&skey=" . urlencode($self->skey) . "&sid=" . $self->sid . "&deviceid=" . $self->BaseRequest['DeviceID'] . "&uin=" . $self->uin . "&synckey=" . urlencode($SyncKey_value) . "&_=" . getMillisecond();
        //getMillisecond()时间戳15位
        $data[] = $this->curlPost($url);
    }
    foreach ($data as $k => $val) {
        $rule = '/window.synccheck={retcode:"(\d+)",selector:"(\d+)"}/';
        preg_match($rule, $data[$k], $match);
        if ($match[1] == '0') {
            $retcode = $match[1];
            $selector = $match[2];
        }
    }
    $status = array(
        'ret' => $retcode,
        'sel' => $selector,
    );
    return $status;
}

/**
 * 获取最新消息
 */
public
function webwxsync()
{
    $self = $_SESSION['self'];

    $SyncKey = $_SESSION['synckey'];

    $url = $_SESSION['https_header'] . '/cgi-bin/mmwebwx-bin/webwxsync?sid=' . $self->sid . '&skey=' . $self->skey . '&pass_ticket=' . $self->pass_ticket;

    $params = array(
        'BaseRequest' => $self->BaseRequest,
        'SyncKey' => $SyncKey,
        'rr' => ~time(),
    );
    $data = $this->curlPost($url, $params);

    return $data;
}

/**
 * 发送消息
 */
public function sendMsg($username, $content)
{
    header("Content-Type: text/html; charset=UTF-8");
    $this->webwxsendmsg($_SESSION['self'], $username, $content);
}

/**
 * 发送消息
 */
public
function webwxsendmsg($self, $to, $word)
{

    header("Content-Type: text/html; charset=UTF-8");
    $url = $_SESSION['https_header'] . '/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=' . $self->pass_ticket;
    $clientMsgId = getMillisecond() * 1000 + rand(1000, 9999);
    $params = array(
        'Msg' => array(
            "Type" => 1,
            "Content" => $word,
            "FromUserName" => $self->User['UserName'],
            "ToUserName" => $to,
            "LocalID" => $clientMsgId,
            "ClientMsgId" => $clientMsgId
        ),
        'BaseRequest' => $self->BaseRequest,
    );
    $data = $this->curlPost($url, $params, 1);
    return $data;
}
好了不多解释了,有问题github:https://github.com/yjliushigui/wxrobot

转载请注名出处http://blog.csdn.net/qq_27263649/article/details/52701181

环境要求 PHP >= 7.0 PHP fileinfo 拓展 储存文件需要用到 PHP gd 拓展 控制台显示二维码 PHP posix 拓展 控制台显示二维码(linux) PHP 系统命令 拓展 执行clear命令 PHP SimpleXML 拓展 解析XML 安装 请确保已经会使用composer! 运行微信账号的语言设置务必设置为简体中文!!否则可能出现未知的错误! 1、git git clone https://github.com/HanSon/vbot.git cd vbot composer install 2、composer composer require hanson/vbot 运行 正常运行 php example/index.php 带session运行 php example/index.php --session yoursession 关于session : 带session运行会自动寻找设定session指定的cookies,如不存在则新建一个文件夹位于 /tmp/session 中,当下次修改代码时再执行就会免扫码自动登录。 如果不设置,vbot会自动设置一个6位的字符的session值,下次登录也可以直接设定此值进行面扫码登录。 PS:运行后二维码将保存于设置的缓存目录,命名为qr.png,控制台也会显示二维码,扫描即可(linux用户请确保已经打开ANSI COLOR) 警告!执行前请先查看index.php的代码,注释掉你认为不需要的代码,避免对其他人好友造成困扰 请在terminal运行!请在terminal运行!请在terminal运行! 目录结构 vbot demo (vbot 当前在运行的代码,也欢迎大家提供自己的一些实战例子) example (较为初级的实例) src (源码) tmp (假设缓存目录设置在此) session hanson (设定值 php index.php --session hanson) 523eb1 (随机值) users 23534234345 (微信账号的UIN值) file (文件) gif (表情) jpg (图片) mp3 (语音) mp4 (视频) contact.json (联系人 debug模式下存在) group.json (群组 debug模式下存在) member.json (所有群的所有成员 debug模式下存在) official.json (公众号 debug模式下存在) special.json (特殊账号 debug模式下存在) message.json (消息) 体验 扫码后,验证输入“echo”即可自动加为好友并且拉入vbot群。 vbot并非24小时执行,有时会因为开发调试等原因暂停功能。如果碰巧遇到关闭情况,可加Q群 492548647 了解开放时间。执行后发送“拉我”即可自动邀请进群。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值