PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】


Posted in PHP onJune 29, 2017

本文实例讲述了PHP实现微信模拟登陆并给用户发送消息的方法。分享给大家供大家参考,具体如下:

<?php
/*
原作者:https://github.com/itziy/wechat
修改:Server getUserFakeid函数 获取fakeid的正则匹配公式
调用方式简单说明:
 $arr = array(
  'account' => '公众平台帐号',
  'password' => '密码'
);
$w = new Weixin($arr);
$w->getAllUserInfo();//获取所有用户信息
$w->getUserInfo($groupid, $fakeid);//获取所有用户信息,如果默认分组,则$groupid传0
$w->sendMessage('群发内容'); //群发给所有用户
$w->sendMessage('群发内容',$userId); //群发给特定用户,这里的$userId就是用户的fakeid,数组方式传递
*/
$w = new Weixin(array('account'=>'771948524@qq.com','password'=>'1259012345'));
$w->sendMessage('hello', 'oXLujjp9y1311QldQKht7iyq83RM');
exit;
class Weixin {
  public $userFakeid;//所有粉丝的fakeid
  private $_account;//用户名
  private $_password;//密码
  private $url;//请求的网址
  private $send_data;//提交的数据
  private $getHeader = 0;//是否显示Header信息
  private $token;//公共帐号TOKEN
  private $host = 'mp.weixin.qq.com';//主机
  private $origin = 'https://mp.weixin.qq.com';
  private $referer;//引用地址
  private $cookie;
  private $pageSize = 100000;//每页用户数(用于读取所有用户)
  private $userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0';
  public function __construct($options){
    $this->_account = isset($options['account'])?$options['account']:'';
    $this->_password = isset($options['password'])?$options['password']:'';
    $this->login();
  }
  //登录
  private function login(){
    $url = 'https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN';
    $this->send_data = array(
      'username' => $this->_account,
      'pwd' => md5($this->_password),
      'f' => 'json'
    );
    $this->referer = "https://mp.weixin.qq.com/";
    $this->getHeader = 1;
    $result = explode("\n",$this->curlPost($url));
    //print_r($result);exit;
    foreach ($result as $key => $value) {
      $value = trim($value);
      if (preg_match('/token=(\d+)/i', $value,$match)){
        //获取token
        $this->token = trim($match[1]);
      }
      if (preg_match('/"ret":(.*)/i', $value,$match)){//获取token
        switch ($match[1]) {
          case -1:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"系统错误")));
          case -2:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"帐号或密码错误")));
          case -3:
            die(urldecode(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>urlencode("密码错误")))));
          case -4:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"不存在该帐户")));
          case -5:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"访问受限")));
          case -6:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"需要输入验证码")));
          case -7:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"此帐号已绑定私人微信号,不可用于公众平台登录")));
          case -8:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"邮箱已存在")));
          case -32:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"验证码输入错误")));
          case -200:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"因频繁提交虚假资料,该帐号被拒绝登录")));
          case -94:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"请使用邮箱登陆")));
          case 10:
            die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"该公众会议号已经过期,无法再登录使用")));
          case 0:
            //$this->userFakeid = $this->getUserFakeid();
            break;
        }
      }
      if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $value,$match)){//获取cookie
        $this->cookie .=$match[1].'='.$match[2].'; ';
      }
    }
  }
  //单发消息
  private function send($fakeid,$content){
    $url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN';
    $this->send_data = array(
        'type' => 1,
        'f' => 'json',
        'action' => 'sync',
        'content' => $content,
        'tofakeid' => $fakeid,
        'token' => $this->token,
        'ajax' => 1,
      );
    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token='.$this->token.'&fromfakeid='.$fakeid.'&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN';
    return $this->curlPost($url);
  }
  //单发消息
  private function sendimg($fakeid,$mediaid){
    $url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN';
    $this->send_data = array(
        'type' => 2,
        'f' => 'json',
        'action' => 'sync',
        'tofakeid' => $fakeid,
        'token' => $this->token,
        'ajax' => 1,
        'file_id'=>$mediaid,
        'fileid'=>$mediaid,
      );
    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token='.$this->token.'&fromfakeid='.$fakeid.'&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN';
    return $this->curlPost($url);
  }
  //群发消息
  public function sendMessage($content='',$userId='') {
    if(!empty($userId)){
      $json = json_decode($this->sendimg($userId,'304019426'));
      /*if($json->ret!=0){
        $errUser[] = $v;
      }*/
      /*foreach($userId as $v){
        $json = json_decode($this->send($v,$content));
        if($json->ret!=0){
          $errUser[] = $v;
        }
      }*/
    }else{
      foreach($this->userFakeid as $v){
        $json = json_decode($this->send($v['fakeid'],$content));
        if($json->ret!=0){
          $errUser[] = $v['fakeid'];
        }
      }
    }
    //共发送用户数
    //$count = count($this->userFakeid);
    //发送失败用户数
    //$errCount = count($errUser);
    //发送成功用户数
    //$succeCount = $count-$errCount;
    /*$data = array(
      'status'=>0,
      'count'=>$count,
      'succeCount'=>$succeCount,
      'errCount'=>$errCount,
      'errUser'=>$errUser
    );
    return json_encode($data);*/
  }
  //获取所有用户信息
  public function getAllUserInfo(){
    foreach($this->userFakeid as $v){
      $info[] = $this->getUserInfo($v['groupid'],$v['fakeid']);
    }
    return $info;
  }
  //获取用户信息
  public function getUserInfo($groupId,$fakeId){
    $url = "https://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo&lang=zh_CN&fakeid={$fakeId}";
    $this->getHeader = 0;
    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this->token.'&t=wxm-friend&lang=zh_CN&pagesize='.$this->pageSize.'&pageidx=0&type=0&groupid='.$groupId;
    $this->send_data = array(
      'token'=>$this->token,
      'ajax'=>1
    );
    $message_opt = $this->curlPost($url);
    return $message_opt;
  }
  //获取所有用户fakeid
  private function getUserFakeid(){
    ini_set('max_execution_time',600);
    $pageSize = 100;
    $this->referer = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token={$this->token}";
    $url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize={$pageSize}&pageidx=0&type=0&groupid=0&token={$this->token}&lang=zh_CN";
    $user = $this->vget($url);
    //print_r($user);exit;
    //$preg = "/"id":(\d+),"nick_name"/";
    //preg_match_all($preg,$user,$b);
    $user = str_replace(array(" "," ","\t","\n","\r"), '', $user);
    preg_match_all('%id:"(.*?)",%si', $user, $b);
    $i = 0;
    foreach($b[1] as $v){
      $arr[$i]['fakeid'] = $v;
      $arr[$i]['groupid'] = 0;
      $i++;
    }
    return $arr;
  }
  /**
   * curl模拟登录的post方法
   * @param $url request地址
   * @param $header 模拟headre头信息
   * @return json
   */
  private function curlPost($url) {
    $header = array(
      'Accept:*/*',
      'Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3',
      'Accept-Encoding:gzip,deflate,sdch',
      'Accept-Language:zh-CN,zh;q=0.8',
      'Connection:keep-alive',
      'Host:'.$this->host,
      'Origin:'.$this->origin,
      'Referer:'.$this->referer,
      'X-Requested-With:XMLHttpRequest'
    );
    $curl = curl_init(); //启动一个curl会话
    curl_setopt($curl, CURLOPT_URL, $url); //要访问的地址
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置HTTP头字段的数组
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); //对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); //从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $this->userAgent); //模拟用户使用的浏览器
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); //自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); //发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $this->send_data); //Post提交的数据包
    curl_setopt($curl, CURLOPT_COOKIE, $this->cookie); //读取储存的Cookie信息
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); //设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, $this->getHeader); //显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //获取的信息以文件流的形式返回
    $result = curl_exec($curl); //执行一个curl会话
    curl_close($curl); //关闭curl
    return $result;
  }
  private function vget($url){ // 模拟获取内容函数
    $header = array(
        'Accept: */*',
        'Connection: keep-alive',
        'Host: mp.weixin.qq.com',
        'Referer: '.$this->referer,
        'X-Requested-With: XMLHttpRequest'
    );
    $useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0';
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置HTTP头字段的数组
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $useragent); // 模拟用户使用的浏览器
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_HTTPGET, 1); // 发送一个常规的GET请求
    curl_setopt($curl, CURLOPT_COOKIE, $this->cookie); // 读取上面所储存的Cookie信息
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, $this->getHeader); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
      // echo 'Errno'.curl_error($curl);
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
傻瓜化配置PHP环境――Appserv
Dec 13 PHP
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
利用PHP实现短域名互转
Jul 05 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
Mar 19 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
php微信开发之谷歌测距
Jun 14 PHP
php连接mysql数据库最简单的实现方法
Sep 24 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 #PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 #PHP
Symfony查询方法实例小结
Jun 28 #PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 #PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 #PHP
php的常量和变量实例详解
Jun 27 #PHP
Zend Framework框架中实现Ajax的方法示例
Jun 27 #PHP
You might like
理解php原理的opcodes(操作码)
2010/10/26 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
Node.js文件操作详解
2014/08/16 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
js实现tab切换效果
2017/02/16 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
儿童学习python的一些小技巧
2018/05/27 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
python中p-value的实现方式
2019/12/16 Python
python实现贪吃蛇双人大战
2020/04/18 Python
python爬取音频下载的示例代码
2020/10/19 Python
法学专业个人求职信
2013/09/26 职场文书
个人简历自我鉴定
2013/10/11 职场文书
回门宴父母答谢词
2014/01/26 职场文书
医学生个人求职信范文
2014/02/07 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
毕业生个人自荐书
2015/03/05 职场文书
共青团员自我评价
2015/03/10 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python