mirror of
https://github.com/xuthus83/LittlePaimon.git
synced 2024-12-16 13:40:53 +08:00
174 lines
6.1 KiB
Python
174 lines
6.1 KiB
Python
import json
|
||
import urllib
|
||
import requests
|
||
from asyncio import sleep
|
||
import time
|
||
import os
|
||
import hoshino,os
|
||
from hoshino import R,MessageSegment,aiorequests,logger,Service
|
||
|
||
sv = Service('原神抽卡记录导出')
|
||
|
||
def checkApi(url) -> bool:
|
||
if not url:
|
||
#print("url为空")
|
||
return "url为空"
|
||
if "getGachaLog" not in url:
|
||
#print("错误的url,检查是否包含getGachaLog")
|
||
return "错误的url,检查是否包含getGachaLog"
|
||
try:
|
||
r = requests.get(url)
|
||
s = r.content.decode("utf-8")
|
||
j = json.loads(s)
|
||
except Exception as e:
|
||
#print("API请求解析出错:" + str(e))
|
||
return "API请求解析出错:" + str(e)
|
||
|
||
if not j["data"]:
|
||
if j["message"] == "authkey valid error":
|
||
return "authkey错误"
|
||
else:
|
||
return "数据为空,错误代码:" + j["message"]
|
||
return "OK"
|
||
|
||
def getApi(url: str, gachaType: str, size: str, page: int, end_id="") -> str:
|
||
parsed = urllib.parse.urlparse(url)
|
||
querys = urllib.parse.parse_qsl(parsed.query)
|
||
param_dict = dict(querys)
|
||
param_dict["size"] = size
|
||
param_dict["gacha_type"] = gachaType
|
||
param_dict["page"] = page
|
||
param_dict["lang"] = "zh-cn"
|
||
param_dict["end_id"] = end_id
|
||
param = urllib.parse.urlencode(param_dict)
|
||
path = url.split("?")[0]
|
||
api = path + "?" + param
|
||
return api
|
||
|
||
|
||
async def getGachaLogs(url: str, gachaTypeId: str, gachaTypeDict: dict) -> list:
|
||
size = "20"
|
||
# api限制一页最大20
|
||
gachaList = []
|
||
gachaList_temp = []
|
||
end_id = "0"
|
||
c = 0
|
||
for page in range(1, 9999):
|
||
#print(f"正在获取 {gachaTypeDict[gachaTypeId]} 第 {page} 页", flush=True)
|
||
api = getApi(url, gachaTypeId, size, page, end_id)
|
||
r = requests.get(api)
|
||
s = r.content.decode("utf-8")
|
||
j = json.loads(s)
|
||
gacha = j["data"]["list"]
|
||
if not len(gacha):
|
||
break
|
||
for i in gacha:
|
||
gachaList_temp.append(i)
|
||
end_id = j["data"]["list"][-1]["id"]
|
||
await sleep(0.3)
|
||
if gachaList_temp:
|
||
gachaList.append({'uid':gachaList_temp[0]['uid']})
|
||
gachaList_temp.reverse()
|
||
for i in gachaList_temp:
|
||
c += 1
|
||
if i['rank_type'] == "5":
|
||
fivechar = {}
|
||
fivechar['name'] = i['name']
|
||
fivechar['item_type'] = i['item_type']
|
||
fivechar['count'] = c
|
||
c = 0
|
||
gachaList.append(fivechar)
|
||
gachaList.append({'未出货':c})
|
||
return gachaList
|
||
|
||
# def getGachaTypes(url: str) -> list:
|
||
# tmp_url = url.replace("getGachaLog", "getConfigList")
|
||
# parsed = urllib.parse.urlparse(tmp_url)
|
||
# querys = urllib.parse.parse_qsl(parsed.query)
|
||
# param_dict = dict(querys)
|
||
# param_dict["lang"] = "zh-cn"
|
||
# param = urllib.parse.urlencode(param_dict)
|
||
# path = tmp_url.split("?")[0]
|
||
# tmp_url = path + "?" + param
|
||
# r = requests.get(tmp_url)
|
||
# s = r.content.decode("utf-8")
|
||
# configList = json.loads(s)
|
||
# return configList["data"]["gacha_type_list"]
|
||
|
||
# def mergeDataFunc(localData: dict, gachaData: dict) -> dict:
|
||
# gachaTypes = gachaData["gachaType"]
|
||
# gachaTypeIds = [banner["key"] for banner in gachaTypes]
|
||
# gachaTypeNames = [banner["name"] for banner in gachaTypes]
|
||
# gachaTypeDict = dict(zip(gachaTypeIds, gachaTypeNames))
|
||
|
||
# for banner in gachaTypeDict:
|
||
# bannerLocal = localData["gachaLog"][banner]
|
||
# bannerGet = gachaData["gachaLog"][banner]
|
||
# if bannerGet == bannerLocal:
|
||
# pass
|
||
# else:
|
||
# #print("合并", gachaTypeDict[banner])
|
||
# flaglist = [1] * len(bannerGet)
|
||
# loc = [[i["time"], i["name"]] for i in bannerLocal]
|
||
# for i in range(len(bannerGet)):
|
||
# gachaGet = bannerGet[i]
|
||
# get = [gachaGet["time"], gachaGet["name"]]
|
||
# if get in loc:
|
||
# pass
|
||
# else:
|
||
# flaglist[i] = 0
|
||
|
||
# print("获取到", len(flaglist), "条记录")
|
||
# tempData = []
|
||
# for i in range(len(bannerGet)):
|
||
# if flaglist[i] == 0:
|
||
# gachaGet = bannerGet[i]
|
||
# tempData.insert(0, gachaGet)
|
||
# print("追加", len(tempData), "条记录")
|
||
# for i in tempData:
|
||
# localData["gachaLog"][banner].insert(0, i)
|
||
|
||
# return localData
|
||
|
||
@sv.on_prefix('原神抽卡记录导出')
|
||
async def get_gacha_record(bot,ev):
|
||
url = ev.message.extract_plain_text().strip()
|
||
spliturl = url.split("?")
|
||
spliturl[0] = "https://hk4e-api.mihoyo.com/event/gacha_info/api/getGachaLog"
|
||
url = "?".join(spliturl)
|
||
checkApimsg = checkApi(url)
|
||
if checkApimsg == 'OK':
|
||
await bot.send(ev,'获取抽卡记录中,请稍候...',at_sender=True)
|
||
gachaTypes = {'200': '常驻祈愿', '301': '角色活动祈愿', '302': '武器活动祈愿'}
|
||
gachaData = {}
|
||
gachaData["gachaLog"] = {}
|
||
|
||
for gachaType in gachaTypes.items():
|
||
gachaLog = await getGachaLogs(url, gachaType[0], gachaTypes)
|
||
gachaData["gachaLog"][gachaType[1]] = gachaLog
|
||
|
||
uid_flag = 1
|
||
for gachaType in gachaData["gachaLog"]:
|
||
for log in gachaData["gachaLog"][gachaType]:
|
||
if uid_flag and log["uid"]:
|
||
gachaData["uid"] = log["uid"]
|
||
uid_flag = 0
|
||
|
||
|
||
#gen_path = os.path.dirname(os.path.realpath(sys.argv[0]))
|
||
uid = gachaData["uid"]
|
||
mergeData = gachaData
|
||
msg = f'你的抽卡记录如下\nuid: {uid}\n'
|
||
for gachaType in gachaTypes.values():
|
||
if gachaType in mergeData['gachaLog']:
|
||
msg += gachaType +': '
|
||
if len(mergeData['gachaLog'][gachaType]) <= 2:
|
||
msg += '没有五星记录'
|
||
else:
|
||
for role in mergeData['gachaLog'][gachaType]:
|
||
if 'name' in role:
|
||
msg += f"{role['name']}({role['count']}) "
|
||
msg += '\n'
|
||
await bot.send(ev,msg,at_sender=True)
|
||
else:
|
||
await bot.send(ev,checkApimsg,at_sender=True) |