采集文章系统(微信公众号历史消息页的采集方法整理之后写下来)

优采云 发布时间: 2022-01-10 10:17

  采集文章系统(微信公众号历史消息页的采集方法整理之后写下来)

  我从2014年开始做微信公众号内容采集的批次,最初的目的是做一个html5垃圾邮件网站。当时垃圾站采集收到的微信公众号内容很容易在公众号中传播。那个时候批量采集很容易做,采集入口就是公众号的历史新闻页面。这个条目到今天还是一样,只是越来越难了采集。采集 的方法也更新了很多版本。后来在2015年,html5垃圾站不再做,转而将采集定位为本地新闻资讯公众号,前端展示做成app。因此,一个可以自动采集 公众号内容形成。我曾经担心有一天,微信技术升级后,它无法采集内容,我的新闻应用程序会失败。不过随着微信的不断技术升级,采集方式也升级了,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集到内容。所以今天决定整理一下采集方法,写下来。我的方法来源于很多同事的分享精神,所以我会延续这种精神,分享我的成果。随着微信的不断技术升级,采集方式也不断升级,让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集到内容。所以今天决定整理一下采集方法,写下来。我的方法来源于很多同事的分享精神,所以我会延续这种精神,分享我的成果。随着微信的不断技术升级,采集方式也不断升级,让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集到内容。所以今天决定整理一下采集方法,写下来。我的方法来源于很多同事的分享精神,所以我会延续这种精神,分享我的成果。

  本文文章会持续更新,保证您看到的内容在您看到的时候可用。

  1http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5MzczNjY2NA==#wechat_webview_type=1&wechat_redirect

2

3

  =========2017 年 1 月 11 日更新==========

  现在,根据不同的微信个人号,会有两个不同的历史消息页面地址。以下是另一个历史消息页面的地址。第一个地址的链接在anyproxy中会显示302跳转:

  1https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3NDk5MjYzNg==&scene=124#wechat_redirect

2

3

  第一个链接地址的页面样式:

  

  第二个链接地址的页面样式:

  

  根据目前掌握的信息,这两种页面形式在不同的微信账号中不规则出现。有的微信账号总是第一页格式,有的总是第二页格式。

  1//第一种链接

2http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5NTM1NjczMw==&uin=NzM4MTk1ODgx&key=a226a081696afed0d9dfa0972fa431e116e5c4572ce52343178ad4e9a2b94aeaad6ac4dd87de3e56f72209a73a32e9cc2052f68aca4884e36cf726e99f2671630c741d8e4c29abe4a049d1a71eeb2be5&devicetype=android-17&version=2605033c&lang=zh_CN&nettype=WIFI&ascene=1&pass_ticket=zbA7PswOPKySRpyEYI5kDCjRiljxcpzdbTuVMauFGemgdp8R1DY1uQY49srehWab&wx_header=1

3//第二种

4http://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3NDk5MjYzNg==&scene=124&uin=NzM4MTk1ODgx&key=5134ab1cc362a0324183dbd55a2680d11ccbaa34cdb349ee9be58f5b666092ddb17adf8a88dc788831923f3c6087547d651f04209f72334d511c9e118a3800d7b05a324a38903f79cff940cf749ecd5a&devicetype=android-17&version=2605033c&lang=zh_CN&nettype=WIFI&a8scene=3&pass_ticket=Fo3zjtJcbPfijNHKUIQbV%2BeHsAqhbjJCwzTfV48u%2FCZRRGTmI8oqmHDxxfEL8ke%2B&wx_header=1

5

