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

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

hi

前言

最近想通过接口爬取微信公众号的文章,找到了获取文章的接口,但是要通过登录公众号后台获得cookie后才能调用。

所以想着能不能直接使用接口来获得登录后的cookie,看了很多文章,都没有现成高可用的,还有一些是很多年前的,那就自己借鉴并研究一下。

看过几篇用接口登录微信公众号后台的文章,一开始也想着一步到位,直接账号密码登陆不用扫码,也用js逆向出密码的加密算法了,但是调用登陆接口后还是需要扫码,就算普通的网页上账号密码登录后也还是需要扫码的,干脆直接不用账号密码,用扫码登录。

只学习用

【Java实战】

Java也能爬虫,直接上手。
项目地址:Java爬取公众号文章

实战介绍

前提是你得有一个公众号账号

  1. 用接口模拟公众号扫码登录,得到登录状态的cookie和token
  2. 有了登录状态就可以请求搜索公众号接口
  3. 选中公众号,查询该公众号发布的文章

技术栈

  1. Java
  2. OkHttp3
  3. Cookie管理
  4. Jackson
  5. Java awt包,用来显示二维码图片
  6. 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获取文章列表

如法炮制,成功返回
在这里插入图片描述


版权声明:本文为qq_40826978原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。