В этой статье приведен пример, иллюстрирующий аналоговую функцию входа в систему для проверки общедоступных номеров Wechat, реализованную с помощью PHP. Поделитесь для вашей справки следующим образом:
Функция имитации входа в систему с помощью PHP Wechat с открытым номером
Функции будут только: https://github.com/huanz/wechat-mp-hack Изменение реализации PHP. Был номер подписки на ежедневную утреннюю газету leisure bean, которая регулярно отправляла сообщения каждый день. В прошлом году Wechat внезапно запросил авторизацию с помощью кода для входа в систему, а затем сдался. Несколько дней назад я увидел, что кто-то использовал программный код для входа в систему, получения токена, файлы cookie автоматически распределялись по группам, простаивали и бездействовали, поэтому я изменил JS на PHP, чтобы реализовать функцию входа в систему.
Основные процессы заключаются в следующем.
1. Посетите https://mp.weixin.qq.com/, имитируйте вход в систему и войдите на двумерную кодовую страницу. 2. Загрузите двумерный код с возвращенным файлом cookie. Фон программы всегда находится в цикле while, ожидая сообщения о сканировании. 3. Откройте загруженный двумерный код, код развертки Wechat, успешно войдите в систему, получите токен и файл 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=〈=zh_CN&f=json&ajax=1",
"loginask" => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=〈=zh_CN&f=json&ajax=1&random=",
"loginauth" => "https://mp.weixin.qq.com/cgi-bin/loginauth?action=ask&token=〈=zh_CN&f=json&ajax=1",
"bizlogin" => "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login〈=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 ("[Wechat Scheduling:". 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{
// Nima, first get the home page!!!
$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;
}
// Preserving two-dimensional codes
$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 ("scanned");
}else if($_status==2){
$this - > log ("administrator rejects");
break;
}else if($_status==3){
$this - > log ("logon timeout");
break;
}else{
if($_ask_api==$this->_apis["loginask"]){
This - > log ("Open test. JPG and wipe the code with Wechat");
}else{
$this - > log ("waiting for confirmation");
}
}
sleep(2);
$_index++;
}
/*if($_index>=60){
This - > log ("U pro, overtime");
return;
}*/
$this - > log ("start validation");
$_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"]; // jump path
If (preg_match('/token=([\d]+)/i', $redirect_url, $match){// Get cookie
$this->setToken($match[1]);
}
This - > log ("validation success, token:"$this - > getToken ()));
}
// Download two-dimensional code
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"]; //jump path
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); //Set an array of HTTP header fields
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, могут ознакомиться с темами этого сайта: Краткое описание навыков разработки PHP Wechat, Краткое описание использования Php Curl, Краткое описание навыков сетевого программирования PHP, Краткое описание использования строк Php, Краткое описание Навыков работы с данными в формате Json в PHP и Краткое описание навыков работы с файлами XML в PHP. “
Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.