功能说明
自动签到、自动获取免费抽奖次数、自动免费抽奖、获取抽奖后的矿石余额
8.21 增加 幸运值满格必出转盘内奖励 提醒 精简代码
9.10 优化逻辑、 mstoken 和 a_bogus 不再当天过期,测试已有18天未出问题
9.13 更新cookie提取教程
本篇文章实时更新
显示 无法解析为JSON格式 说明接口返回为空,表示你填写的参数 存在问题
直接上脚本
脚本临时写的,今天是运行的第一天,虽然报错编码,但是签到、抽奖都成功了。
下面是修改了之后的版本。
# -*- 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
值
Cookie提取教程
通过document,cookie 提取的cookie 无法通过校验
账户登录之后,F12 打开网络控制台,刷新页面。 然后点击网络 筛选下类型。
点击任意类型为fetch的网络请求
点击之后,可以看到 请求标头,在里面找到cookie字段。全部复制,粘贴到脚本
如下所示
提取必要参数方法一
因为反馈说找不到uuid,这里增加一下说明,我们在F12 获取到的cookie是经过了URL双重 编码的,需要复制所有的COOKIE,然后进行解密,
URL在线编码: https://www.toolhelper.cn/EncodeDecode/Url
解密之后就可以获取。
提取必要参数方法二
打开签到界面
F12 或者 鼠标右键-检查 打开浏览器控制台 (这里以Edge做演示)
打开网络请求- F5 刷新当前界面-得到自己的网络请求
在左侧的搜索框 输入:get_cur_point 回车 ,点击任意接口
得到除了cookie之外的所有值
如果还是找不到,建议学习一下网络请求相关的基础知识
效果
然后采用crontab
做个定时任务
效果
我这里直接采用了宝塔执行。
问题解决
如果遇到脚本运行显示如下错误
这是因为下面的两个值为空 或者错误,要注意msToken 要完全与网络请求中一样,不要将其解码。
如果遇到未登录,请登录的情况
是因为你获取的cookie无效 或者失效, 需要注意的是,如果你在客户端或者网页上点击了退出登录,那么你的cookie就会失效,需要重新获取你登录之后的cookie.
另外,脚本没有问题,我在windows上 和 阿里云 服务器上都可以成功运行
如果脚本运行正常一段时间之后,突然出现报错, 直接替换 msToken
和 a_bogus
这两个值为最新的即可。
实际上,截至今天,在未修改cookie的情况下,脚本一直正常运行,偶尔会出现签到失败的情况,所以我直接将签到函数执行了两遍。自主运行20天无问题。