6

  这个地址是通过微信客户端打开历史消息页面,然后使用后面介绍的代理服务器软件获得的。这里有几个参数:

  action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;

  重要的参数是:__biz;uin=;key=;pass_ticket=; 这四个参数。

  我现在使用的方法只需要注意__biz参数即可。

  我的 采集 系统由以下部分组成:

  1、微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。经测试,在批处理采集过程中,ios微信客户端的崩溃率高于安卓系统。为了降低成本,我使用的是安卓模拟器。

  

  2、个人微信账号:采集的内容,不仅需要微信客户端,采集还需要个人微信账号,因为这个微信账号不能做其他事情。

  4、文章列表分析入库系统:我用php语言写的,我会详细介绍如何分析文章列表和构建采集队列实现批量< @采集内容。

  步

  一、安装模拟器或者用手机安装微信客户端app,申请微信个人账号并登录app。这个我就不多说了,大家都会的。

  二、代理服务器系统安装

  1、安装 NodeJS

  2、在命令行或者终端运行npm install -g anyproxy,mac系统需要添加sudo;

  3、生成RootCA,https需要这个证书:运行命令sudo anyproxy --root(windows可能不需要sudo);

  4、启动anyproxy并运行命令:sudo anyproxy -i; 参数 -i 表示解析 HTTPS;

  5、安装证书,在手机或者安卓模拟器中安装证书:

  6、设置代理:Android模拟器的代理服务器地址是wifi链接的网关。将dhcp设置为static后可以看到网关地址。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器的默认端口是8001;

  

  现在打开浏览器地址:8002可以看到anyproxy的网页界面。从微信点击一个历史消息页面,然后查看浏览器的网页界面,历史消息页面的地址会滚动。

  

  /mp/getmasssendmsg 开头的网址是微信历史消息页面。左边的小锁表示页面是https加密的。现在让我们点击这一行;

  =========2017 年 1 月 11 日更新==========

  一些以/mp/getmasssendmsg开头的微信网址会有302跳转,跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址查看内容。

  

  如果右边出现html文件的内容,则解密成功。如果没有内容,请检查anyproxy的运行模式是否有参数i,是否生成了ca证书,手机上是否正确安装了证书。

  一、找到配置文件:

  mac系统中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道的请见谅。应该可以根据类似mac的文件夹地址找到这个目录。

  二、修改文件rule_default.js

  找到replaceServerResDataAsync: function(req,res,serverResData,callback) 函数

  修改函数内容(请详细阅读注释,这里只是原理介绍,了解后根据自己的情况修改内容):

  =========2017 年 1 月 11 日更新==========

  因为有两种页面形式,而且同一个页面形式总是显示在不同的微信账号中,但是为了兼容这两种页面形式,下面的代码会保留两种页面形式的判断,你也可以使用你的自己的页面表单删除li

  1replaceServerResDataAsync: function(req,res,serverResData,callback){

2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)

3 if(serverResData.toString() !== ""){

4 try {//防止报错退出程序

5 var reg = /msgList = (.*?);\r\n/;//定义历史消息正则匹配规则

6 var ret = reg.exec(serverResData.toString());//转换变量为string

7 HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器

8 var http = require('http');

9 http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。

10 res.on('data', function(chunk){

11 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来

12 })

13 });

14 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。

15 try {

16 var json = JSON.parse(serverResData.toString());

17 if (json.general_msg_list != []) {

18 HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器

19 }

20 }catch(e){

21 console.log(e);//错误捕捉

22 }

23 callback(serverResData);//直接返回第二页json内容

24 }

25 }

26 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)

27 try {

28 var reg = /var msgList = \'(.*?)\';\r\n/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)

29 var ret = reg.exec(serverResData.toString());//转换变量为string

30 HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器

31 var http = require('http');

32 http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。

33 res.on('data', function(chunk){

34 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来

35 })

36 });

37 }catch(e){

38 callback(serverResData);

39 }

40 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json

41 try {

42 var json = JSON.parse(serverResData.toString());

43 if (json.general_msg_list != []) {

44 HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器

45 }

46 }catch(e){

47 console.log(e);

48 }

49 callback(serverResData);

50 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时

51 try {

52 HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器

53 }catch(e){

54

55 }

56 callback(serverResData);

57 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)

58 try {

59 var http = require('http');

60 http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。

61 res.on('data', function(chunk){

62 callback(chunk+serverResData);

63 })

64 });

65 }catch(e){

66 callback(serverResData);

67 }

68 }else{

69 callback(serverResData);

70 }

71 },

72

73

  在 rule_default.js 文件的末尾添加以下代码:

  1function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名

2 var http = require('http');

3 var data = {

4 str: encodeURIComponent(str),

5 url: encodeURIComponent(url)

6 };

7 content = require('querystring').stringify(data);

8 var options = {

9 method: "POST",

10 host: "www.xxx.com",//注意没有http://,这是服务器的域名。

11 port: 80,

12 path: path,//接收程序的路径和文件名

13 headers: {

14 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',

15 "Content-Length": content.length

16 }

17 };

18 var req = http.request(options, function (res) {

19 res.setEncoding('utf8');

20 res.on('data', function (chunk) {

21 console.log('BODY: ' + chunk);

22 });

23 });

24 req.on('error', function (e) {

25 console.log('problem with request: ' + e.message);

26 });

27 req.write(content);

28 req.end();

29}

30

31

  以上是规则修改的主要部分。需要将json内容发送到自己的服务器,并从服务器获取跳转到下一页的地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php

  在详细介绍这4个php文件之前,为了提高采集系统性能,降低crash率,我们还可以做一些修改:

  Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:

  1replaceRequestOption : function(req,option){

2 var newOption = option;

3 if(/google/i.test(newOption.headers.host)){

4 newOption.hostname = "www.baidu.com";

5 newOption.port = "80";

6 }

7 return newOption;

8 },

9

10

  以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果启动报错,程序可能无法干净退出,端口被占用。此时输入命令ps -a查看被占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀死进程后,您可以启动anyproxy。或者windows的命令请原谅我不是很熟悉。

  接下来详细介绍服务器端接收程序的设计原理:

  (以下代码不能直接使用,只是介绍原理,部分需要根据自己的服务器数据库框架编写)

  1、getMsgJson.php:该程序负责接收历史消息的json,解析后存入数据库

<p>1

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线