PHP实现的微信公众号扫码模拟登录功能示例
时间:2022-07-27
本文章向大家介绍PHP实现的微信公众号扫码模拟登录功能示例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了PHP实现的微信公众号扫码模拟登录功能。分享给大家供大家参考,具体如下:
PHP微信公众号扫码模拟登录功能
功能只是将:https://github.com/huanz/wechat-mp-hack 改成PHP实现罢了. 之前有个休闲豆每日晨报订阅号每天定时群发消息,去年微信突然要求一定要扫码授权才能登录,FK,然后就放弃了,前几天看到早有人使用程序扫码登录,获取token,cookie自动群发了,闲着也是闲着,就将js改成php实现了登录功能.
主要流程如下
1,先访问https://mp.weixin.qq.com/ ,模拟登录,进入二维码页面 2,带着返回的cookie下载二维码.程序后台一直while循环,等待扫描消息. 3,打开下载的二维码,微信扫码,登录成功,获取token和cookie,然后后面就可以自由发挥了.
供上代码.
class WeiSendAuto
{
//--------------------------------------------------------LOGIN START
private $_apis = [
"host" = "https://mp.weixin.qq.com",
"login" = "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin",
"qrcode" = "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=getqrcode¶m=4300",
"loginqrcode" = "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1",
"loginask" = "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1&random=",
"loginauth" = "https://mp.weixin.qq.com/cgi-bin/loginauth?action=ask&token=&lang=zh_CN&f=json&ajax=1",
"bizlogin" = "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login&lang=zh_CN"
];
private $_redirect_url = "";
private $_key = "";
private function _getCookieFile(){
return WEI_UPLOAD_PATH."cookie_{$this- _key}.text";
}
private function _getSavePath(){
return WEI_UPLOAD_PATH.$this- _qrcodeName();
}
private function _qrcodeName(){
return "qrcode_{$this- _key}.png";
}
private function _log($msg){
Log::record("[微信调度:".date("Y-m-d H:i:s")."] ======: {$msg}");
}
public function getToken(){
return Utils::getCache("token_{$this- _key}");
}
public function setToken($token){
Utils::setCache("token_{$this- _key}",$token);
}
public function init($options){
if(!isset($options["key"])){
die("Key is Null!");
}
$this- _key = $options["key"];
if($this- getToken()){
echo("HAS Token !");
return;
}else{
//尼玛,先要获取首页!!!
$this- fetch("https://mp.weixin.qq.com/","","text");
$this- _log("start login!!");
$this- start_login($options);
}
}
private function start_login($options){
$_res = $this- _login($options["account"],$options["password"]);
if(!$_res["status"]){
$this- _log($_res["info"]);
return;
}
//保存二维码
$this- _saveQRcode();
$_ask_api = $this- _apis["loginask"];
$_input["refer"] = $this- _redirect_url;
$_index = 1;
while(true){
/* if($_index 60){
break;
}*/
$_res = $this- fetch($_ask_api.$this- getWxRandomNum(),$_input);
$_status = $_res["status"];
if($_status==1){
if($_res["user_category"]==1){
$_ask_api = $this- _apis["loginauth"];
}else{
$this- _log("Login success");
break;
}
}else if($_status==4){
$this- _log("已经扫码");
}else if($_status==2){
$this- _log("管理员拒绝");
break;
}else if($_status==3){
$this- _log("登录超时");
break;
}else{
if($_ask_api==$this- _apis["loginask"]){
$this- _log("请打开test.jpg,用微信扫码");
}else{
$this- _log("等待确认");
}
}
sleep(2);
$_index++;
}
/*if($_index =60){
$this- _log("U亲,超时了");
return;
}*/
$this- _log("开始验证");
$_input["post"] = ["lang"= "zh_CN","f"= "json","ajax"= 1,"random"= $this- getWxRandomNum(),"token"= ""];
$_input["refer"] = $this- _redirect_url;
$_res = $this- fetch($this- _apis["bizlogin"],$_input);
$this- _log(print_r($_res,true));
if($_res["base_resp"]["ret"]!=0){
$this- _log("error = ".$_res["base_resp"]["err_msg"]);
return ;
}
$redirect_url = $_res["redirect_url"];//跳转路径
if(preg_match('/token=([d]+)/i', $redirect_url,$match)){//获取cookie
$this- setToken($match[1]);
}
$this- _log("验证成功,token: ".$this- getToken());
}
//下载二维码
private function _saveQRcode(){
$_input["refer"] = $this- _redirect_url;
$_res = $this- fetch($this- _apis["qrcode"],$_input,"text");
$fp = fopen($this- _getSavePath(), "wb+") or die("open fails");
fwrite($fp,$_res) or die("fwrite fails");
fclose($fp);
}
private function _login($_username,$_password){
$_input["post"] = array(
'username' = $_username,
'pwd' = md5($_password),
'f' = 'json',
'imgcode' = ""
);
$_input["refer"] = "https://mp.weixin.qq.com";
$_res = $this- fetch($this- _apis["login"],$_input);
if($_res["base_resp"]["ret"]!==0){
return Utils::error($_res["base_resp"]["err_msg"]);
}
$this- _redirect_url = "https://mp.weixin.qq.com".$_res["redirect_url"];//跳转路径
return Utils::success("ok");
}
function getWxRandomNum(){
return "0.".mt_rand(1000000000000000,9999999999999999);
}
/**
* @param $url
* @param null $_input
* @param string $data_type
* @return mixed
* $_input= ["post"= [],"refer"= "",cookiefile='']
*/
function fetch( $url, $_input=null, $data_type='json') {
$ch = curl_init();
$useragent = isset($_input['useragent']) ? $_input['useragent'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2';
//curl_setopt( $ch, CURLOPT_HTTPHEADER, $this- _headers); //设置HTTP头字段的数组
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_POST, isset($_input['post']) );
if( isset($_input['post']) ) curl_setopt( $ch, CURLOPT_POSTFIELDS, $_input['post'] );
if( isset($_input['refer']) ) curl_setopt( $ch, CURLOPT_REFERER, $_input['refer'] );
curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, ( isset($_input['timeout']) ? $_input['timeout'] : 5 ) );
curl_setopt( $ch, CURLOPT_COOKIEJAR, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : $this- _getCookieFile() ));
curl_setopt( $ch, CURLOPT_COOKIEFILE, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : $this- _getCookieFile() ));
$result = curl_exec( $ch );
curl_close( $ch );
if ($data_type == 'json') {
$result = json_decode($result,true);
}
return $result;
}
//--------------------------------------------------------LOGIN END
}
怎么调用?上码
$arr = array(
'account' = '***',
'password' = '****',
'key' = "tmall",
);
$w = new WeiSendAuto();
$w- init($arr);
if(!$w- getToken()){
die("NOT TOKEN!");
}
- Google Chrome 浏览器 开发者工具 使用教程
- 反向代理(Reverse Proxy)及 IIS 7 应用请求路由模块
- 2014腾讯“大数据连接的未来”高峰论坛在京召开
- 工作流、业务流程管理和SOA
- 面向对象设计的SOLID原则
- 用psake来简化自动化脚本的构建
- TESLA V100如何让质疑GPU的流言“失声”
- Web 前端性能优化相关内容解析
- Service Broker 无法工作的问题修复
- .NET代码快速转换成powershell代码
- 网站性能评分工具Yslow 使用教程
- Temp权限引起的WCF问题
- WordPress 中强制设置 特色图像 才能发表文章
- 实用工具SDelete
- 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
- SpringBoot整合easyexcel
- socket网络编程基础
- Java自动化测试(登陆接口测试 14)
- poiAndEasyExcel学习(一)
- IP地址与子网划分
- HDFS异构存储简介
- Milvus 实战 | 基于 Kubernetes 的分布式集群部署方案
- Linux Bash基础(二)
- poiAndEasyExcel学习(二)
- poiAndEasyExcel学习(三)
- poiAndEasyExcel学习(四)
- 使用OpenCV为视频中美女加上眼线
- 论文精读|5th|YOLO v3的新特性|目标检测|附下载
- 算法集锦(9)|自动驾驶|道路图像增强算法
- 基于OpenCV实现海岸线变化检测