執行個體詳解PHP實現微信類比登陸並給使用者發送訊息

來源:互聯網
上載者:User
本文主要和大家介紹了PHP實現類比登陸並給使用者發送訊息的方法,可實現發送文字、圖片及圖文的功能,涉及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; // 返回資料  }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.