1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/55RK8C若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/55RK8C若失效,可用地址
https://www.aliyun.com/daily-act/ecs/activity_selection?source=5176.29345612&userCode=49hts92d腾讯云:
https://curl.qcloud.com/wJpWmSfU若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=2019052.部署教程
3.代码如下
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""京东每日签到领京豆(多账号)依赖:pip install requests用法:export JD_COOKIE='pt_key=xxx;pt_pin=xxx;&pt_key=yyy;pt_pin=yyy;'python jd_daily_sign.py"""import osimport jsonimport timeimport randomimport refrom typing import Dict, Any, List, Tuple, Optionalimport requestsJD_SIGN_URL = "https://api.m.jd.com/client.action"JD_USERINFO_URL = "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion"def load_cookies_from_env(env_name: str = "JD_COOKIE") -> List[str]:"""从环境变量读取 Cookie,支持 & 或换行分隔。"""raw = os.getenv(env_name, "").strip()if not raw:return []# 兼容多种分隔if "\n" in raw:parts = [x.strip() for x in raw.splitlines() if x.strip()]else:parts = [x.strip() for x in raw.split("&") if x.strip()]return partsdef parse_jsonp(text: str) -> Dict[str, Any]:"""解析 JSONP / JSON 响应为 dict。"""text = text.strip()if not text:return {}# JSONP: callback({...})if "(" in text and text.endswith(")"):start = text.find("(") + 1end = text.rfind(")")payload = text[start:end].strip()return json.loads(payload) if payload else {}# JSONreturn json.loads(text)def cookie_to_pin(cookie: str) -> str:"""从 Cookie 中提取 pt_pin(用于展示账号标识)。"""m = re.search(r"pt_pin=([^;]+)", cookie)return m.group(1) if m else "UNKNOWN"def build_headers(cookie: str) -> Dict[str, str]:"""构造更接近移动端的请求头。"""ua_pool = ["Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148","Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",]return {"User-Agent": random.choice(ua_pool),"Accept": "application/json, text/plain, */*","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","Cookie": cookie,"Referer": "https://h5.m.jd.com/","Origin": "https://h5.m.jd.com",}def get_user_info(session: requests.Session, cookie: str) -> str:"""获取京东账号昵称(可选,仅用于展示)。"""try:resp = session.get(JD_USERINFO_URL, headers=build_headers(cookie), timeout=15)data = resp.json()# 不同返回结构可能不一样,做兼容if isinstance(data, dict):user = (data.get("data") or {}).get("userInfo") or {}nickname = user.get("baseInfo", {}).get("nickname") or user.get("baseInfo", {}).get("curPin")if nickname:return str(nickname)except Exception:passreturn cookie_to_pin(cookie)def jd_sign_bean(session: requests.Session, cookie: str) -> Tuple[bool, str, int]:"""京豆签到(signBeanAct)返回:success, message, beans"""callback = f"jsonp_{int(time.time() * 1000)}_{random.randint(10000, 99999)}"params = {"functionId": "signBeanAct","appid": "ld","client": "apple","clientVersion": "10.0.4","networkType": "wifi","osVersion": "16.6","jsonp": callback,"body": json.dumps({}, separators=(",", ":")),}resp = session.get(JD_SIGN_URL, params=params, headers=build_headers(cookie), timeout=20)data = parse_jsonp(resp.text)# 常见结构:code + msg + data.dailyAward.beanAward.beanCountcode = str(data.get("code", ""))msg = str(data.get("msg", "")) or str(data.get("message", ""))# 成功if code == "0":beans = 0try:daily_award = (data.get("data") or {}).get("dailyAward") or {}bean_award = daily_award.get("beanAward") or {}beans = int(bean_award.get("beanCount") or 0)except Exception:beans = 0return True, (msg or "签到成功"), beans# 已签到(不同地区/版本可能文案不同)text = json.dumps(data, ensure_ascii=False)if "已签到" in text or "already" in text.lower():return True, "今日已签到", 0# Cookie 失效常见:code=3 或提示缺少 pt_key/登录态if code in {"3", "13"} or "pt_key" in text or "登录" in text:return False, "Cookie疑似失效/未登录(请更新 JD_COOKIE)", 0return False, f"签到失败:code={code} msg={msg}".strip(), 0def main():cookies = load_cookies_from_env("JD_COOKIE")if not cookies:print("❌ 未检测到环境变量 JD_COOKIE")print("💡 示例:export JD_COOKIE='pt_key=xxx;pt_pin=xxx;&pt_key=yyy;pt_pin=yyy;'")returnprint(f"✅ 检测到 {len(cookies)} 个账号,开始执行京豆签到...\n")session = requests.Session()results = []total_beans = 0for idx, ck in enumerate(cookies, 1):# 账号间随机等待,降低触发频控概率if idx > 1:time.sleep(random.uniform(2, 5))nickname = get_user_info(session, ck)ok, message, beans = jd_sign_bean(session, ck)total_beans += beansresults.append((idx, nickname, "成功" if ok else "失败", beans, message))print(f"[{idx}] {nickname} -> {'✅' if ok else '❌'} {message}(京豆 +{beans})")print("\n================= 汇总 =================")for idx, nickname, status, beans, message in results:print(f"{idx}. {nickname} | {status} | +{beans} | {message}")print("----------------------------------------")print(f"🎯 账号数:{len(results)}")print(f"🎁 今日累计京豆:{total_beans}")print("========================================")if __name__ == "__main__":main()
该脚本为京东每日签到领京豆任务脚本,主要作用包括:
从环境变量
JD_COOKIE读取单账号/多账号 Cookie对每个账号调用京东"京豆签到接口",完成每日签到领京豆
输出每个账号的执行结果,并在最后给出汇总统计
主要方法
load_cookies_from_env()
从环境变量读取 Cookie,支持&或换行分隔,返回账号 Cookie 列表。parse_jsonp()
京东部分接口会返回 JSONP(callback(...)),这个方法把 JSONP/JSON 统一解析为字典。build_headers()
生成请求头(包含 Cookie、UA 等),并做简单 UA 轮换,提升请求稳定性。get_user_info()
调用用户信息接口,尽量拿到昵称用于日志展示;失败则退化为pt_pin。jd_sign_bean()
核心签到逻辑:请求signBeanAct接口并解析返回,判断是否成功
是否已签到
是否 Cookie 失效
同时尝试提取本次获得的京豆数量。main()
主流程:按账号逐个执行签到、控制随机等待、打印结果并汇总。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论