1. 程式人生 > >[微信公眾號]php版模擬登入,向指定使用者推送訊息

[微信公眾號]php版模擬登入,向指定使用者推送訊息

模擬登入程式碼:

<?php
/*
呼叫方式簡單說明:
 $arr = array(
    'account' => '公眾平臺帳號',
    'password' => '密碼'
);
$postMsg = new postMsg($arr);
$postMsg->getAllUserInfo();//獲取所有使用者資訊
$postMsg->getUserInfo($groupid, $fakeid);//獲取所有使用者資訊,如果預設分組,則$groupid傳0
$postMsg->sendMessage('群發內容'); //群發給所有使用者
$postMsg->sendMessage('群發內容',$userId); //群發給特定使用者,這裡的$userId就是使用者的fakeid,陣列方式傳遞
*/
class postMsg {
    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));
        echo '</br>result';
        echo $result;

        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);
        var_dump($user);
        $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 /* 呼叫方式簡單說明: $arr = array( 'account' => '公眾平臺帳號', 'password' => '密碼' ); $postMsg = new postMsg($arr); $p

公眾php模擬登入指定使用者訊息目前

<?php /* 呼叫方式簡單說明: $arr = array( 'account' => '公眾平臺帳號', 'password' => '密碼' ); $postMsg = new postMsg($arr); $postMsg->getAllUserInfo()

公眾開發整理(六)--自定義選單事件

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");req.setCharacter

在電腦使用公眾或wap掃碼登陸解決方案

介紹: 在微信端或手機瀏覽器端,使用微信或手機的登陸狀態,掃碼登陸電腦版。 實現: 1、電腦端登陸頁面顯示二維碼,二維碼內容為以當前時間的加密token作為引數的URL,並把這串加密token儲存到資料庫。 2、在手機端掃碼後進入頁面拉取手機端的登陸狀態資訊,並綁定當前token儲存

公眾 基於PHP 拼團活動開發一 模板搭建

已測試號為例;使用者發起拼團活動(為團長),回覆給他帶有活動id與其openid的二維碼圖片,轉發給他人,已關注的掃碼之後儲存其openid,未關注的在關注之後儲存openid(防止重複參與)(團員),然後自動回覆團員自己活動資訊的二維碼。 1.微信公眾號後臺配置好 伺服器

支付V3公眾支付PHP教程(thinkPHP5公眾支付)/JSSDK的使用

掃二維碼關注,獲取更多技術分享 本文承接之前釋出的部落格《 微信支付V3微信公眾號支付PHP教程/thinkPHP5公眾號支付》必須閱讀上篇文章後才可以閱讀這篇文章。由於最近一段時間工作比較忙,部落格更新比較慢。如果有任何問題大家可以關注以上公眾

支付V3公眾支付PHP教程/thinkPHP5公眾支付

本篇文章是微信支付最新介面V3版本的PHP實踐教程,在該教程中主要使用的框架是thinkPHP5框架,如果你對thinkPHP5框架下的開發還不是很熟悉可以檢視相關的教程,當然在我的部落格中也有thinkPHP5的教程大家可以檢視。在本篇文章中我的主要目標

支付開發(二)----支付開發之公眾支付JAVA

一、開通微信公眾號 1.1公眾平臺帳號型別 微信公眾平臺分為服務號、企業號、訂閱號。 1、訂閱號:主要偏於為使用者傳達資訊(類似報紙雜誌),認證前後都是每天只可以群發一條訊息; 2、服務號:主要

公眾開發-java 騰訊課堂(消息收發 +圖靈聊天機器人)

請求 微信公眾 www. 包裝類 jsonarray 公眾號 cli robot lan 圖靈機器人 (第三方接口) 使用httpclientUtils工具類請求 #圖靈機器人 請求接口json數據 { "reqType":0, "perc

公眾開發-java 騰訊課堂(自定義菜單 菜單點擊事件)

文字 bubuko pid json格式 實體類 第三方接口 推送 sos 標題 接口調用請求說明 http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=A

哪個公眾客服系統好用都有什麼功能?

現在越來越多的企業都投入微信營銷的大軍中,而創立微信公眾號成為大家的首選,但是想要輕鬆玩轉公眾號也不是那麼容易的,除了我們常遇到的吸粉難、粉絲轉化率低等問題,還跟微信服務號的客服功能比較薄弱有關,那麼要怎麼改善這種情況呢? 在這裡給大家推薦一款第三方客服系統-魚

java 公眾支付demo 企業支付到個人使用者、公眾企業付款到個人零錢提現到零錢

微信提現到零錢(微信內部交易,不需要手續費)價格格式錯誤:可能是價格經過計算後.doubleValue了一下 最後價格是 200.00 企業付款簽名錯誤:和支付的時候簽名的引數有出入(搞了半天,最後到看了一段php程式碼後做了一下調整。OK了) 參考PHP部落格:http:

公眾對接淘寶客系統淘口令解析

現在大家做淘寶客公眾號的比較多,最近也是開發了淘寶客系統,解析淘口令也算是比較煩心的一件事了。直接上思路+程式碼,不囉嗦。 首先我們判斷,使用者傳送的訊息中是否含有https://m.tb.cn,一般淘口令複製出來都是這個連結 if( Content.indexOf("https://m

公眾文章怎麽精準群發給指定用戶?

分享圖片 有時 導航 老板 log 展現 頁面 term 之前 微信公眾號文章一般默認是全體群發狀態,但如果想要把內容只展現給一部分用戶呢?其實很簡單,只需要根據之前設定好的標簽來群發就可以了,不過當然是你的標簽分類要簡潔合理,具體操作如下: 1、進入微信公眾平臺,左邊導航

玩玩公眾Java之二:接收、處理及返回消息

log med iou set arch weixin b- rom data- 前面已經配置了微信服務器,那麽先開始最簡單的接收微信消息吧~ 可以用我們的微信號來直接進行測試,下面先看測試效果圖: 這是最基本的文本消息的接收、處理及返回,來看看是怎麽實現的

php公眾支付接口開發demo

targe param pre space secret 修改 pen host field 本支付接口使用Yii2框架,所以控制器的格式都是該框架的,不過放到其他框架都差不多,根據對應的規則修改一下控制器的方法名字就行了,親測有效,比較簡單,沒有封裝,想了解微信支付實現

php公眾開發三公牛牛房卡平臺搭建使用php7要註意的地方

mar shadow 公眾號開發 jpg oss 文檔 微信公眾號開發 dem proc 開啟微信公眾號開發三公牛牛房卡平臺搭建網站(h5.fanshubbs.com聯系Q1687054422),從微信開發文檔中下載demo 如下載php示例代碼 示例代碼中是使用“$GL

PHP 公眾開發 - 消息

function mic req ade appid encode enc pub cnblogs 項目微信公眾號開發,需要做用戶消息推送,記錄下來以便日後使用 1,接上一篇文章,可以查看如何獲取用戶openid   PHP 微信公眾號開發 - 獲取用戶信息 2,添加模板消

PHP實現發模板消息到公眾

模板消息 red 這一 技術 template 公眾 rem out 開發 簡述:在這裏會具體講述到如何實現:如何通過後臺的代碼來實現發送模板消息到已經關註了“心想”公眾號的用戶。   (本人新手,目前實習中,我的所有文檔都是在自己開發過程中的記錄,有些言語跟我的項目有關請

php篇二 之公眾開發

mps timestamp brush ack article time curl lB -m 博主提示玩微信公眾號必須要有自己的服務器,其次有自己的微信公眾平臺,將自己的token保存在開發者模式中,將代碼上傳到服務器中,並且保存在開發者模式中。代碼類似如下 <?