182 lines
7.3 KiB
Python
182 lines
7.3 KiB
Python
# Source: https://github.com/xfmeng970526/ql/blob/main/yu.py
|
||
# Raw: https://raw.githubusercontent.com/xfmeng970526/ql/main/yu.py
|
||
# Repo: xfmeng970526/ql
|
||
# Path: yu.py
|
||
# UploadedAt: 2023-09-20T12:13:28+08:00
|
||
# SHA256: 0548064af1ce7ef8d6d449edb5bb0555d2911a7ea795da689b70f7b325282fdc
|
||
# Category: web版/账密
|
||
# Evidence: web/H5关键词 + username/password/login
|
||
|
||
# -*- coding: utf-8 -*-
|
||
# @Time: 2023年04月06日14时26分
|
||
import requests
|
||
from datetime import datetime, timedelta, timezone
|
||
from pathlib import Path
|
||
import logging
|
||
import json
|
||
cron: 3 9,14 * * *
|
||
new Env('102-雨云');
|
||
项目名称:雨云
|
||
''''脚本使用说明:
|
||
后缀名改成py
|
||
|
||
白嫖的项目:签到白嫖游戏服务器或者稳定的虚拟主机,攒着提现也可以(2018年以来一直稳定运行的,自己可以查一查资料)
|
||
|
||
第一步:上传本脚本到青龙(本脚本是py不是js 别搞错了)
|
||
第二步:去 https://www.rainyun.cc/?ref=MzUxMzA= 注册一个账号(不提现只抢游戏云和主机的话不用实名)
|
||
想提现的话6万积分起提现...绑定支付宝提现(稳到,亲测过,也有官方用户群)。
|
||
第三步:本脚本里第121行122行里设置一下自己注册的账号和密码!!!
|
||
本脚本里第121行122行里设置一下自己注册的账号和密码!!!
|
||
本脚本里第121行122行里设置一下自己注册的账号和密码!!!
|
||
第四步:时间规则:0 0 23 * * ? #每天 23 点执行一次 (可以按自己的需求,每天执行一次)
|
||
|
||
积分规则及说明:本脚本是每天实现自动签到(每天300个积分),入门级游戏云或者虚拟主机2000积分一周。
|
||
这样下来一直用积分续费,想提现的话6万积分起提现...绑定支付宝提现(稳到)。
|
||
|
||
|
||
注册地址:
|
||
https://www.rainyun.cc/?ref=rain
|
||
|
||
https://www.rainyun.cc/?ref=rain
|
||
|
||
|
||
提现规则:6万积分起提现(稳到,不过建议用来续费游戏云比较划算)
|
||
|
||
新人完成积分任务以后大概会有7000积分(积分商城每天20点刷新,自己抢一下一个主机或者游戏云)。
|
||
而2000积分就可以领取一个免费的MC服务器或者主机,而且可以用积分进行续费!续费也只需要2000积分!
|
||
前期积分任务做完加上每日签到,足够免费续费一个月了!后面一直用积分续费。
|
||
|
||
|
||
注册地址:
|
||
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://api.rainyun.com",
|
||
"Referer": "https://api.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": "账户", # 账户
|
||
"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) # 保存日志
|