Merge branch 'master' into develop

This commit is contained in:
Womsxd 2021-11-06 21:35:17 +08:00 committed by GitHub
commit b9d47990e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 408 additions and 329 deletions

3
.gitignore vendored
View File

@ -131,6 +131,9 @@ dmypy.json
# VSCode
.vscode/
# idea
.idea/
#自己用的推送((
push_main.py

245
README.md
View File

@ -1,121 +1,124 @@
# 米游社辅助签到
基于Python3的米游社辅助签到项目
本项目米游币部分参考[XiaoMiku01/miyoubiAuto](https://github.com/XiaoMiku01/miyoubiAuto)进行编写
* 此项目的用途
这是一个米游社的辅助签到项目包含了米游币和原神以及崩坏3
## 如何使用程序
* **部署方法**
1. 使用[Git](https://git-scm.com/)或[点击此处](https://github.com/Womsxd/AutoMihoyoBBS/archive/refs/heads/master.zip)下载本项目
2. 下载[Python3](https://www.python.org/downloads/)
3. 解压本项目压缩包,在解压目录中**Shift+右键** 打开你的命令提示符cmd或powershell
4. [requirements.txt](https://raw.githubusercontent.com/Womsxd/AutoMihoyoBBS/master/requirements.txt) 是所需第三方模块,执行 `pip install -r requirements.txt` 安装模块
5. 打开目录中的**config文件夹**复制`config.json.example`并改名为`config.json`,脚本的多用户功能靠读取不同的配置文件实现,你可以创建无数个`自定义名字.json`,脚本会扫描**config**目录下`json`为拓展名的文件,并按照名称顺序依次执行。
6. 请使用vscode/notepad++等文本编辑器打开上一步复制好的配置文件
7. **使用[获取Cookie](#获取米游社Cookie)里面的方法来获取米游社Cookie**
8. 将复制的Cookie粘贴到`config.json`的`"mihoyobbs_Cookies":" "`中
例子
> ```json
> "mihoyobbs_Cookies": "你复制的cookie"
> ```
9. 在命令提示符(cmd)/powershell输入`python main.py`来进行执行
10. 多用户的请使用`python main_multi.py`,多用户在需要自动执行的情况下请使用`python main_multi.py autorun`
## 获取米游社Cookie
1. 打开你的浏览器,进入**无痕/隐身模式**
2. 由于米哈游修改了bbs可以获取的Cookie导致一次获取的Cookie缺失所以需要增加步骤
3. 打开`http://bbs.mihoyo.com/ys/`并进行登入操作
4. 在上一步登入完成后新建标签页,打开`http://user.mihoyo.com/`并进行登入操作
5. 按下键盘上的`F12`或右键检查,打开开发者工具,点击Console
6. 输入
```javascript
var cookie=document.cookie;var ask=confirm('Cookie:'+cookie+'\n\nDo you want to copy the cookie to the clipboard?');if(ask==true){copy(cookie);msg=cookie}else{msg='Cancel'}
```
回车执行,并在确认无误后点击确定。
7. **此时Cookie已经复制到你的粘贴板上了**
## 使用Docker运行
Docker的运行脚本基于Linux平台编写暂未在Win平台测试。
将本项目Clone至本地后请先按照上述步骤添加或修改配置文件。随后运行`make-docker.sh`脚本本地构建Docker镜像同时初次运行容器。
```shell
sh make-docker.sh
```
或手动执行
```
# 编译容器
docker build -f Dockerfile --tag ${docker_name}:"${time_now}" .
```
```
# 运行容器(默认自动多配置文件)
docker run -itd \
--name ${docker_name} \
--log-opt max-size=1m \
-v $(pwd):/var/app \
${docker_name}:"${time_now}"
# 运行容器直接运行main.py
docker run -itd \
--name ${docker_name} \
--log-opt max-size=1m \
-v $(pwd):/var/app \
-e MULTI=FALSE \
${docker_name}:"${time_now}"
```
若需要添加配置文件或修改配置文件可直接在主机config文件夹中修改修改的内容将实时同步在容器中。
若需要再次运行签到脚本可手动重启容器。每次运行Docker容器后容器内将自动按照参数执行签到活动签到完成后容器将自动停止运行。
```
docker restart ${docker_name} && docker logs -f ${docker_name}
```
关于每日定时,用户可在容器外部设计定时触发(启动)程序,每日定时运行脚本。
(若有需要可自行编写相关脚本通知完成状态
## 使用的第三方库
requests: [github](https://github.com/psf/requests) [pypi](https://pypi.org/project/requests/)
httpx: [github](https://github.com/encode/httpx) [pypi](https://pypi.org/project/httpx/)
## License
[MIT License](https://github.com/Womsxd/AutoMihoyoBBS/blob/master/LICENSE)
# 米游社辅助签到
基于Python3的米游社辅助签到项目
本项目米游币部分参考[XiaoMiku01/miyoubiAuto](https://github.com/XiaoMiku01/miyoubiAuto)进行编写
* 此项目的用途
这是一个米游社的辅助签到项目包含了米游币和原神以及崩坏3
## 如何使用程序
* **部署方法**
1. 使用[Git](https://git-scm.com/)或[点击此处](https://github.com/Womsxd/AutoMihoyoBBS/archive/refs/heads/master.zip)下载本项目
2. 下载[Python3](https://www.python.org/downloads/)
3. 解压本项目压缩包,在解压目录中**Shift+右键** 打开你的命令提示符cmd或powershell
4. [requirements.txt](https://raw.githubusercontent.com/Womsxd/AutoMihoyoBBS/master/requirements.txt) 是所需第三方模块,执行 `pip install -r requirements.txt` 安装模块
5. 打开目录中的**config文件夹**复制`config.json.example`并改名为`config.json`,脚本的多用户功能靠读取不同的配置文件实现,你可以创建无数个`自定义名字.json`,脚本会扫描**config**目录下`json`为拓展名的文件,并按照名称顺序依次执行。
6. 请使用vscode/notepad++等文本编辑器打开上一步复制好的配置文件
7. **使用[获取Cookie](#获取米游社Cookie)里面的方法来获取米游社Cookie**
8. 将复制的Cookie粘贴到`config.json`的`"mihoyobbs_Cookies":" "`中
例子
> ```json
> "mihoyobbs_Cookies": "你复制的cookie"
> ```
9. 在命令提示符(cmd)/powershell输入`python main.py`来进行执行
10. 多用户的请使用`python main_multi.py`,多用户在需要自动执行的情况下请使用`python main_multi.py autorun`
## 获取米游社Cookie
1. 打开你的浏览器,进入**无痕/隐身模式**
2. 由于米哈游修改了bbs可以获取的Cookie导致一次获取的Cookie缺失所以需要增加步骤
3. 打开`http://bbs.mihoyo.com/ys/`并进行登入操作
4. 在上一步登入完成后新建标签页,打开`http://user.mihoyo.com/`并进行登入操作
5. 按下键盘上的`F12`或右键检查,打开开发者工具,点击Console
6. 输入
```javascript
var cookie=document.cookie;var ask=confirm('Cookie:'+cookie+'\n\nDo you want to copy the cookie to the clipboard?');if(ask==true){copy(cookie);msg=cookie}else{msg='Cancel'}
```
回车执行,并在确认无误后点击确定。
7. **此时Cookie已经复制到你的粘贴板上了**
## 使用Docker运行
Docker的运行脚本基于Linux平台编写暂未在Win平台测试。
将本项目Clone至本地后请先按照上述步骤添加或修改配置文件。随后运行`make-docker.sh`脚本本地构建Docker镜像同时初次运行容器。
```shell
sh make-docker.sh
```
或手动执行
```
# 编译容器
docker build -f Dockerfile --tag ${docker_name}:"${time_now}" .
```
```
# 运行容器(默认自动多配置文件)
docker run -itd \
--name ${docker_name} \
--log-opt max-size=1m \
-v $(pwd):/var/app \
${docker_name}:"${time_now}"
# 运行容器直接运行main.py
docker run -itd \
--name ${docker_name} \
--log-opt max-size=1m \
-v $(pwd):/var/app \
-e MULTI=FALSE \
${docker_name}:"${time_now}"
```
若需要添加配置文件或修改配置文件可直接在主机config文件夹中修改修改的内容将实时同步在容器中。
若需要再次运行签到脚本可手动重启容器。每次运行Docker容器后容器内将自动按照参数执行签到活动签到完成后容器将自动停止运行。
```
docker restart ${docker_name} && docker logs -f ${docker_name}
```
关于每日定时,用户可在容器外部设计定时触发(启动)程序,每日定时运行脚本。
(若有需要可自行编写相关脚本通知完成状态
## 使用的第三方库
requests: [github](https://github.com/psf/requests) [pypi](https://pypi.org/project/requests/)
httpx: [github](https://github.com/encode/httpx) [pypi](https://pypi.org/project/httpx/)
## License
[MIT License](https://github.com/Womsxd/AutoMihoyoBBS/blob/master/LICENSE)
## 鸣谢
[JetBrains](https://jb.gg/OpenSource)

View File

@ -2,44 +2,45 @@ import os
import json
import tools
#是否启用config
# 是否启用config
enable_Config = True
#这里的内容会自动获取
# 这里的内容会自动获取
mihoyobbs_Login_ticket = ""
mihoyobbs_Stuid = ""
mihoyobbs_Stoken = ""
#这里是米游社的cookie
# 这里是米游社的cookie
mihoyobbs_Cookies = ""
#这个dist里面的内容和米游社有关
# 这个dist里面的内容和米游社有关
mihoyobbs = {
#全局开关,关闭之后下面的都不执行
# 全局开关,关闭之后下面的都不执行
"bbs_Global": True,
#讨论区签到
# 讨论区签到
"bbs_Signin": True,
#多个讨论区签到
# 多个讨论区签到
"bbs_Signin_multi": True,
#指定签到讨论区
#1是崩坏3 2是原神 3是崩坏2 4是未定事件簿 5是大别墅
#可以通过设置讨论区的id位置来设置主讨论区[5,1]就是大别墅为主社区
#看帖子 点赞 分享帖子都是使用主社区获取到的列表
"bbs_Signin_multi_list": [2,5],
#浏览3个帖子
# 指定签到讨论区
# 1是崩坏3 2是原神 3是崩坏2 4是未定事件簿 5是大别墅
# 可以通过设置讨论区的id位置来设置主讨论区[5,1]就是大别墅为主社区
# 看帖子 点赞 分享帖子都是使用主社区获取到的列表
"bbs_Signin_multi_list": [2, 5],
# 浏览3个帖子
"bbs_Read_posts": True,
#完成5次点赞
# 完成5次点赞
"bbs_Like_posts": True,
#完成后取消点赞
# 完成后取消点赞
"bbs_Unlike": True,
#分享帖子
# 分享帖子
"bbs_Share": True,
}
#原神自动签到
# 原神自动签到
genshin_Auto_sign = True
#崩坏3自动签到
# 崩坏3自动签到
honkai3rd_Auto_sign = True
path = os.path.dirname(os.path.realpath(__file__)) + "/config"
config_Path = f"{path}/config.json"
def Load_config():
with open(config_Path, "r") as f:
data = json.load(f)
@ -69,8 +70,9 @@ def Load_config():
f.close()
tools.log.info("Config加载完毕")
def Save_config():
with open(config_Path,"r+") as f:
with open(config_Path, "r+") as f:
data = json.load(f)
data["mihoyobbs_Login_ticket"] = mihoyobbs_Login_ticket
data["mihoyobbs_Stuid"] = mihoyobbs_Stuid
@ -83,8 +85,9 @@ def Save_config():
f.close()
tools.log.info("Config保存完毕")
def Clear_cookies():
with open(config_Path,"r+") as f:
with open(config_Path, "r+") as f:
data = json.load(f)
data["enable_Config"] = False
data["mihoyobbs_Login_ticket"] = ""

View File

@ -5,70 +5,71 @@ import random
import setting
from request import http
class genshin:
def __init__(self) -> None:
self.headers = {
'Accept': 'application/json, text/plain, */*',
'DS': tools.Get_ds(web=True, web_old=True),
'Origin': 'https://webstatic.mihoyo.com',
'x-rpc-app_version': setting.mihoyobbs_Version_old,
'User-Agent': 'Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 miHoYoBBS/2.3.0',
'x-rpc-client_type': setting.mihoyobbs_Client_type_web,
'Referer': 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true&act_id=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
'X-Requested-With': 'com.mihoyo.hyperion',
"Cookie": config.mihoyobbs_Cookies,
'x-rpc-device_id': tools.Get_deviceid()
}
'Accept': 'application/json, text/plain, */*',
'DS': tools.Get_ds(web=True, web_old=True),
'Origin': 'https://webstatic.mihoyo.com',
'x-rpc-app_version': setting.mihoyobbs_Version_old,
'User-Agent': 'Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 miHoYoBBS/2.3.0',
'x-rpc-client_type': setting.mihoyobbs_Client_type_web,
'Referer': 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true&act_id=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
'X-Requested-With': 'com.mihoyo.hyperion',
"Cookie": config.mihoyobbs_Cookies,
'x-rpc-device_id': tools.Get_deviceid()
}
self.acc_List = self.Getacc_list()
if len(self.acc_List) != 0:
self.sign_Give = self.Get_signgive()
#获取绑定的账号列表
# 获取绑定的账号列表
def Getacc_list(self) -> list:
tools.log.info("正在获取米哈游账号绑定原神账号列表...")
temp_List = []
req = http.get(setting.genshin_Account_info_url, headers=self.headers)
data = req.json()
if data["retcode"] != 0:
tools.log.warn("获取账号列表失败!")
tools.log.warning("获取账号列表失败!")
exit(1)
for i in data["data"]["list"]:
temp_List.append([i["nickname"], i["game_uid"], i["region"]])
tools.log.info(f"已获取到{len(temp_List)}个原神账号信息")
return temp_List
#获取已经签到奖励列表
# 获取已经签到奖励列表
def Get_signgive(self) -> list:
tools.log.info("正在获取签到奖励列表...")
req = http.get(setting.genshin_Signlisturl.format(setting.genshin_Act_id),headers=self.headers)
req = http.get(setting.genshin_Signlisturl.format(setting.genshin_Act_id), headers=self.headers)
data = req.json()
if data["retcode"] != 0:
tools.log.warn("获取签到奖励列表失败")
print (req.text)
tools.log.warning("获取签到奖励列表失败")
print(req.text)
exit(1)
return data["data"]["awards"]
#判断签到
def Is_sign(self, region:str, uid:str):
# 判断签到
def Is_sign(self, region: str, uid: str):
req = http.get(setting.genshin_Is_signurl.format(setting.genshin_Act_id, region, uid), headers=self.headers)
data = req.json()
if data["retcode"] != 0:
tools.log.warn("获取账号签到信息失败!")
print (req.text)
tools.log.warning("获取账号签到信息失败!")
print(req.text)
exit(1)
return data["data"]
#签到
# 签到
def Sign_acc(self):
if len(self.acc_List) != 0:
for i in self.acc_List:
tools.log.info(f"正在为旅行者{i[0]}进行签到...")
time.sleep(random.randint(2, 8))
is_data = self.Is_sign(region = i[2], uid = i[1])
is_data = self.Is_sign(region=i[2], uid=i[1])
if is_data["first_bind"]:
tools.log.warn(f"旅行者{i[0]}是第一次绑定米游社,请先手动签到一次")
tools.log.warning(f"旅行者{i[0]}是第一次绑定米游社,请先手动签到一次")
else:
sign_Days = is_data["total_sign_day"] - 1
if is_data["is_sign"]:
@ -76,17 +77,18 @@ class genshin:
else:
time.sleep(random.randint(2, 8))
req = http.post(url=setting.genshin_Signurl, headers=self.headers,
json={'act_id': setting.genshin_Act_id, 'region': i[2], 'uid': i[1]})
json={'act_id': setting.genshin_Act_id, 'region': i[2], 'uid': i[1]})
data = req.json()
if data["retcode"] == 0:
if sign_Days == 0:
tools.log.info(f"旅行者{i[0]}签到成功~\r\n今天获得的奖励是{tools.Get_item(self.sign_Give[sign_Days])}")
else:
tools.log.info(f"旅行者{i[0]}签到成功~\r\n今天获得的奖励是{tools.Get_item(self.sign_Give[sign_Days + 1])}")
tools.log.info(
f"旅行者{i[0]}签到成功~\r\n今天获得的奖励是{tools.Get_item(self.sign_Give[sign_Days + 1])}")
elif data["retcode"] == -5003:
tools.log.info(f"旅行者{i[0]}今天已经签到过了~\r\n今天获得的奖励是{tools.Get_item(self.sign_Give[sign_Days])}")
else:
tools.log.warn("账号签到失败!")
print (req.text)
tools.log.warning("账号签到失败!")
print(req.text)
else:
tools.log.warn("账号没有绑定任何原神账号!")
tools.log.warning("账号没有绑定任何原神账号!")

View File

@ -5,56 +5,60 @@ import random
import setting
from request import http
class honkai3rd:
def __init__(self) -> None:
self.headers = {
'Accept': 'application/json, text/plain, */*',
'DS': tools.Get_ds(web=True, web_old=True),
'Origin': 'https://webstatic.mihoyo.com',
'x-rpc-app_version': setting.mihoyobbs_Version_old,
'User-Agent': 'Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 miHoYoBBS/2.3.0',
'x-rpc-client_type': setting.mihoyobbs_Client_type_web,
'Referer': 'https://webstatic.mihoyo.com/bh3/event/euthenia/index.html?bbs_presentation_style=fullscreen&bbs_game_role_required=bh3_cn&bbs_auth_required=true&act_id=e202104072769&utm_source=bbs&utm_medium=mys&utm_campaign=icon',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
'X-Requested-With': 'com.mihoyo.hyperion',
"Cookie": config.mihoyobbs_Cookies,
'x-rpc-device_id': tools.Get_deviceid()
}
'Accept': 'application/json, text/plain, */*',
'DS': tools.Get_ds(web=True, web_old=True),
'Origin': 'https://webstatic.mihoyo.com',
'x-rpc-app_version': setting.mihoyobbs_Version_old,
'User-Agent': 'Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) '
'Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 miHoYoBBS/2.3.0',
'x-rpc-client_type': setting.mihoyobbs_Client_type_web,
'Referer': f'https://webstatic.mihoyo.com/bh3/event/euthenia/index.html?bbs_presentation_style=fullscreen'
f'&bbs_game_role_required=bh3_cn&bbs_auth_required=t'
f'rue&act_id={setting.honkai3rd_Act_id}&utm_source=bbs&utm_medium=mys&utm_campaign=icon',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
'X-Requested-With': 'com.mihoyo.hyperion',
"Cookie": config.mihoyobbs_Cookies,
'x-rpc-device_id': tools.Get_deviceid()
}
self.acc_List = self.Getacc_list()
#获取绑定的账号列表
# 获取绑定的账号列表
def Getacc_list(self) -> list:
tools.log.info("正在获取米哈游账号绑定的崩坏3账号列表...")
temp_List = []
req = http.get(setting.honkai3rd_Account_info_url, headers=self.headers)
data = req.json()
if data["retcode"] != 0:
tools.log.warn("获取账号列表失败!")
tools.log.warning("获取账号列表失败!")
exit(1)
for i in data["data"]["list"]:
temp_List.append([i["nickname"], i["game_uid"], i["region"]])
tools.log.info(f"已获取到{len(temp_List)}个崩坏3账号信息")
return temp_List
#获取今天已经签到了的dict
def Get_today_item(self,raw_data:list) -> dict:
#用range进行循环当staus等于0的时候上一个就是今天签到的dict
# 获取今天已经签到了的dict
def Get_today_item(self, raw_data: list) -> dict:
# 用range进行循环当status等于0的时候上一个就是今天签到的dict
for i in range(len(raw_data)):
if raw_data[i]["status"] == 0:
return raw_data[i-1]
return raw_data[i - 1]
if raw_data[i]["status"] == 1:
return raw_data[i]
if i == int(len(raw_data) - 1) and raw_data[i]["status"] != 0:
return raw_data[i]
#判断签到
def Is_sign(self, region:str, uid:str, nickname:str):
# 判断签到
def Is_sign(self, region: str, uid: str, nickname: str):
req = http.get(setting.honkai3rd_Is_signurl.format(setting.honkai3rd_Act_id, region, uid), headers=self.headers)
data = req.json()
if data["retcode"] != 0:
tools.log.warn("获取账号签到信息失败!")
print (req.text)
tools.log.warning("获取账号签到信息失败!")
print(req.text)
exit(1)
today_Item = self.Get_today_item(data["data"]["sign"]["list"])
if today_Item["status"] == 1:
@ -63,26 +67,26 @@ class honkai3rd:
tools.log.info(f"舰长{nickname}今天已经签到过了~\r\n今天获得的奖励是{tools.Get_item(today_Item)}")
return False
#签到
# 签到
def Sign_acc(self):
if len(self.acc_List) != 0:
for i in self.acc_List:
tools.log.info(f"正在为舰长{i[0]}进行签到...")
time.sleep(random.randint(2, 8))
is_data = self.Is_sign(region = i[2], uid = i[1], nickname = i[0])
is_data = self.Is_sign(region=i[2], uid=i[1], nickname=i[0])
if is_data:
time.sleep(random.randint(2, 8))
req = http.post(url=setting.honkai3rd_SignUrl, headers=self.headers,
json={'act_id': setting.honkai3rd_Act_id, 'region': i[2], 'uid': i[1]})
json={'act_id': setting.honkai3rd_Act_id, 'region': i[2], 'uid': i[1]})
data = req.json()
if data["retcode"] == 0:
today_Item = self.Get_today_item(data["data"]["list"])
tools.log.info(f"舰长{i[0]}签到成功~\r\n今天获得的奖励是{tools.Get_item(today_Item)}")
elif data["retcode"] == -5003:
#崩坏3应为奖励列表和签到信息在一起了加上上面已经可以进行了一次判断所以这里旧不重复再次执行判断来获取内容了
# 崩坏3应为奖励列表和签到信息在一起了加上上面已经可以进行了一次判断所以这里旧不重复再次执行判断来获取内容了
tools.log.info(f"舰长{i[0]}今天已经签到过了~")
else:
tools.log.warn("账号签到失败!")
print (req.text)
tools.log.warning("账号签到失败!")
print(req.text)
else:
tools.log.warn("账号没有绑定任何崩坏3账号")
tools.log.warning("账号没有绑定任何崩坏3账号")

View File

@ -2,13 +2,14 @@ import main
import main_multi
def main_handler(event:dict, context:dict):
def main_handler(event: dict, context: dict):
main.main()
print("云函数测试支持!")
return 0
def main_handler_mulit(event:dict, context:dict):
#多用户需要传递True表示自动执行不需要手动进行确认
def main_handler_mulit(event: dict, context: dict):
# 多用户需要传递True表示自动执行不需要手动进行确认
main_multi.main_multi(True)
print("云函数多用户测试支持!")
return 0

View File

@ -3,20 +3,20 @@ import config
import request
import setting
def login():
if (config.mihoyobbs_Cookies == ''):
if config.mihoyobbs_Cookies == '':
log.error("请填入Cookies!")
config.Clear_cookies()
exit(1)
temp_Cookies = {}
#判断Cookie里面是否有login_ticket 没有的话直接退了
# 判断Cookie里面是否有login_ticket 没有的话直接退了
if "login_ticket" in config.mihoyobbs_Cookies:
temp_Cookies = config.mihoyobbs_Cookies.split(";")
for i in temp_Cookies:
if i.split("=")[0] == " login_ticket":
config.mihoyobbs_Login_ticket = i.split("=")[1]
break
#这里获取Stuid但是实际是可以直接拿cookie里面的Uid
# 这里获取Stuid但是实际是可以直接拿cookie里面的Uid
data = request.get(url=setting.bbs_Cookieurl.format(config.mihoyobbs_Login_ticket))
if "成功" in data["data"]["msg"]:
config.mihoyobbs_Stuid = str(data["data"]["cookie_info"]["account_id"])
@ -32,4 +32,4 @@ def login():
else:
log.error("cookie中没有'login_ticket'字段,请重新登录米游社重新抓取cookie!")
config.Clear_cookies()
exit(1)
exit(1)

34
main.py
View File

@ -8,39 +8,41 @@ import setting
import mihoyobbs
import honkai3rd
def main():
#初始化,加载配置
# 初始化,加载配置
config.Load_config()
if config.enable_Config:
#检测参数是否齐全,如果缺少就进行登入操作
# 检测参数是否齐全,如果缺少就进行登入操作
if config.mihoyobbs_Login_ticket == "" or config.mihoyobbs_Stuid == "" or config.mihoyobbs_Stoken == "":
#登入
# 登入
login.login()
time.sleep(random.randint(2, 8))
#获取要使用的BBS列表,#判断是否开启bbs_Signin_multi
# 获取要使用的BBS列表,#判断是否开启bbs_Signin_multi
if config.mihoyobbs["bbs_Signin_multi"]:
#速度快,但是无法设置主社区,主社区默认为第一个
# 速度快,但是无法设置主社区,主社区默认为第一个
'''
for i in setting.mihoyobbs_List:
if int(i["id"]) in config.mihoyobbs["bbs_Signin_multi_list"]:
setting.mihoyobbs_List_Use.append(i)
'''
#用这里的方案可以实现当让id在第一个的时候为主社区
# 用这里的方案可以实现当让id在第一个的时候为主社区
for i in config.mihoyobbs["bbs_Signin_multi_list"]:
for i2 in setting.mihoyobbs_List:
if i == int(i2["id"]):
setting.mihoyobbs_List_Use.append(i2)
else:
#关闭bbs_Signin_multi后只签到大别墅
# 关闭bbs_Signin_multi后只签到大别墅
for i in setting.mihoyobbs_List:
if int(i["id"]) == 5:
setting.mihoyobbs_List_Use.append(i)
#米游社签到
# 米游社签到
if config.mihoyobbs["bbs_Global"]:
bbs = mihoyobbs.mihoyobbs()
if bbs.Task_do["bbs_Sign"] and bbs.Task_do["bbs_Read_posts"] and bbs.Task_do["bbs_Like_posts"] and bbs.Task_do["bbs_Share"]:
if bbs.Task_do["bbs_Sign"] and bbs.Task_do["bbs_Read_posts"] and bbs.Task_do["bbs_Like_posts"] and \
bbs.Task_do["bbs_Share"]:
tools.log.info(f"今天已经全部完成了!一共获得{mihoyobbs.Today_have_getcoins}个米游币,目前有{mihoyobbs.Have_coins}个米游币")
else:
else:
if config.mihoyobbs["bbs_Signin"]:
bbs.Signin()
if config.mihoyobbs["bbs_Read_posts"]:
@ -50,11 +52,12 @@ def main():
if config.mihoyobbs["bbs_Share"]:
bbs.Share()
bbs.Get_taskslist()
tools.log.info(f"今天已经获得{mihoyobbs.Today_have_getcoins}个米游币,还能获得{mihoyobbs.Today_getcoins}个米游币,目前有{mihoyobbs.Have_coins}个米游币")
tools.log.info(
f"今天已经获得{mihoyobbs.Today_have_getcoins}个米游币,还能获得{mihoyobbs.Today_getcoins}个米游币,目前有{mihoyobbs.Have_coins}个米游币")
time.sleep(random.randint(2, 8))
else:
tools.log.info("米游社功能未启用!")
#原神签到
# 原神签到
if config.genshin_Auto_sign:
tools.log.info("正在进行原神签到")
genshin_Help = genshin.genshin()
@ -62,7 +65,7 @@ def main():
time.sleep(random.randint(2, 8))
else:
tools.log.info("原神签到功能未启用!")
#崩坏3签到
# 崩坏3签到
if config.honkai3rd_Auto_sign:
tools.log.info("正在进行崩坏3签到")
honkai3rd_Help = honkai3rd.honkai3rd()
@ -70,8 +73,9 @@ def main():
else:
tools.log.info("崩坏3签到功能未启用")
else:
tools.log.warn ("Config未启用")
tools.log.warning("Config未启用")
if __name__ == "__main__":
main()
pass
pass

View File

@ -7,20 +7,22 @@ import config
import random
import setting
#搜索配置文件
def Fund_config() ->list:
file_Name=[]
# 搜索配置文件
def Fund_config() -> list:
file_Name = []
for files in os.listdir(config.path):
if os.path.splitext(files)[1] == '.json':
file_Name.append(files)
return (file_Name)
return file_Name
def main_multi(autorun:bool):
def main_multi(autorun: bool):
tools.log.info("AutoMihoyoBBS Multi User mode")
tools.log.info("正在搜索配置文件!")
config_List = Fund_config()
if len(config_List) == 0:
tools.log.warn("未检测到配置文件请确认config文件夹存在.json后缀名的配置文件")
tools.log.warning("未检测到配置文件请确认config文件夹存在.json后缀名的配置文件")
exit(1)
if autorun:
tools.log.info(f"已搜索到{len(config_List)}个配置文件,正在开始执行!")
@ -33,11 +35,12 @@ def main_multi(autorun:bool):
for i in iter(config_List):
tools.log.info(f"正在执行{i}")
setting.mihoyobbs_List_Use = []
config.config_Path= f"{config.path}/{i}"
config.config_Path = f"{config.path}/{i}"
main.main()
tools.log.info(f"{i}执行完毕")
time.sleep(random.randint(3, 10))
if __name__ == "__main__":
if len(sys.argv) >= 2 and sys.argv[1] == "autorun":
autorun = True
@ -45,4 +48,4 @@ if __name__ == "__main__":
autorun = False
main_multi(autorun)
exit(0)
pass
pass

View File

@ -6,9 +6,10 @@ import setting
from request import http
Today_getcoins = 0
Today_have_getcoins = 0 #这个变量以后可能会用上,先留着了
Today_have_getcoins = 0 # 这个变量以后可能会用上,先留着了
Have_coins = 0
class mihoyobbs:
def __init__(self):
self.headers = {
@ -34,13 +35,13 @@ class mihoyobbs:
"bbs_Share": False
}
self.Get_taskslist()
#如果这三个任务都做了就没必要获取帖子了
# 如果这三个任务都做了就没必要获取帖子了
if self.Task_do["bbs_Read_posts"] and self.Task_do["bbs_Like_posts"] and self.Task_do["bbs_Share"]:
pass
else:
self.postsList = self.Getlist()
#获取任务列表,用来判断做了哪些任务
# 获取任务列表,用来判断做了哪些任务
def Get_taskslist(self):
global Today_getcoins
global Today_have_getcoins
@ -56,44 +57,44 @@ class mihoyobbs:
Today_getcoins = data["data"]["can_get_points"]
Today_have_getcoins = data["data"]["already_received_points"]
Have_coins = data["data"]["total_points"]
#如果当日可获取米游币数量为0直接判断全部任务都完成了
# 如果当日可获取米游币数量为0直接判断全部任务都完成了
if Today_getcoins == 0:
self.Task_do["bbs_Sign"] = True
self.Task_do["bbs_Read_posts"] = True
self.Task_do["bbs_Like_posts"] = True
self.Task_do["bbs_Share"] = True
else:
#如果第0个大于或等于62则直接判定任务没做
# 如果第0个大于或等于62则直接判定任务没做
if data["data"]["states"][0]["mission_id"] >= 62:
tools.log.info(f"新的一天,今天可以获得{Today_getcoins}个米游币")
pass
else:
tools.log.info(f"似乎还有任务没完成,今天还能获得{Today_getcoins}")
for i in data["data"]["states"]:
#58是讨论区签到
# 58是讨论区签到
if i["mission_id"] == 58:
if i["is_get_award"]:
self.Task_do["bbs_Sign"] = True
#59是看帖子
# 59是看帖子
elif i["mission_id"] == 59:
if i["is_get_award"]:
self.Task_do["bbs_Read_posts"] = True
else:
self.Task_do["bbs_Read_posts_num"] -= i["happened_times"]
#60是给帖子点赞
# 60是给帖子点赞
elif i["mission_id"] == 60:
if i["is_get_award"]:
self.Task_do["bbs_Like_posts"] = True
else:
self.Task_do["bbs_Like_posts_num"] -= i["happened_times"]
#61是分享帖子
# 61是分享帖子
elif i["mission_id"] == 61:
if i["is_get_award"]:
self.Task_do["bbs_Share"] = True
#分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环
# 分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环
break
#获取要帖子列表
# 获取要帖子列表
def Getlist(self) -> list:
temp_List = []
tools.log.info("正在获取帖子列表......")
@ -104,24 +105,24 @@ class mihoyobbs:
tools.log.info("已获取{}个帖子".format(len(temp_List)))
return temp_List
#进行签到操作
# 进行签到操作
def Signin(self):
if self.Task_do["bbs_Sign"]:
tools.log.info("讨论区任务已经完成过了~")
else:
tools.log.info("正在签到......")
for i in setting.mihoyobbs_List_Use:
req = http.post(url=setting.bbs_Signurl.format(i["id"]), data="" ,headers=self.headers)
req = http.post(url=setting.bbs_Signurl.format(i["id"]), data={}, headers=self.headers)
data = req.json()
if "err" not in data["message"]:
tools.log.info(str(i["name"]+ data["message"]))
tools.log.info(str(i["name"] + data["message"]))
time.sleep(random.randint(2, 8))
else:
tools.log.info("签到失败你的cookie可能已过期请重新设置cookie。")
config.Clear_cookies()
exit(1)
#看帖子
# 看帖子
def Readposts(self):
if self.Task_do["bbs_Read_posts"]:
tools.log.info("看帖任务已经完成过了~")
@ -134,7 +135,7 @@ class mihoyobbs:
tools.log.info("看帖:{} 成功".format(self.postsList[i][1]))
time.sleep(random.randint(2, 8))
#点赞
# 点赞
def Likeposts(self):
if self.Task_do["bbs_Like_posts"]:
tools.log.info("点赞任务已经完成过了~")
@ -142,21 +143,22 @@ class mihoyobbs:
tools.log.info("正在点赞......")
for i in range(self.Task_do["bbs_Like_posts_num"]):
req = http.post(url=setting.bbs_Likeurl, headers=self.headers,
json={"post_id": self.postsList[i][0], "is_cancel": False})
json={"post_id": self.postsList[i][0], "is_cancel": False})
data = req.json()
if data["message"] == "OK":
tools.log.info("点赞:{} 成功".format(self.postsList[i][1]))
#判断取消点赞是否打开
# 判断取消点赞是否打开
if config.mihoyobbs["bbs_Unlike"]:
time.sleep(random.randint(2, 8))
req = http.post(url=setting.bbs_Likeurl, headers=self.headers,
json={"post_id": self.postsList[i][0], "is_cancel": True})
json={"post_id": self.postsList[i][0], "is_cancel": True})
data = req.json()
if data["message"] == "OK":
tools.log.info("取消点赞:{} 成功".format(self.postsList[i][1]))
time.sleep(random.randint(2, 8))
time.sleep(random.randint(2, 8))
# 分享操作
#分享操作
def Share(self):
if self.Task_do["bbs_Share"]:
tools.log.info("分享任务已经完成过了~")
@ -166,4 +168,4 @@ class mihoyobbs:
data = req.json()
if data["message"] == "OK":
tools.log.info("分享:{} 成功".format(self.postsList[0][1]))
time.sleep(random.randint(2, 8))
time.sleep(random.randint(2, 8))

38
push_main-server.py Normal file
View File

@ -0,0 +1,38 @@
import sys
import time
import random
import subprocess
from request import http
SendKey = ""
send_Url = f"https://sctapi.ftqq.com/{SendKey}.send"
python_Path = sys.executable
run_ShellCommand = python_Path + " main_multi.py autorun"
for i in range(2):
opt_id, opt_info = subprocess.getstatusoutput(run_ShellCommand)
if opt_id == 0:
break
time.sleep(random.randint(30, 70))
if opt_id != 0:
print("Error!")
http.post(
url=send_Url,
data={
"title": "米游社脚本执行出错!",
"desp": "这里是运行相关日志:\r\n" + opt_info
}
)
else:
http.post(
url=send_Url,
data={
"title": "米游社脚本执行成功",
"desp": "这里是运行相关日志:\r\n" + opt_info
}
)
print("OK!")
exit(0)

View File

@ -1,17 +1,21 @@
try:
#优先使用httpx在httpx无法使用的环境下使用requests
# 优先使用httpx在httpx无法使用的环境下使用requests
import httpx
http = httpx
#当openssl版本小于1.0.2的时候直接进行一个空请求让httpx报错
# 当openssl版本小于1.0.2的时候直接进行一个空请求让httpx报错
import tools
if tools.Get_openssl_Version() <= 102:
httpx.get()
except:
import requests
http = requests
#这里实际上应该加个"-> dict"但是考虑到请求可能失败的关系,所以直接不声明返回变量
def get(url:str, **headers:dict):
# 这里实际上应该加个"-> dict"但是考虑到请求可能失败的关系,所以直接不声明返回变量
def get(url: str, **headers: dict):
try:
req = http.get(url, headers=headers)
return req.json()
@ -19,7 +23,8 @@ def get(url:str, **headers:dict):
print("请求失败,网络错误!")
return ""
def post(url:str, data:dict, **headers:dict):
def post(url: str, data: dict, **headers: dict):
try:
req = http.post(url, data=data, headers=headers)
return req.json()
@ -27,10 +32,11 @@ def post(url:str, data:dict, **headers:dict):
print("请求失败,网络错误!")
return ""
def post_json(url:str, json, **headers:dict):
def post_json(url: str, json, **headers: dict):
try:
req = http.post(url, json=json, headers=headers)
return req.json()
except:
print("请求失败,网络错误!")
return ""
return ""

View File

@ -1,2 +1,2 @@
httpx==0.19.0
httpx==0.20.0
requests==2.26.0

View File

@ -1,68 +1,68 @@
#米游社的Salt
# 米游社的Salt
mihoyobbs_Salt = "fd3ykrh7o1j54g581upo1tvpam0dsgtf"
mihoyobbs_Salt_web = "14bmu1mz0yuljprsfgpvjh3ju2ni468r"
mihoyobbs_Salt_web_old = "h8w582wxwgqvahcdkpvdhbh2w9casgfl"
#米游社的版本
mihoyobbs_Version = "2.7.0" #Slat和Version相互对应
# 米游社的版本
mihoyobbs_Version = "2.7.0" # Slat和Version相互对应
mihoyobbs_Version_old = "2.3.0"
#米游社的客户端类型
mihoyobbs_Client_type = "2" #1为ios 2为安卓
mihoyobbs_Client_type_web = "5" #4为pc web 5为mobile web
#米游社的分区列表
# 米游社的客户端类型
mihoyobbs_Client_type = "2" # 1为ios 2为安卓
mihoyobbs_Client_type_web = "5" # 4为pc web 5为mobile web
# 米游社的分区列表
mihoyobbs_List = [{
"id": "1",
"forumId": "1",
"name": "崩坏3",
"url": "https://bbs.mihoyo.com/bh3/"
},{
"id": "2",
"forumId": "26",
"name": "原神",
"url": "https://bbs.mihoyo.com/ys/"
},{
"id": "3",
"forumId": "30",
"name": "崩坏2",
"url": "https://bbs.mihoyo.com/bh2/"
},{
"id": "4",
"forumId": "37",
"name": "未定事件簿",
"url": "https://bbs.mihoyo.com/wd/"
},{
"id": "5",
"forumId": "34",
"name": "大别野",
"url": "https://bbs.mihoyo.com/dby/"
},{
"id": "6",
"forumId": "52",
"name": "崩坏:星穹铁道",
"url": "https://bbs.mihoyo.com/sr/"
}]
"id": "1",
"forumId": "1",
"name": "崩坏3",
"url": "https://bbs.mihoyo.com/bh3/"
}, {
"id": "2",
"forumId": "26",
"name": "原神",
"url": "https://bbs.mihoyo.com/ys/"
}, {
"id": "3",
"forumId": "30",
"name": "崩坏2",
"url": "https://bbs.mihoyo.com/bh2/"
}, {
"id": "4",
"forumId": "37",
"name": "未定事件簿",
"url": "https://bbs.mihoyo.com/wd/"
}, {
"id": "5",
"forumId": "34",
"name": "大别野",
"url": "https://bbs.mihoyo.com/dby/"
}, {
"id": "6",
"forumId": "52",
"name": "崩坏:星穹铁道",
"url": "https://bbs.mihoyo.com/sr/"
}]
#Config Load之后run里面进行列表的选择
mihoyobbs_List_Use= []
# Config Load之后run里面进行列表的选择
mihoyobbs_List_Use = []
#米游社的API列表
# 米游社的API列表
bbs_Cookieurl = "https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}"
bbs_Cookieurl2 = "https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket?login_ticket={}&token_types=3&uid={}"
bbs_Taskslist = "https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState" #获取任务列表
bbs_Taskslist = "https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState" # 获取任务列表
bbs_Signurl = "https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}" # post
bbs_Listurl = "https://bbs-api.mihoyo.com/post/api/getForumPostList?forum_id={}&is_good=false&is_hot=false&page_size=20&sort_type=1"
bbs_Detailurl = "https://bbs-api.mihoyo.com/post/api/getPostFull?post_id={}"
bbs_Shareurl = "https://bbs-api.mihoyo.com/apihub/api/getShareConf?entity_id={}&entity_type=1"
bbs_Likeurl = "https://bbs-api.mihoyo.com/apihub/sapi/upvotePost" # post json
#原神自动签到相关的设置
# 原神自动签到相关的设置
genshin_Act_id = "e202009291139501"
genshin_Account_info_url = "https://api-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_cn"
genshin_Signlisturl = "https://api-takumi.mihoyo.com/event/bbs_sign_reward/home?act_id={}"
genshin_Is_signurl = "https://api-takumi.mihoyo.com/event/bbs_sign_reward/info?act_id={}&region={}&uid={}"
genshin_Signurl = "https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign"
#崩坏3自动签到相关的设置
honkai3rd_Act_id = "e202104072769"
# 崩坏3自动签到相关的设置
honkai3rd_Act_id = "ea20211026151532"
honkai3rd_Account_info_url = "https://api-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=bh3_cn"
honkai3rd_Is_signurl = "https://api-takumi.mihoyo.com/common/euthenia/index?act_id={}&region={}&uid={}"
honkai3rd_SignUrl = "https://api-takumi.mihoyo.com/common/euthenia/sign"
honkai3rd_Is_signurl = "https://api-takumi.mihoyo.com/common/eutheniav2/index?act_id={}&region={}&uid={}"
honkai3rd_SignUrl = "https://api-takumi.mihoyo.com/common/eutheniav2/sign"

View File

@ -8,33 +8,39 @@ import logging
import hashlib
import setting
#Log输出这里提供了自定义logging输出的机会只需要创建一个logging.ini并且写入配置文件即可自定义输出
# Log输出这里提供了自定义logging输出的机会只需要创建一个logging.ini并且写入配置文件即可自定义输出
if os.path.exists(f"{config.path}/logging.ini"):
import logging.config
logging.config.fileConfig(f"{config.path}/logging.ini")
log = logging.getLogger("AutoMihoyoBBS")
else:
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
datefmt='%Y-%m-%dT%H:%M:%S')
log = logger = logging
log = logger = logging
#md5计算
def MD5(text:str) -> str:
# md5计算
def MD5(text: str) -> str:
md5 = hashlib.md5()
md5.update(text.encode())
return md5.hexdigest()
#随机文本
def Random_text(num:int) -> str:
return''.join(random.sample(string.ascii_lowercase + string.digits, num))
#时间戳
# 随机文本
def Random_text(num: int) -> str:
return ''.join(random.sample(string.ascii_lowercase + string.digits, num))
# 时间戳
def Timestamp() -> int:
return int(time.time())
#获取请求Header里的DS 当web为true则生成网页端的DS
def Get_ds(web:bool, web_old:bool) -> str:
# 获取请求Header里的DS 当web为true则生成网页端的DS
def Get_ds(web: bool, web_old: bool) -> str:
if web:
if web_old:
n = setting.mihoyobbs_Salt_web_old
@ -47,31 +53,35 @@ def Get_ds(web:bool, web_old:bool) -> str:
c = MD5("salt=" + n + "&t=" + i + "&r=" + r)
return f"{i},{r},{c}"
#生成一个device id
# 生成一个device id
def Get_deviceid() -> str:
return str(uuid.uuid3(uuid.NAMESPACE_URL, config.mihoyobbs_Cookies)).replace(
'-', '').upper()
'-', '').upper()
#获取签到的奖励名称
def Get_item(raw_data:dict) ->str:
# 获取签到的奖励名称
def Get_item(raw_data: dict) -> str:
temp_Name = raw_data["name"]
temp_Cnt = raw_data["cnt"]
return f"{temp_Name}x{temp_Cnt}"
#获取明天早晨0点的时间戳
# 获取明天早晨0点的时间戳
def Nextday() -> int:
now_time = int(time.time())
nextday_time = now_time - now_time % 86400 + time.timezone + 86400
return nextday_time
#获取Openssl版本
def Get_openssl_Version() ->int:
# 获取Openssl版本
def Get_openssl_Version() -> int:
try:
import ssl
except ImportError:
log.error("Openssl Lib Error !!")
#return -99
#建议直接更新Python的版本有特殊情况请提交issues
# return -99
# 建议直接更新Python的版本有特殊情况请提交issues
exit(-1)
temp_List = ssl.OPENSSL_VERSION_INFO
return int(f"{str(temp_List[0])}{str(temp_List[1])}{str(temp_List[2])}")
return int(f"{str(temp_List[0])}{str(temp_List[1])}{str(temp_List[2])}")