拼多多社会招聘反爬参数逆向实战(Anti-Content生成)

// 实战案例:拼多多社会招聘反爬参数逆向实战(Anti-Content生成)

// 网址:https://careers.pddglobalhr.com/jobs

概述

1.1 背景说明

拼多多社会招聘平台采用了瑞数动态安全防护技术,其中anti-content参数是核心的反爬机制之一。该参数通过客户端JavaScript动态生成,结合了设备指纹、行为特征和时间戳等多维信息,是访问招聘数据接口的必要凭证。

1.2 技术挑战

  • 动态加密:参数生成算法每日变化,传统静态分析失效
  • 环境检测:严格验证浏览器指纹和自动化特征
  • 行为验证:监测鼠标轨迹、操作间隔等生物特征
  • 链路完整:需要维护cookie、referer等完整请求链

反爬体系架构

1754053264334-5d6eac36-5caa-42f6-9207-e845ab307d3c.png

逆向网页分析

1754054240843-0603019a-21d4-43fc-9d2d-0e2e021ae199.png

1754054377820-e4deebee-0803-453e-ab70-e47aa325548b.png

1754054488865-1829cf99-1f58-455f-b0f2-2734c62d63e9.png

1754054617637-7696f08a-3ad6-4d8c-8d34-84dece5eb685.png

1754054840934-88eeda70-877a-4baf-adce-1eb5ad178504.png

1754054832214-1ad48b62-2cb7-4c4f-8db2-8230009e25eb.png

1754054921132-7a82180d-ba9d-43fe-917d-5adca1503667.png

1754054959416-5b4313b8-4e02-4b78-b9ce-01f7a34d3fce.png

1754055105722-73fe4b64-9b18-465a-afd7-eda97ff99c67.png

1754055288366-d0340798-a556-4ac9-9732-2f80d3e1d744.png

1754055368063-f3ac4404-96dd-4e6f-abd9-b960b65bc36b.png

1754055582146-d7e84e76-e13d-4b59-b1c0-8e5694c3c266.png

1754055653279-92ddd5e2-3264-4a6c-bb16-03079128c910.png

1754055708616-edff3b19-66b9-41a7-8cf9-634871b64bd2.png

1754055848828-a8abf751-4165-4748-93f7-a2a074d68c56.png

1754055912488-4962736f-2725-4c1c-8532-8fd38d5e24d7.png

核心加密逻辑分析

2.1 关键函数定位

在拼多多的前端代码中,anti-content 的生成通常由以下关键函数完成:

function get_anti() {
  return new window.hhh(4)({
    serverTime: new Date().getTime()
  }).messagePack()
}
  • window.hhh(4) 是一个加密构造器,传入参数 4 可能代表加密版本或算法类型。
  • serverTime 是当前时间戳,用于动态加密。
  • messagePack() 是最终的序列化方法,生成 anti-content

2.2 加密流程拆解

  1. 环境检测\ 拼多多会检测浏览器环境,包括:
    • navigator.webdriver(是否自动化)
    • window.chrome(Chrome扩展信息)
    • document.cookie(是否携带合法Token)
navigator.webdriver = false;  // 必须设置为false
window.chrome = { ... };      // 模拟Chrome环境
  1. **动态加密构造器**** **window.hhh
    • hhh 是一个动态生成的构造函数,可能通过Webpack或自执行函数注入。
    • 参数 4 可能代表加密模式(如AES、RSA、自定义算法)。
  2. 时间戳加密\ serverTime 会被编码到加密数据中,防止重放攻击:
{
    serverTime: new Date().getTime()  // 当前时间戳
}
  1. **序列化**** **messagePack()
    • 可能使用 MessagePack(二进制序列化格式)或自定义Base64编码。
    • 最终生成 anti-content 字符串,格式类似:
