最近看到一篇博客,讲到用青龙面板白嫖游戏云(文章链接)。这里所说的游戏云是雨云。
笔者按照文中的步骤进行了配置,很不幸,失败了。因为是4月份的博客,可能服务器端有变化。
笔者对原文中提供的脚本进行查看和调试,确实在请求的URI上存在出入,现在贴上代码全文。
# -*- coding: utf-8 -*-
# @Time: 2023年06月22日23时48分
import requests
from datetime import datetime, timedelta, timezone
from pathlib import Path
import logging
import json
''''脚本使用说明:
第一步:上传本脚本到青龙。
第二步:去 https://www.rainyun.cc/?ref=rain 注册一个账号(不提现只抢游戏云和主机的话不用实名)
想提现的话6万积分起提现...绑定支付宝提现(稳到,亲测过,也有官方用户群)。
第三步:本脚本里第132行和133行里设置一下自己注册的账号和密码!!!
注册地址:
https://www.rainyun.cc/?ref=rain
'''
# 忽略 不验证ssl的提示
import warnings
warnings.filterwarnings('ignore')
class RainYun():
def __init__(self, user: str, pwd: str) -> None:
# 认证信息
self.user = user.lower()
self.pwd = pwd
self.json_data = json.dumps({
"field": self.user,
"password": self.pwd,
})
# 日志输出
self.logger = logging.getLogger(self.user)
formatter = logging.Formatter(datefmt='%Y/%m/%d %H:%M:%S',
fmt="%(asctime)s 雨云 %(levelname)s: 用户<%(name)s> %(message)s")
handler = logging.StreamHandler()
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.logger.setLevel(logging.INFO)
# 签到结果初始化
self.signin_result = False
# 请求设置
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
"Origin": "https://app.rainyun.com",
"Referer": "https://app.rainyun.com"
})
self.login_url = "https://api.v2.rainyun.com/user/login"
self.signin_url = "https://api.v2.rainyun.com/user/reward/tasks"
self.logout_url = "https://api.v2.rainyun.com/user/logout"
self.query_url = "https://api.v2.rainyun.com/user/"
# 忽略 .cc ssl错误
self.session.verify = False
def login(self) -> None:
"""登录"""
res = self.session.post(
url=self.login_url, headers={"Content-Type": "application/json"}, data=self.json_data)
if res.text.find("200") > -1:
self.logger.info("登录成功")
self.session.headers.update({
"X-CSRF-Token": res.cookies.get("X-CSRF-Token", "")
})
else:
self.logger.error(f"登录失败,响应信息:{res.text}")
def signin(self) -> None:
"""签到"""
res = self.session.post(url=self.signin_url, headers={"Content-Type": "application/json"}, data=json.dumps({
"task_name": "每日签到",
"verifyCode": ""
}))
self.signin_date = datetime.utcnow()
if res.text.find("200") > -1:
self.logger.info("成功签到并领取积分")
self.signin_result = True
else:
self.logger.error(f"签到失败,响应信息:{res.text}")
self.signin_result = False
def logout(self) -> None:
res = self.session.post(url=self.logout_url)
if res.text.find("200") > -1:
self.logger.info('已退出登录')
else:
self.logger.warning(f"退出登录时出了些问题,响应信息:{res.text}")
def query(self) -> None:
res = self.session.get(url=self.query_url)
self.points = None
if res.text.find("200") > -1:
data = res.json()["data"]
self.points = data.get("Points", None) or data["points"]
self.logger.info("积分查询成功为 " + repr(self.points))
else:
self.logger.error(f"积分信息失败,响应信息:{res.text}")
def log(self, log_file: str, max_num=5) -> None:
"""存储本次签到结果的日志"""
# 北京时间
time_string = self.signin_date.replace(tzinfo=timezone.utc).astimezone(
timezone(timedelta(hours=8))).strftime("%Y/%m/%d %H:%M:%S")
file = Path(log_file)
record = {
"date": time_string,
"result": self.signin_result,
"points": self.points
}
previous_records = {}
if file.is_file():
try:
with open(log_file, 'r') as f:
previous_records = json.load(f)
if not previous_records.get(self.user):
previous_records[self.user] = []
previous_records[self.user].insert(0, record)
previous_records[self.user] = previous_records[self.user][:max_num]
except Exception as e:
self.logger.error("序列化日志时出错:"+repr(e))
else:
previous_records[self.user] = [record]
with open(log_file, 'w', encoding='utf-8') as f:
json.dump(previous_records, f, indent=4)
self.logger.info('日志保存成功')
if __name__ == '__main__':
accounts = [
{
"user": "username", # 账户
"password": "password" # 密码
}
]
for acc in accounts:
ry = RainYun(acc["user"], acc["password"]) # 实例
ry.login() # 登录
ry.signin() # 签到
ry.query() # 查询积分
ry.logout() # 登出
# 保存日志则打开注释 推荐文件绝对路径
# file = "./rainyun-signin-log.json"
# 日志最大记录数量
# max_num = 5
# ry.log(file, max_num) # 保存日志
上述的脚本可以通过青龙脚本进行运行,也可以通过宝塔面板的定时任务或者Linux的crond进行运行。