[掘金社区]自动签到脚本

功能说明

自动签到、自动获取免费抽奖次数、自动免费抽奖、获取抽奖后的矿石余额
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上 和 阿里云 服务器上都可以成功运行

如果脚本运行正常一段时间之后,突然出现报错, 直接替换 msTokena_bogus 这两个值为最新的即可。

实际上,截至今天,在未修改cookie的情况下,脚本一直正常运行,偶尔会出现签到失败的情况,所以我直接将签到函数执行了两遍。自主运行20天无问题。

在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwBack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值