2025/6/9 最新效果,脚本已经成功生存315天

功能说明
自动签到、自动获取免费抽奖次数、自动免费抽奖、获取抽奖后的矿石余额
8.21 增加 幸运值满格必出转盘内奖励 提醒 精简代码
9.10 优化逻辑、 mstoken 和 a_bogus 不再当天过期,测试已有18天未出问题
9.13 更新cookie提取教程
9.25 更新脚本
10.15 更新视频教程
12.12 更新bug: 服务器返回的数据无法解析为JSON格式。 问题参考问题解决部分
视频内演示的cookie已失效,请勿尝试伪造
2025.11.4 - 更新
本篇文章实时更新
显示 无法解析为JSON格式 说明接口返回为空,表示你填写的参数 存在问题
~~
最新代码
下面的更新过后的代码。
AI优化了下
增加一键控制代理开关、方便调试
# -*- coding: utf-8 -*-
"""
掘金自动签到和抽奖脚本
支持一键控制代理开关(优化:代理状态仅显示一次)
"""
import requests
import time
from urllib3.exceptions import InsecureRequestWarning
# 禁用SSL验证警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# ==================== 配置区域 ====================
# 是否启用代理(True/False)
USE_PROXY = True # 当前配置为未启用
# 代理配置
PROXY_CONFIG = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080',
}
# Cookie和其他配置
COOKIE = "..." # 实际使用时替换为有效Cookie
AID = "" # 实际使用时替换为有效参数
UUID = "" # 实际使用时替换为有效参数
SPIDER = "" # 实际使用时替换为有效参数
MS_TOKEN = '...' # 实际使用时替换为有效Token
A_BOGUS = '...' # 实际使用时替换为有效参数
BASE_URL = "https://api.juejin.cn/growth_api/v1/"
HEADERS = {
'Cookie': COOKIE,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/128.0.0.0',
}
# ==================== 配置区域结束 ====================
def get_request_kwargs():
"""仅返回请求参数,不打印代理状态(避免重复输出)"""
kwargs = {}
if USE_PROXY:
kwargs['proxies'] = PROXY_CONFIG
return kwargs
def print_proxy_status_once():
"""脚本初始化时,仅打印一次代理状态"""
if USE_PROXY:
print("【代理状态】已启用代理")
else:
print("【代理状态】未启用代理")
def check_sign_in_status(base_url, headers):
"""检查今日是否已签到"""
api = "get_today_status"
url = base_url + api
kwargs = get_request_kwargs()
response = requests.get(url, headers=headers, verify=False, **kwargs)
if response.status_code == 200:
data = response.json()
if data['err_no'] == 0:
if data['data'] is True:
print("【今日是否签到】已签到")
return True
elif data['data'] is False:
print("【今日是否签到】未签到")
return False
else:
print("【当前登录状态】未登录,请重新登录")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def sign_in(base_url, params, headers):
"""执行签到"""
data = '{}'
url = f"{base_url}check_in"
kwargs = get_request_kwargs()
response = requests.post(url, headers=headers, data=data, params=params, verify=False, **kwargs)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
print("【当前签到状态】签到成功")
return True
elif data['err_no'] == 3013:
print("【当前签到状态】", data['err_msg'])
return False
elif data['err_no'] == 15001:
print("【当前签到状态】重复签到")
return True
else:
print("【当前签到状态】", data['err_msg'])
return False
except requests.JSONDecodeError:
print("【签到功能】服务器返回数据无法解析为JSON")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def get_points(base_url, headers):
"""获取当前矿石余额"""
api = "get_cur_point"
url = base_url + api
kwargs = get_request_kwargs()
response = requests.get(url, headers=headers, verify=False, **kwargs)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
print("【矿石最新余额】", data['data'])
return data['data']
except requests.JSONDecodeError:
print("【获取余额功能】服务器返回数据无法解析为JSON")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def get_free(base_url, params, headers):
"""检查是否有免费抽奖次数"""
url = f"{base_url}lottery_config/get"
kwargs = get_request_kwargs()
response = requests.get(url, headers=headers, params=params, verify=False, **kwargs)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
free_count = data['data']['free_count']
print("【免费抽奖次数】", free_count)
return free_count > 0
else:
print("【获取抽奖次数失败】", data.get('err_msg', '未知错误'))
return False
except requests.JSONDecodeError:
print("【获取抽奖次数】服务器返回数据无法解析为JSON")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def draw(base_url, params, headers):
"""执行抽奖"""
url = f"{base_url}lottery/draw"
data = '{}'
kwargs = get_request_kwargs()
response = requests.post(url, headers=headers, data=data, params=params, verify=False, **kwargs)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
print("【今日抽奖奖品】", data['data']['lottery_name'])
return True
else:
print("【抽奖异常】", data.get('err_msg', '未知错误'))
return False
except requests.JSONDecodeError:
print("【抽奖功能】服务器返回数据无法解析为JSON")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def get_win(base_url, aid, uuid, spider, headers):
"""获取中奖信息和幸运值"""
api = "lottery_lucky/my_lucky"
url = base_url + api
data = {
"aid": aid,
"uuid": uuid,
"spider": spider
}
kwargs = get_request_kwargs()
response = requests.post(url, data=data, headers=headers, verify=False, **kwargs)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
total_value = data['data']['total_value']
points = get_points(base_url, headers)
if points is False:
print("【获取幸运值】获取矿石余额失败")
return False
cha = points - (6000 - total_value) * 20
print("【当前幸运数值】:", total_value)
print("【距离中奖还差】:{} 矿石!".format(max(0, abs(cha))))
return True
else:
print("【获取幸运值失败】", data.get('err_msg', '未知错误'))
return False
except requests.JSONDecodeError:
print("【获取幸运值】服务器返回数据无法解析为JSON")
return False
else:
print("【请求失败】状态码:", response.status_code)
return False
def main():
"""主函数:初始化时打印一次代理状态,后续不重复输出"""
print("=" * 50)
print("【掘金自动签到和抽奖脚本】")
print("=" * 50)
# 核心优化:仅打印一次代理状态
print_proxy_status_once()
# 生成公共参数
common_params = {
"aid": AID,
"uuid": UUID,
"spider": SPIDER,
"msToken": MS_TOKEN,
"a_bogus": A_BOGUS
}
# 检查签到状态并执行操作
is_signed = check_sign_in_status(BASE_URL, HEADERS)
# sign_in(BASE_URL, common_params, HEADERS)
if is_signed:
print("\n【操作流程】今日已签到,检查抽奖...")
if get_free(BASE_URL, common_params, HEADERS):
draw(BASE_URL, common_params, HEADERS)
else:
print("\n【操作流程】今日未签到,执行签到...")
sign_success = sign_in(BASE_URL, common_params, HEADERS)
if not sign_success:
print("【重试签到】第一次签到失败,重试...")
time.sleep(1)
sign_in(BASE_URL, common_params, HEADERS)
if get_free(BASE_URL, common_params, HEADERS):
draw(BASE_URL, common_params, HEADERS)
# 查询中奖信息
print("\n【查询中奖信息】")
get_win(BASE_URL, AID, UUID, SPIDER, HEADERS)
print("\n" + "=" * 50)
print("【脚本执行完成】")
print("=" * 50)
if __name__ == "__main__":
main()
Cookie提取教程
user-agent 最好是最新的。
通过document,cookie 提取的cookie 无法通过校验
账户登录之后,F12 打开网络控制台,刷新页面。 然后点击网络 筛选下类型。
点击任意类型为fetch的网络请求

