├── .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 | python 7 | version 8 |

9 |

10 | 11 | GitHub 12 | 13 | 14 | GitHub 15 | 16 |

17 | 本项目用于需要手动每天签到的场景,使用本项目解放双手。本项目自动每天签到并推送到各社交应用上,目前支持qmsg,sever酱,企业微信,钉钉 18 | 19 |
20 |

目前支持

21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 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 |
应用是否需要cookie是否需要密码是否可用功能
MIUI历史版本每日签到得积分
好游快报每日爆米花浇水
小黑盒每日签到得盒币
交易猫每日签到得积分
天翼云盘每日签到抽奖得空间
网易云游戏每日签到获取使用时间和成长值
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" --------------------------------------------------------------------------------