PHP实现的微信公众号扫码模拟登录功能示例
作者:Hubs'm 发布时间:2023-11-22 18:13:08
标签: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!");
}
希望本文所述对大家PHP程序设计有所帮助。
来源:http://www.hihubs.com/article/275
0
投稿
猜你喜欢
- CSS2.1 中规定了关于 CSS 规则 Specificity(特异性)的计算方式,用一个四位的数字串(注:CSS2 中是用三位)来表示,
- 代码如下: '排序 Function Sort1(ary) Dim KeepChecking,I,FirstValue,Second
- mysql是linux平台下最流行的数据库系统,今天介绍的是mysql的安装及简单的操作方法!groupadd mysql //建立mysq
- SQL Server 2005相对于SQL Server 2000做了很大的改进,许些新特性是非常实用的。本文中将通过几个具体示例进行详细的
- 即使在不太复杂的样式表中,也可能会有两个或者更多个规则找到同一元素。CSS通过一个叫做层叠(cascade)的过程处理这种冲突。
- 从接触互联网开始,一直在关注每个网站页面浏览速度,不管大小国内外网站,而且每个用户的浏览时间都不一样,从而了解用户在浏览页面上时间体验尺度的
- 相关文章推荐:各种北京2008奥运会倒计时Flash2008北京奥运会倒计时js代码 全套北京2008奥运会倒计时屏保<!DOCTYP
- 这可是个综合性的问题,看看下面对文件操作的集大成代码:<% 'Set file i/
- js关于 byval 与 byref 二者区别: byval 传递数值,实参和形参分处不同的内存单元,互不干扰! byref 传递地址,实参
- 平时我们获取事件对象一般写法如下:function getEvent(event) { return event
- 如何制作一个从Access数据库中读取记录的下拉菜单?看看这个例子:<% SQL = "SEL
- 如何在ADO服务器端利用好缓存技术?请看下面示例,这是一个用来显示图书分类的例子程序:displayBooks.asp< %
- 第一章:基本的圆角框第二章:透明圆角化背景图片第三章:圆角化图片 第四章:CSS圆角框组件 V1.0序言:在我的文章《超圆滑圆角框的半完美解
- 在我们关于SQL服务器安全系列的这文章里,我们的目标是向你提供安全安装SQL服务器所需要的工具和信心,这样的话,你有价值的数据就会受到保护,
- 1.打开 database/migrations/2014_10_12_000000_create_users_table.php 这个 m
- 治標不治本的就是將php.ini內的reporting部份修改,讓notice不顯示 error_reporting = E_ALL; di
- 用header 发送cookie header("Set-Cookie: testcookie=中文
- 本文实例讲述了PHP常用函数之获取汉字首字母功能。分享给大家供大家参考,具体如下://获取汉字的首字母function getFirstCh
- 做网站数据库,是选SQL Server还是Access好,可能您会说:选MySQL好,不过现在只是讨论IIS+ASP这种架构下的选择,不讨论
- 如果网站只开了80端口,你会发现下面的方法是比较有用的,其中用的方法几乎都不是我发现的,文总包括一些注入时的个人经验和技巧方法可以说有4种(