目录
【Java爬虫】接口模拟微信公众号登录,搜索公众号,获取公众号文章,java实现hi前言【Java实战】实战介绍技术栈演示得到二维码图片,手机端扫描扫码确认,搜索公众号搜索公众号下的文章列表【原理】浏览器端公众号后台登录逻辑【测试】用postman工具进行接口测试1. POST请求开始登录接口,初始化cookiePOST请求地址表单参数请求头postman请求如下成功时返回2. 请求接口获取二维码图片GET请求地址参数请求头postman请求如下3. GET 轮询二维码状态接口参数请求头postman请求如下status返回状态解释4.拿出手机,微信扫描上面获取到的二维码5. 扫码确认登录后,就可以请求登录接口POST请求地址表单传参请求头postman请求如下6. 同样的方法,获得返回的cookie7.调用一下搜索公众号接口8. 根据公众号id获取文章列表【Java爬虫】接口模拟微信公众号登录,搜索公众号,获取公众号文章,java实现
hi
前言
最近想通过接口爬取微信公众号的文章,找到了获取文章的接口,但是要通过登录公众号后台获得cookie后才能调用。
所以想着能不能直接使用接口来获得登录后的cookie,看了很多文章,都没有现成高可用的,还有一些是很多年前的,那就自己借鉴并研究一下。
看过几篇用接口登录微信公众号后台的文章,一开始也想着一步到位,直接账号密码登陆不用扫码,也用js逆向出密码的加密算法了,但是调用登陆接口后还是需要扫码,就算普通的网页上账号密码登录后也还是需要扫码的,干脆直接不用账号密码,用扫码登录。
只学习用
【Java实战】
Java也能爬虫,直接上手。
项目地址:Java爬取公众号文章
实战介绍
用接口模拟公众号扫码登录,得到登录状态的cookie和token有了登录状态就可以请求搜索公众号接口选中公众号,查询该公众号发布的文章前提是你得有一个公众号账号
技术栈
JavaOkHttp3Cookie管理JacksonJava awt包,用来显示二维码图片FutureTask 线程返回值演示
得到二维码图片,手机端扫描
扫码确认,搜索公众号
搜索公众号下的文章列表
【原理】浏览器端公众号后台登录逻辑
想直接看实现的,根据目录跳过
1.打开公众号登录页面:https://mp./
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./cgi-bin/bizlogin?action=startlogin
表单参数
userlang: zh_CNredirect_url: login_type: 3sessionid: 161700241598412token: lang: zh_CNf: jsonajax: 1
sessionid 如上面所示:时间戳,加两位随机数,其他参数固定
new Date().getTime() + "" + Math.floor(100 * Math.random())
请求头
referer: https://mp./user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36x-requested-with: XMLHttpRequest
postman请求如下
成功时返回
{"base_resp": {"err_msg": "ok","ret": 0}}
同时会返回很多cookie,打开请求日志可以看到,这些cookie贯穿登录流程,虽然postman请求时会自动加上,但是这里为了严谨我们采用手动添加。
复制这些cookie,用正则进行解析,得到key-value形式
再去掉回车等符号,就得到cookie请求头了
2. 请求接口获取二维码图片
使用得到的cookie,获取登录二维码图片
GET请求地址
请求头都要带上cookie
https://mp./cgi-bin/scanloginqrcode?action=getqrcode&random=1617001289613
参数
action: getqrcoderandom: 当前时间戳
请求头
cookie: 刚才得到的cookiereferer: https://mp./user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36x-requested-with: XMLHttpRequest
postman请求如下
携带刚才的cookie
这里选择 发送并下载,保存二维码图片,等会需要手机扫码
修改一下名字再保存
得到二维码图片,先不用拿微信扫码
3. GET 轮询二维码状态接口
https://mp./cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1
参数
默认固定的参数
action=asktoken=lang=zh_CNf=jsonajax=1
请求头
cookie: 获取的cookiereferer: https://mp./user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36x-requested-with: XMLHttpRequest
postman请求如下
status返回状态解释
未扫码时返回;status=0
acct_size: 0base_resp: {err_msg: "ok", ret: 0}err_msg: "ok"ret: 0status: 0user_category: 0
手机扫码后,未确认登录,返回;status=4
acct_size: 6base_resp: {err_msg: "ok", ret: 0}err_msg: "ok"ret: 0status: 4user_category: 0
二维码过期返回;status=3
acct_size: 0base_resp: {err_msg: "ok", ret: 0}status: 3user_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./cgi-bin/bizlogin?action=login
表单传参
固定以下默认参数即可
userlang: zh_CNredirect_url: cookie_forbidden: 0cookie_cleaned: 0plugin_used: 0login_type: 3token: lang: zh_CNf: jsonajax: 1
请求头
cookie: 获取的cookiereferer: https://mp./user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36x-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获取文章列表
如法炮制,成功返回