2025/5/8 最新效果,脚本已经成功生存283天
功能说明
自动签到、自动获取免费抽奖次数、自动免费抽奖、获取抽奖后的矿石余额
8.21 增加 幸运值满格必出转盘内奖励 提醒 精简代码
9.10 优化逻辑、 mstoken 和 a_bogus 不再当天过期,测试已有18天未出问题
9.13 更新cookie提取教程
9.25 更新脚本
10.15 更新视频教程
12.12 更新bug: 服务器返回的数据无法解析为JSON格式。 问题参考问题解决部分
视频内演示的cookie已失效,请勿尝试伪造
本篇文章实时更新
显示 无法解析为JSON格式 说明接口返回为空,表示你填写的参数 存在问题
直接上脚本
下面是修改了之后的版本。
代码比较稳定,只要值未填错,就可以成功运行。 这里的值可以从一个成功的接口上获取。
比如签到、抽奖等。
# 代码1.0 版本
# -*- coding: utf-8 -*-
import requests
import logging
logging.basicConfig(level=logging.INFO)
def check_sign_in_status(base_url,headers):
api = "get_today_status"
url = base_url+ api
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
if data['err_no'] == 0:
if data['data'] is True:
logging.info("【签到状态】%s","已签到")
return True
elif data['data'] is False:
logging.info("【签到状态】%s","未签到")
return False
else:
logging.info("【签到状态】%s","未登录,请登录")
pass
return False
else:
logging.error("【请求失败】%s",response.status_code)
return False
def sign_in(base_url,aid,uuid,spider,msToken,a_bogus,headers):
api = "check_in"
url = base_url+ api + "?aid=" + aid + "&uuid=" + uuid + "&spider=" + spider + "&msToken=" + msToken + "&a_bogus=" + a_bogus
response = requests.post(url, headers=headers)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
logging.info("【签到功能】%s","签到成功")
return False
elif data['err_no'] == 3013 and data['err_msg'] == "掘金酱提示:签到失败了~":
logging.info("【签到功能】%s",data['err_msg'])
return False
else:
logging.info("【签到功能】%s",data['err_msg'])
except requests.JSONDecodeError:
logging.error("【签到功能】服务器返回的数据无法解析为JSON格式。")
return False
def get_points(base_url,headers):
api = "get_cur_point"
url = base_url+ api
response = requests.get(url, headers=headers)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
logging.info("【矿石余额】%s",data['data'])
return data['data']
except requests.JSONDecodeError:
logging.error("【获取余额功能】服务器返回的数据无法解析为JSON格式。")
return False
def get_free(base_url,aid,uuid,spider,msToken,a_bogus,headers):
api = "lottery_config/get"
url = base_url+ api + "?aid=" + aid + "&uuid=" + uuid + "&spider=" + spider + "&msToken=" + msToken + "&a_bogus=" + a_bogus
response = requests.get(url, headers=headers)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
if data['data']['free_count'] > 0 :
logging.info("【免费抽奖次数】%s",data['data']['free_count'])
return True
else:
logging.info("【免费抽奖次数】%s",data['data']['free_count'])
return False
except requests.JSONDecodeError:
logging.error("【获取免费抽奖次数功能】服务器返回的数据无法解析为JSON格式。")
return False
def draw(base_url,aid,uuid,spider,msToken,a_bogus,headers):
api = "lottery/draw"
url = base_url+ api + "?aid=" + aid + "&uuid=" + uuid + "&spider=" + spider + "&msToken=" + msToken + "&a_bogus=" + a_bogus
data = '{}'
response = requests.post(url, headers=headers,data=data)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
logging.info("【奖品】%s",data['data']['lottery_name'])
except requests.JSONDecodeError:
logging.error("【抽奖功能】服务器返回的数据无法解析为JSON格式。")
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
}
response = requests.post(url, data=data,headers=headers)
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,header1)
cha = points - (6000 - total_value)*20
logging.info("【当前幸运值】:%s",total_value)
if cha >= 0 :
logging.info("【距离中奖还差】:0 矿石!")
elif cha <= 0:
logging.info("【距离中奖还差】:%s",str(abs(cha)) + "矿石!")
except requests.JSONDecodeError:
logging.error("【获取免费抽奖次数功能】服务器返回的数据无法解析为JSON格式。")
return False
else:
logging.error("【请求失败】%s",response.status_code)
return False
cookie = '你的cookie值'
aid = "你的aid值"
uuid = "你的uuid值"
spider = "你的spider值"
msToken = "你的msToken值"
a_bogus = "你的a_bogus值"
base_url="https://api.juejin.cn/growth_api/v1/"
header1 = {
'Cookie':cookie,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
'Referer':'https://juejin.cn/user/center/signin?from=sign_in_menu_bar'
}
if check_sign_in_status(base_url,header1):
if get_free(base_url,aid,uuid,spider,msToken,a_bogus,header1):
draw(base_url,aid,uuid,spider,msToken,a_bogus,header1)
pass
else:
pass
else:
sign_in(base_url,aid,uuid,spider,msToken,a_bogus,header1)
sign_in(base_url,aid,uuid,spider,msToken,a_bogus,header1)
if get_free(base_url,aid,uuid,spider,msToken,a_bogus,header1):
draw(base_url,aid,uuid,spider,msToken,a_bogus,header1)
pass
else:
pass
get_win(base_url,aid,uuid,spider,header1)
脚本中所需要的值都可以登录后的网络请求中获取,其中mstoken和a_bogus的值必须存在,不然页面会返回空值。 aid,uuid在cookie中都有体现。
其中uuid的值为cookie中的user_unique_id
值
最新代码
下面的更新过后的代码。
主要是移除了log
精简了函数的参数调用
以及签到逻辑。
user-agent如果长时间不更换或者突然更换user-agent会导致功能异常。即接口返回内容为空。触发异常捕获
# v2.0
# -*- coding: utf-8 -*-
import requests
import time
def check_sign_in_status(base_url, headers):
api = "get_today_status"
url = base_url + api
response = requests.get(url, headers=headers)
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("【当前登录状态】", "未登录,请登录")
pass
return False
else:
print("【请求失败】", response.status_code)
return False
def sign_in(base_url, params, headers):
data = '{}'
url = f"{base_url}check_in"
response = requests.post(url, headers=headers, data=data,params=params)
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 and data['err_msg'] == "掘金酱提示:签到失败了~":
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
def get_points(base_url, headers):
api = "get_cur_point"
url = base_url + api
response = requests.get(url, headers=headers)
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
def get_free(base_url,params, headers):
url = f"{base_url}lottery_config/get"
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
if data['data']['free_count'] > 0:
print("【免费抽奖次数】", data['data']['free_count'])
return True
else:
print("【免费抽奖次数】", data['data']['free_count'])
return False
except requests.JSONDecodeError:
print("【获取免费抽奖次数功能】服务器返回的数据无法解析为JSON格式。")
return False
def draw(base_url, params, headers):
# proxies = {
# 'http': 'http://127.0.0.1:8080',
# 'https': 'http://127.0.0.1:8080',
# }
url = f"{base_url}lottery/draw"
data = '{}'
response = requests.post(url, headers=headers, data=data,params=params)
if response.status_code == 200:
try:
data = response.json()
if data['err_no'] == 0 and data['err_msg'] == "success":
print("【今日抽奖奖品】", data['data']['lottery_name'])
except requests.JSONDecodeError:
print("【抽奖功能】服务器返回的数据无法解析为JSON格式。")
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
}
response = requests.post(url, data=data, headers=headers)
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, header1)
cha = points - (6000 - total_value) * 20
print("【当前幸运数值】:", total_value)
if cha >= 0:
print("【距离中奖还差】:0 矿石!")
elif cha <= 0:
print("【距离中奖还差】:", str(abs(cha)) + "矿石!")
except requests.JSONDecodeError:
print("【获取免费抽奖次数功能】服务器返回的数据无法解析为JSON格式。")
return False
else:
print("【请求失败】", response.status_code)
return False
if __name__ == "__main__":
cookie = ''
aid = ""
uuid = ""
spider = ""
# msToken 获取后测试 url解码和未解码 哪种可以使用
msToken = ''
a_bogus = ''
base_url = "https://api.juejin.cn/growth_api/v1/"
common_params = {"aid": aid, "uuid": uuid, "spider": spider, "msToken": msToken, "a_bogus": a_bogus}
header1 = {
'Cookie': cookie,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36'
}
# proxies = {
# 'http': 'http://127.0.0.1:8080',
# 'https': 'http://127.0.0.1:8080',
# }
if check_sign_in_status(base_url, header1):
if get_free(base_url,common_params, header1):
draw(base_url,common_params, header1)
pass
else:
pass
else:
if not sign_in(base_url, common_params, header1):
sign_in(base_url, common_params, header1)
if get_free(base_url,common_params, header1):
draw(base_url, common_params, header1)
pass
else:
pass
get_win(base_url, aid, uuid, spider, header1)
Cookie提取教程
通过document,cookie 提取的cookie 无法通过校验
账户登录之后,F12 打开网络控制台,刷新页面。 然后点击网络 筛选下类型。
点击任意类型为fetch的网络请求
点击之后,可以看到 请求标头,在里面找到cookie字段。全部复制,粘贴到脚本
如下所示
提取必要参数方法一
因为反馈说找不到uuid,这里增加一下说明,我们在F12 获取到的cookie是经过了URL双重 编码的,需要复制所有的COOKIE,然后进行解密,
URL在线编码: https://www.toolhelper.cn/EncodeDecode/Url
解密之后就可以获取。
提取必要参数方法二
打开签到界面
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 = ''
然后运行。
第二天运行结果
视频教程
参数填写完成之后,如果存在异常,注意替换user-Agent, 多替换几种。
掘金签到教程