0aqAfxiUGjtaj99VwndmQX2wGVG19zihz-RMZVsR8hxQxk1fgbjpkFMM1omnG-vPaZuS28uxX6ssx2N4odsS6yXHupv3TYWleYVzx9sTDaj1LGQAexhq7GPVKwZMGSwzE26gaEisOK1uVQQ6qTbSv9lWwr_SpUtmsk_LUz1y19Isk-hYnPIYbVe-_IkvnA-mU8qyQ1N68PRbPSH2_zW1fa-8vNVo6yRj6AStyfYYdfs7_8k1IUk2dyxn3zZHZsuvvvGjW7Ai66eAvIiz7T5gK87HUbLrf1TLOKLw42SU85gG-QTrTXsTDTnr9QDyQtC6Xmd8J5EP-YRREkI97tceHFpJC4d225OE_iCAv0jgxeZ8pTCC-12Tj4xYBSlZmXOT-DM5fyx5eJYq2Iy-mYKVhQ0EmyI6FmMQWuKJ8rmIWit5nlP0Z3aTULf3JG4K-RwYRtGAPiWoYrAVzFDIP4931Nih9F

逆向实战步骤

3.1 环境模拟

由于拼多多会检测浏览器环境,需要完整模拟合法请求的Headers和全局变量:

window.navigator = {
    webdriver: false,
    plugins: [ ... ],  // 模拟插件
    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
};

document.cookie = '_nano_fp=XpXXX...';  // 合法Cookie

3.2 加密函数Hook

通过调试工具(Chrome DevTools)定位 window.hhh

  1. **搜索**** window.hhh **get_anti\ 在Sources面板全局搜索,找到定义位置。
  2. 下断点动态调试\ 在 messagePack() 处断点,观察输入输出。

完整代码

# -*- coding: utf-8 -*-
"""
    JS逆向实战-->拼多多社会招聘数据采集
    网址:https://careers.pddglobalhr.com/jobs
"""

import json
import requests
import execjs

def get_rpcDy():
    # 参数较长的情况下 超过1024字节  可以采用post方法即可
    _con = execjs.compile(open('demo.js', encoding='utf-8').read()).call("get_anti")
    # _con = execjs.compile(open('pdd724补.js',encoding='utf-8').read()).call("get_anti")
    return _con

content = get_rpcDy()
print(content)
headers = {
    "accept": "*/*",
    "accept-language": "en-GB,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
    "cache-control": "no-cache",
    "content-type": "application/json",
    "origin": "https://careers.pinduoduo.com",
    "pragma": "no-cache",
    "priority": "u=1, i",
    "referer": "https://careers.pinduoduo.com/jobs",
    "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin",
    "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"
}
cookies = {
    "_bee": "xQ7qGAmSgD7rGmic9gSMsy7mLXgZ0q7x",
    "_f77": "b6375e0c-ac66-4495-a902-a2deeb5b19ba",
    "_a42": "e7ecb87f-d95b-444e-8a3c-754bac7ee3e0",
    "rckk": "xQ7qGAmSgD7rGmic9gSMsy7mLXgZ0q7x",
    "ru1k": "b6375e0c-ac66-4495-a902-a2deeb5b19ba",
    "ru2k": "e7ecb87f-d95b-444e-8a3c-754bac7ee3e0",
    "njrpl": "EEpYInqGrKpqm9rQNOMBmmo7l1wo4ed3",
    "api_uid": "rBUUYGaNM200FzKzwAhrAg==",
    "_nano_fp": "XpmxXpdjX0EJlpTjl9_alWVAVP6vEvkEofBo1wa1"
}
url = "https://careers.pinduoduo.com/api/recruit/position/list"
data = {
    "job": "",
    "page": 1,
    "pageSize": 10,
    "name": "",
    "workLocationList": [],
    "anti_content": content

}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data)
print(response.text)
print(response)


运行效果

1754053902694-b5cc3aaf-5ab6-465b-81d7-73869fcc58fb.png

总结

关键点说明
环境检测需模拟合法浏览器(无自动化标志、完整navigator)。
window.hhh核心加密构造器,参数 4
可能代表算法版本。
时间戳加密serverTime
参与加密,防止重放攻击。
序列化messagePack()
最终生成 anti-content
,可能是Base64或MessagePack。