php簡陋版實作微信公眾號主動推播訊息
模擬登入微信公共平台,實現主動訊息發送;
突破訂閱號一天只能發送一條訊息的限制。
使用編碼UTF-8
代碼位址:https://github.com/itziy/wechat
使用方法:
$arr = array( 'account' => '公眾平台帳號', 'password' => '密碼' );
$w = new Weixin($arr);
//$w->getAllUserInfo();//取得所有使用者資訊
$w->getUserInfo($groupid, $fakeid);//取得單一使用者的信息,如果是預設群組,則$groupid傳0
$w->sendMessage('群發內容'); //群發給所有使用者
$w->sendMessage('群發內容',$ userId); //群發給特定用戶,這裡的userId是fakeid
本實例僅供參考,由此引發的法律風險,本人概不負責。謝謝。
<?php /* 调用方式简单说明: $arr = array( 'account' => '公众平台帐号', 'password' => '密码' ); $w = new Weixin($arr); $w->getAllUserInfo();//获取所有用户信息 $w->getUserInfo($groupid, $fakeid);//获取所有用户信息,如果默认分组,则$groupid传0 $w->sendMessage('群发内容'); //群发给所有用户 $w->sendMessage('群发内容',$userId); //群发给特定用户,这里的$userId就是用户的fakeid,数组方式传递 */ 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)); 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); $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; // 返回数据 } }

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

GitHub是開發者發現、分享和貢獻代碼的首選平台。 1)通過搜索功能查找特定代碼庫,如Python項目。 2)創建倉庫並推送代碼分享給全球開發者。 3)通過Fork和PullRequest參與開源項目並貢獻代碼。

SublimeTextSnippets是一種預定義的代碼模板,通過快捷鍵或觸發詞快速插入代碼,提升編程效率。 1.創建Snippets:基於XML格式,存儲在.sublime-snippet文件中。 2.使用示例:輸入觸發詞如"def"或"html5"並按Tab鍵,自動生成代碼結構。 3.避免錯誤:確保觸發詞獨特,設置正確作用域,保持XML格式正確。

玩家在地平線2西之絕境中進行遊戲時,在第十個主線任務「迴聲的搖籃」中需要檢查控制台並輸入代碼,有很多玩家不知道代碼是什麼,控制台代碼為237。地平線2西之絕境迴聲的搖籃代碼分享答:237。1、控制台會用236來迷惑玩家,實際上真正需要的是隱藏編號237。2、代碼可以從【呼救信號】數據點中找到,在與控制台互動時瓦爾也會指出這一點。 3、輸入錯誤將會得到空的容器。 4.接觸木板-筆記本-數據點-文字資料點-任務-呼救訊號,最後可以看到237顯示在座標的下方位置。

商城物流介面程式碼分享:PHP技術實現快速列印運單功能!隨著電子商務的快速發展,商城物流成為了電商平台不可或缺的一部分。對商家來說,一個高效率的物流系統能夠提升使用者購物體驗,增加使用者黏性,進而帶來更多的銷售機會。而在實現快速列印運單功能方面,PHP技術能夠發揮強大的優勢。 PHP作為一種開源、免費的腳本語言,在網站開發和應用開發中被廣泛應用。它具有語法簡單、易

SublimeText的代碼片段功能可通過預設模板提升編碼效率。具體步驟為:1.通過Tools>Developer>NewSnippet…創建新片段,替換模板中的佔位符並保存至默認文件夾;2.在代碼中使用觸發詞加Tab鍵快速插入常用結構,如輸入htmlbase即可生成HTML5基礎框架;3.可在片段中添加變量和占位符,例如定義JavaScript函數模板時設置${1:functionName}、${2:arguments}等標記以實現快速定制;4.用戶自定義片段默認存儲於Packag

使用SublimeText的代码片段功能可通过快捷触发词插入常用代码,显著提升编码效率。要创建自定义片段,请依次执行以下步骤:1.点击Tools>Developer>NewSnippet…;2.在模板中定义内容和触发词;3.将其保存为Packages/User文件夹中的.sublime-snippet文件。例如,输入divc后按Tab键可插入带有类和内容占位符的HTMLdiv标签。此外,可通过打开命令面板(Ctrl Shift P)并输入“InsertSnippet”查看当前文件类型

在VSCode中快速调用内置代码片段的方法是输入触发词后按Tab键,如输入for或clg;可通过命令面板输入“InsertSnippet”查看当前语言支持的片段;添加自定义代码片段需打开用户代码片段设置,选择语言后编辑JSON文件添加新模板;可使用GitHub账号同步设置以实现跨设备共享代码片段;掌握这些技巧能显著提升编码效率。

使用內置代碼片段:在對應語言文件中輸入觸發詞(如JavaScript中輸入for後按Tab鍵生成for循環,HTML中輸入!後按Tab生成HTML5模板),通過IntelliSense中的拼圖圖標識別可用片段;2.創建自定義片段:通過命令面板(Ctrl Shift P或Cmd Shift P)選擇“配置用戶代碼片段”,可創建全局或特定語言的片段,在打開的JSON文件中定義名稱、前綴、內容和描述;3.片段結構包含prefix(觸發詞)、body(插入代碼,使用$1、$2等表示跳轉點,$0為最終位置
