1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【Java爬虫】接口模拟微信公众号登录 搜索公众号 获取公众号文章 java实现

【Java爬虫】接口模拟微信公众号登录 搜索公众号 获取公众号文章 java实现

时间:2023-02-05 15:54:08

相关推荐

【Java爬虫】接口模拟微信公众号登录 搜索公众号 获取公众号文章 java实现

目录

【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获取文章列表

如法炮制,成功返回

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。