php实现微信模拟登陆、获取用户列表及群发消息功能示例
时间:2019-03-30
本文章向大家介绍php实现微信模拟登陆、获取用户列表及群发消息功能示例,主要包括php实现微信模拟登陆、获取用户列表及群发消息功能示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了php实现微信模拟登陆、获取用户列表及群发消息功能。分享给大家供大家参考,具体如下:
<?php header('Content-Type: text/html; charset=UTF-8'); /* 调用方式简单说明: $arr = array( 'account' => '公众平台帐号', 'password' => '密码' ); $w = new Weixin($arr); print_r($w->getAllUserInfo());//获取所有用户信息 $w->getUserInfo($groupid, $fakeid);//获取所有用户信息,如果默认分组,则$groupid传0 $w->sendMessage('群发内容'); //群发给所有用户 $w->sendMessage('群发内容',$userId); //群发给特定用户,这里的$userId就是用户的fakeid,数组方式传递 */ 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)); 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); } //群发消息 public function sendMessage($content='',$userId='') { if(is_array($userId) && !empty($userId)){ 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 = 1000000; $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); $preg = "/\"id\":(\d+),\"nick_name\"/"; preg_match_all($preg,$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编码与转码操作技巧汇总》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
- 点击此文,无需转发,即可下载上千个免费R包
- 如何使用Cloudera Manager启用HDFS的HA
- 刷剧不忘学CNN:TF+Keras识别辛普森一家人物 | 教程+代码+数据集
- 深度学习中的基础线代知识-初学者指南
- 如何通过CM升级Kafka0.11及Spark2.2
- MyEtherWallet 手动添加币乎代币(KEY)
- 玩转TensorFlow深度学习
- 如何在CDH实现HDFS透明加密
- 漏洞分析】Shiro RememberMe 1.2.4 反序列化导致的命令执行漏洞
- 机器学习算法再比较
- 区块链钱包开发
- 加密货币常见加密算法
- 如何给Kerberos环境下的CDH集群添加Gateway节点
- Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- C# 获取.exe文件的运行目录
- MySQL存储过程示例
- C# winform之Log4Net的使用
- C# 调用百度AI接口实现文字识别
- MySQL 案例:自增列的空洞问题与“小”BUG
- 教你用云开发打造一个双端自动发布的博客体系(上)
- [Oracle概念]密码文件
- [Oracle 11g RAC安装]OPENFILER配置
- [Oracle 11g RAC安装]RAC环境搭建
- [Oracle 11g RAC安装]Grid安装
- [Oracle 11g RAC安装]Oracle安装
- [Oracle 11g RAC安装]UDEV设置
- Oracle参数(Undo_Retention)
- Oracle基本概念(Undo空间)
- [AWR报告]Buffer Hit %