腾讯过于坑爹,看起来叫开放平台,其实有很多限制,为了实现某些功能,本人也只好铤而走险,从此踏上了模拟登陆的不归路,百度了无数的网页,不过由于腾讯的不停调整,那些代码都已经失效了,看过了不少风格迥异的代码,渐渐有了清晰的思路,在这里以微信公众平台为例写一篇思路详细的模拟登陆技术文章,希望可以让后来者少走弯路,这些代码实在各位大神的代码基础上修改完成的,其实也要感谢微信公众平台的加密并没弄得很复杂,要不然还真搞不定。

先来介绍浏览器浏览网页的大致原理,浏览器发送一段请求给服务器,服务器收到请求后,发送网页给浏览器,浏览器记下Cookie,并解析网页,最后展示给电脑前的你。所以所谓的模拟登陆就是模仿浏览器向服务器骗取信息。

首先打开mp.weixin.qq.com进入微信公众平台首页,按下F12调出开发者工具,(IE的优势更体现在这里,真心觉得ie的开发者工具很强大,而且再装个HttpWatch插件就无敌了),这里以遨游为例(因为简单),按下f12,进入源代码选项,打开按ctrl+O选择名字为wxm2-loginform1ec5f7.js的源代码,

然后找到这段代码

[javascript] viewplaincopy
  1. t.post("/cgi-bin/login?lang=zh_CN", {"font-family: Arial, Helvetica, sans-serif;">username: e.account,pwd: t.md5(e.password.substr(0, 16)),imgcode: c.data("isHide") ? "" : e.verify,f: "json"}

这段就是登陆的时候用来提交账号和密码用的,username就是用户名,pwd就是密码,而且使用MD5加密过的,imgcode就是验证码,不过由于只要账号密码正确,就不需要输入验证码,接下来就是把这段东西稍作处理发给微信服务器就能登陆了。

[php] viewplaincopy
  1. function cookie(){
  2. $post['username']=$this->username;             //账号,这个是类的成员,具体声明见完整的源代码,后面的也是
  3. $post['pwd']=md5($this->password);              //密码
  4. $post['f']='json';
  5. $post['imgcode']='';
  6. $login_url = 'https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN';    //见下文解释
  7. $cookie_file = tempnam('./temp','cookie');                           //设置cookie保存地址
  8. $ch = curl_init($login_url);                                         //php是curl技术,需要服务器支持(新浪sae支持这个技术)
  9. curl_setopt($ch,CURLOPT_REFERER,'https://mp.weixin.qq.com/');        //跳转地址,见下文
  10. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5');                                                                       //浏览器代理,可以理解为模仿某种浏览器向服务器发送消息
  11. curl_setopt($ch, CURLOPT_HEADER, 0);                                //不注释的大家可以自行百度,我个人没他们讲的专业
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  13. curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
  14. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  15. curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
  16. curl_setopt($ch, CURLOPT_POST, 1);
  17. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);                         //这里就是提交账号密码的地方
  18. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);                   //cookie
  19. $contents = curl_exec($ch);
[php] viewplaincopy
  1. preg_match('/[\?\&]token=(\d+)"/',$contents,$t);       //这个是正则表达式,具体用法我也不是很熟悉,可参照网上的语法规则和检测工具来验证自己                                               // 写的正不正确,这里是为了从刚才返回的信息中吧token的值抠出来
  2. self::$token=$t[1];
  3. curl_close($ch);                                         //其实到这里模拟登陆就已经结束了,不过不搞搞其他东西就一点也不好玩
  4. $cookie_wenjain = file_get_contents($cookie_file);
  5. $cookie_wenjain = str_replace("\n","",$cookie_wenjain);
  6. $cookie_wenjain = str_replace("\t","",$cookie_wenjain);
  7. $cookie_wenjain = str_replace("\r","",$cookie_wenjain);
  8. preg_match_all('/data_bizuin(.*)mp/isU',$cookie_wenjain,$slave_user_lists);
  9. $data_bizuin = $slave_user_lists[1][0];
  10. preg_match_all('/data_ticket(.*)mp/isU',$cookie_wenjain,$slave_user_lists);
  11. $data_ticket = $slave_user_lists[1][0];
  12. preg_match_all('/slave_user(.*)mp/isU',$cookie_wenjain,$slave_user_lists);
  13. $slave_user = $slave_user_lists[1][0];
  14. preg_match_all('/slave_sid(.*)=/isU',$cookie_wenjain,$slave_sid_lists);
  15. $slave_sid = $slave_sid_lists[1][0];
  16. $cookie = "data_ticket=".$data_ticket.";data_bizuin=".$data_bizuin.";slave_user=".$slave_user.";slave_sid=".$slave_sid."=";
  17. unlink($cookie_file);
  18. self::$cookie = str_replace("#HttpOnly_","",$cookie);//将信息保存在$cookie里
  19. }

接下来讲解上面的$login_url和refer网址是怎么找出来的了,进入开发者工具网络选项卡,然后在微信网页上用错误的密码登陆,找到post的那条信息,   

