win bd1e50e410 feat(01-02): port sign algorithms to crawler_core/ platform directories
- Add crawler_core/boss/sign.py: BossSign traceid generator (pure stdlib)
- Add crawler_core/qcwy/sign.py: Job51Sign HMAC-SHA256 signing (pure stdlib)
- Add crawler_core/zhilian/sign.py: ZhilianSign header/param signing (pure stdlib)
- Add __init__.py for all three crawler_core platform directories
- Updated module docstrings to reference crawler_core; all logic unchanged
- No imports from spiderJobs or app; no HTTP dependencies
2026-03-21 18:08:53 +08:00

87 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
智联招聘签名算法 (crawler_core)
职责:参数构造 + 签名算法,不涉及 HTTP 请求
"""
from __future__ import annotations
import math
import random
from typing import Optional
class ZhilianSign:
"""
智联招聘请求签名
功能 1: 生成请求所需的签名参数device_id, action_id, at, rt 等)
功能 2: 根据接口类型cgate / capi构造对应的签名头或签名参数
参数说明:
at: Access Token登录后获得未登录为空
rt: Refresh Token登录后获得未登录为空
device_id: 设备 ID自动生成 UUID也可手动指定
version: 小程序版本号
channel: 渠道标识
platform: 平台 ID12 = 微信小程序)
"""
def __init__(
self,
*,
at: str = "",
rt: str = "",
device_id: Optional[str] = None,
version: str = "4.1.259",
channel: str = "wxxiaochengxu",
platform: str = "12",
):
self.at = at
self.rt = rt
self.device_id = device_id or self.generate_uuid()
self.version = version
self.channel = channel
self.platform = platform
# ── 算法: UUID 生成(与小程序一致)────────
@staticmethod
def generate_uuid() -> str:
chars = "0123456789ABCDEF"
uuid = [""] * 36
for i in range(36):
uuid[i] = chars[math.floor(16 * random.random())]
uuid[14] = "4"
uuid[19] = chars[(int(uuid[19], 16) & 0x3) | 0x8]
uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-"
return "".join(uuid)
# ── cgate 签名头 ─────────────────────────
def sign_headers(self, page_code: str = "0") -> dict:
"""构造 cgate 接口的签名请求头"""
return {
"x-zp-at": self.at,
"x-zp-rt": self.rt,
"x-zp-action-id": self.generate_uuid(),
"x-zp-page-code": page_code,
"x-zp-version": self.version,
"x-zp-channel": self.channel,
"x-zp-platform": self.platform,
"x-zp-device-id": self.device_id,
"x-zp-business-system": "73",
}
# ── capi 签名参数 ────────────────────────
def sign_params(self) -> dict:
"""构造 capi 接口的签名查询参数"""
return {
"at": self.at,
"rt": self.rt,
"channel": self.channel,
"platform": self.platform,
"version": self.version,
"d": self.device_id,
}