🚀 解放双手!Linux 无头服务器打造最强自动签到脚本 (支持多号 + 飞书通知)
自动化脚本 ⚡ 效率提升 python 自动化 脚本 ubuntu 18

你好呀!👋 手里有一台 24 小时运行的 Linux 服务器,却还在每天手动打开网页点“签到”?这不是浪费资源嘛!😤

今天我们就来硬核一把,用 Python 打造一个轻量级多账户带飞书美观推送的自动签到神器!不需要安装笨重的浏览器,不需要图形界面,甚至能在 1 核 512M 的小鸡上跑得飞起!✈️


🛠️ 原理揭秘:为什么不用 Selenium?

很多教程教你用 Selenium 模拟浏览器,但它太吃内存了,配置 Headless 模式也容易报错。

我们的方案是 “模拟 API 请求”:直接像黑客一样构造 HTTP 数据包发送给服务器。

  • 资源占用极低 (几 MB 内存)

  • 速度极快 (秒级完成)

  • 极度稳定 (不受网页加载速度影响)

唯一的小难点是网站用了 FingerprintJS(浏览器指纹),不过别怕,我有 “一次抓取,永久使用” 的绝招!😎


🕵️ 第一步:获取关键情报 (Fingerprint)

这是最关键的一步!因为网站登录后会瞬间跳转,普通的抓包看都看不清。我们需要一点小技巧。

🚨 注意:请严格按照以下顺序操作,顺序错了就抓不到了!

  1. 打开你的电脑浏览器(Chrome/Edge),进入登录页面。

  2. F12 召唤开发者工具,切换到 Network (网络) 面板。

  3. 🔴 关键设置 A:确保左上角的圆点是红色的(正在录制)。

  4. 关键设置 B必须勾选 "Preserve log" (保留日志)

    • 这一步是为了防止页面跳转后,刚刚的登录请求记录被清空。

  5. 🔍 筛选:点击上方的 "Fetch/XHR"(只看数据,不看图片)。

  6. 执行:输入账号密码,点击 “登录”

  7. 捕获:此时列表中会出现一个名为 login (或 auth/login) 的请求。点击它,在右侧 Payload 里找到 fingerprint,复制那串长长的字符备用。


⚙️ 第二步:准备配置文件

为了安全,我们把账号密码和代码分开。在服务器上新建一个文件夹,比如 /root/scripts/neworld/

创建 config.json,直接抄作业:

 {
   "url_base": "https://neworld.cloud",
   "feishu": {
     "enable": true,
     "webhook": "https://open.feishu.cn/open-apis/bot/v2/hook/你的Webhook地址",
     "secret": "你的加签密钥(在飞书机器人安全设置里看)"
   },
   "accounts": [
     {
       "email": "user1@gmail.com",
       "password": "mypassword123",
       "fingerprint": "这里填刚刚抓到的那一串字符_1",
       "note": "我的主力号"
     },
     {
       "email": "user2@qq.com",
       "password": "mypassword456",
       "fingerprint": "这里填刚刚抓到的那一串字符_2",
       "note": "我的小号"
     }
   ]
 }

💡 提示:如果有多个账号,直接在 accounts 列表里复制粘贴大括号块即可,支持无限多开!


🐍 第三步:部署核心脚本

接下来是核心代码。这个脚本集成了 HmacSHA256 签名校验多线程会话隔离 以及 精美的飞书卡片生成

确保安装了依赖:

Bash

 pip install requests

创建 auto_sign.py,粘贴以下内容:

