php简陋版实现微信公众号主动推送消息

推荐一个网站
www.itziy.com csdn免积分下载器、pudn免积分下载器、51cto免积分下载器
www.verypan.com 百度网盘搜索引擎
www.94cto.com 编程相关视频教程、电子书、源码、开发工具、文档手册
模拟登录微信公共平台,实现主动信息发送;

突破订阅号一天只能发送一条信息的限制。

使用编码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; // 返回数据
    }
}

  

时间: 2024-10-11 21:45:45

php简陋版实现微信公众号主动推送消息的相关文章

微信公众号之推送消息

首先进入网站: 微信公众号 2.输入账号密码(微信或QQ皆可) 没有注册的先注册,OK 注意一个问题,选好任意一种类型以后,不能修改,千万注意 3.群发功能以及推送完就行了.

如何在微信服务号每天推送消息?

公众号粉丝48小时内不断推送信息,如何设置,我看别人一天给我发了十几次信息 #微号帮平台48小时信息推送,实现微信服务号每天推送消息 原文地址:https://blog.51cto.com/14397880/2418160

微信公众号接收推送

因为需要一个新的公众平台,所以又去弄了一个.照着以前的那个公众号对上去的.注册公众号的时候,有些域名填写,就写一级域名,只有那些接收网址需要精确的. 因为使用三方授权,所以呢,公众号本身的信息推送,有些忘记了.其功能开启就是在下图中的位置里面.在做的时候,一直没接收到信息推送,一直以为是因为和另外一个公众号冲突(因为所用的域名是同一个),还以为信息推送错了. 改了图文素材的图片,结果微信那边回复的,仍然是以前的图片信息,这就造成了错觉.后来,还是修改了发送的文字内容,才断定,推送信息没有问题,而

微信批量关注公众号,推送消息软件介绍

主要功能:批量导入采集好的公众号ID,批量自动关注,关注之后自动推送设置好的消息,可实现多次循环推消息,无需人工看守,手机自动操作.有问题联系扣402090644

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler

(转)移动端主动推送消息原理

转:https://www.zhihu.com/question/19628406/answer/77205019 一.服务端主动推送消息到客户端过程 作者:谢泽帆   李琰链接:https://www.zhihu.com/question/24938934/answer/85359794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 服务端主动推送到客户端是怎么一个过程 目前服务端给客户端推送,普遍做法是客户端与服务端维持一个长连接,客户端定时向服务端发送心跳以

微信公众号开发教程[005]-消息管理-消息加解密

一.配置公众号消息加解密方式 在公众号官方管理后台->开发->基本配置->修改配置上有3种方式,如下: 其中,EncodingAESKey可以随机生成. 加解密方式说明: 1).明文模式:微信服务器向公众号服务器(即我们要处理的http://szuzsq.tunnel.qydev.com/weixin/index.php)发送的xml结构是原始的,没有加密.如下: <xml> <ToUserName><![CDATA[gh_733c42e0aee9]]>

微信公众号开发教程[003]-消息管理-接收消息

当微信用户向公众号发送消息时,微信服务器会向公众号配置的服务器URL地址发送请求,并将相关内容包装成一定格式的xml发送到这个服务器;响应时,这个服务器只要回复特定格式的xml字符串给微信服务器,微信服务器即可向微信用户的客户端转发这条回复消息.(假设公众号开发模式已开启,以后的教程,如果没有特别说明,都是如此).如下图: 例如,文本消息的xml结构如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> &

Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有(如图): 附上解析xml类的依赖: 1 <!-- dom对象读取写入xml文件 --> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId>dom4j</artifactId>