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中使用Oracle数据库(3)
Oct 09 PHP
PHP脚本的10个技巧(5)
Oct 09 PHP
PHP 上传文件大小限制
Jul 05 PHP
php 获取客户端的真实ip
Nov 30 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
PHP生成条形码大揭秘
Sep 24 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
PHP基于XMLWriter操作xml的方法分析
Jul 17 PHP
Laravel 集成 Geetest验证码的方法
May 14 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中对2个数组相加的函数
2011/06/24 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python subprocess模块学习总结
2014/03/13 Python
python获取目录下所有文件的方法
2015/06/01 Python
django中send_mail功能实现详解
2018/02/06 Python
python使用requests.session模拟登录
2019/08/09 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
Django设置Postgresql的操作
2020/05/14 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
Python 实现进度条的六种方式
2021/01/06 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
管理专员自荐信
2014/01/26 职场文书
校庆标语集锦
2014/06/25 职场文书
销售2014年度工作总结
2014/12/08 职场文书
检讨书格式
2015/01/23 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
深入理解Vue的数据响应式
2021/05/15 Vue.js