点击之后,可以看到 请求标头,在里面找到cookie字段。全部复制,粘贴到脚本

如下所示

提取必要参数方法
打开签到界面
msToken 和 a_bogus 多找两个测试

F12 或者 鼠标右键-检查 打开浏览器控制台 (这里以Edge做演示)
打开网络请求- F5 刷新当前界面-得到自己的网络请求

在左侧的搜索框 输入:get_cur_point 回车 ,点击任意接口, 其他接口也可以。 要多尝试几个值。可能一个会失败

得到除了cookie之外的所有值

效果展示




然后采用crontab做个定时任务

效果

我这里直接采用了宝塔执行。

问题解决
如果遇到脚本运行显示如下错误

这是因为下面的两个值为空 或者错误,要注意msToken ,如果使用的脚本一 无需URL解密。
如果是脚本2 则需要URL解码。

如果遇到未登录,请登录的情况
是因为你获取的cookie无效 或者失效, 需要注意的是,如果你在客户端或者网页上点击了退出登录,那么你的cookie就会失效,需要重新获取你登录之后的cookie.
另外,脚本采用python3 运行
cookie中的最后一个值csrf_session_id,user-agent, msToken,a_bogus 都会影响页面是否返回信息。这个和脚本无关。
如果脚本运行正常一段时间之后,突然出现报错, 直接替换 msToken 和 a_bogus 这两个值为最新的即可。
实际上,截至今天,在未修改cookie的情况下,脚本一直正常运行,偶尔会出现签到失败的情况,所以我直接将签到函数执行了两遍。自主运行40天无问题。

服务器返回的数据无法解析为JSON格式
如果配置完成遇到如下情况, 尝试将 sign_in 和 draw 两个函数中的 data 置为空。

即 搜索 data = '{}' 替换为 data = ''
然后运行。

第二天运行结果

解决方案
msToken值url解码,因为get请求会自动进行url编码。
脚本内url解码,正常访问到
未解码情况 - 无法获取到内容,导致脚本显示 服务器返回的数据无法解析为JSON格式。
视频教程
参数填写完成之后,如果存在异常,注意替换user-Agent, 多替换几种。
掘金签到教程
掘金自动签到脚本Python实现




1275

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



