雨云签到

注册雨云账号 点击这里 领取五元无门槛优惠券 免费已备案域名。低价服务器,主机。

Github地址:雨云签到

  • 这是一个用于在雨云进行自动签到的Python脚本。
  • 请注意,这只是一个demo,仅供学习参考,不保证能够长期使用。

功能说明

  • 支持多账号登录和签到
  • 程序将在每天的早上八点签到一次
  • 通过电子邮件发送签到结果的通知

使用说明

  1. 安装依赖库:在运行代码之前,请确保已安装以下依赖库:
  2. requests
  3. email
  4. apscheduler
  5. python-dotenv
pip install requests email apscheduler python-dotenv

如果你使用的是Python 3,你可能需要使用pip3来安装依赖库。

pip3 install requests email apscheduler python-dotenv

如果您使用的是虚拟环境,请确保已经激活了虚拟环境再执行上述命令。

  1. 设置环境变量:在app.py同级目录新建.env文件
    在运行代码之前,请确保已设置以下环境变量:

  2. USER_ID: 用户ID,用逗号分隔

  3. USER_PASSWORD: 用户密码,用逗号分隔,顺序与用户ID对应

  4. API_KEYS: API Key,用逗号分隔,顺序与用户ID对应

  5. API_KEY_REMARKS: API Key的备注,用逗号分隔,顺序与API Key对应

  6. NOTIFICATION_EMAILS: API Key的通知邮箱,用逗号分隔,顺序与API Key对应

  7. TASK_NAME: 签到任务名称

  8. SMTP_SERVER: SMTP服务器地址

  9. SMTP_PORT: SMTP服务器端口号

  10. SMTP_USERNAME: 邮箱用户名

  11. SMTP_PASSWORD: 邮箱密码

  12. SENDER_EMAIL: 发件人邮箱

  13. 运行代码:使用以下命令运行代码:

python app.py

如果你使用的是Python 3,你可能需要使用python3来运行代码。

python3 app.py

定时任务:代码中已包含定时任务的设置,可以根据需要进行调整。

import os
import requests
import json
import smtplib
import logging
from email.mime.text import MIMEText
from apscheduler.schedulers.blocking import BlockingScheduler
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 配置日志记录
logging.basicConfig(filename='app.log', level=logging.WARN, format='%(asctime)s - %(levelname)s - %(message)s', encoding='utf-8')

# 获取用户ID、密码和API Key的列表
user_ids = os.getenv("USER_ID").split(",")
user_passwords = os.getenv("USER_PASSWORD").split(",")
api_keys = os.getenv("API_KEYS").split(",")
api_key_remarks = os.getenv("API_KEY_REMARKS").split(",")

# 设置API请求的URL
url = "https://api.v2.rainyun.com"

# 设置SMTP服务器和邮箱相关信息
smtp_server = os.getenv("SMTP_SERVER")
smtp_port = int(os.getenv("SMTP_PORT"))
smtp_username = os.getenv("SMTP_USERNAME")
smtp_password = os.getenv("SMTP_PASSWORD")
sender_email = os.getenv("SENDER_EMAIL")

# 设置Headers
headers = {
    'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
    'Content-Type': 'application/json'
}

# 创建邮件内容
def create_email_content(remark, result):
    subject = f"雨云签到结果 - {remark}"
    content = f"签到结果: {result}"
    email_content = MIMEText(content, 'plain')
    email_content['Subject'] = subject
    email_content['From'] = sender_email
    return email_content

# 执行登录操作
def perform_login(user_id, user_password, remark):
    payload = {
        "field": user_id,
        "password": user_password
    }
    response = requests.post(f"{url}/user/login", headers=headers, json=payload)
    result = response.json()
    if response.status_code == 200:
        return result["x-api-key"]
    else:
        error_message = result['message']
        logging.error(f"用户ID: {user_id} - 备注:{remark} - 登录失败,错误信息: {error_message}")
        send_email(os.getenv("NOTIFICATION_EMAILS").split(",")[user_ids.index(user_id)], f"用户ID: {user_id}", f"备注:{remark}", error_message)
        return None

# 执行签到任务
def perform_sign_in(api_key, remark, notification_email, user_id):
    headers['x-api-key'] = api_key
    task_name = os.getenv("TASK_NAME")
    payload = {
        "task_name": task_name
    }
    response = requests.post(f"{url}/user/reward/tasks", headers=headers, json=payload)
    result = response.json()

    if response.status_code == 200:
        print(f"备注: {remark} - 用户id:{user_id} - 签到成功")
        send_email(notification_email, remark, result, user_id)
    else:
        error_message = result['message']
        logging.error(f"备注: {remark} - 用户id:{user_id} - 签到失败,错误信息: {error_message}")
        send_email(notification_email, remark, result, user_id)

# 发送邮件通知
def send_email(notification_email, remark, result, user_id):
    try:
        smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
        smtp.login(smtp_username, smtp_password)
        email_content = create_email_content(remark, result)
        smtp.sendmail(sender_email, notification_email, email_content.as_string())
        print(f"邮件通知已发送 - 用户ID: {user_id} - 邮件地址: {notification_email}")
    except Exception as e:
        error_message = str(e)
        logging.error(f"发送邮件通知时出错: {error_message} - 用户ID: {user_id} - 邮件地址: {notification_email}")
    finally:
        if 'smtp' in locals():
            try:
                smtp.quit()
            except Exception as e:
                error_message = str(e)
                logging.error(f"关闭SMTP连接时出错: {error_message}")

# 遍历所有账号登录并签到
def sign_in_all():
    for index, (user_id, user_password) in enumerate(zip(user_ids, user_passwords)):
        if user_id in user_ids and api_keys[user_ids.index(user_id)]:
            remark = api_key_remarks[user_ids.index(user_id)]
            notification_email = os.getenv("NOTIFICATION_EMAILS").split(",")[index] if index < len(os.getenv("NOTIFICATION_EMAILS").split(",")) else None
            api_key = api_keys[user_ids.index(user_id)]
            if api_key:
                perform_sign_in(api_key, remark, notification_email, user_id)
        else:
            print(f"用户ID: {user_id} - 未设置API Key")

# 启动立即执行一次
try:
    sign_in_all()
except Exception as e:
    error_message = str(e)
    logging.error(f"执行签到时出错: {error_message}")

# 定时任务
scheduler = BlockingScheduler()
try:
    scheduler.add_job(sign_in_all, 'cron', hour=8, minute=0)  # 每天的8:00 AM触发签到任务
    scheduler.start()
except Exception as e:
    error_message = str(e)
    logging.error(f"启动定时任务时出错: {error_message}")