summaryrefslogtreecommitdiff
path: root/ATRI/plugins/genshin
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2020-12-20 17:14:41 +0800
committerKyomotoi <[email protected]>2020-12-20 17:14:41 +0800
commit9bf222471d34cb756a4878b103ec82c6c4bfb191 (patch)
tree1420d498c41f71858e74b4926b8d7206b5235fe6 /ATRI/plugins/genshin
parent9ac2c2eb7ef2eb267e926d599dc077f5afae98f9 (diff)
downloadATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.tar.gz
ATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.tar.bz2
ATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.zip
[Update]
- 创建项目结构
Diffstat (limited to 'ATRI/plugins/genshin')
-rw-r--r--ATRI/plugins/genshin/__init__.py53
-rw-r--r--ATRI/plugins/genshin/data_source.py121
2 files changed, 174 insertions, 0 deletions
diff --git a/ATRI/plugins/genshin/__init__.py b/ATRI/plugins/genshin/__init__.py
new file mode 100644
index 0000000..4705e0e
--- /dev/null
+++ b/ATRI/plugins/genshin/__init__.py
@@ -0,0 +1,53 @@
+import re
+from nonebot.plugin import on_command
+from nonebot.typing import Bot, Event
+
+from ATRI.config import GENSHIN_CONFIG
+from ATRI.exceptions import InvalidRequestError
+from ATRI.rule import isInBanList, isInDormant, isInService
+
+from .data_source import Genshin
+
+__plugin_name__ = 'genshin'
+
+genshin = on_command(GENSHIN_CONFIG['genshin']['command'][0],
+ aliases=set(GENSHIN_CONFIG['genshin']['command']),
+ rule=isInBanList() & isInDormant()
+ & isInService(__plugin_name__))
+
+
+async def _(bot: Bot, event: Event, state: dict) -> None:
+ args = str(event.message)
+
+ if args:
+ state['args'] = args
+
[email protected]('args', prompt='请告诉咱id以及是官服还是b服嗷~w\n用空格隔开!!')
+async def _(bot: Bot, event: Event, state: dict) -> None:
+ args = state['args'].split(' ')
+ uid_info = ''
+ server_id = ''
+
+ if len(args[0]) != 9:
+ await genshin.finish('抱歉暂时只支持国服呢...')
+ else:
+ pass
+
+ if re.findall('[Bb官]服', args[1]):
+ if re.findall('[Bb]服', args[1]):
+ server_id = 'cn_qd01'
+ else:
+ server_id = 'cn_gf01'
+
+ await bot.send(event, '别急,在找!')
+ try:
+ uid_info = Genshin().jsonAnalysis(Genshin().getInfo(server_id=server_id, uid=args[0]))
+ except InvalidRequestError:
+ await genshin.finish('找不到呢...咱搜索区域或许出错了...')
+
+ msg0 = (f'{args[0]} Genshin INFO:\n'
+ f'{uid_info}')
+ await genshin.finish(msg0)
+ else:
+ await genshin.finish('抱歉暂时只支持官服和b服...呐.')
diff --git a/ATRI/plugins/genshin/data_source.py b/ATRI/plugins/genshin/data_source.py
new file mode 100644
index 0000000..2bb4572
--- /dev/null
+++ b/ATRI/plugins/genshin/data_source.py
@@ -0,0 +1,121 @@
+import time
+import json
+import random
+import string
+import hashlib
+import requests
+from typing import Optional
+
+from ATRI.request import Request
+from ATRI.config import GENSHIN_CONFIG
+from ATRI.exceptions import InvalidRequestError
+
+
+mhyVersion = GENSHIN_CONFIG['genshin']['mhyVersion']
+
+
+class Genshin:
+ def md5(self, text: str) -> str:
+ md5 = hashlib.md5()
+ md5.update(text.encode())
+ return md5.hexdigest()
+
+ def getDS(self):
+ global mhyVersion
+ if mhyVersion == '2.1.0':
+ n = self.md5(mhyVersion)
+ elif mhyVersion == '2.2.1':
+ n = "cx2y9z9a29tfqvr1qsq6c7yz99b5jsqt"
+ else:
+ mhyVersion = "2.2.1"
+ n = "cx2y9z9a29tfqvr1qsq6c7yz99b5jsqt"
+
+ i = str(int(time.time()))
+ r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
+ c = self.md5("salt=" + n + "&t="+ i + "&r=" + r)
+ return (i + "," + r + "," + c)
+
+ def getInfo(self, server_id: str, uid: str) -> str:
+ try:
+ url = GENSHIN_CONFIG['genshin']['url'] + server_id + "&role_id=" + uid
+ print(url)
+ headers: dict = {
+ 'Accept': 'application/json, text/plain, */*',
+ 'DS': self.getDS(),
+ 'Origin': 'https://webstatic.mihoyo.com',
+ 'x-rpc-app_version': mhyVersion,
+ '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.2.0',
+ 'x-rpc-client_type': '4',
+ 'Referer': 'https://webstatic.mihoyo.com/app/community-game-records/index.html?v=6',
+ 'Accept-Encoding': 'gzip, deflate',
+ 'Accept-Language': 'zh-CN,en-US;q=0.8',
+ 'X-Requested-With': 'com.mihoyo.hyperion'
+ }
+ result = requests.get(url=url,headers=headers, timeout=10)
+ print(result.text)
+ return result.text
+ except InvalidRequestError:
+ raise InvalidRequestError('请求数据出错')
+
+ def jsonAnalysis(self, a) -> Optional[str]:
+ print(a)
+ data = json.loads(a)
+ if data['retcode'] != 0:
+ raise InvalidRequestError('请求出错,原因:uid错误/不存在/国服之外')
+ else:
+ pass
+
+ character_info = 'Roles:\n'
+ character_list = data['data']['avatars']
+ for i in character_list:
+ if i["element"] == "None":
+ character_type = "无属性"
+ elif i["element"] == "Anemo":
+ character_type = "风属性"
+ elif i["element"] == "Pyro":
+ character_type = "火属性"
+ elif i["element"] == "Geo":
+ character_type = "岩属性"
+ elif i["element"] == "Electro":
+ character_type = "雷属性"
+ elif i["element"] == "Cryo":
+ character_type = "冰属性"
+ elif i["element"] == "Hydro":
+ character_type = "水属性"
+ else:
+ character_type = "草属性"
+
+ if i["name"] == "旅行者":
+ if i["image"].find("UI_AvatarIcon_PlayerGirl") != -1:
+ temp_text = f'* {i["name"]}:\n'
+ temp_text += f' - [萤——妹妹] {i["level"]}级 {character_type}\n'
+
+ elif i["image"].find("UI_AvatarIcon_PlayerBoy") != -1:
+ temp_text = f'* {i["name"]}:\n'
+ temp_text += f' - [空——哥哥] {i["level"]}级 {character_type}\n'
+
+ else:
+ temp_text = f'* {i["name"]}:\n'
+ temp_text += f' - [性别判断失败] {i["level"]}级 {character_type}\n'
+ else:
+ temp_text = f'* {i["name"]} {i["rarity"]}★角色:\n'
+ temp_text += f' - {i["level"]}级 好感度({i["fetter"]})级 {character_type}\n'
+
+ character_info += temp_text
+
+ a1 = data["data"]["stats"]["spiral_abyss"]
+
+ account_info = 'Account Info:\n'
+ account_info += f'- 活跃天数:{data["data"]["stats"]["active_day_number"]} 天\n'
+ account_info += f'- 达成成就:{data["data"]["stats"]["achievement_number"]} 个\n'
+ account_info += f'- 获得角色:{data["data"]["stats"]["avatar_number"]}个\n'
+ account_info += f'- 深渊螺旋:{"没打" if (data["data"]["stats"]["spiral_abyss"] == "-") else f"打到了{a1}"}\n'
+ account_info += f'* 收集:\n'
+ account_info += f' - 风神瞳{data["data"]["stats"]["anemoculus_number"]}个 岩神瞳{data["data"]["stats"]["geoculus_number"]}个\n'
+ account_info += f'* 解锁:\n'
+ account_info += f' - 传送点{data["data"]["stats"]["way_point_number"]}个 秘境{data["data"]["stats"]["domain_number"]}个\n'
+ account_info += f'* 共开启宝箱:\n'
+ account_info += f' - 普通:{data["data"]["stats"]["common_chest_number"]}个 精致:{data["data"]["stats"]["exquisite_chest_number"]}个\n'
+ account_info += f' - 珍贵:{data["data"]["stats"]["luxurious_chest_number"]}个 华丽:{data["data"]["stats"]["precious_chest_number"]}个'
+
+ return str(character_info + '\r\n' + account_info)