【Java爬虫】接口模拟微信公众号登录,搜索公众号,获取公众号文章,java实现
hi
前言
最近想通过接口爬取微信公众号的文章,找到了获取文章的接口,但是要通过登录公众号后台获得cookie后才能调用。
所以想着能不能直接使用接口来获得登录后的cookie,看了很多文章,都没有现成高可用的,还有一些是很多年前的,那就自己借鉴并研究一下。
看过几篇用接口登录微信公众号后台的文章,一开始也想着一步到位,直接账号密码登陆不用扫码,也用js逆向出密码的加密算法了,但是调用登陆接口后还是需要扫码,就算普通的网页上账号密码登录后也还是需要扫码的,干脆直接不用账号密码,用扫码登录。
只学习用
【Java实战】
Java也能爬虫,直接上手。
项目地址:Java爬取公众号文章
实战介绍
前提是你得有一个公众号账号
- 用接口模拟公众号扫码登录,得到登录状态的cookie和token
- 有了登录状态就可以请求搜索公众号接口
- 选中公众号,查询该公众号发布的文章
技术栈
- Java
- OkHttp3
- Cookie管理
- Jackson
- Java awt包,用来显示二维码图片
- FutureTask 线程返回值
演示
得到二维码图片,手机端扫描

扫码确认,搜索公众号

搜索公众号下的文章列表

【原理】浏览器端公众号后台登录逻辑
想直接看实现的,根据目录跳过
1.打开公众号登录页面:https://mp.weixin.qq.com/
2.按F12打开调试,勾选Preserve log,表示页面刷新后保留日志
3.刷新页面,看Network里的XHR请求
4. 主要接口是这个,表单参数基本上固定,sessionid需要动态生成
这个接口返回很多cookie,如果是http请求框架,需要存储cookie
5.接下来看一下sessionid的生成方法,打开搜索
输入sessionid,找到了一个js文件,点击它
然后格式化代码
再输入sessionid,看找到的第一个,对比了其他,应该就是这里的实现了,很简单,时间戳加两位随机数
6.查看二维码图片链接,发现是拼接的,random参数是时间戳,其他参数固定,主要是要携带上面接口中返回的cookie,这些cookie贯穿整个登录流程
7.同时有一个接口一直在调用,来检查二维码的扫码状态,主要参数是status,看后续解释

【测试】用postman工具进行接口测试
上面摸透了公众号登录页面的逻辑,下面进行实践,先用postman来测试接口。
1. POST请求开始登录接口,初始化cookie
先post请求这个接口,得到cookie
打开postman的控制台,View -> Show Postman Console
POST请求地址
https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin
表单参数
userlang: zh_CN
redirect_url:
login_type: 3
sessionid: 161700241598412
token:
lang: zh_CN
f: json
ajax: 1
- sessionid 如上面所示:时间戳,加两位随机数,其他参数固定
new Date().getTime() + "" + Math.floor(100 * Math.random())
请求头
referer: https://mp.weixin.qq.com/
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
x-requested-with: XMLHttpRequest
postman请求如下

成功时返回
{
"base_resp": {
"err_msg": "ok",
"ret": 0
}
}
同时会返回很多cookie,打开请求日志可以看到,这些cookie贯穿登录流程,虽然postman请求时会自动加上,但是这里为了严谨我们采用手动添加。
复制这些cookie,用正则进行解析,得到key-value形式
再去掉回车等符号,就得到cookie请求头了
2. 请求接口获取二维码图片
使用得到的cookie,获取登录二维码图片
GET请求地址
请求头都要带上cookie
https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=getqrcode&random=1617001289613
参数
action: getqrcode
random: 当前时间戳
请求头
cookie: 刚才得到的cookie
referer: https://mp.weixin.qq.com/
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
x-requested-with: XMLHttpRequest
postman请求如下
携带刚才的cookie
这里选择 发送并下载,保存二维码图片,等会需要手机扫码
修改一下名字再保存
得到二维码图片,先不用拿微信扫码
3. GET 轮询二维码状态接口
https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1
参数
默认固定的参数
action=ask
token=
lang=zh_CN
f=json
ajax=1
请求头
cookie: 获取的cookie
referer: https://mp.weixin.qq.com/
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
x-requested-with: XMLHttpRequest
postman请求如下

status返回状态解释
未扫码时返回;status=0
acct_size: 0
base_resp: {err_msg: "ok", ret: 0}
err_msg: "ok"
ret: 0
status: 0
user_category: 0
手机扫码后,未确认登录,返回;status=4
acct_size: 6
base_resp: {err_msg: "ok", ret: 0}
err_msg: "ok"
ret: 0
status: 4
user_category: 0
二维码过期返回;status=3
acct_size: 0
base_resp: {err_msg: "ok", ret: 0}
status: 3
user_category: 0
确认登录后返回;status=1
{
"acct_size": 6,
"base_resp": {
"err_msg": "ok",
"ret": 0
},
"status": 1,
"user_category": 2
}
4.拿出手机,微信扫描上面获取到的二维码
手机上确认登录后,status状态变1
5. 扫码确认登录后,就可以请求登录接口
POST请求地址
https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login
表单传参
固定以下默认参数即可
userlang: zh_CN
redirect_url:
cookie_forbidden: 0
cookie_cleaned: 0
plugin_used: 0
login_type: 3
token:
lang: zh_CN
f: json
ajax: 1
请求头
cookie: 获取的cookie
referer: https://mp.weixin.qq.com/
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
x-requested-with: XMLHttpRequest
postman请求如下

接口返回,redirect_url是主页,说明成功了,token需要存本地,调用其他接口时需要
{
"base_resp": {
"err_msg": "ok",
"ret": 0
},
"redirect_url": "/cgi-bin/home?t=home/index&lang=zh_CN&token=2080662142"
}
6. 同样的方法,获得返回的cookie

正则解析
去除空格回车
7.调用一下搜索公众号接口
填入cookie,第一步中的cookie也需要
要填入返回的token,成功返回数据
8. 根据公众号id获取文章列表
如法炮制,成功返回