Python

 # -*- coding: utf-8 -*-
 import requests, json, logging, time, random, os, hashlib, base64, hmac
 ​
 # ==================== 基础配置 ====================
 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 CONFIG_FILE = os.path.join(BASE_DIR, 'config.json')
 LOG_FILE = os.path.join(BASE_DIR, 'sign_task.log')
 ​
 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename=LOG_FILE, filemode='a')
 console = logging.StreamHandler()
 logging.getLogger('').addHandler(console)
 ​
 # ==================== 飞书签名算法 ====================
 def gen_sign(timestamp, secret):
     string_to_sign = '{}\n{}'.format(timestamp, secret)
     hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
     return base64.b64encode(hmac_code).decode('utf-8')
 ​
 # ==================== 发送飞书美化卡片 ====================
 def send_feishu_card(config, results):
     feishu = config.get('feishu', {})
     if not feishu.get('enable'): return
     
     timestamp = str(int(time.time()))
     sign = gen_sign(timestamp, feishu['secret']) if feishu.get('secret') else ""
     
     # 构建卡片元素
     elements = [{"tag": "div", "text": {"tag": "lark_md", "content": f"📅 **执行时间**: {time.strftime('%Y-%m-%d %H:%M:%S')}"}}, {"tag": "hr"}]
     
     for res in results:
         status_icon = "🟢" if res['login'] else "🔴"
         # 结果图标逻辑:成功🎉 / 重复🔁 / 失败📝
         msg_icon = "🎉" if "成功" in res['msg'] else ("🔁" if "已经" in res['msg'] else "📝")
         
         elements.append({
             "tag": "div", 
             "text": {"tag": "lark_md", "content": f"👤 **{res['name']}**\n{status_icon} {'登录成功' if res['login'] else '登录失败'} | {msg_icon} {res['msg']}"}
         })
         elements.append({"tag": "hr"})
         
     elements.append({"tag": "note", "elements": [{"tag": "plain_text", "content": "来自 Linux 最强自动签到脚本"}]})
 ​
     payload = {
         "timestamp": timestamp, "sign": sign, "msg_type": "interactive",
         "card": {"config": {"wide_screen_mode": True}, "header": {"template": "blue", "title": {"content": "☁️ 新界云 自动签到报告", "tag": "plain_text"}}, "elements": elements}
     }
     try:
         requests.post(feishu['webhook'], json=payload)
         logging.info("🔔 飞书通知已发送")
     except Exception as e:
         logging.error(f"🔔 发送失败: {e}")
 ​
 # ==================== 机器人逻辑 ====================
 class Bot:
     def __init__(self, acc, url):
         self.acc, self.url = acc, url
         self.sess = requests.Session()
         self.sess.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/115.0.0.0 Safari/537.36", "Content-Type": "application/json", "Origin": url, "Referer": f"{url}/auth/login"})
 ​
     def run(self):
         res = {"name": self.acc.get('note', self.acc['email']), "login": False, "msg": "未执行"}
         try:
             # 1. 登录
             logging.info(f"[{res['name']}] 正在登录...")
             login_resp = self.sess.post(f"{self.url}/auth/login", data=json.dumps({
                 "email": self.acc['email'], "passwd": self.acc['password'], "fingerprint": self.acc['fingerprint'], "code": "", "remember_me": "false"
             }), timeout=15).json()
             
             if login_resp.get("ret") == 1:
                 res['login'] = True
                 time.sleep(random.uniform(2, 5)) # 模拟人类延迟
                 # 2. 签到
                 self.sess.headers.update({"Referer": f"{self.url}/user"})
                 check_resp = self.sess.post(f"{self.url}/user/checkin", timeout=15).json()
                 res['msg'] = check_resp.get('msg', '未知返回')
                 logging.info(f"[{res['name']}] ✅ 结果: {res['msg']}")
             else:
                 res['msg'] = f"登录失败: {login_resp.get('msg')}"
                 logging.error(f"[{res['name']}] ❌ {res['msg']}")
         except Exception as e:
             res['msg'] = f"异常: {str(e)}"
             logging.error(f"[{res['name']}] 💥 {res['msg']}")
         return res
 ​
 def main():
     logging.info("🚀 任务启动")
     if not os.path.exists(CONFIG_FILE): return logging.error("找不到配置文件")
     with open(CONFIG_FILE, 'r', encoding='utf-8') as f: config = json.load(f)
     
     results = []
     for i, acc in enumerate(config.get('accounts', [])):
         results.append(Bot(acc, config['url_base']).run())
         if i < len(config['accounts']) - 1: time.sleep(random.randint(5, 10)) # 多号间隔防止封IP
             
     send_feishu_card(config, results)
     logging.info("🏁 任务结束")
 ​
 if __name__ == "__main__":
     main()

⏰ 第四步:设置自动化 (Crontab)

最后,我们让它每天早上 8:30 自动干活。

输入 crontab -e,添加这一行:

 # 每天 08:30 运行
 30 8 * * * /usr/bin/python3 /root/scripts/neworld/auto_sign.py

🎉 效果展示

每天早上,你的飞书就会收到这样一张赏心悦目的卡片:

☁️ 新界云 自动签到报告

📅 执行时间: 2026-01-23 08:30:15

──────────────────────

👤 我的主力号

🟢 登录成功 | 🎉 签到成功 (获得 500MB)

──────────────────────

👤 备用号

🟢 登录成功 | 🔁 今天已经签到过了

──────────────────────

来自 Linux 最强自动签到脚本


❓ 常见问题 (FAQ)

Q: Fingerprint 会过期吗?

A: 基本不会。 只要你的那台电脑硬件和浏览器不升级,生成的指纹就是固定的。我实测用了一年都没变过。

Q: 为什么日志提示“环境异常”?

A: 极少数情况发生。可能是你的 User-Agent (脚本里写的) 和你抓取的 Fingerprint (浏览器生成的) 匹配度太低。建议把脚本里的 User-Agent 换成你自己浏览器抓包看到的那个。

Q: 配置文件安全吗?

A: 建议执行 chmod 600 config.json,这样只有你能看,防止其他用户偷窥密码。


搞定!现在你可以去喝杯咖啡,让服务器自己去打工吧!☕️ 如果觉得好用,记得点个赞哦!💖

🚀 解放双手!Linux 无头服务器打造最强自动签到脚本 (支持多号 + 飞书通知)
https://fnidore.top/archives/xin-jie-yun
作者
fnidore
发布于
更新于
许可