科技微讯

检测小红书用户更新

通过小红书的微信小程序,找到下面这样的请求,目前只发现「笔记」的检测,用户发表的瞬间、语音、打卡等内容均不知道怎么检测,因为小红书微信小程序也只能看笔记。

const headers = {
  Host: "www.xiaohongshu.com",
  Connection: "keep-alive",
  "Device-Fingerprint":
    "WHJMrwNw1k/F+fa3+moWhiBdFk413SbxfmvoGwYKmm0PmP7Wv8+5MClpy1lv65FrJQ6RFq+4v1gAqq7amWr0w0tqDTkgg5uLfdCW1tldyDzmauSxIJm5Txg==1487582755342",
  "X-Sign": "Xb56f899b67de58caf668fd8a29d4f79f",
  "content-type": "application/json",
  Authorization: "wxmp.a0cb6f14-f10e-40c1-b6ee-fd61cb63c9aa",
  "Accept-Encoding": "gzip,compress,br,deflate",
  "User-Agent":
    "Mozilla/5.0 (iPhone; CPU iPhone OS 15_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.18(0x1800122f) NetType/WIFI Language/zh_CN",
  Referer: "https://servicewechat.com/wxb296433268a1c654/61/page-frame.html",
};
const api = `https://www.xiaohongshu.com/fe_api/burdock/weixin/v2/user/5651e7aff53ee01fd1bb59be/notes?page=1&page_size=5`;

const json = await got(api, {
  headers: headers,
})
  .then((res) => res.body)
  .catch((err) => {
    console.log("出错:", err);
  });

问题的关键是 header 中的 X-Sign,谷歌一番,在 GitHub 有人分享了 X-Sign 的计算方法

class WebSignDownloaderMiddleware(object):
    screen_key = "WSUDD"
    def process_request(self, request, spider):
        _st = request.url.split(".com")[-1] + self.screen_key
        md5String = spider.general_method.get_md5(_st).lower()
        request.headers['x-sign'] = "X" + md5String

即:

const md5 = require("md5");

async function app() {
  const url = `https://www.xiaohongshu.com/fe_api/burdock/weixin/v2/user/5651e7aff53ee01fd1bb59be/notes?page=1&page_size=5`;
  const _sr = url.split(".com")[url.split(".com").length - 1] + "WSUDD";
  const xSign = `X${md5(_sr).toLowerCase()}`;
  //有些 header 不需要,但保险起见还是加上
  const headers = {
    Host: "www.xiaohongshu.com",
    // Connection: "keep-alive",
    // "Device-Fingerprint":
    //   "WHJMrwNw1k/F+fa3+moWhiBdFk413SbxfmvoGwYKmm0PmP7Wv8+5MClpy1lv65FrJQ6RFq+4v1gAqq7amWr0w0tqDTkgg5uLfdCW1tldyDzmauSxIJm5Txg==1487582755342",
    "X-Sign": xSign,
    // "content-type": "application/json",
    Authorization: "wxmp.a0cb6f14-f10e-40c1-b6ee-fd61cb63c9aa",
    // "Accept-Encoding": "gzip,compress,br,deflate",
    "User-Agent":
      "Mozilla/5.0 (iPhone; CPU iPhone OS 15_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.18(0x1800122f) NetType/WIFI Language/zh_CN",
    Referer: "https://servicewechat.com/wxb296433268a1c654/61/page-frame.html",
  };

  const json = await got(url, {
    headers: headers,
  })
    .then((res) => res.body)
    .catch((err) => {
      console.log("出错:", err);
    });

  console.log(json);
}

app();

另一个问题是,当 API 访问次数太多,会出现滑窗验证。Authorization 听说是和微信号绑定的,每个微信号固定一个 Authorization,我尝试随便更改其中一个字符,结果请求失败。我在一段时间尝试了 2 次同时请求 1000 次 api,都可以顺利获得数据,于是又尝试同时请求 10000 次,不知道有多少成功的,但看起来成功了不少,最后还是出现失败请求,被判断为 spam,这时候我用手机重新打开小红书小程序,会被要求滑块验证,验证后,又可以成功发起请求了。

我想可以利用多个微信用户的 Authorization 信息,随机发起请求,避开限制?粗略观察了一下,活跃的小红书博主的发布频率基本是一到三天一次。

在另一个 github 项目找到很多小红书的接口

在腾讯云函数请求小红书的 api,经常会返回 461 代码,被判定为 spam,可能是因为小红书自动屏蔽了大部分腾讯云的 ip 地址。

暂无评论