那个请求url和refer就分别对应上面的两项,因为当初那个大神的代码上refer是另一个网址,因此我不禁怀疑是不是因为我没有登录,跳转的网页才不正确,可是如果登陆了,浏览器就调到另一个网页上去了,那些监控的信息就会被清空,这个时候就要靠HttpWatch,它可以记录所有的信息,这次正常登陆,结果显示这个refer是正确的, 

之所以与大神不同可能是,腾讯的调整或者refer根本就不是这么找的。接下来介绍怎么用这玩样发送信息,每个微信都有一个独一无二的fakeid,微信公众平台就是根据这个来给大家发送信息的,所以我们就来搜集所有收听者的fakeid,

[php] viewplaincopy
  1. function getUserFakeid()
  2. {
  3. //ini_set('max_execution_time',600);
  4. //$pageSize = 1000000;
  5. //$this->referer = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=".self::$token;
  6. //$url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize={$pageSize}&pageidx=0&type=0&groupid=0&t//oken=".self::$token."&lang=zh_CN";
  7. //$user = $this->vget($url);
  8. //$preg = "/\"id\":(\d+),\"name\"/";
  9. //preg_match_all($preg,$user,$b);
  10. //$i = 0;
  11. //foreach($b[1] as $v){
  12. //$url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize=10&pageidx=0&type=0&groupid='//.$v.'&token='.$this->token.'&lang=zh_CN';
  13. $j=1;$page=15;//因为对代码进行了不小的修改,上面那些有些利用价值的注释就不删了,上面可以获取订阅者的分组信息,以便搜集到所有的fakeid,以下                             是以默认分组进行举例
  14. //$mysql = new SaeMysql();           //这个是新浪sae的mysql,因为大家也许都不用就把它注释掉了,如果需要可解除注释
  15. for($i=0;$i<=$page;$i++)                 //$page表示页码,这个页码我没找到,所以大家可以根据自己的实际情况尽量设得大一点
  16. {                                       //$i表示当前页码
  17. $url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize=10&pageidx='.$i.'&type=0&groupid=0&token='.self::$token.'&lang=zh_CN';
  18. $header = array(                     //这个头后面讲解
  19. 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*
  20. $info[$j]=array("id"=>$a[1][$i],"name"=>$a[2][$i]);
  21. $j++;
  22. }
  23. }
  24. echo "完毕";
  25. return  $info;
  26. }

正常登陆以后,在开发者工具的网络选项中找到与浏览器地址栏中类似的那一项

请求url和请求Http报头就是上面的$url和$header,因为cookie要另行设置,所以把cookie那项删掉

那个正则表达式部分很坑爹,首先是要在茫茫文件中人工找fakeid到底是在哪个地方,最后还是找到了,首先打开总用户数的网页,然后查看源代码,在最底下(看到最后终于找到了,内牛满面)找到所有有用信息,接下来就是用正则表达式把这些信息整理成数组(具体用法还是麻烦各位百度,我也花了好多时间才看懂,也讲不明白),id是fakeid

nick_name是昵称

[javascript] viewplaincopy
  1. "text/javascript">
  2. wx.cgiData={
  3. isVerifyOn: "0"*1,
  4. pageIdx : 0,
  5. pageCount : 9,
  6. pageSize : 10,
  7. groupsList : ({"groups":[{"id":0,"name":"默认组","cnt":90},{"id":1,"name":"屏蔽组","cnt":0},{"id":2,"name":"星标组","cnt":0},{"id":102,"name":"闲杂人等","cnt":0},{"id":103,"name":"队员","cnt":0}]}).groups,
  8. friendsList : ({"contacts":[{"id":1068263504,"nick_name":"Livia","remark_name":"","group_id":0},{"id":1584342404,"nick_name":"王立敏","remark_name":"","group_id":0},{"id":460078235,"nick_name":"零距离-思念","remark_name":"","group_id":0},{"id":2454542763,"nick_name":"徐仁达","remark_name":"","group_id":0},{"id":1484309520,"nick_name":"水蒸气","remark_name":"","group_id":0},{"id":2988121915,"nick_name":"凝烟","remark_name":"","group_id":0},{"id":2340551701,"nick_name":"W、","remark_name":"","group_id":0},{"id":2880414606,"nick_name":"快乐天使","remark_name":"","group_id":0},{"id":1699244625,"nick_name":"心若动则万痛","remark_name":"","group_id":0},{"id":2697365613,"nick_name":"掌上大学","remark_name":"","group_id":0}]}).contacts,
  9. currentGroupId : "0" * 1,
  10. type : "0" * 1 || 0,
  11. userRole : '1' * 1,
  12. verifyMsgCount : '0' * 1,
  13. totalCount : '90' * 1
  14. };
  15. seajs.use("user/index");

最后就是发送信息的函数

