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


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 都会影响页面是否返回信息。这个和脚本无关。

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

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

在这里插入图片描述

服务器返回的数据无法解析为JSON格式

如果配置完成遇到如下情况, 尝试将 sign_indraw 两个函数中的 data 置为空。
在这里插入图片描述

即 搜索 data = '{}' 替换为 data = ''
然后运行。
在这里插入图片描述

第二天运行结果
在这里插入图片描述

视频教程

参数填写完成之后,如果存在异常,注意替换user-Agent, 多替换几种。

掘金签到教程

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SwBack

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

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

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

打赏作者

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

抵扣说明:

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

余额充值