能够自动发布文章的自动采集器(一个公众号历史消息页采集的方法整理以后写下来)

优采云 发布时间: 2021-12-14 18:23

  能够自动发布文章的自动采集器(一个公众号历史消息页采集的方法整理以后写下来)

  2014年开始做微信公众号内容的批量采集,最初的目的是为了制作html5垃圾邮件网站。当时,垃圾站采集到达的微信公众号内容很容易在公众号传播。那个时候采集的批次特别好,采集的入口就是公众号的历史新闻页面。今天这个条目还是一样,但是越来越难采集。采集的方法也更新了很多版本。后来,在2015年,html5垃圾站停止工作。取而代之的是,采集的目标是针对本地新闻资讯公众号,前端展示变成了一个app。因此,一个可以自动< @采集 公众号内容已创建。曾经担心微信技术升级一天后,采集的内容不可用,个人新闻APP会失效。但是随着微信的不断技术升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天决定整理一下采集的方法,写下来。个人方法来源于很多同事的分享精神,所以我会延续这种精神,分享我个人的成果。php 个人新闻应用程序将失败。但是随着微信的不断技术升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天决定整理一下采集的方法,写下来。个人方法来源于很多同事的分享精神,所以我会延续这种精神,分享我个人的成果。php 个人新闻应用程序将失败。但是随着微信的不断技术升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天决定整理一下采集的方法,写下来。个人方法来源于很多同事的分享精神,所以我会延续这种精神,分享我个人的成果。php 方法并写下来。个人方法来源于很多同事的分享精神,所以我会延续这种精神,分享我个人的成果。php 方法并写下来。个人方法来源于很多同事的分享精神,所以我会延续这种精神,分享我个人的成果。php

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

  首先我们来看一个微信公众号历史消息页面的连接地址:前端

  http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5MzczNjY2NA==&uin=NzM4MTk1ODgx&key=9ed31d4918c154c8e04cb95d0b28d07ae8eda2ba29a25f538d06adfa060e5d7d42a1427e8f9cfb6a4c3ecc0903a1a9ab87d1471e43705a8b04e1a796612405546f901ec1e4ea662122bb9235f4dfea4d&devicetype=android-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=iyVknv0cBEc1Z8oR4zVs%2BkLeRwYtW5bbtL4Tj9bm%2FwgjP%2BsobV6en3WohWUOllUU&wx_header=1

  有几个参数:html5

  __biz;uin=;key=;devicetype=;version=;lang=;nettype=;ascene=;pass_ticket=;wx_header=;node

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

  __biz 是类似公众号的 id 参数。每个公众号都有一个微信。目前公众号的业务发生变化的可能性很小;安卓

  其余 3 个参数与用户的 id 和 token 票证相关。这3个参数的值只能由微信客户端生成。因此,我们认为采集公众号必须通过微信客户端。在之前的微信版本中,这3个参数也可以一次性获取,在有效期内使用多个公众号。在今天的版本中,每次访问公众号时都会更改参数值。ios

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

  个人采集系统由以下几部分组成:

  一、 微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。通过ios实测,批量采集进程中微信客户端的崩溃率高于Android系统。为了降低成本,我使用了Android模拟器。sql

  

  二、一个微信账号:对于采集的内容,不仅需要微信客户端,还需要一个专用于采集的微信账号,因为这个微信账号不能做其他事情了。

  三、本地代理服务器系统:目前使用的方法是通过Anyproxy代理服务器将公众账号历史消息页面中的文章列表发送到自己的服务器。具体的安装方法后面会详细介绍。

  四、文章列表分析入库系统:本人使用php语言编写,下篇文章将详细介绍如何分析文章列表并创建采集队列实现批量采集内容。

  步

  1、 安装模拟器或使用手机安装微信客户端应用,申请微信账号并登录应用。这个我就不多介绍了,大家会的。

  2、代理服务器系统安装

  目前我使用 Anyproxy,AnyProxy。该软件的特点是能够获取https连接的内容。2016年初,微信公众号和微信文章开始使用https连接。而Anyproxy可以通过修改规则配置,在公众号页面插入脚本代码。下面将介绍安装和配置过程。

  一、安装NodeJS

  二、 在命令行或终端运行npm install -g anyproxy,必须在mac系统中加入sudo;

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

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

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

  方法一:启动anyproxy,打开浏览器:8002/fetchCr...,即可得到rootCA.crt文件

  方法二:启动anyproxy,:8002/qr_root可以获取认证路径的二维码,手机安装会更方便

  建议通过二维码将证书安装到手机中。

  六、设置代理:安卓模拟器的代理服务器地址是wifi连接的网关。通过dhcp设置为static后就可以看到网关地址了。看完后不要忘记再次将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;

  

  现在打开微信,点击任意公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。

  

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

  

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

  

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

  现在我们手机里的所有内容都可以明文通过代理服务器了。接下来,我们需要修改代理服务器的配置,以便获取公众号的内容。

  1、找到配置文件:

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

  2、修改文件rule_default.js

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

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

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

if(/mp\/getmasssendmsg/i.test(req.url)){//当连接地址为公众号历史消息页面时

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

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

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

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

var http = require('http');

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

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

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

})

});

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

try {

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

if (json.general_msg_list != []) {

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

}

}catch(e){

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

}

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

}

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

try {

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

}catch(e){

}

callback(serverResData);

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

try {

var http = require('http');

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

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

callback(chunk+serverResData);

})

});

}catch(e){

callback(serverResData);

}

}else{

callback(serverResData);

}

},

  上面的代码是使用anyproxy修改返回页面内容的功能,向页面注入脚本,将页面内容发送到服务器。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:

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

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

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

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

  replaceRequestOption : function(req,option){

var newOption = option;

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

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

newOption.port = "80";

}

return newOption;

},

  以上是对anyproxy规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果启动时报错,大部分程序没有干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。还是那句话windows command,不熟还请见谅。

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

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

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

<p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线