├── .gitignore
├── README.md
├── default.config.yaml
├── index.py
├── main.py
├── requirements.txt
└── src
├── Miui.py
├── Push.py
├── Sign.py
├── SkyWingsCloud.py
├── aliyundrive.py
├── arknights.py
├── hykb.py
├── log.py
├── raincloud.py
└── setting.py
/.gitignore:
--------------------------------------------------------------------------------
1 | steat.py
2 | */*__pycache__
3 | /__pycache__
4 | /pyasn1/*/__pycache__
5 | /pyasn1/codec/*/__pycache__
6 | config.yaml
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 自动签到
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 本项目用于需要手动每天签到的场景,使用本项目解放双手。本项目自动每天签到并推送到各社交应用上,目前支持qmsg,sever酱,企业微信,钉钉
18 |
19 |
20 | 目前支持
21 |
22 |
23 | 应用 |
24 | 是否需要cookie |
25 | 是否需要密码 |
26 | 是否可用 |
27 | 功能 |
28 |
29 |
30 | MIUI历史版本 |
31 | ❌ |
32 | ✅ |
33 | ✅ |
34 | 每日签到得积分 |
35 |
36 |
37 | 好游快报 |
38 | ✅ |
39 | ❌ |
40 | ✅ |
41 | 每日爆米花浇水 |
42 |
43 |
44 | 小黑盒 |
45 | ✅ |
46 | ❌ |
47 | ❌ |
48 | 每日签到得盒币 |
49 |
50 |
51 | 交易猫 |
52 | ✅ |
53 | ❌ |
54 | ✅ |
55 | 每日签到得积分 |
56 |
57 |
58 | 天翼云盘 |
59 | ❌ |
60 | ✅ |
61 | ✅ |
62 | 每日签到抽奖得空间 |
63 |
64 |
65 | 网易云游戏 |
66 | ✅ |
67 | ❌ |
68 | ✅ |
69 | 每日签到获取使用时间和成长值 |
70 |
71 |
72 |
73 |
74 |
75 | ---
76 |
77 | **使用**:
78 |
79 | 1. 下载本项目
80 |
81 | 2. 解压本项目压缩包,在解压目录中**Shift+右键** 打开你的命令提示符cmd或powershell
82 |
83 | 3. 执行 `pip install -r requirements.txt` 安装模块
84 |
85 | 4. 把目录中的**default.config.yaml**文件重命名为**config.yaml**,并填写cookie。
86 |
87 | 5. 运行**index.py**文件。
88 |
89 |
90 |
91 | # 使用腾讯云函数运行
92 |
93 | 1. 打开并登录[云函数控制台](https://console.cloud.tencent.com/scf/list)。
94 |
95 | 2. 新建云函数 - 自定义创建,函数类型选`事件函数`,部署方式选`代码部署`,运行环境选 `Python3.6`.
96 |
97 | 3. 提交方法选`本地上传文件夹`,并在下方的函数代码处上传整个项目文件夹。
98 |
99 | 4. 执行方法填写 `index.main_handler`.
100 |
101 | 5. 展开高级配置,将执行超时时间修改为 `300 秒`,其他保持默认。
102 |
103 | 6. 展开触发器配置,选中自定义创建,触发周期选择`自定义触发周期`,并填写表达式`0 0 7 * * * *`(此处为每天上午 7 时运行一次,可以自行修改)
104 |
105 | 7. 完成
106 |
107 | # 使用阿里云函数运行
108 |
109 | 1. 打开并登录[云函数控制台](https://fcnext.console.aliyun.com/overview)。
110 |
111 | 2. 函数及服务 - 创建服务(名称随便填,日志服务会收费可以关闭) - 创建函数(从零开始创建,函数名称随便填) - 运行环境选择python3.6及以上。
112 |
113 | 3. 代码上传方式选择`本地上传文件夹`并在下方的选择文件夹处上传整个项目文件夹。
114 |
115 | 4. 其余的默认就行
116 |
117 | 5. 配置触发器选择`定时触发器`,触发名称随便填,触发方式自定义,`cron表达式参照腾讯云函数表达式`
118 |
119 | 6. 创建完成到`函数配置`把`环境信息,超时时间改成300到600之间`
120 |
121 | 7. 完成
122 |
123 | # cookie 获取
124 |
125 | ### 好游快爆
126 |
127 | 1. 用手机进行抓包复制请求体里面的的数据填入好游快爆的cookie
128 |
129 |
130 |
131 |
132 |
133 |
134 | ### 小黑盒
135 |
136 | 1. 用手机进行抓包复制cookie的的数据填入小黑盒的cookie heybox_id,heybox_id可以在请求链接获取,imei请求连接里面获得 `注意imei可以不填,但有可能会封号`
137 |
138 | ### 交易猫
139 |
140 | 1. 用手机进行抓包复制cookie的的数据填入交易猫的cookie
141 |
142 | ### 网易云游戏
143 |
144 | 1. 首先我们进入[官网](https://cg.163.com/#/mobile),进行登录。
145 |
146 | 2. 然后用F12打开开发者工具后使用Ctrl+F5进行刷新。
147 |
148 | 3. 找到@me这一项,然后在右边找到Authorization将冒号后面的内容复制下来就是我们所需要的Cookie。
149 |
--------------------------------------------------------------------------------
/default.config.yaml:
--------------------------------------------------------------------------------
1 | Push:
2 | # 推送方式
3 | # 支持qmsg酱 server酱 企业微信推送 钉钉机器人推送
4 | # Qmsg,Server,Epwc,Dingtalk,Wxhook
5 | # 为空或False则不进行推送
6 | PushMode: Qmsg
7 | Qmsg:
8 | key: ""
9 | Server:
10 | key: "your server key"
11 | Epwc:
12 | EnterpriseId: ""
13 | AppId: ""
14 | AppSecret: ""
15 | UserUid: ""
16 | Dingtalk:
17 | token:
18 | secret:
19 | atuser:
20 | atMobiles:
21 | isAtAll: False
22 | Wxhook:
23 | url: ""
24 |
25 | SignToken:
26 | Hykb:
27 | switch: False
28 | cookie:
29 | MiUI:
30 | switch: False
31 | username:
32 | password:
33 | XiaoHeiHe:
34 | switch: False
35 | cookie:
36 | imei:
37 | heybox_id:
38 | version:
39 | JiaoYiMao:
40 | switch: False
41 | cookie:
42 | Tyyp:
43 | switch: False
44 | username:
45 | password:
46 | wyyyx:
47 | switch: False
48 | cookie:
49 | # 请在阿里云盘网页端输入后面代码获取:JSON.parse(localStorage.getItem("token")).refresh_token
50 | Aliyundrive:
51 | switch: False
52 | token:
53 | # 明日方舟配置 打开森空岛网页 登录账号, 打开https://web-api.skland.com/account/info/hg, 复制 content 的值
54 | Arknights:
55 | switch: False
56 | token:
--------------------------------------------------------------------------------
/index.py:
--------------------------------------------------------------------------------
1 | from main import run
2 |
3 | # ------- 腾讯云函数启动模块 --------#
4 | def main_handler(event,context):
5 | run()
6 |
7 | # ------- 阿里云函数启动模块 -------- #
8 | def handler(event,context):
9 | run()
10 | # ------- 本地调试启动模块 --------#
11 | if __name__ == '__main__':
12 | run()
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import time, yaml, os
2 | from src.log import Log
3 | from src.Push import Push
4 | from src.Miui import Miui
5 | from src.SkyWingsCloud import Cloud
6 | from src.aliyundrive import Aliyundrive
7 | from src.raincloud import RainCloud
8 | from src.hykb import HaoYouKuaiBao
9 | from src.arknights import Arknights
10 | from src.Sign import XiaoHeiHe,JiaoYiMao,wyyyx
11 | log = Log()
12 |
13 | def getconfig():
14 | path = os.path.dirname(os.path.realpath(__file__))
15 | with open(f'{path}/config.yaml', 'r', encoding='utf-8') as f:
16 | config = yaml.load(f, Loader=yaml.FullLoader)
17 | return config
18 |
19 | def run():
20 | #开始时间
21 | Begin = time.time()
22 | #程序主体
23 | config = getconfig()
24 | SignToken = config['SignToken']
25 | data = "今日签到结果:\n\n"
26 | # miui历史版本签到
27 | if SignToken['MiUI']['switch']:
28 | body = Miui(SignToken['MiUI'])
29 | data += "MIUI历史版本:\n"+body.Sign()
30 | if SignToken['Hykb']['switch']:
31 | body = HaoYouKuaiBao(SignToken['Hykb'])
32 | data += "\n\n好游快爆:\n"+ body.sgin()
33 | if SignToken['XiaoHeiHe']['switch']:
34 | body = XiaoHeiHe(SignToken)
35 | data += "\n\n小黑盒:\n"+body.Sgin()
36 | if SignToken['JiaoYiMao']['switch']:
37 | body = JiaoYiMao(SignToken)
38 | data += "\n\n交易猫:\n"+body.Sgin()
39 |
40 | # 天翼云盘签到
41 | if SignToken['Tyyp']['switch']:
42 | body = Cloud(SignToken['Tyyp'])
43 | data += "\n天翼云盘:\n"+body.sgin()
44 | if SignToken['wyyyx']['switch']:
45 | body = wyyyx(SignToken)
46 | data += "\n\n网易云游戏:\n"+body.Sgin()
47 | # 阿里云盘
48 | if SignToken['Aliyundrive']['switch']:
49 | body = Aliyundrive(SignToken['Aliyundrive'])
50 | data += "\n\n阿里云盘:\n"+body.sgin()
51 | # 雨云签到
52 | if SignToken['Raincloud']['switch']:
53 | body = RainCloud(SignToken['Raincloud'])
54 | data += "\n\n雨云:\n"+body.sgin()
55 | if SignToken['Arknights']['switch']:
56 | body = Arknights(SignToken['Arknights'])
57 | data += "\n\n明日方舟:\n"+body.sgin()
58 | # 结束时间
59 | end = time.time()
60 | sum = f"本次运行时间{round(end-Begin,3)}秒"
61 | data = data + "\n\n" + sum
62 | # 推送消息
63 | ts = Push(data,config['Push'])
64 | ts.push()
65 |
66 | log.info(sum)
67 | log.info("\n"+data)
68 |
69 | if __name__ == '__main__':
70 | run()
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | requests
2 | rsa
3 | pyyaml
4 |
--------------------------------------------------------------------------------
/src/Miui.py:
--------------------------------------------------------------------------------
1 | import src.setting as url
2 | import requests
3 | from src.log import Log
4 |
5 | log = Log()
6 |
7 | #MIUI 历史版本签到
8 | class Miui():
9 | """MIUI 历史版本签到
10 | """
11 | def __init__(self,SignToken) -> None:
12 | self.user = SignToken['username']
13 | self.password = SignToken['password']
14 | self.head = {
15 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
16 | 'Origin':'https://miuiver.com/',
17 | 'Referer':'https://miuiver.com/',
18 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
19 | 'Accept': 'application/json, text/javascript, */*; q=0.01'
20 | }
21 | #登录
22 | def Login(self):
23 | datas = {
24 | 'log':self.user,
25 | 'pwd':self.password,
26 | 'action': 'mobantu_login'
27 | }
28 | response = requests.post(url=url.Miui_LoginUrl,data=datas,headers=self.head)
29 | if response.text == '1':
30 | log.info("MIUI历史版本:登录成功")
31 | if response.text.__eq__(1):
32 | cookies = response.cookies
33 | log.info("MIUI历史版本:cookies获取成功")
34 | else:
35 | cookies = "没有获取到cookie"
36 | log.info("MIUI历史版本:没有获取到cookie")
37 | return cookies
38 | else:
39 | log.info("MIUI历史版本:登录失败,账号或密码错误")
40 | #签到
41 | def Sign(self):
42 | datas = {
43 | 'action': 'epd_checkin'
44 | }
45 | if self.user != "" and self.password != "":
46 | cookies = self.Login()
47 | if cookies == None:
48 | pass
49 | else:
50 | response = requests.post(url=url.Miui_SginUrl,data=datas,headers=self.head,cookies=cookies).json()
51 | if response['status'] == 200:
52 | log.info("MIUI历史版本:签到成功积分+1")
53 | return "签到成功积分+1"
54 | else:
55 | log.info("MIUI历史版本:" + response["msg"])
56 | return response["msg"]
57 | else:
58 | log.info("MIUI历史版本:账号或密码为空")
59 | return "账号或密码为空"
--------------------------------------------------------------------------------
/src/Push.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import time
3 | import hmac
4 | import hashlib
5 | import base64
6 | import urllib.parse
7 | from src.log import Log
8 |
9 | log = Log()
10 |
11 | class Push():
12 | """
13 | msg : 消息内容
14 | push : 推送的配置
15 | """
16 | def __init__(self,msg,push) -> None:
17 | self.PushMode = push['PushMode']
18 | self.qmsg_key = push['Qmsg']['key']
19 | self.Server_key = push['Server']['key']
20 | self.EnterpriseId = push['Epwc']['EnterpriseId']
21 | self.AppId = push['Epwc']['AppId']
22 | self.AppSecret = push['Epwc']['AppSecret']
23 | self.UserUid = push['Epwc']['UserUid']
24 | self.Dingtalk_token = push['Dingtalk']['token']
25 | self.Dingtalk_secret = push['Dingtalk']['secret']
26 | self.Dingtalk_atuser = push['Dingtalk']['atuser']
27 | self.Dingtalk_atMobiles = push['Dingtalk']['atMobiles']
28 | self.Dingtalk_isAtAll = push['Dingtalk']['isAtAll']
29 | self.wxhookurl = push['Wxhook']['url']
30 | self.msg = msg
31 |
32 | #qmsg酱推送
33 | def Qmsg(self) -> None:
34 | if self.qmsg_key == "":
35 | log.info("没有配置qmsg酱key")
36 | else:
37 | try:
38 | qmsg_url = f'https://qmsg.zendee.cn/send/{self.qmsg_key}'
39 | data = {'msg': self.msg}
40 | zz = requests.post(url=qmsg_url,data=data).json()
41 | if zz['code'] == 0:
42 | log.info("qmsg酱"+zz['reason'])
43 | else:
44 | log.info("qmsg酱"+zz['reason'])
45 | except Exception as e:
46 | log.error("qmsg酱可能挂了:"+e)
47 |
48 | #Sever酱推送
49 | def Server(self,title="米游社签到") -> None:
50 | if self.Server_key == "":
51 | log.info("没有Server酱cookie")
52 | else:
53 | Server_url = f"https://sctapi.ftqq.com/{self.Server_key}.send"
54 | data = {
55 | "title":title,
56 | "desp":self.msg
57 | }
58 | zz = requests.post(url=Server_url,data=data).json()
59 | if zz['code'] == 0:
60 | log.info("Server推送成功")
61 | else:
62 | log.info("Server推送失败"+zz['message'])
63 |
64 | # 企业微信推送
65 | def Epwc(self):
66 | try:
67 | if self.AppId != "" and self.AppSecret != "" and self.UserUid != "" and self.EnterpriseId != "":
68 | def GetToken():
69 | url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.EnterpriseId}&corpsecret={self.AppSecret}&debug=1'
70 | response = requests.get(url=url).json()
71 | return response['access_token']
72 | url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={GetToken()}"
73 | body = {
74 | "touser" : self.UserUid,
75 | "msgtype" : "text",
76 | "agentid" : int(self.AppId),
77 | "text" : {"content" : self.msg},
78 | "safe":0,
79 | "duplicate_check_interval": 1800
80 | }
81 | response = requests.post(url=url,json=body).json()
82 | if response['errcode'] == 0:
83 | log.info("企业微信推送成功")
84 | else:
85 | log.info("企业微信推送失败")
86 | else:
87 | log.info("企业微信:配置没有填写完整")
88 | except Exception as e:
89 | log.info(f"企业微信推送时出现错误,错误码:{e}")
90 |
91 | #钉钉机器人推送
92 | def Dingtalk(self) -> None:
93 | def webhook():
94 | timestamp = str(round(time.time() * 1000))
95 | secret = self.Dingtalk_secret
96 | secret_enc = secret.encode('utf-8')
97 | string_to_sign = '{}\n{}'.format(timestamp, secret)
98 | string_to_sign_enc = string_to_sign.encode('utf-8')
99 | hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
100 | sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
101 | webhook = f'https://oapi.dingtalk.com/robot/send?access_token={self.Dingtalk_token}×tamp={timestamp}&sign={sign}'
102 | # 返回请求链接
103 | return webhook
104 |
105 | # 消息体构建
106 | data = {
107 | "at": {
108 | "atMobiles":[self.Dingtalk_atMobiles],
109 | "atUserIds":[self.Dingtalk_atuser],
110 | "isAtAll": self.Dingtalk_isAtAll
111 | },
112 | "text": {
113 | "content":self.msg
114 | },
115 | "msgtype":"text"
116 | }
117 |
118 | if self.Dingtalk_token == "":
119 | log.info("没有配置钉钉机器人的Token")
120 | else:
121 | try:
122 | if self.Dingtalk_secret != "":
123 | url = webhook()
124 | else:
125 | url = f'https://oapi.dingtalk.com/robot/send?access_token={self.Dingtalk_token}'
126 | # 发送消息
127 | zz = requests.post(url=url,json=data).json()
128 | if zz['errcode'] == 0:
129 | log.info("钉钉机器人推送成功")
130 | else:
131 | log.info("钉钉机器人:"+zz['errmsg'])
132 | except Exception as e:
133 | log.error("钉钉机器人可能挂了:"+e)
134 |
135 | # 企业微信webhook推送
136 | def wxwebhook(self):
137 | head = {
138 | "Content-Type": "application/json"
139 | }
140 | data = {
141 | "msgtype": "text",
142 | "text": {
143 | "content": self.msg
144 | }
145 | }
146 | if self.wxhookurl != "":
147 | try:
148 | zz = requests.post(url=self.wxhookurl,headers=head,json=data).json()
149 | if zz['errcode'] == 0:
150 | log.info("企业微信hook推送成功")
151 | else:
152 | log.info(f"企业微信hook推送失败:{zz}")
153 | except Exception as e:
154 | log.error(f"企业微信hook推送出现错误:{e}")
155 | else:
156 | log.info("企业微信hook推送的url为空。")
157 |
158 |
159 |
160 |
161 | def push(self):
162 | if self.PushMode == "" or not self.PushMode:
163 | log.info("配置了不进行推送")
164 | elif self.PushMode == "Qmsg":
165 | self.Qmsg()
166 | elif self.PushMode == "Server":
167 | self.Server()
168 | elif self.PushMode == "Epwc":
169 | self.Epwc()
170 | elif self.PushMode == "Dingtalk":
171 | self.Dingtalk()
172 | elif self.PushMode == "Wxhook":
173 | self.wxwebhook()
174 | else:
175 | log.info("推送配置错误")
176 |
177 |
--------------------------------------------------------------------------------
/src/Sign.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import random
3 | import time
4 | import base64
5 | import src.setting as url
6 | from src.log import Log
7 |
8 | log = Log()
9 |
10 | # 小黑盒签到
11 | class XiaoHeiHe():
12 | def __init__(self,SignToken) -> None:
13 | self.Xiaoheihe = SignToken['XiaoHeiHe']['cookie']
14 | self.imei = SignToken['XiaoHeiHe']['imei']
15 | self.heybox_id = SignToken['XiaoHeiHe']['heybox_id']
16 | self.version = SignToken['XiaoHeiHe']['version']
17 | self.n = self.get_nonce_str()
18 | self.t = int(time.time())
19 | #self.u = "/task/sign"
20 |
21 | def get_nonce_str(self,length: int = 32) -> str:
22 | """
23 | 生成随机字符串
24 | 参数:
25 | length: 密钥参数
26 | 返回:
27 | str: 随机字符串
28 | """
29 | source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
30 | result = "".join(random.choice(source) for _ in range(length))
31 | return(result)
32 |
33 | def hkey(self,key):
34 | params={"urlpath": key, "nonce": self.n, "timestamp": self.t}
35 | zz = requests.get(url.XiaoHeiHe_Hkey,params=params).text
36 | return zz
37 |
38 | def params(self,key):
39 | p = {
40 | "_time":self.t,
41 | "hkey":self.hkey(key),
42 | "nonce":self.n,
43 | "imei":self.imei,
44 | "heybox_id":self.heybox_id,
45 | "version":self.version,
46 | "divice_info":"M2012K11AC",
47 | "x_app":"heybox",
48 | "channel":"heybox_xiaomi",
49 | "os_version":"13",
50 | "os_type":"Android"
51 | }
52 | return p
53 |
54 | def head(self):
55 | head = {
56 | "User-Agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 ApiMaxJia/1.0",
57 | "cookie":self.Xiaoheihe,
58 | "Referer":"http://api.maxjia.com/"
59 | }
60 | return head
61 |
62 | def b64encode(self,data: str) -> str:
63 | result = base64.b64encode(data.encode('utf-8')).decode('utf-8')
64 | return(str(result))
65 |
66 | def getpost(self):
67 | req = requests.get(
68 | url=url.XiaoHeiHe_News,
69 | params=self.params("/bbs/app/feeds/news"),
70 | headers=self.head()
71 | ).json()['result']['links'][1]['linkid']
72 | def click(link_id):
73 | head = self.params("/bbs/app/link/share/click")
74 | head['h_src'] = self.b64encode('news_feeds_-1')
75 | head['link_id'] = link_id
76 | head['index'] = 1
77 | req = requests.get(url=url.XiaoHeiHe_Click,params=head,headers=self.head()).json()['status']
78 | if req == "ok":
79 | log.info("分享成功")
80 | msg_req = "分享成功"
81 | else:
82 | log.info("分享失败")
83 | msg_req = "分享失败"
84 | return msg_req
85 | def check():
86 | head = self.params("/task/shared/")
87 | head['h_src'] = self.b64encode('news_feeds_-1')
88 | head['shared_type'] = 'normal'
89 | req = requests.get(url=url.XiaoHeiHe_Check,params=head,headers=self.head()).json()['status']
90 | if req == "ok":
91 | log.info("检查分享成功")
92 | msg_req = "检查分享成功"
93 | else:
94 | log.info("检查分享失败")
95 | msg_req = "检查分享失败"
96 | return msg_req
97 | return click(req)+"\n"+check()
98 |
99 | def Sgin(self):
100 | if self.Xiaoheihe != "":
101 | try:
102 | req = requests.get(
103 | url=url.XiaoHeiHe_SginUrl,
104 | params=self.params("/task/sign/"),
105 | headers=self.head()
106 | ).json()
107 | fx = self.getpost()
108 | if req['status'] == "ok":
109 | if req['msg'] == "":
110 | log.info("小黑盒:已经签到过了")
111 | return fx+"\n已经签到过了"
112 | else:
113 | log.info(f"小黑盒:{req['msg']}")
114 | return {fx} + "\n" + req['msg']
115 | else:
116 | log.info(f"小黑盒:签到失败 - {req['msg']}")
117 | return f"{fx}\n签到失败 - {req['msg']}"
118 | except Exception as e:
119 | log.info(f"小黑盒:出现了错误,错误信息{e}")
120 | return f"出现了错误,错误信息{e}"
121 | else:
122 | log.info("小黑盒:没有配置cookie")
123 | return "没有配置cookie"
124 |
125 | # 交易猫签到
126 | class JiaoYiMao():
127 | def __init__(self,SignToken) -> None:
128 | self.jiaoyimao = SignToken['JiaoYiMao']['cookie']
129 |
130 | def Sgin(self):
131 | if self.jiaoyimao != "":
132 | head = {
133 | "user-agent":"jym_mobile (Linux; U; Android12; zh_CN; M2012K11AC; Build/SKQ1.220213.001; fca7d8fc-03b5-4fea-97e6-94173844b374; 1080x2400) com.jym.mall/206/JYN_548/7.0.2 AliApp(JYM/7.0.2) UT4Aplus/0.2.29; density/2.7; app_id/23072786; WindVane/8.5.0; utdid/YH2ygxDifiEDAA6wMV75K10e; umid_token/7+9LGztLOiq8MTWA+l8fZZQW+RjvBE56; oaid/9933af2363237087;",
134 | "referer":url.JiaoYiMao_Referer,
135 | "x-csrf-token":"HT-x5YUi3IF7iyVDXY6FBc6g",
136 | "x-requested-with":"com.jym.mall",
137 | "cookie":self.jiaoyimao
138 | }
139 | try:
140 | zz = requests.get(url=url.JiaoYiMao_SginUrl,headers=head).json()
141 | if zz['success']:
142 | rep = requests.get(url=url.JiaoYiMao_Url,headers=head).json()
143 | if rep['stateCode'] == 200:
144 | Integral = rep['data']['amountLeft']
145 | else:
146 | Integral = "获取积分失败"
147 |
148 | log.info(f"交易猫:签到成功 - 现有积分{Integral}")
149 | return f"签到成功 - 现有积分{Integral}"
150 | else:
151 |
152 | log.info(f"交易猫:签到失败 - 已经签到了")
153 | return f"签到失败 - 已经签到了"
154 | except Exception as e:
155 | log.info("交易猫:cookie可能已过期,或出现了错误")
156 | return "cookie可能已过期,或出现了错误"
157 | else:
158 | log.info("交易猫:没有配置cookie")
159 | return "没有配置cookie"
160 |
161 | # 网易云游戏签到
162 | class wyyyx():
163 | def __init__(self,SignToken) -> None:
164 | self.wyyyx_cookie = SignToken['wyyyx']['cookie']
165 |
166 | def Sgin(self):
167 | url='https://n.cg.163.com/api/v2/sign-today'
168 | header={
169 | 'Accept': 'application/json, text/plain, */*',
170 | 'Accept-Encoding': 'gzip, deflate, br',
171 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5',
172 | 'Authorization': self.wyyyx_cookie,
173 | 'Connection': 'keep-alive',
174 | 'Content-Length': '0',
175 | 'Host': 'n.cg.163.com',
176 | 'Origin': 'https://cg.163.com',
177 | 'Referer': 'https://cg.163.com/',
178 | 'Sec-Fetch-Dest': 'empty',
179 | 'Sec-Fetch-Mode': 'cors',
180 | 'Sec-Fetch-Site': 'same-site',
181 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
182 | 'X-Platform': '0'
183 | }
184 | res = requests.post(url=url,headers=header).status_code
185 | if res == 200:
186 | log.info("网易云游戏:签到成功")
187 | return "签到成功"
188 | else:
189 | log.info("网易云游戏:签到失败或已签到")
190 | return "签到失败或已签到"
191 |
--------------------------------------------------------------------------------
/src/SkyWingsCloud.py:
--------------------------------------------------------------------------------
1 | import re
2 | import time
3 | import requests
4 | import rsa
5 | import base64
6 | from src.log import Log
7 |
8 | log = Log()
9 |
10 | # 天翼云盘
11 | # 使用了开源项目https://github.com/xtyuns/cloud189app-action
12 | class Cloud():
13 | def __init__(self,config) -> None:
14 | self.username = config['username']
15 | self.password = config['password']
16 | self.s = requests.Session()
17 |
18 | def int2char(self, a):
19 | BI_RM = list("0123456789abcdefghijklmnopqrstuvwxyz")
20 | return BI_RM[a]
21 |
22 | def b64tohex(self, a):
23 | B64MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
24 | d = ""
25 | e = 0
26 | c = 0
27 | for i in range(len(a)):
28 | if list(a)[i] != "=":
29 | v = B64MAP.index(list(a)[i])
30 | if e == 0:
31 | e = 1
32 | d += self.int2char(v >> 2)
33 | c = 3 & v
34 | elif e == 1:
35 | e = 2
36 | d += self.int2char(c << 2 | v >> 4)
37 | c = 15 & v
38 | elif e == 2:
39 | e = 3
40 | d += self.int2char(c)
41 | d += self.int2char(v >> 2)
42 | c = 3 & v
43 | else:
44 | e = 0
45 | d += self.int2char(c << 2 | v >> 4)
46 | d += self.int2char(15 & v)
47 | if e == 1:
48 | d += self.int2char(c << 2)
49 | return d
50 |
51 | def rsa_encode(self, j_rsakey, string):
52 | rsa_key = f"-----BEGIN PUBLIC KEY-----\n{j_rsakey}\n-----END PUBLIC KEY-----"
53 | pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(rsa_key.encode())
54 | result = self.b64tohex((base64.b64encode(rsa.encrypt(f'{string}'.encode(), pubkey))).decode())
55 | return result
56 |
57 | # 登录函数
58 | def login(self, username, password):
59 | urlToken = "https://m.cloud.189.cn/udb/udb_login.jsp?pageId=1&pageKey=default&clientType=wap&redirectURL=https://m.cloud.189.cn/zhuanti/2021/shakeLottery/index.html"
60 | r = self.s.get(urlToken)
61 | pattern = r"https?://[^\s'\"]+" # 匹配以http或https开头的url
62 | match = re.search(pattern, r.text) # 在文本中搜索匹配
63 | if match: # 如果找到匹配
64 | url = match.group() # 获取匹配的字符串
65 | else: # 如果没有找到匹配
66 | log.info("没有找到url")
67 | return None
68 |
69 | r = self.s.get(url)
70 | pattern = r"]*href=\"([^\"]+)\"" # 匹配id为j-tab-login-link的a标签,并捕获href引号内的内容
71 | match = re.search(pattern, r.text) # 在文本中搜索匹配
72 | if match: # 如果找到匹配
73 | href = match.group(1) # 获取捕获的内容
74 | else: # 如果没有找到匹配
75 | log.info("没有找到href链接")
76 | return None
77 |
78 | r = self.s.get(href)
79 | captchaToken = re.findall(r"captchaToken' value='(.+?)'", r.text)[0]
80 | lt = re.findall(r'lt = "(.+?)"', r.text)[0]
81 | returnUrl = re.findall(r"returnUrl= '(.+?)'", r.text)[0]
82 | paramId = re.findall(r'paramId = "(.+?)"', r.text)[0]
83 | j_rsakey = re.findall(r'j_rsaKey" value="(\S+)"', r.text, re.M)[0]
84 | self.s.headers.update({"lt": lt})
85 |
86 | username = self.rsa_encode(j_rsakey, username)
87 | password = self.rsa_encode(j_rsakey, password)
88 | url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do"
89 | headers = {
90 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0',
91 | 'Referer': 'https://open.e.189.cn/',
92 | }
93 | data = {
94 | "appKey": "cloud",
95 | "accountType": '01',
96 | "userName": f"{{RSA}}{username}",
97 | "password": f"{{RSA}}{password}",
98 | "validateCode": "",
99 | "captchaToken": captchaToken,
100 | "returnUrl": returnUrl,
101 | "mailSuffix": "@189.cn",
102 | "paramId": paramId
103 | }
104 | r = self.s.post(url, data=data, headers=headers, timeout=5)
105 | if r.json()['result'] == 0:
106 | log.info(r.json()['msg'])
107 | else:
108 | log.info(r.json()['msg'])
109 | redirect_url = r.json()['toUrl']
110 | r = self.s.get(redirect_url)
111 | return self.s
112 |
113 | # 签到函数
114 | def sgin(self):
115 | s = self.login(self.username, self.password)
116 | if not s:
117 | log.info("登录失败")
118 | rand = str(round(time.time() * 1000))
119 | surl = f'https://api.cloud.189.cn/mkt/userSign.action?rand={rand}&clientType=TELEANDROID&version=8.6.3&model=SM-G930K'
120 | url = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN&activityId=ACT_SIGNIN'
121 | url2 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN_PHOTOS&activityId=ACT_SIGNIN'
122 | url3 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_2022_FLDFS_KJ&activityId=ACT_SIGNIN'
123 | headers = {
124 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; SM-G930K Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 Ecloud/8.6.3 Android/22 clientId/355325117317828 clientModel/SM-G930K imsi/460071114317824 clientChannelId/qq proVersion/1.0.6',
125 | "Referer": "https://m.cloud.189.cn/zhuanti/2016/sign/index.jsp?albumBackupOpened=1",
126 | "Host": "m.cloud.189.cn",
127 | "Accept-Encoding": "gzip, deflate",
128 | }
129 | # 签到
130 | response = s.get(surl, headers=headers).json()
131 | netdiskBonus = response['netdiskBonus']
132 | if not response['isSign']:
133 | log.info(f"天翼云盘:签到成功,获得:{netdiskBonus}M空间")
134 | message = f"签到成功,获得:{netdiskBonus}M空间"
135 | else:
136 | log.info(f"天翼云盘:已经签到过了,获得:{netdiskBonus}M空间")
137 | message = f"已经签到过了,获得:{netdiskBonus}M空间"
138 |
139 | # 第一次抽奖
140 | response = s.get(url, headers=headers).json()
141 | try:
142 | if "errorCode" in response:
143 | log.info("天翼云盘:第一次抽奖-没有抽奖次数")
144 | message += "\n第一次抽奖-没有抽奖次数"
145 | else:
146 | log.info(f"天翼云盘:第一次抽奖获得{response['prizeName']}")
147 | message += f"\n第一次抽奖获得{response['prizeName']}"
148 | except Exception as er:
149 | log.info(f"天翼云盘:第一次抽奖出现了错误:{er}")
150 | message += f"\n第一次抽奖出现了错误:{er}"
151 |
152 | # 第二次抽奖
153 | response = s.get(url2, headers=headers).json()
154 | try:
155 | if "errorCode" in response:
156 | log.info("天翼云盘:第二次抽奖-没有抽奖次数")
157 | message += "\n第二次抽奖-没有抽奖次数"
158 | else:
159 | log.info(f"天翼云盘:第二次抽奖获得{response['prizeName']}")
160 | message += f"\n第二次抽奖获得{response['prizeName']}"
161 | except Exception as er:
162 | log.info(f"天翼云盘:第二次抽奖出现了错误:{er}")
163 | message += f"\n第二次抽奖出现了错误:{er}"
164 | return message
165 |
--------------------------------------------------------------------------------
/src/aliyundrive.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from src.log import Log
3 |
4 |
5 | log = Log()
6 |
7 | class Aliyundrive:
8 | def __init__(self, coofig):
9 | self.token = self.get_access_token(coofig['token'])
10 | self.headers = {
11 | "Content-Type": "application/json",
12 | "Authorization": self.token,
13 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 D/C501C6D2-FAF6-4DA8-B65B-7B8B392901EB"
14 | }
15 |
16 | def get_access_token(self,token):
17 | access_token = ''
18 | try:
19 | url = "https://auth.aliyundrive.com/v2/account/token"
20 |
21 | data_dict = {
22 | "refresh_token": token,
23 | "grant_type": "refresh_token"
24 | }
25 | headers = {
26 | "accept": "application/json, text/plain, */*",
27 | "accept-language": "zh-CN,zh;q=0.9",
28 | "cache-control": "no-cache",
29 | "content-type": "application/json;charset=UTF-8",
30 | "origin": "https://www.aliyundrive.com",
31 | "pragma": "no-cache",
32 | "referer": "https://www.aliyundrive.com/",
33 | "sec-fetch-dest": "empty",
34 | "sec-fetch-mode": "cors",
35 | "sec-fetch-site": "same-site",
36 | "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
37 | }
38 |
39 | resp = requests.post(url, json=data_dict, headers=headers).json()
40 |
41 | token = {}
42 | token['access_token'] = resp['access_token']
43 | access_token = token['access_token']
44 | except Exception as e:
45 | log.error(f"获取异常:{e}")
46 |
47 | return access_token
48 |
49 |
50 | # 获取奖励
51 | def get_reward(self, day):
52 | try:
53 | url = 'https://member.aliyundrive.com/v1/activity/sign_in_reward'
54 | body = {
55 | 'signInDay': day
56 | }
57 | rep = requests.post(url, json=body, headers=self.headers).json()
58 | return rep['success']
59 | except Exception as e:
60 | log.error(f"获取签到奖励异常={e}")
61 | return False
62 |
63 |
64 | # 签到
65 | def sign_in(self):
66 | url = "https://member.aliyundrive.com/v2/activity/sign_in_info"
67 | #url = 'https://member.aliyundrive.com/v2/activity/sign_in_list'
68 | #url = 'https://member.aliyundrive.com/v1/activity/sign_in_list'
69 | body = {}
70 | resp = requests.post(url, json=body, headers=self.headers).json()
71 | return resp
72 |
73 | # 是否领取了奖励
74 | def isReward(self):
75 | url = "https://member.aliyundrive.com/v1/activity/sign_in_goods"
76 | body = {}
77 | resp = requests.post(url, json=body, headers=self.headers).json()
78 | return resp['result']['isReward']
79 |
80 |
81 | def sgin(self):
82 | # 签到
83 | resp = self.sign_in()
84 |
85 | reward_name = resp['result']['rewards'][0]['name']
86 | sgin_day = resp['result']['day']
87 | if resp['success']:
88 | if resp['result']['isSignIn']:
89 | if self.get_reward(resp['result']['signInDay']):
90 | content = f"✅打卡第{sgin_day}天,获得奖励:**[{reward_name}]**"
91 | log.info(content)
92 | else:
93 | content = f"✅打卡第{sgin_day}天,获得奖励:**[ 失败 ]**"
94 | log.info(content)
95 | elif not resp['result']['isSignIn']:
96 | if not self.isReward():
97 | if self.get_reward(resp['result']['signInDay']):
98 | content = f"✅第{sgin_day}天已签到: 获得奖励:**[{reward_name}]**"
99 | log.info(content)
100 | else:
101 | content = f"✅第{sgin_day}天已签到: 获得奖励:**[ 失败 ]**"
102 | log.info(content)
103 | else:
104 | content = f"🔁第{sgin_day}天已签到: 已获得奖励:**[{reward_name}]**"
105 | log.info(content)
106 | else:
107 | content = f"❌签到失败,请检查token是否正确"
108 | log.info(content)
109 |
110 |
111 | return content
--------------------------------------------------------------------------------
/src/arknights.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import hashlib
3 | import json
4 | from urllib.parse import urlparse
5 | import time
6 | import hmac
7 | from src.log import Log
8 |
9 | log = Log()
10 |
11 | class Arknights():
12 | def __init__(self, coofig):
13 | # self.token = coofig['token']
14 | self.command_header = {
15 | "User-Agent": "Skland/1.5.1 (com.hypergryph.skland; build:100501001; Android 34; ) Okhttp/4.11.0",
16 | 'Accept-Encoding': 'gzip',
17 | 'Connection': 'close'
18 | }
19 | self.sign_header = {
20 | 'platform': '1',
21 | 'timestamp': '',
22 | 'dId': '',
23 | 'vName': '1.5.1'
24 | }
25 | code = self.get_code(coofig['token'])
26 | self.cred,self.token = self.get_cred(code)
27 |
28 | def get_code(self, token):
29 | url = "https://as.hypergryph.com/user/oauth2/v2/grant"
30 |
31 | data = {
32 | "appCode": '4ca99fa6b56cc2ba',
33 | "token": token,
34 | "type": 0
35 | }
36 |
37 | response = requests.post(url, headers=self.command_header, json=data)
38 | if response.json()['status'] == 0:
39 | return response.json()['data']['code']
40 | else:
41 | raise
42 |
43 | def get_cred(self, code):
44 | url = "https://zonai.skland.com/api/v1/user/auth/generate_cred_by_code"
45 |
46 | data = {
47 | "code": code,
48 | "kind": 1
49 | }
50 |
51 | headers = {**self.command_header, "Content-Type": "application/json; charset=utf-8"}
52 | response = requests.post(url, headers=headers, json=data)
53 | if response.json()['code'] == 0:
54 | return response.json()['data']['cred'],response.json()['data']['token']
55 | else:
56 | raise
57 |
58 | def generate_signature(self, token, uri, data=None):
59 | timestamp = str(int(time.time()))
60 | headers = self.sign_header.copy()
61 | headers['timestamp'] = timestamp
62 |
63 | url_parts = urlparse(uri)
64 | path = url_parts.path
65 | query = url_parts.query
66 |
67 | data_str = json.dumps(data) if data else ''
68 |
69 | header_ca_str = json.dumps(headers, separators=(',', ':'))
70 | s = f"{path}{query}{data_str}{timestamp}{header_ca_str}"
71 |
72 | hex_s = hmac.new(token.encode('utf-8'), s.encode('utf-8'), hashlib.sha256).hexdigest()
73 | md5 = hashlib.md5(hex_s.encode('utf-8')).hexdigest().encode('utf-8').decode('utf-8')
74 | return md5, headers
75 |
76 | def checkin(self,nickName,uid,gameId):
77 | url = "https://zonai.skland.com/api/v1/game/attendance"
78 | json = {
79 | "uid": uid,
80 | "gameId": gameId
81 | }
82 | sign, headers = self.generate_signature(self.token,url,json)
83 | headers = {**headers, 'sign': sign, 'cred': self.cred, 'Content-Type': 'application/json;charset=utf-8', **self.command_header}
84 |
85 | response = requests.post(url, headers=headers, json=json)
86 | if response.json()['code'] == 0:
87 | for award in response.json().get('data', {}).get('awards', []):
88 | count = award.get('count', None)
89 | name = award.get('resource', {}).get('name', None)
90 | return f'{nickName}签到成功,获得了{name}×{count}\n'
91 | else:
92 | return f"{nickName}签到失败:", response.status_code, response.reason,f'{response.json()["message"]}'
93 |
94 | def isCheckined(self,uid,gameId):
95 | url = f"https://zonai.skland.com/api/v1/game/attendance?gameId={gameId}&uid={uid}"
96 | sign, headers = self.generate_signature(self.token,url)
97 | headers = {**self.command_header,**headers,"sign":sign, "cred":self.cred}
98 | response = requests.get(url, headers=headers)
99 | # 检查"data"和"calendar"键是否存在,并获取"calendar"列表
100 | if "data" in response.json() and "calendar" in response.json()["data"]:
101 | calendar_list = response.json()["data"]["calendar"]
102 |
103 | # 遍历"calendar"列表,检查是否有"available"为True的项
104 | for item in calendar_list:
105 | if item.get("available", False):
106 | return True
107 | else:
108 | return False
109 | else:
110 | log.info("ERROR 未获取到签到记录")
111 | return False
112 |
113 | def get_bindingList(self, cred,token):
114 | url="https://zonai.skland.com/api/v1/game/player/binding"
115 | sign, headers = self.generate_signature(token,url)
116 | headers = {**self.command_header,**headers,"sign":sign, "cred":cred}
117 | response = requests.get(url, headers=headers)
118 | if response.json()['code'] == 0:
119 | for i in response.json()['data']['list']:
120 | if i['appCode'] == 'arknights':
121 | return i['bindingList']
122 |
123 | else:
124 | log.info(f"请求角色列表出现问题:{response.json()['message']}")
125 | if response.json()['message'] == '用户未登录':
126 | log.info(f'用户登录可能失效了,请更新cred!')
127 |
128 | def sgin(self):
129 | bindingList=self.get_bindingList(self.cred,self.token)
130 | for i in bindingList:
131 | if self.isCheckined(i["uid"],i["channelMasterId"]):
132 | data = self.checkin(i["nickName"],i["uid"],i["channelMasterId"])
133 | log.info(f"明日方舟:{data}")
134 | return data
135 | else:
136 | data = f'{i["nickName"]}已签到'
137 | log.info(f"明日方舟:{data}")
138 | return data
--------------------------------------------------------------------------------
/src/hykb.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import random
3 | import datetime
4 | from src.log import Log
5 |
6 |
7 | log = Log()
8 |
9 |
10 | class HaoYouKuaiBao():
11 | """好游快爆签到
12 | """
13 | def __init__(self, config):
14 | self.cookie = config['cookie']
15 | self.url = "https://huodong3.3839.com/n/hykb/{}/ajax{}.php"
16 | self.data = "ac={}&r=0.{}&scookie={}"
17 | self.headers={
18 | "Origin": "https://huodong3.i3839.com",
19 | "Referer": "https://huodong3.3839.com/n/hykb/cornfarm/index.php?imm=0",
20 | "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
21 | "User-Agent": "Mozilla/5.0 (Linux; Android 13; M2012K11AC Build/TKQ1.220829.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.166 Mobile Safari/537.36Androidkb/1.5.7.005(android;M2012K11AC;13;1080x2320;WiFi);@4399_sykb_android_activity@"
22 | }
23 |
24 | def plant(self) -> int:
25 | """播种
26 | """
27 | url = self.url.format("cornfarm", "_plant")
28 | data = self.data.format("Plant", random.randint(1000000000000000, 8999999999999999), self.cookie)
29 | try:
30 | response = requests.post(url, headers=self.headers, data=data).json()
31 | if response['key'] == 'ok':
32 | log.info("好游快爆-播种成功")
33 | return 1
34 | else:
35 | if response['seed'] == 0:
36 | log.info("好游快爆-种子已用完")
37 | return -1
38 | else:
39 | log.info("好游快爆-播种失败")
40 | return 0
41 | except Exception as e:
42 | log.info(f"好游快爆-播种出现错误:{e}")
43 | return False
44 |
45 | def harvest(self) -> bool:
46 | """收获
47 | """
48 | url = self.url.format("cornfarm", "_plant")
49 | data = self.data.format("Harvest", random.randint(1000000000000000, 8999999999999999), self.cookie)
50 | try:
51 | response = requests.post(url, headers=self.headers, data=data).json()
52 | if response['key'] == 'ok':
53 | log.info("好游快爆-收获成功")
54 | return True
55 | else:
56 | log.info("好游快爆-收获失败")
57 | return False
58 | except Exception as e:
59 | log.info(f"好游快爆-收获出现错误:{e}")
60 | return False
61 |
62 | def login(self):
63 | """登录
64 | """
65 | url = self.url.format("cornfarm", "")
66 | data = self.data.format("login", random.randint(100000000000000, 8999999999999999), self.cookie)
67 | response = requests.post(url, headers=self.headers, data=data)
68 | try:
69 | response = response.json()
70 | return response
71 | except Exception as e:
72 | response = response.text
73 | return response
74 |
75 | def watering(self):
76 | """浇水
77 | """
78 | url = self.url.format("cornfarm", "_sign")
79 | data = self.data.format("Sign&verison=1.5.7.005&OpenAutoSign=", random.randint(100000000000000, 8999999999999999), self.cookie)
80 | try:
81 | response = requests.post(url, headers=self.headers, data=data).json()
82 | if response['key'] == 'ok':
83 | log.info("好游快爆-浇水成功")
84 | return 1, response['add_baomihua']
85 | elif response['key'] == '1001':
86 | log.info("好游快爆-今日已浇水")
87 | return 0, 0
88 | else:
89 | log.info("好游快爆-浇水出现错误:{}".format(response))
90 | return -1, 0
91 | except Exception as e:
92 | log.info("好游快爆-浇水出现错误:{}".format(e))
93 | return -1, 0
94 |
95 | # def buyseeds(self):
96 | # """购买种子
97 | # """
98 | # url = self.url.format("bmhstore2/inc/virtual", "Virtual")
99 | # print(url)
100 | # ac = "exchange&t=" + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "&goodsid=14565"
101 | # data = self.data.format(ac, random.randint(100000000000000, 8999999999999999), self.cookie)
102 | # print(data)
103 | # response = requests.post(url, headers=self.headers, data=data)
104 | # print(response.json())
105 |
106 | def sgin(self):
107 | info = ""
108 | # 登录
109 | data = self.login()
110 | if data['key'] == 'ok':
111 | if data['config']['csd_jdt'] == "100%":
112 | # 收获
113 | if self.harvest():
114 | info = info+"收获成功\n"
115 | # 播种
116 | b = self.plant()
117 | if b == -1:
118 | info = info+"播种失败,没有种子\n"
119 | elif b == 1:
120 | info = info+"播种成功\n"
121 | # 浇水
122 | data = self.watering()
123 | if data[0] == 1:
124 | info = info+f"浇水成功,获得{data[1]}爆米花\n"
125 | elif data[0] == 0:
126 | info = info+f"今日已浇水\n"
127 | else:
128 | info = info+f"浇水失败\n"
129 | else:
130 | info = info+"播种失败\n"
131 | else:
132 | info = info+"收获失败\n"
133 |
134 | elif data['config']['grew'] == '-1':
135 | # 播种
136 | b = self.plant()
137 | if b == -1:
138 | info = info+"播种失败,没有种子\n"
139 | elif b == 1:
140 | info = info+"播种成功\n"
141 | # 浇水
142 | data = self.watering()
143 | if data[0] == 1:
144 | info = info+f"浇水成功,获得{data[1]}爆米花\n"
145 | elif data[0] == 0:
146 | info = info+f"今日已浇水\n"
147 | else:
148 | info = info+f"浇水失败\n"
149 | else:
150 | info = info+"播种失败\n"
151 |
152 | else:
153 | # 浇水
154 | data = self.watering()
155 | if data[0] == 1:
156 | info = info+f"浇水成功,获得{data[1]}爆米花\n"
157 | elif data[0] == 0:
158 | info = info+f"今日已浇水\n"
159 | else:
160 | info = info+f"浇水失败\n"
161 | else:
162 | info = info+"登录失败\n"
163 |
164 | return info
165 |
166 |
--------------------------------------------------------------------------------
/src/log.py:
--------------------------------------------------------------------------------
1 | import logging,os
2 |
3 | class Log():
4 | def __init__(self) -> None:
5 | #解决windows系统在cmd运行日志显示异常问题
6 | os.system('')
7 | #设置日志输出样式
8 | logging.basicConfig(format = '\033[33m[%(asctime)s][%(levelname)s]:\033[0m%(message)s',level=logging.DEBUG)
9 | logging.getLogger("urllib3").setLevel(logging.CRITICAL)
10 |
11 | def info(self,msg) -> None:
12 | logging.info(msg)
13 |
14 | def debug(self,msg) -> None:
15 | logging.debug(msg)
16 |
17 | def error(self,msg) -> None:
18 | logging.error(msg)
19 |
20 | def warning(self,msg) -> None:
21 | logging.warning(msg)
22 |
23 | def critical(self,msg) -> None:
24 | logging.critical(msg)
25 |
--------------------------------------------------------------------------------
/src/raincloud.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from src.log import Log
3 |
4 | log = Log()
5 |
6 | class RainCloud():
7 | def __init__(self, config) -> None:
8 | self.headers = {
9 | "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
10 | "X-Api-Key": config['apikey'],
11 | "content-type": "application/json"
12 | }
13 |
14 | def get_user_info(self):
15 | user_info_url = "https://api.v2.rainyun.com/user/"
16 | rsp = requests.get(user_info_url, headers=self.headers).json()
17 | if rsp['code'] == 200:
18 | return rsp['data']['Points']
19 | else:
20 | log.info(f"雨云:获取用户信息失败,请检查apikey是否正确")
21 | log.info(f"雨云:返回信息:{rsp}")
22 | return 0
23 |
24 | def sgin(self):
25 | sginurl = "https://api.v2.rainyun.com/user/reward/tasks"
26 | data = {"task_name": "每日签到", "verifyCode": ""}
27 | rsp = requests.post(sginurl, json=data, headers=self.headers).json()
28 | if rsp['code'] == 200:
29 | if rsp['data'] == "ok":
30 | info = f"雨云:签到成功,积分+300,现有积分{self.get_user_info()+300}"
31 | log.info(info)
32 | return info
33 | elif rsp['code'] == 30011:
34 | info = f"雨云:今日已签到,现有积分{self.get_user_info()}"
35 | log.info(info)
36 | return info
37 | else:
38 | info = f"雨云:签到失败,请检查apikey是否正确"
39 | log.info(info)
40 | return info
--------------------------------------------------------------------------------
/src/setting.py:
--------------------------------------------------------------------------------
1 | # 小黑盒链接配置
2 | XiaoHeiHe_Api = "https://api.xiaoheihe.cn"
3 | XiaoHeiHe_Hkey = "http://146.56.234.178:8077/encode"
4 | XiaoHeiHe_SginUrl = XiaoHeiHe_Api + "/task/sign/"
5 | #XiaoHeiHe_SginUrl = XiaoHeiHe_Api + "/task/sign_v3/sign"
6 | XiaoHeiHe_News = XiaoHeiHe_Api + "/bbs/app/feeds/news"
7 | XiaoHeiHe_Click = XiaoHeiHe_Api + "/bbs/app/link/share/click"
8 | XiaoHeiHe_Check = XiaoHeiHe_Api + "/task/shared/"
9 |
10 | # 交易猫链接配置
11 | JiaoYiMao_Api = "https://m.jiaoyimao.com"
12 | JiaoYiMao_Url = JiaoYiMao_Api + "/api2/account/integration/getMyIntegration"
13 | JiaoYiMao_SginUrl = JiaoYiMao_Api + "/api2/account/integration/signin"
14 | JiaoYiMao_Referer = JiaoYiMao_Api + "/account/integration/center?spm=gcmall.home2022.topshortcut.0"
15 |
16 | # MiUi历史版本链接配置
17 | Miui_Api = "https://miuiver.com"
18 | Miui_LoginUrl = Miui_Api + "/wp-content/plugins/erphplogin//action/login.php"
19 | Miui_SginUrl = Miui_Api + "/wp-admin/admin-ajax.php"
20 |
21 | # 好游快爆链接配置
22 | hykb_host = "https://huodong3.3839.com"
23 | hykb_sgin = hykb_host + "/n/hykb/grow/ajax.php"
--------------------------------------------------------------------------------