[php] viewplaincopy
  1. function singlesendpage($content,$tofakeid){
  2. $url="https://mp.weixin.qq.com/cgi-bin/singlesend";
  3. $ch=curl_init($url);
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  5. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
  6. curl_setopt($ch, CURLOPT_COOKIE, self::$cookie);
  7. curl_setopt($ch,CURLOPT_REFERER,'https://mp.weixin.qq.com/cgi-bin/message?t=message/list&count=20&day=7&token='.self::$token.'&lang=zh_CN');
  8. curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0');
  9. curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
  10. $post['random']=rand(1,999999999999999)/10000000000000000;
  11. $post['lang']='zh_CN';
  12. $post['type'] =1;
  13. $post['content']=$content;
  14. $post['tofakeid']=$tofakeid;
  15. $post['imgcode']='';
  16. $post['token']=self::$token;
  17. $post['f'] =json;
  18. $post['ajax'] =1;
  19. $post['t']="ajax-response";
  20. curl_setopt($ch,CURLOPT_POST,1);
  21. curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
  22. $html=curl_exec($ch);
  23. curl_close($ch);
  24. $html_json = json_decode($html);
  25. if($html_json->base_resp->ret == 0){
  26. return true;
  27. }else{
  28. return false;
  29. }
  30. }                                                             //这个用上面的方法分析就可以了,不过因为是模拟登陆,无法突破腾//讯的订阅者48小时内不跟你联系,你无法主动发送信息给它的限制,因此原先想突破每日一群发的限制的美梦破灭了

最后对这些函数进行调用就可以搞定了,本人也是初学者,有错之处还请指出,最后感谢《蜡笔小新》给我正能量,让我能搞定这个问题(这个代码排版真麻烦,修改了好多次)
下载地址: http://download.csdn.net/detail/wlmnzf/7614073

微信公众平台模拟登陆和发送消息详解相关推荐

  1. Python3 微信公众平台模拟登陆 requests模拟请求

    声明此代码仅供技术交流学习,擅自用于其他,一切后果与本人无关 目标网址: https://mp.weixin.qq.com/ 所谓模拟登陆,就是自己模拟构造请求发送给服务器,然后服务器返回认证的信息过 ...

  2. 微信公众平台模拟登录自动群发图文消息工具包

    无需微信认证即可实现微信公众号自动群发图文消息. 使用 npm i wechat-mp-hack --save const Wechat = require('wechat-mp-hack'); co ...

  3. 微信公众账户模拟登陆后的一系列操作

    <?php header("content-type:text/html;charset=utf-8");/*** wx_mass* * 完成微信公众账户模拟登陆后的一系列操 ...

  4. 微信公众平台开发(十) 消息回复总结

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  5. 微信公众平台开发(10) 消息回复总结

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  6. 微信公众平台开发(26) 消息回复总结

    原文: http://www.cnblogs.com/imaker/p/5491433.html 一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将 ...

  7. 微信公众平台开发(十) 消息回复总结——用其xml模板

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  8. 关于微信公众平台模拟登录(无源码)

    为什么80%的码农都做不了架构师?>>>    写于2015年7月7日的话:这个模拟的问题我很久没研究了(2年了),都不知道微信公众号的网站有没有修改过,研究这个我感觉最大的作用就是 ...

  9. java推送微信消息换行_微信公众平台开发教程之文本消息如何换行(第十二课)

    上两节课介绍了微信公众平台开发工具类的开发,这节课呢就用到了,没有读前两节课程的读者建议看前两节课程,当然你可以可以去下载实例代码直接运行 . 使用"\n"换行 回复用户的文本消息 ...

最新文章

  1. ping 丢包 网络摄像头_视频监控系统的摄像头掉线看交换机连接注意事项
  2. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
  3. mac mysql utf 8编码_MacOS下MySQL设置UTF8编码问题
  4. 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)
  5. Swift语言中如何使用JSON数据教程
  6. 【原】网页程序学习Linux利器-----jsuix
  7. 万字长文带你一览ICLR2020最新Transformers进展(下)
  8. Linux字符界面和图形界面
  9. Android学习四、Android中的Adapter
  10. 关于微信浏览器H5 React,Vue工程化项目input无法自动聚焦疑难杂症排查
  11. sql注入空格被过滤_网站渗透:SQL注入与WAF绕过思路分享
  12. Flutter 中的国际化之多语言环境
  13. 中文信息处理——语料划分测试集与训练集
  14. C#按Esc后退出对话框
  15. Java初学者笔记五:泛型处理
  16. 华为平板 鸿蒙2.0,华为鸿蒙2.0支持型号有哪些
  17. CentOS 7下载及安装教程
  18. 相关性分析和假设检验
  19. Ubuntu 更改鼠标滚轮速度
  20. CONCAT不是可以识别的内置函数名称。

热门文章

  1. 报错“/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libopencv_video.so.3.2 is not a symbolic link“
  2. matlab中有没有谱聚类,matlab – 谱聚类
  3. 拿下618,京东祭出AI备战双11
  4. vue 过滤器做字数限制并显示省略号
  5. login主页面+接口+依赖
  6. 手把手教你申请计算机软件著作权(5)——— 信息补充(必看)
  7. 二级c语言百度云,全国计算机二级C语言历年真题完整版.pdf
  8. Coinversation Protocol (铸币协议)简版白皮书及网站
  9. Qt编写安防视频监控系统26-硬件加速
  10. 论文阅读 点云动态图卷积(DGCNN)