diff options
Diffstat (limited to 'ATRI/plugins/plugin_utils')
-rw-r--r-- | ATRI/plugins/plugin_utils/__init__.py | 42 | ||||
-rw-r--r-- | ATRI/plugins/plugin_utils/data_source.py | 194 | ||||
-rw-r--r-- | ATRI/plugins/plugin_utils/generate.py | 47 | ||||
-rw-r--r-- | ATRI/plugins/plugin_utils/genshin.py | 118 | ||||
-rw-r--r-- | ATRI/plugins/plugin_utils/roll.py | 59 |
5 files changed, 216 insertions, 244 deletions
diff --git a/ATRI/plugins/plugin_utils/__init__.py b/ATRI/plugins/plugin_utils/__init__.py index 9d29a82..16a57d2 100644 --- a/ATRI/plugins/plugin_utils/__init__.py +++ b/ATRI/plugins/plugin_utils/__init__.py @@ -16,23 +16,22 @@ from time import strftime from datetime import datetime, timedelta from nonebot.plugin import on_command -from nonebot.adapters.cqhttp import Bot, Event +from nonebot.typing import Bot, Event -from utils.utils_error import errorRepo -from utils.utils_rule import check_banlist, check_switch - -from .roll import roll_dice -from .generate import infoID, numberID -from .genshin import GetInfo, JsonAnalysis +from ATRI.utils.utils_error import errorRepo +from ATRI.utils.utils_rule import check_banlist, check_switch +from .data_source import Generate, Genshin, Roll plugin_name_0 = "one-key-adult" generateID = on_command("我要转大人,一天打25小时游戏", - rule=check_banlist() & check_switch(plugin_name_0)) + aliases={'虚拟身份', '一键成年'}, + rule=check_banlist() + & check_switch(plugin_name_0, True)) -@generateID.handle() # type: ignore +@generateID.handle() async def _(bot: Bot, event: Event, state: dict) -> None: - NAME, AREA = infoID() + NAME, AREA = Generate().infoID() BIRTH_BEGIN = datetime(*[1980, 10, 10]) # type: ignore BIRTH_END = datetime(*[2002, 10, 10]) # type: ignore @@ -45,7 +44,8 @@ async def _(bot: Bot, event: Event, state: dict) -> None: (BIRTH_BEGIN + id_card_year_old).timetuple()) id_card_sex = random.choice([0, 1]) id_card_name = random.choice(NAME[{0: "female", 1: "male"}[id_card_sex]]) - id_card_id = numberID(id_card_area, id_card_sex, id_card_birth_day) # type: ignore + id_card_id = Generate().numberID(id_card_area, id_card_sex, + id_card_birth_day) # type: ignore msg0 = "恭喜,你已经成大人了!\n" msg0 += "这是你一天25h游戏的通行证:\n" @@ -61,7 +61,7 @@ async def _(bot: Bot, event: Event, state: dict) -> None: rollD = on_command("roll", rule=check_banlist()) -@rollD.handle() # type: ignore +@rollD.handle() async def _(bot: Bot, event: Event, state: dict) -> None: args = str(event.message).strip() @@ -69,8 +69,7 @@ async def _(bot: Bot, event: Event, state: dict) -> None: state['resu'] = args -@rollD.got("resu", - prompt="roll 参数不能为空~!\ndemo:1d10 或 2d10+2d10") # type: ignore +@rollD.got("resu", prompt="roll 参数不能为空~!\ndemo:1d10 或 2d10+2d10") async def _(bot: Bot, event: Event, state: dict) -> None: resu = state['resu'] match = re.match(r'^([\dd+\s]+?)$', resu) @@ -78,15 +77,16 @@ async def _(bot: Bot, event: Event, state: dict) -> None: if not match: await rollD.finish("请输入正确的参数!!\ndemo:1d10 或 2d10+2d10") - await rollD.finish(roll_dice(resu)) + await rollD.finish(Roll().roll_dice(resu)) plugin_name_1 = 'genshin-search' genshinInfo = on_command('genshin', - rule=check_banlist() & check_switch(plugin_name_1)) + rule=check_banlist() + & check_switch(plugin_name_1, True)) -@genshinInfo.handle() # type: ignore +@genshinInfo.handle() async def _(bot: Bot, event: Event, state: dict) -> None: args = str(event.message).strip() @@ -94,7 +94,7 @@ async def _(bot: Bot, event: Event, state: dict) -> None: state['uid'] = args -@genshinInfo.got('uid', prompt='请告诉咱需要查询的UID,暂时只支持国服嗷~(') # type: ignore +@genshinInfo.got('uid', prompt='请告诉咱需要查询的UID,暂时只支持国服嗷~(') async def _(bot: Bot, event: Event, state: dict) -> None: uid = str(state['uid']) @@ -103,12 +103,14 @@ async def _(bot: Bot, event: Event, state: dict) -> None: uid_info = '' try: - uid_info = JsonAnalysis(GetInfo(uid)) + uid_info = Genshin().JsonAnalysis(Genshin().GetInfo(uid)) except: - await genshinInfo.finish(errorRepo("数据请求错误,原因可能为ID输入错误或不存在\n暂时只支持国服查询(")) + await genshinInfo.finish( + errorRepo("数据请求错误,原因可能为ID输入错误或不存在\n暂时只支持国服查询(")) msg0 = f'{uid} Genshin Info:\n' msg0 += uid_info + print(uid_info) await genshinInfo.finish(msg0) else: diff --git a/ATRI/plugins/plugin_utils/data_source.py b/ATRI/plugins/plugin_utils/data_source.py new file mode 100644 index 0000000..da6c52c --- /dev/null +++ b/ATRI/plugins/plugin_utils/data_source.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +# -*- encoding: utf-8 -*- +''' +@File : data_source.py +@Time : 2020/11/21 11:13:42 +@Author : Kyomotoi +@Contact : kyomotoiowo@gmail.com +@Github : https://github.com/Kyomotoi +@License : Copyright © 2018-2020 Kyomotoi, All Rights Reserved. +''' +__author__ = 'kyomotoi' + +import re +import os +import time +import json +import string +import random +import hashlib +import requests +from pathlib import Path +from zipfile import PyZipFile +from typing import Tuple, Dict, List + + +class Generate: + """虚拟身份证部分""" + GENERATE_DATA_PATH = Path( + '.') / 'ATRI' / 'plugins' / 'plugin_utils' / 'main.bin' + + def infoID(self) -> Tuple[Dict[str, List[str]], Dict[str, str]]: + with PyZipFile(os.path.abspath(self.GENERATE_DATA_PATH), + "r") as zipFile: + with zipFile.open("name.json", "r") as f: + name = json.loads(f.read().decode()) + with zipFile.open("area.json", "r") as f: + area = json.loads(f.read().decode()) + return name, area + + def numberID(self, area: int, sex: int, birth: int) -> str: + def checkSum(fullCode: str) -> int or str: + assert len(fullCode) == 17 + checkSum = sum([((1 << (17 - i)) % 11) * int(fullCode[i]) + for i in range(0, 17)]) + checkDigit = (12 - (checkSum % 11)) % 11 + if checkDigit < 10: + return checkDigit + else: + return "X" # type: ignore + + orderCode = str(random.randint(10, 99)) + sexCode = str(random.randrange(sex, 10, step=2)) + fullCode = str(area) + str(birth) + str(orderCode) + str(sexCode) + fullCode += str(checkSum(fullCode)) + return fullCode + + +class Genshin: + """原神部分""" + def md5(self, text: str) -> str: + """text 转 md5""" + md5 = hashlib.md5() + md5.update(text.encode()) + return md5.hexdigest() + + def DSGet(self) -> str: + mhyVersion = "2.1.0" + n = self.md5(mhyVersion) + 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, uid: str) -> str: + """请求API""" + req = requests.get( + url= + f"https://api-takumi.mihoyo.com/game_record/genshin/api/index?server=cn_gf01&role_id={uid}", + headers={ + 'Accept': 'application/json, text/plain, */*', + 'DS': self.DSGet(), + 'Origin': 'https://webstatic.mihoyo.com', + 'x-rpc-app_version': '2.1.0', + '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' + }) + return req.text + + def JsonAnalysis(self, JsonText) -> str: + """解析数据""" + data = json.loads(JsonText) + + Character_Info = "Roles:\n" + Character_List = [] + 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): + TempText = f'* {i["name"]}:\n' + TempText += f' - [萤——妹妹] {i["level"]}级 {Character_Type}\n' + + elif (i["image"].find("UI_AvatarIcon_PlayerBoy") != -1): + TempText = f'* {i["name"]}:\n' + TempText += f' - [空——哥哥] {i["level"]}级 {Character_Type}\n' + + else: + TempText = f'* {i["name"]}:\n' + TempText += f' - [性别判断失败] {i["level"]}级 {Character_Type}\n' + else: + TempText = f'* {i["name"]} {i["rarity"]}★角色:\n' + TempText += f' - {i["level"]}级 好感度({i["fetter"]})级 {Character_Type}\n' + + Character_Info = Character_Info + TempText + + 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 Character_Info + "\r\n" + Account_Info + + +class Roll: + """骰娘部分""" + def roll_dice(self, par: str) -> str: + """掷骰子""" + result = 0 + proc = '' + proc_list = [] + p = par.split('+') + + # 计算每个单独的roll + for i in p: + args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i) + args = list(args[0]) + + if not args[0]: + args[0] = 1 + + if int(args[0]) >= 5000 or int(args[2]) >= 5000: + return '阿..好大...' + + for a in range(1, int(args[0]) + 1): + rd = random.randint(1, int(args[2])) + result = result + rd + + if len(proc_list) <= 10: + proc_list.append(rd) + + if len(proc_list) <= 10: + proc += "+".join(map(str, proc_list)) + + elif len(proc_list) >= 10: + proc += '太长了不展示了就酱' + + else: + proc += str(result) + + result = f"{par}=({proc})={result}" + + return str(result)
\ No newline at end of file diff --git a/ATRI/plugins/plugin_utils/generate.py b/ATRI/plugins/plugin_utils/generate.py deleted file mode 100644 index 4749bab..0000000 --- a/ATRI/plugins/plugin_utils/generate.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -# -*- encoding: utf-8 -*- -''' -@File : generateID.py -@Time : 2020/11/08 10:35:09 -@Author : Kyomotoi -@Contact : kyomotoiowo@gmail.com -@Github : https://github.com/Kyomotoi -@License : Copyright © 2018-2020 Kyomotoi, All Rights Reserved. -''' -__author__ = 'kyomotoi' - -import os -import json -import random -from pathlib import Path -from zipfile import PyZipFile -from typing import Tuple, Dict, List - -FILE = Path('.') / 'ATRI' / 'plguins' / 'plugin_utils' / 'main.bin' - - -def infoID() -> Tuple[Dict[str, List[str]], Dict[str, str]]: - with PyZipFile(os.path.abspath(FILE), "r") as zipFile: - with zipFile.open("name.json", "r") as f: - name = json.loads(f.read().decode()) - with zipFile.open("area.json", "r") as f: - area = json.loads(f.read().decode()) - return name, area - - -def numberID(area: int, sex: int, birth: int) -> str: - def checkSum(fullCode: str) -> int or str: - assert len(fullCode) == 17 - checkSum = sum([((1 << (17 - i)) % 11) * int(fullCode[i]) - for i in range(0, 17)]) - checkDigit = (12 - (checkSum % 11)) % 11 - if checkDigit < 10: - return checkDigit - else: - return "X" # type: ignore - - orderCode = str(random.randint(10, 99)) - sexCode = str(random.randrange(sex, 10, step=2)) - fullCode = str(area) + str(birth) + str(orderCode) + str(sexCode) - fullCode += str(checkSum(fullCode)) - return fullCode diff --git a/ATRI/plugins/plugin_utils/genshin.py b/ATRI/plugins/plugin_utils/genshin.py deleted file mode 100644 index 642773d..0000000 --- a/ATRI/plugins/plugin_utils/genshin.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -# -*- encoding: utf-8 -*- -''' -@File : genshin.py -@Time : 2020/11/07 22:34:58 -@Author : Kyomotoi -@Contact : kyomotoiowo@gmail.com -@Github : https://github.com/Kyomotoi -@License : Copyright © 2018-2020 Kyomotoi, All Rights Reserved. -@Docs : Fork from https://github.com/Womsxd/YuanShen_User_Info -''' -__author__ = 'kyomotoi' - -import json -import time -import string -import random -import hashlib -import requests - - -def md5(text: str) -> str: - """text 转 md5""" - md5 = hashlib.md5() - md5.update(text.encode()) - return md5.hexdigest() - - -def DSGet() -> str: - mhyVersion = "2.1.0" - n = md5(mhyVersion) - i = str(int(time.time())) - r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) - c = md5("salt=" + n + "&t=" + i + "&r=" + r) - return i + "," + r + "," + c - - -def GetInfo(uid: str) -> str: - """请求API""" - req = requests.get( - url= - f"https://api-takumi.mihoyo.com/game_record/genshin/api/index?server=cn_gf01&role_id={uid}", - headers={ - 'Accept': 'application/json, text/plain, */*', - 'DS': DSGet(), - 'Origin': 'https://webstatic.mihoyo.com', - 'x-rpc-app_version': '2.1.0', - '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' - }) - return req.text - - -def JsonAnalysis(JsonText) -> str: - """解析数据""" - data = json.loads(JsonText) - - Character_Info = "Roles:\n" - Character_List = [] - 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): - TempText = f'* {i["name"]}:\n' - TempText += f' - [萤——妹妹] {i["level"]}级 {Character_Type}\n' - - elif (i["image"].find("UI_AvatarIcon_PlayerBoy") != -1): - TempText = f'* {i["name"]}:\n' - TempText += f' - [空——哥哥] {i["level"]}级 {Character_Type}\n' - - else: - TempText = f'* {i["name"]}:\n' - TempText += f' - [性别判断失败] {i["level"]}级 {Character_Type}\n' - else: - TempText = f'* {i["name"]} {i["rarity"]}★角色:\n' - TempText += f' - {i["level"]}级 好感度({i["fetter"]})级 {Character_Type}\n' - - Character_Info = Character_Info + TempText - - 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 Character_Info + "\r\n" + Account_Info
\ No newline at end of file diff --git a/ATRI/plugins/plugin_utils/roll.py b/ATRI/plugins/plugin_utils/roll.py deleted file mode 100644 index bf87aa3..0000000 --- a/ATRI/plugins/plugin_utils/roll.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -# -*- encoding: utf-8 -*- -''' -@File : roll.py -@Time : 2020/11/07 15:56:02 -@Author : Kyomotoi -@Contact : kyomotoiowo@gmail.com -@Github : https://github.com/Kyomotoi -@License : Copyright © 2018-2020 Kyomotoi, All Rights Reserved. -''' -__author__ = 'kyomotoi' - -import re -from random import randint - - -def roll_dice(par: str) -> str: - """掷骰子""" - result = 0 - proc = '' - proc_list = [] - p = par.split('+') - - # 计算每个单独的roll - for i in p: - args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i) - args = list(args[0]) - - if not args[0]: - args[0] = 1 - - if int(args[0]) >= 5000 or int(args[2]) >= 5000: - return '阿..好大...' - - for a in range(1, int(args[0]) + 1): - rd = randint(1, int(args[2])) - result = result + rd - - if len(proc_list) <= 10: - proc_list.append(rd) - - if len(proc_list) == 10: - temp_list = [] - for i in proc_list: - if len(temp_list) == 9: - proc += str(i) - else: - proc += str(i) + '+' - temp_list.append(i) - - elif len(proc_list) >= 10: - proc += '太长了不展示了' - - else: - proc += str(result) - - result = f"{par}=({proc})={result}" - - return str(result) |