98
这个用户还没有留下简介。
回复讨论
0
登录后可参与回复讨论。
当前还没有回复,欢迎成为第一个参与讨论的人。
主要是本人想要推送,但没看懂就用AI修改了下,能支持企业微信/钉钉推送
要是能有人修改支持帐号密码登陆就好了
浏览器登录论坛
按 F12 → 切换到 网络(Network)选项卡
刷新页面,随便点一个请求
找到 请求标头(Request Headers) 里的 Cookie: 那一行
复制整行值
计划任务 → 添加任务:
脚本内容:

python#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
女仆论坛自动签到 - 增强版 (支持企业微信/钉钉推送)
适用于 bt.sb (Rhex 论坛系统)
"""
import json
import urllib.request
import urllib.error
import logging
import os
import hmac
import hashlib
import base64
import time
from datetime import datetime
# ═══════════════ 配置区 ═══════════════
BASE_URL = "https://bt.sb"
# 建议通过环境变量设置敏感信息,避免硬编码
COOKIE = os.environ.get("BBS_COOKIE", "在这里粘贴你的Cookie")
LOG_FILE = os.environ.get("BBS_LOG", "")
# Webhook 配置
# 企业微信 Webhook 地址
WECHAT_WEBHOOK = os.environ.get("WECHAT_WEBHOOK", "在这里粘贴你的企业微信Webhook地址")
# 钉钉 Webhook 地址
DINGTALK_WEBHOOK = os.environ.get("DINGTALK_WEBHOOK", "在这里粘贴你的钉钉Webhook地址")
# 钉钉加签密钥 (如果钉钉机器人开启了加签安全设置,请填写此处,否则留空)
DINGTALK_SECRET = os.environ.get("DINGTALK_SECRET", "")
def setup_logging():
handlers = [logging.StreamHandler()]
if LOG_FILE:
handlers.append(logging.FileHandler(LOG_FILE, encoding="utf-8"))
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [签到] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
handlers=handlers,
)
def checkin():
url = f"{BASE_URL}/api/check-in"
data = json.dumps({"action": "check-in"}).encode("utf-8")
req = urllib.request.Request(url, data=data, headers={
"Content-Type": "application/json",
"Cookie": COOKIE,
"User-Agent": "Mozilla/5.0 BBS-AutoCheckIn/1.0",
"Referer": BASE_URL,
"Origin": BASE_URL,
}, method="POST")
try:
with urllib.request.urlopen(req, timeout=15) as resp:
body = json.loads(resp.read().decode("utf-8"))
payload = body.get("data", body)
if payload.get("alreadyCheckedIn"):
msg = f"📌 今日已签到(日期:{payload.get('date', '未知')})"
else:
points = payload.get("points", "")
streak = payload.get("currentStreak", 0)
max_streak = payload.get("maxStreak", 0)
msg = f"✅ 日期:{payload.get('date', '未知')}签到成功!累计 {points} 女仆币 | 连续 {streak} 天 | 最长 {max_streak} 天"
logging.info(msg)
push_notify(msg)
return True
except urllib.error.HTTPError as e:
if e.code in (401, 403):
msg = f"❌ Cookie 已失效({e.code}),请重新获取"
else:
msg = f"⚠️ 签到异常 {e.code}: {e.reason}"
logging.error(msg)
push_notify(msg)
return False
except Exception as e:
msg = f"❌ 网络错误:{e}"
logging.error(msg)
push_notify(msg)
return False
def generate_dingtalk_sign(secret):
"""生成钉钉加签签名"""
timestamp = str(round(time.time() * 1000))
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign
def send_wechat_webhook(msg):
"""发送消息到企业微信"""
if not WECHAT_WEBHOOK or "key=" not in WECHAT_WEBHOOK:
return
try:
# 企业微信支持 text, markdown 等类型
payload = {
"msgtype": "text",
"text": {
"content": msg
}
}
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(WECHAT_WEBHOOK, data=data, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=10) as resp:
res_body = json.loads(resp.read().decode("utf-8"))
if res_body.get("errcode") != 0:
logging.warning(f"📨 企业微信推送失败: {res_body.get('errmsg')}")
else:
logging.info("📨 企业微信推送成功")
except Exception as e:
logging.warning(f"📨 企业微信推送异常: {e}")
def send_dingtalk_webhook(msg):
"""发送消息到钉钉"""
if not DINGTALK_WEBHOOK or "access_token=" not in DINGTALK_WEBHOOK:
return
try:
webhook_url = DINGTALK_WEBHOOK
# 如果配置了加签密钥,需要添加 timestamp 和 sign 参数
if DINGTALK_SECRET:
timestamp, sign = generate_dingtalk_sign(DINGTALK_SECRET)
webhook_url = f"{DINGTALK_WEBHOOK}×tamp={timestamp}&sign={sign}"
# 钉钉支持 text, link, markdown 等类型
payload = {
"msgtype": "text",
"text": {
"content": msg
},
"at": {
"isAtAll": False
}
}
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(webhook_url, data=data, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=10) as resp:
res_body = json.loads(resp.read().decode("utf-8"))
if res_body.get("errcode") != 0:
logging.warning(f"📨 钉钉推送失败: {res_body.get('errmsg')}")
else:
logging.info("📨 钉钉推送成功")
except Exception as e:
logging.warning(f"📨 钉钉推送异常: {e}")
def push_notify(msg):
"""统一推送入口"""
# 并行或串行发送均可,这里采用串行以简化逻辑
send_wechat_webhook(msg)
send_dingtalk_webhook(msg)
if __name__ == "__main__":
setup_logging()
logging.info("🕐 开始执行签到")
if COOKIE == "在这里粘贴你的Cookie" or not COOKIE:
logging.error("❌ 请先配置 COOKIE")
exit(1)
success = checkin()
logging.info(f"{'✅ 完成' if success else '❌ 失败'}")
Cookie 有有效期,过期后需要重新获取(脚本会提示 ❌ Cookie 已失效)
执行时间建议设在 00:05 或 08:00,避开整点
零依赖,不需要 pip install 任何东西,Python 3.6+ 自带的标准库就够了
有问题欢迎回帖,觉得好用点个赞 👍
↓↓↓根据下面的修改了下↓↓↓
女仆论坛服务器端自动签到 - 宝塔计划任务版 - 女仆论坛 https://bt.sb/posts/cmpcifjiq0bpqql0kqpqy8hbj#python脚本女仆论坛服务器端自动签到-宝塔计划任务版