逆向工程入门 (二):获取评论/点赞微博的 API
前言
在上一篇博客中,我们成功逆向获取了域名 m.weibo.cn 的发微博 API。根据我在其中详述的过滤 POST 方法来抓包互动请求的 API 接口,可以较容易地推理出评论/点赞微博的 API 接口。
遗留问题
上篇博客中曾提到一次 Cookie 的更新,我的 Cookie 从
SUB=_2A25KcMuXDeRhGeVL7VYV-SfFzzyIHXVpDEFfrDV6PUJbktANLXnQkW1NTCXsnxWC6W6onbf_fEsQaxfYXJQxPzJ3; ... XSRF-TOKEN=f13778
变成了
SUB=_2A25KcMuXDeRhGeVL7VYV-SfFzzyIHXVpDEFfrDV6PUJbktANLXnQkW1NTCXsnxWC6W6onbf_fEsQaxfYXJQxPzJ3; ... XSRF-TOKEN=8ea381; mweibo_short_token=bf3d747a9d
值得注意的是 mweibo_short_token 这个字段,不知道添加这个字段会不会可以延长 Cookie 刷新时间呢?可以看到,这个字段只在我第二次的 Cookie 中出现了,第一个 Cookie 中却没有,这是一个很有意思的现象!关于 Cookie 的有效期,我测试过至少 3 次,基本都是 15-19 分钟就过期了。
- 可能的用途:
short_token,从字面上理解,可能是一个“短期令牌”。它或许是为了增强安全性或者优化用户体验而设计的。我猜测它可能与维持登录状态、减少重复验证或者实现某些特定的功能(比如快速发布、自动刷新等)有关。 - 出现时机: 它只在第二次测试的 Cookie 中出现了,而第一次没有。这可能说明
mweibo_short_token的生成和使用有一定的触发条件。- 时间因素: 会不会和登录时长有关呢?会不会第一次登录不生成,退出登录后再次登录才生成?
- 操作触发: 会不会进行某些操作才会生成呢?比如修改账户设置,发布特定内容等等。
- 其他因素: 或者与服务器端的一些策略更新或者 A/B 测试有关。
- 与 Cookie 过期的关系: 虽然
mweibo_short_token看起来像是一个“短期令牌”,但目前我们还没有确凿的证据表明它能直接影响 Cookie 的过期时间(也就是测试的 15-19 分钟)。不过,这并不排除它们之间存在某种关联的可能性。毕竟,mweibo_short_token的出现肯定是有其特定目的的,只是我们现在还不清楚。 - 如何进一步探究: 可以从以下几个方面入手,进一步研究
mweibo_short_token的作用:- 对比实验: 我们可以进行更多次的登录测试,记录每次 Cookie 的详细信息,看看
mweibo_short_token是否总是伴随XSRF-TOKEN一起变化。同时,我们可以尝试在两次登录之间执行一些特定的操作,看看是否会影响mweibo_short_token的生成。比如,第一次登录后什么都不做,记录 Cookie;第二次登录后,修改一下个人资料或者发布一条微博,再记录 Cookie,对比看看。 - 长期观察: 我们可以延长观察时间,看看
mweibo_short_token的值是否会在一段时间后发生变化,或者消失。比如,可以分别在获取到 Cookie 后的 5 分钟、10 分钟、15 分钟、20 分钟打印一下 Cookie,观察mweibo_short_token的变化,说不定有新的发现。 - 网络请求分析: 我们可以仔细分析包含
mweibo_short_token的网络请求和响应,看看是否有其他相关的参数或者数据。特别是看看这个 token 是否被用于后续的某些请求中。
- 对比实验: 我们可以进行更多次的登录测试,记录每次 Cookie 的详细信息,看看
然而,以上方案都没有机会在今天实现,因为我记录了 3 个变化的 Cookie,均没有出现过之前只在“第二次”出现的 mweibo_short_token=bf3d747a9d,这让它看起来愈发神秘。
评论微博/删除评论的 API 接口
接下来进入正题,抓包 > 分析 > 写脚本。
评论微博的 API 接口
想评论微博正文网址: https://m.weibo.cn/detail/xxxxxxxxxxxxxxxxx
发送评论,在“载荷” (Payload) 处抓包:
载荷
content: 第5次 04:49 st4分测试
mid: xxxxxxxxxxxxxxxxx
st: 95e264
_spr: screen:1920x1080
分析
- content: 评论内容
- mid: 微博正文网址最后的数字
- st: Cookie 的
XSRF-TOKEN - _spr: 屏幕分辨率
代码实现思路
get_cookie_and_st.py 这个脚本依然用来获取记录 Cookie 和 st,评论脚本我们可以直接模仿之前的发微博脚本,修改一些数据,编写 comment_weibo_api.py。重点在于,如何构造 mid 合适呢?
mid其实就是微博的 ID,用来唯一标识一条微博。
comment_weibo函数 (模仿send_weibo函数) 现在接收一个weibo_url参数,表示微博详情页的完整 URL。Referer直接使用传入的weibo_url。mid从weibo_url中提取。
代码示例
以下为 comment_weibo 函数示例:
def comment_weibo(content, weibo_url, cookie=None, x_xsrf_token=None):
"""使用 requests 库评论微博
Args:
content (string): 评论内容
weibo_url (string): 微博详情页的完整 URL
cookie (string, optional): 你的微博 Cookie. Defaults to None.
x_xsrf_token (string, optional): 用于验证的 token, 需要抓包获取. Defaults to None.
"""
url = "https://m.weibo.cn/api/comments/create" # 微博评论接口
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Referer": weibo_url, # 评论的微博正文网址, 后续继续逆向微博用户详情api, 改成检测用户新发微博的网址 TODO
"Origin": "https://m.weibo.cn",
"Content-Type": "application/x-www-form-urlencoded",
"X-Requested-With": "XMLHttpRequest",
"X-XSRF-TOKEN": x_xsrf_token,
"Cookie": cookie,
}
data = {
"content": content,
"st": x_xsrf_token,
"_spr": "screen:1920x1080", # 根据屏幕分辨率修改
"mid": weibo_url.split("/")[-1], # 从 weibo_url 中提取 mid
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
result = response.json()
if result["ok"] == 1:
print("微博评论成功!")
return True
else:
print(f"微博评论失败: {
result['msg']}")
return False
else:
print(f"请求失败: {
response.status_code}")
return False
# 从文件中读取 Cookie 和 st
with open(r"E:\...\cookie_and_st.json", "r") as f:
data = json.load(f)
cookies = data["cookies"]
st = data["st"]
# 将 Cookie 转换为 requests 可以使用的格式
cookie_str = "; ".join([f"{
cookie['name']}={
cookie['value']}" for cookie in cookies])
# 获取当前时间
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 微博详情页的 URL,需要根据实际情况修改
weibo_url = "https://m.weibo.cn/detail/xxxxxxxxxxxxxxxxx" # 把你要评论的微博的url 传进来
# 使用 Cookie 和 st 评论微博
comment_weibo(f" valid - {
now} 使用 py 评论微博 1", weibo_url, cookie=cookie_str


7435

被折叠的 条评论
为什么被折叠?



