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

掘金自动签到脚本Python实现
该文章已生成可运行项目,


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

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

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

在这里插入图片描述

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

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

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

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

解决方案

msToken值url解码,因为get请求会自动进行url编码。
脚本内url解码,正常访问到
在这里插入图片描述
未解码情况 - 无法获取到内容,导致脚本显示 服务器返回的数据无法解析为JSON格式。
在这里插入图片描述

视频教程

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

掘金签到教程

本文章已经生成可运行项目
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SwBack

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

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

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

打赏作者

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

抵扣说明:

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

余额充值