嘿,大家好!今天我要带你们走进一段有趣的代码世界。我们要编写一份 Python 脚本,主要用于自动完成掘金的签到和抽奖任务。想象一下,什么都不用做,你的掘金账号每天都会悄悄为你完成签到,领取矿石,甚至参加抽奖,这是不是一件相当惬意的事情?这段代码可不只是简单的签到和抽奖,其中还有一些非常有趣的技术细节,适合想要提升自己技术的小伙伴们!
那我们就开始吧!🔍
PS:文末有完整代码的 git 地址
1. 序幕:导入模块,开启探险之旅
我们从导入模块开始,首先看看代码都使用了哪些库。
import requests # 导入 requests 库,用于发送 HTTP 请求
import json # 导入 json 库,用于处理 JSON 数据
import time # 导入 time 库,用于延时操作
import random # 导入 random 库,用于生成随机数
在编程的世界里,就像冒险前需要装备一样,我们需要准备工具。requests
是用来发送 HTTP 请求的,json
用来处理 JSON 数据,time
用来控制时间,random
则可以帮我们制造一些“随机性”。这几个库可以说是日常开发中的“必备武器”。
2. 签到与抽奖的幕后英雄:配置参数
aid = ""
uuid = ""
params = ""
cookie = ""
aid
和 uuid
是脚本运行的关键参数,类似于游戏中的玩家 ID 和装备槽位,params
则是一些关键接口才需要添加的额外参数。而 cookie
则是你与掘金服务器“对话”的凭证。它告诉掘金服务器,“嘿,我是秦始皇的账号,我来签到啦!”。
cookie
是从浏览器获取的,可能每隔一段时间就会过期,需要手动更新。这就像是进出某些区域时需要出示的通行证,没有这个通行证,你就会被拦在门外。
3. 参数获取:从抽奖接口轻松拿到所有必备参数
写代码之前,我们先来解决一件关键的事情——获取这些必备的参数,比如 aid
、uuid
、params
、cookie
等。其实,掘金可以说是非常“厚道”,我们可以通过浏览器的开发者工具从请求中直接拿到所有需要的参数,轻轻松松搞定。
具体操作很简单,你只需要在浏览器中打开掘金的控制面板,然后执行一次幸运抽奖,比如点击“单抽”。接下来,查找 draw
接口请求,所有你需要的参数就都在这个接口里了,包括 aid
、uuid
、cookie
,还有 spider
和 msToken
等等。拿下这些参数后,基本上可以说你已经拥有了通往掘金签到与抽奖世界的“钥匙”。
如何操作?
-
打开浏览器的开发者工具(F12 或右键 -> 检查):然后进入“网络 (Network)”面板,在这里你可以看到所有与服务器的交互。
-
点击执行抽奖操作:这时,你会在控制台里看到一个
draw
接口请求。点开它,找到请求的详情,你就可以看到所有需要的参数。
为了方便起见,我个人的习惯是直接复制整个请求的 curl
命令。这样所有参数一目了然,还可以随时查找和调整。下面是一个示例截图:
这样经过简单的操作,你就可以轻松获得所有的必备参数了。是不是非常方便?不用担心手动拼接 URL 或去猜测参数的来源,浏览器开发者工具给你提供了所有的一切。
4. 编写函数,做签到小能手
# 通用请求函数
def send_request(method, url, **kwargs):
try:
response = requests.request(method, url, **kwargs)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
print(f"请求发生错误:{e}")
return None
# 签到函数
def check_in():
"""
签到函数,发送 POST 请求到指定 URL,进行签到操作,更新签到时间
当响应中的 err_no 为 0 时,更新签到奖励矿石和当前剩余矿石
如果 data["data"]["err_no"] 为 403,说明签到失败,可能是 Cookie 过期
"""
url = (
f"https://api.juejin.cn/growth_api/v1/check_in"
f"?aid={aid}&uuid={uuid}&{params}"
)
data = send_request("POST", url, headers=headers, json={})
if data:
global sign_in_time, sign_error
sign_in_time = time.strftime("%Y年%m月%d日 %H:%M:%S", time.localtime())
if data.get("err_no") == 0:
# 处理登录过期的情况
if data["data"].get("err_no") == 403:
sign_error = data["data"].get("err_msg")
print(
"签到失败,Cookie 可能已过期,请检查 Cookie 是否正确或重新获取 Cookie"
)
else:
# 处理签到成功的情况
global sign_in_reward
sign_in_reward = data["data"]["incr_point"]
elif data.get("err_no") == 15001:
sign_error = data["err_msg"]
return data
这段代码的重点是签到操作!check_in()
函数首先发送一个 POST 请求到掘金的签到接口,send_request
函数被用来负责请求的发送和响应处理。我们通过 err_no
来判断签到是否成功。成功后,它会告诉你今天又拿到了多少矿石(奖励点数)。
你可能会问:“这和自己手动签到有什么区别?” 答案是:省事儿! 这段代码就是懒人专属,既能偷懒,又能准时准点打卡,何乐而不为呢?
5. 每日免费抽奖,手气永远在线!🎰
签到之后,最令人期待的莫过于每天一次的免费抽奖。我们每个人心里都有一个小愿望——万一今天就中奖了呢?脚本的抽奖功能就是为了帮你每天准时准点地执行这次免费的幸运尝试,让你“手气永远在线”!
def draw_lottery():
url = (
f"https://api.juejin.cn/growth_api/v1/lottery/draw"
f"?aid={aid}&uuid={uuid}&{params}"
)
data = send_request("POST", url, headers=headers, json={})
if data and data.get("err_no") == 0:
global lottery_prize, luck_value, total_luck_value
lottery_prize = data["data"]["lottery_name"]
luck_value = data["data"]["draw_lucky_value"]
total_luck_value = data["data"]["total_lucky_value"]
return data
抽奖的代码和签到的代码非常相似,都是通过发送 POST 请求来完成的。抽奖成功后,系统会返回你抽中的奖品是什么,幸运值增加了多少,总的幸运值是多少。
这个幸运值是个什么东西呢?幸运值越高,你未来中奖的概率就越大。总之,每天坚持抽一次,不仅免费,还能积累幸运值,万一哪天中了大奖,岂不是美滋滋?
6. 获取签到天数与矿石
我们也可以通过接口查看自己签到的天数和剩余的矿石。
def get_check_in_days():
url = (
f"https://api.juejin.cn/growth_api/v1/get_counts"
f"?aid={aid}&uuid={uuid}&spider=0"
)
data = send_request("GET", url, headers=headers)
if data and data.get("err_no") == 0:
# 更新连续签到天数和累计签到天数
global continuous_check_in, total_check_in
continuous_check_in = data["data"]["cont_count"]
total_check_in = data["data"]["sum_count"]
return data
def get_remaining_ore():
url = (
f"https://api.juejin.cn/growth_api/v1/get_cur_point"
f"?aid={aid}&uuid={uuid}&spider=0"
)
data = send_request("GET", url, headers=headers)
if data and data.get("err_no") == 0:
global remaining_ore
remaining_ore = data["data"]
return data
签到天数和矿石数量可以让我们清楚地看到,我们每天都积累了多少奖励。积少成多,天长日久,这也是自动化签到代码的一个优势:持之以恒,总有收获!
7. 耐心等候,稍后再试
在脚本中,你可能注意到它会在执行某些操作前,随机延时一段时间。比如:
minutes_delay = random.randint(0, 10)
seconds_delay = random.randint(1, 59)
total_delay = minutes_delay * 60 + seconds_delay
print(f"等待 {minutes_delay} 分 {seconds_delay} 秒 ({total_delay} 秒) 后进行签到...")
time.sleep(total_delay)
这段代码让程序在签到或抽奖前随机等待几分钟。原因其实很简单,这样做可以模拟真实用户的操作,避免被服务器认为你是在“搞自动化”。否则掘金的服务器可能会觉得你是个“机器人”,从而把你屏蔽掉。
8. 结束语:自动化的美妙之处
我们讲解了整个签到和抽奖的流程,从发送请求到获取奖励,整个过程自动化到极致。如果你每天签到,手动去掘金操作难免繁琐,但是有了这份代码,你可以轻松地自动完成签到,领取矿石,甚至尝试一下手气,看看能不能抽中大奖!
代码不仅仅是工具,更是一种让生活更高效的小乐趣。通过这些简单的自动化脚本,我们可以把那些重复枯燥的任务交给机器,腾出时间来做更多有趣的事情。一通百通,其实很多站点的签到原理都是这样的,大同小异。
当然,还可以进一步扩展和优化的方向:
- 多账号支持:通过添加多账号的支持,让脚本一次处理多个用户的签到任务。
- 消息通知:还可以添加飞书消息通知,下图就是我的飞书消息通知模版。
- 青龙面板:结合定时任务或服务器后台运行,使脚本每天自动执行而无需人工启动。
最后祝大家签到顺利,矿石拿到手软,大奖抽到爆! 🎉
“编程不仅是一门技能,更是一种生活方式!”