一定要看更新记录和指令!
92
README.md
@ -1,12 +1,14 @@
|
|||||||
# GenshinUID / 原神UID查询
|
# GenshinUID / 原神UID查询
|
||||||
|
|
||||||
一个HoshinoBot插件,用于查询原神UID信息。
|
一个HoshinoBot插件,用于查询原神UID信息,用于查询树脂/探索派遣状态,推送树脂快满了。
|
||||||
|
|
||||||
注意:本插件不包含本体,您应该配合[Mrs4s](https://github.com/Mrs4s) / [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) 和 [HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot) 使用,本插件的作用是利用米游社API查询指定原神UID信息(Cookies获取可前往[YuanShen_User_Info](https://github.com/Womsxd/YuanShen_User_Info)查看教程)
|
**一定要读更新记录和指令!!**
|
||||||
|
|
||||||
已完成:角色排序(星级>等级>好感),mysid/uid查询,mysid/uid绑定qq号,cookies池,每日自动记录uid查询使用的cookies,下次再查询时仍然调用该cookies(防止浪费),mysid/uid查询深渊单独层数,以上所有输出图片均可支持背景图片自定义。
|
注意:本插件不包含本体,您应该配合[Mrs4s](https://github.com/Mrs4s) / [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) 和 [HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot) 使用,本插件的作用是利用米游社API查询指定原神UID信息(Cookies获取可前往[YuanShen_User_Info](https://github.com/Womsxd/YuanShen_User_Info)查看教程)
|
||||||
|
|
||||||
示例: 
|
再次提醒:**Cookies是重要信息,请不要随意泄露!!!**
|
||||||
|
|
||||||
|
示例: 
|
||||||
|
|
||||||
- [安装](#安装)
|
- [安装](#安装)
|
||||||
- [更新记录](#更新记录)
|
- [更新记录](#更新记录)
|
||||||
@ -38,12 +40,32 @@ $ pip3 install -r requirements.txt
|
|||||||
添加 cookies
|
添加 cookies
|
||||||
```
|
```
|
||||||
|
|
||||||
注意事项:可以添加多条,但一次只能添加一条,添加两个字的之后必须带有空格,cookies填入你自己的,并且不要泄露给任何人,如果添加了错误的cookies,会导致一系列问题,如果想删除错误的cookies,请操作sqlite数据库完成。
|
注意事项:可以添加多条,但一次只能添加一条,添加两个字的之后必须带有空格,cookies填入你自己的,**并且不要泄露给任何人**,~~如果添加了错误的cookies,会导致一系列问题,如果想删除错误的cookies,请操作sqlite数据库完成~~,目前已实现Cookies校验,如果校验失败,请检查Cookies是否按照格式输入。
|
||||||
|
|
||||||
5、进入机器人在的群聊,即可正常使用本插件。
|
5、进入机器人在的群聊,即可正常使用本插件。
|
||||||
|
|
||||||
## 更新记录
|
## 更新记录
|
||||||
|
|
||||||
|
####2021-10-17
|
||||||
|
|
||||||
|
**重要:目前Cookies池采用了新的方式,如果你是之前版本的使用者,请在更新后使用群聊命令:迁移Cookies,无损迁移旧版本全部Cookies**
|
||||||
|
|
||||||
|
新增:奇馈宝箱的支持,以及新UI的调整。
|
||||||
|
|
||||||
|
新增:绑定Cookies可以实现基于当前绑定uid信息的树脂查询,以及推送,具体使用可以前往[指令](#指令)处查阅。
|
||||||
|
|
||||||
|
新增:可以查询深渊总览信息(beta),具体使用可以前往[指令](#指令)处查阅。
|
||||||
|
|
||||||
|
新增:可以群内@某人查询(角色信息、深渊总览、深渊固定层数),具体使用可以前往[指令](#指令)处查阅。
|
||||||
|
|
||||||
|
优化:更换了背景图,更新了readme的指令表格。
|
||||||
|
|
||||||
|
优化:支持群内命令:校验全部Cookies,以此判断是否Cookies池有失效CK。
|
||||||
|
|
||||||
|
修复:在查询深渊时背景图片无法正确缩放的问题。
|
||||||
|
|
||||||
|
修复:极少数情况下,查询功能失效的实例(先uid查询后mys查询)。
|
||||||
|
|
||||||
#### 2021-9-27
|
#### 2021-9-27
|
||||||
|
|
||||||
新增:Cookies次数防浪费机制(查过的mysid/uid会锁定使用过的cookies,当天再查时会使用同样的cookies防止次数浪费,每日零点清空。)
|
新增:Cookies次数防浪费机制(查过的mysid/uid会锁定使用过的cookies,当天再查时会使用同样的cookies防止次数浪费,每日零点清空。)
|
||||||
@ -80,16 +102,10 @@ $ pip3 install -r requirements.txt
|
|||||||
|
|
||||||
uid命令现在可以根据角色数量自动设定长宽,并且自定义背景仍然适用!并且添加了角色当前携带的武器ui界面。
|
uid命令现在可以根据角色数量自动设定长宽,并且自定义背景仍然适用!并且添加了角色当前携带的武器ui界面。
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
UID命令在uid命令的基础上删除了武器的ui界面。
|
UID命令在uid命令的基础上删除了武器的ui界面。
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
添加了深渊查询,指令:uidxxxxxx深渊xx,例如uid123456789深渊12,只能查指定楼层(beta)
|
添加了深渊查询,指令:uidxxxxxx深渊xx,例如uid123456789深渊12,只能查指定楼层(beta)
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
删除角色命令。
|
删除角色命令。
|
||||||
|
|
||||||
#### 2021-8-14
|
#### 2021-8-14
|
||||||
@ -130,37 +146,39 @@ $ pip3 install -r requirements.txt
|
|||||||
|
|
||||||
## 指令
|
## 指令
|
||||||
|
|
||||||
1、仅私聊状态下生效,触发词添加 后跟cookies即可添加Cookies(添加两字后需要带空格)
|
(**括号内为可选词缀**,以下所有可以输出图片的,**命令后跟图可自定义背景图片**):
|
||||||
|
|
||||||

|
| 触发前缀 | 触发后缀/备注 | 效果 | 举例 | 备注 |
|
||||||
|
| :--------------------- | ---------------------- | ---------------------------------- | ------------------ | ---------------------------------------- |
|
||||||
|
| uid | | 获取角色信息一览(带武器信息) | uid123456789 | |
|
||||||
|
| uid | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | uid123456789深渊 | |
|
||||||
|
| uid | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | uid123456789深渊12 | |
|
||||||
|
| mys | | 角色信息(带武器信息,冒险等级) | mys123456 | 米游社通行证 |
|
||||||
|
| mys | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | mys123456深渊 | 米游社通行证 |
|
||||||
|
| mys | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | mys123456深渊12 | 米游社通行证 |
|
||||||
|
| UID | | 获取角色信息一览(不带武器信息) | UID123456789 | 旧版本,比例更和谐 |
|
||||||
|
| 绑定uid | | 当前qq号关联绑定uid | 绑定uid123456789 | 查询前缀前置条件 |
|
||||||
|
| 绑定mys | | 当前qq号关联绑定米游社通行证 | 绑定mys12345678 | 查询前缀前置条件 |
|
||||||
|
| 查询 | | 查询当前绑定角色信息一览 | 查询 | **必须**绑定过mys/uid |
|
||||||
|
| 查询(上期)深渊 | | 查询当前绑定角色深渊总览 | 查询深渊 | **必须**绑定过mys/uid |
|
||||||
|
| 查询(上期)深渊\d | | 查询当前绑定角色深渊某一层数据 | 查询深渊10 | **必须**绑定过mys/uid |
|
||||||
|
| 添加 | | 向cookies池添加cookies | 添加 _ga=balabala | **私聊**bot,注意空格 |
|
||||||
|
| 查询 @人 | | 获取@的群友的角色信息一览 | 查询 @Wuyi | |
|
||||||
|
| 查询(上期)深渊 @人 | | 获取@的群友的深渊信息一览 | 查询深渊 @Wuyi | |
|
||||||
|
| 查询(上期)深渊\d @人 | | 获取@的群友的深渊某一层数据 | 查询深渊10 @Wuyi | |
|
||||||
|
| 当前状态 | | 获取树脂、每日委托、派遣等信息 | 当前状态 | **必须**绑定过CK和uid |
|
||||||
|
| 开启推送 | | 开启推送,超过140树脂提醒旅行者 | 开启推送 | 群聊/私聊都可<br />**必须**绑定过CK和uid |
|
||||||
|
| 关闭推送 | | 关闭树脂快满的提醒 | 关闭推送 | 都可以 |
|
||||||
|
| 校验全部Cookies | | 校验当前池内全部Cookies状态 | 校验全部Cookies | **群聊** |
|
||||||
|
| 迁移Cookies | | 迁移旧版本全部Cookies | 迁移Cookies | **群聊** |
|
||||||
|
|
||||||
2、群聊状态下生效,绑定uid/绑定mys后跟uid/mysid即可完成绑定
|
###深渊查询:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
3、群聊状态下生效,而且必须绑定过uid/mysid才可生效,输出查询可以获取角色图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
4、群聊状态下生效,而且必须绑定过uid/mysid才可生效,输出查询深渊xx可以获取当期深渊层数图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
5、群聊状态下生效,触发词uid后面跟九位uid即可/触发词mys后面跟米游社通行证即可。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
6、群聊状态下生效,mysid/uid后跟相应数字后跟深渊后跟相应层数即可。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
7、以上所有可输出图片的触发词后跟一张任意大小的图片(不能是GIF),可以自定义背景
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
###当前状态:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 相关仓库
|
## 相关仓库
|
||||||
|
|
||||||
|
273
__init__.py
@ -1,32 +1,17 @@
|
|||||||
import re
|
from .getImg import draw_pic,draw_abyss_pic,draw_abyss0_pic
|
||||||
|
from .getDB import connectDB,selectDB,cookiesDB,cacheDB,deletecache,CheckDB,TransDB,OpenPush,GetMysInfo,GetDaily
|
||||||
#from nonebot import on_command
|
|
||||||
#from nonebot.adapters.cqhttp import Event, Bot, Message
|
|
||||||
|
|
||||||
from .getImg import draw_pic,draw_abyss_pic
|
|
||||||
from .getData import GetMysInfo
|
|
||||||
from .getDB import connectDB,selectDB,cookiesDB,cacheDB,deletecache
|
|
||||||
|
|
||||||
from nonebot import *
|
from nonebot import *
|
||||||
import json
|
|
||||||
from random import randint
|
|
||||||
import requests,random,os,json,re
|
|
||||||
from hoshino import Service,R,priv,util
|
from hoshino import Service,R,priv,util
|
||||||
from hoshino.typing import MessageSegment,CQEvent, HoshinoBot
|
from hoshino.typing import MessageSegment,CQEvent, HoshinoBot
|
||||||
from hoshino.util import FreqLimiter,pic2b64
|
|
||||||
|
import requests,random,os,json,re,time,datetime,string,base64
|
||||||
|
|
||||||
import hoshino
|
import hoshino
|
||||||
import asyncio
|
import asyncio
|
||||||
import time
|
|
||||||
import datetime
|
|
||||||
import string
|
|
||||||
import random
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import requests
|
import sqlite3
|
||||||
import os
|
|
||||||
from PIL import Image,ImageFont,ImageDraw
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
import base64
|
|
||||||
|
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
sv = Service('genshinuid')
|
sv = Service('genshinuid')
|
||||||
@ -41,16 +26,176 @@ Texture_PATH = os.path.join(FILE2_PATH,'texture2d')
|
|||||||
async def delete():
|
async def delete():
|
||||||
deletecache()
|
deletecache()
|
||||||
|
|
||||||
|
@sv.scheduled_job('interval', minutes=30)
|
||||||
|
async def push():
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
cursor = c.execute("SELECT * FROM NewCookies WHERE StatusA != ?",("off",))
|
||||||
|
c_data = cursor.fetchall()
|
||||||
|
for row in c_data:
|
||||||
|
raw_data = await GetDaily(str(row[1]))
|
||||||
|
dailydata = raw_data["data"]
|
||||||
|
resin_num = dailydata["current_resin"]
|
||||||
|
if resin_num >= row[5]:
|
||||||
|
re_time = dailydata["resin_recovery_time"]
|
||||||
|
m, s = divmod(int(re_time), 60)
|
||||||
|
h, m = divmod(m, 60)
|
||||||
|
time = "%02d小时%02d分钟%02d秒" % (h, m, s)
|
||||||
|
|
||||||
|
task_num = dailydata["finished_task_num"]
|
||||||
|
travel_num = dailydata["current_expedition_num"]
|
||||||
|
max_travel_num = dailydata["max_expedition_num"]
|
||||||
|
travel_data = dailydata["expeditions"]
|
||||||
|
|
||||||
|
travel_str = ''
|
||||||
|
|
||||||
|
for i in travel_data:
|
||||||
|
name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1]
|
||||||
|
statu = i['status']
|
||||||
|
if statu == "Finished":
|
||||||
|
travel_str = travel_str + f"{name} : 完成\n"
|
||||||
|
else:
|
||||||
|
remain_time = i['remained_time']
|
||||||
|
m1, s1 = divmod(int(remain_time), 60)
|
||||||
|
h1, m1 = divmod(m1, 60)
|
||||||
|
remain_time_str = "还剩%02d小时%02d分钟%02d秒" % (h1, m1, s1)
|
||||||
|
travel_str = travel_str + f"{name} : {remain_time_str}\n"
|
||||||
|
im = f'''
|
||||||
|
==============
|
||||||
|
你的树脂快满了!!!
|
||||||
|
(还剩{time}补充满)
|
||||||
|
==============
|
||||||
|
原粹树脂:{resin_num}/160
|
||||||
|
每日委托:{task_num}/4
|
||||||
|
探索派遣:{travel_num}/{max_travel_num}
|
||||||
|
========
|
||||||
|
{travel_str}
|
||||||
|
'''.strip()
|
||||||
|
|
||||||
|
if row[2] == "on":
|
||||||
|
await bot.send_private_msg(user_id = row[4],message = im)
|
||||||
|
else:
|
||||||
|
await bot.send_group_msg(group_id = row[2],message = f"[CQ:at,qq={row[4]}]" + "\n" + im)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
@bot.on_message('private')
|
@bot.on_message('private')
|
||||||
async def setting(ctx):
|
async def setting(ctx):
|
||||||
message = ctx['raw_message']
|
message = ctx['raw_message']
|
||||||
sid=int(ctx["self_id"])
|
sid=int(ctx["self_id"])
|
||||||
uid=int(ctx["sender"]["user_id"])
|
userid=int(ctx["sender"]["user_id"])
|
||||||
gid=0
|
gid=0
|
||||||
if '添加 ' in message:
|
if '添加 ' in message:
|
||||||
mes = message.replace('添加 ','')
|
try:
|
||||||
await cookiesDB(mes)
|
mes = message.replace('添加 ','')
|
||||||
await bot.send_msg(self_id=sid, user_id=uid, group_id=gid, message=f'添加cookies成功!')
|
ltuid = re.search(r"ltuid=(\d*)", mes)
|
||||||
|
mysid_data = ltuid.group(0).split('=')
|
||||||
|
mysid = mysid_data[1]
|
||||||
|
|
||||||
|
mys_data = await GetMysInfo(mysid,mes)
|
||||||
|
mys_data = mys_data[0]
|
||||||
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
|
|
||||||
|
await cookiesDB(uid,mes)
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'添加Cookies成功!Cookies属于个人重要信息,如果你是在不知情的情况下添加,请马上修改米游社账户密码,保护个人隐私!')
|
||||||
|
except:
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'校验失败!')
|
||||||
|
elif '开启推送' in message:
|
||||||
|
try:
|
||||||
|
uid = await selectDB(userid,mode = "uid")
|
||||||
|
im = await OpenPush(int(uid[0]),userid,"on")
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
|
||||||
|
except:
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
|
||||||
|
elif '关闭推送' in message:
|
||||||
|
try:
|
||||||
|
uid = await selectDB(userid,mode = "uid")
|
||||||
|
im = await OpenPush(int(uid[0]),userid,"off")
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
|
||||||
|
except:
|
||||||
|
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
|
||||||
|
|
||||||
|
@sv.on_fullmatch('开启推送')
|
||||||
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
|
try:
|
||||||
|
gid = ev.group_id
|
||||||
|
qid = ev.sender["user_id"]
|
||||||
|
uid = await selectDB(ev.sender['user_id'],mode = "uid")
|
||||||
|
im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid))
|
||||||
|
await bot.send(ev,im,at_sender=True)
|
||||||
|
except:
|
||||||
|
await bot.send(ev,"未绑定uid信息!",at_sender=True)
|
||||||
|
|
||||||
|
@sv.on_fullmatch('关闭推送')
|
||||||
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
|
try:
|
||||||
|
gid = ev.group_id
|
||||||
|
qid = ev.sender["user_id"]
|
||||||
|
uid = await selectDB(ev.sender['user_id'],mode = "uid")
|
||||||
|
im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off")
|
||||||
|
await bot.send(ev,im,at_sender=True)
|
||||||
|
except:
|
||||||
|
await bot.send(ev,"未绑定uid信息!",at_sender=True)
|
||||||
|
|
||||||
|
@sv.on_fullmatch('校验全部Cookies')
|
||||||
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
|
im = await CheckDB()
|
||||||
|
await bot.send(ev,im)
|
||||||
|
|
||||||
|
@sv.on_fullmatch('迁移Cookies')
|
||||||
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
|
im = await TransDB()
|
||||||
|
await bot.send(ev,im)
|
||||||
|
|
||||||
|
@sv.on_fullmatch('当前状态')
|
||||||
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
|
try:
|
||||||
|
uid = await selectDB(ev.sender['user_id'],mode = "uid")
|
||||||
|
uid = uid[0]
|
||||||
|
raw_data = await GetDaily(uid)
|
||||||
|
dailydata = raw_data["data"]
|
||||||
|
resin_num = dailydata["current_resin"]
|
||||||
|
re_time = dailydata["resin_recovery_time"]
|
||||||
|
m, s = divmod(int(re_time), 60)
|
||||||
|
h, m = divmod(m, 60)
|
||||||
|
time = "%02d小时%02d分钟%02d秒" % (h, m, s)
|
||||||
|
|
||||||
|
task_num = dailydata["finished_task_num"]
|
||||||
|
travel_num = dailydata["current_expedition_num"]
|
||||||
|
max_travel_num = dailydata["max_expedition_num"]
|
||||||
|
travel_data = dailydata["expeditions"]
|
||||||
|
|
||||||
|
travel_str = ''
|
||||||
|
|
||||||
|
for i in travel_data:
|
||||||
|
name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1]
|
||||||
|
statu = i['status']
|
||||||
|
if statu == "Finished":
|
||||||
|
travel_str = travel_str + f"{name} : 完成\n"
|
||||||
|
else:
|
||||||
|
remain_time = i['remained_time']
|
||||||
|
m1, s1 = divmod(int(remain_time), 60)
|
||||||
|
h1, m1 = divmod(m1, 60)
|
||||||
|
remain_time_str = "还剩%02d小时%02d分钟%02d秒" % (h1, m1, s1)
|
||||||
|
travel_str = travel_str + f"{name} : {remain_time_str}\n"
|
||||||
|
|
||||||
|
im = f'''
|
||||||
|
:
|
||||||
|
==============
|
||||||
|
(还剩{time}补充满)
|
||||||
|
==============
|
||||||
|
原粹树脂:{resin_num}/160
|
||||||
|
每日委托:{task_num}/4
|
||||||
|
探索派遣:{travel_num}/{max_travel_num}
|
||||||
|
========
|
||||||
|
{travel_str}
|
||||||
|
'''.strip()
|
||||||
|
|
||||||
|
except:
|
||||||
|
im = "没有找到绑定信息。"
|
||||||
|
|
||||||
|
await bot.send(ev,im, at_sender=True)
|
||||||
|
|
||||||
|
|
||||||
@sv.on_prefix('uid')
|
@sv.on_prefix('uid')
|
||||||
async def _(bot:HoshinoBot, ev: CQEvent):
|
async def _(bot:HoshinoBot, ev: CQEvent):
|
||||||
@ -60,11 +205,26 @@ async def _(bot:HoshinoBot, ev: CQEvent):
|
|||||||
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
||||||
if m == "深渊":
|
if m == "深渊":
|
||||||
try:
|
try:
|
||||||
floor_num = re.findall(r"\d+", message)[1]
|
if len(re.findall(r"\d+", message)) == 2:
|
||||||
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image)
|
floor_num = re.findall(r"\d+", message)[1]
|
||||||
await bot.send(ev, im, at_sender=True)
|
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image)
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image)
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
except:
|
except:
|
||||||
await bot.send(ev,'深渊输入错误!')
|
await bot.send(ev,'深渊输入错误!')
|
||||||
|
elif m == "上期深渊":
|
||||||
|
try:
|
||||||
|
if len(re.findall(r"\d+", message)) == 2:
|
||||||
|
floor_num = re.findall(r"\d+", message)[1]
|
||||||
|
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,2,"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,2,"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
except:
|
||||||
|
await bot.send(ev,'深渊输入错误!')
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
im = await draw_pic(uid,ev.sender['nickname'],image,2)
|
im = await draw_pic(uid,ev.sender['nickname'],image,2)
|
||||||
@ -87,22 +247,46 @@ async def _(bot:HoshinoBot, ev: CQEvent):
|
|||||||
await bot.send(ev,'绑定米游社id成功!', at_sender=True)
|
await bot.send(ev,'绑定米游社id成功!', at_sender=True)
|
||||||
|
|
||||||
@sv.on_prefix('查询')
|
@sv.on_prefix('查询')
|
||||||
async def _(bot:HoshinoBot, ev: CQEvent):
|
async def _(bot, ev):
|
||||||
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
|
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
|
||||||
|
at = re.search(r"\[CQ:at,qq=(\d*)\]", str(ev.raw_message.strip()))
|
||||||
message = ev.message.extract_plain_text()
|
message = ev.message.extract_plain_text()
|
||||||
uid = await selectDB(ev.sender['user_id'])
|
if at:
|
||||||
|
qid = at.group(1)
|
||||||
|
mi =await bot.get_group_member_info(group_id=ev.group_id, user_id=qid)
|
||||||
|
nickname = mi["nickname"]
|
||||||
|
uid = await selectDB(qid)
|
||||||
|
else:
|
||||||
|
nickname = ev.sender['nickname']
|
||||||
|
uid = await selectDB(ev.sender['user_id'])
|
||||||
|
|
||||||
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
||||||
if uid:
|
if uid:
|
||||||
if m == "深渊":
|
if m == "深渊":
|
||||||
try:
|
try:
|
||||||
floor_num = re.findall(r"\d+", message)[0]
|
if len(re.findall(r"\d+", message)) == 1:
|
||||||
im = await draw_abyss_pic(uid[0],ev.sender['nickname'],floor_num,image,uid[1])
|
floor_num = re.findall(r"\d+", message)[0]
|
||||||
await bot.send(ev, im, at_sender=True)
|
im = await draw_abyss_pic(uid[0],nickname,floor_num,image,uid[1])
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid[0],nickname,image,uid[1])
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
except:
|
except:
|
||||||
await bot.send(ev,'输入错误!')
|
await bot.send(ev,'输入错误!')
|
||||||
|
elif m == "上期深渊":
|
||||||
|
try:
|
||||||
|
if len(re.findall(r"\d+", message)) == 1:
|
||||||
|
floor_num = re.findall(r"\d+", message)[0]
|
||||||
|
im = await draw_abyss_pic(uid[0],nickname,floor_num,image,uid[1],"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid[0],nickname,image,uid[1],"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
except:
|
||||||
|
await bot.send(ev,'深渊输入错误!')
|
||||||
elif m == "":
|
elif m == "":
|
||||||
try:
|
try:
|
||||||
bg = await draw_pic(uid[0],ev.sender['nickname'],image,uid[1])
|
bg = await draw_pic(uid[0],nickname,image,uid[1])
|
||||||
await bot.send(ev, bg, at_sender=True)
|
await bot.send(ev, bg, at_sender=True)
|
||||||
except:
|
except:
|
||||||
await bot.send(ev,'输入错误!')
|
await bot.send(ev,'输入错误!')
|
||||||
@ -120,11 +304,26 @@ async def _(bot:HoshinoBot, ev: CQEvent):
|
|||||||
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
|
||||||
if m == "深渊":
|
if m == "深渊":
|
||||||
try:
|
try:
|
||||||
floor_num = re.findall(r"\d+", message)[1]
|
if len(re.findall(r"\d+", message)) == 2:
|
||||||
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,3)
|
floor_num = re.findall(r"\d+", message)[1]
|
||||||
await bot.send(ev, im, at_sender=True)
|
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,3)
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,3)
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
except:
|
except:
|
||||||
await bot.send(ev,'深渊输入错误!')
|
await bot.send(ev,'深渊输入错误!')
|
||||||
|
elif m == "上期深渊":
|
||||||
|
try:
|
||||||
|
if len(re.findall(r"\d+", message)) == 1:
|
||||||
|
floor_num = re.findall(r"\d+", message)[0]
|
||||||
|
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,3,"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
else:
|
||||||
|
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,3,"2")
|
||||||
|
await bot.send(ev, im, at_sender=True)
|
||||||
|
except:
|
||||||
|
await bot.send(ev,'深渊输入错误!')
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
im = await draw_pic(uid,ev.sender['nickname'],image,3)
|
im = await draw_pic(uid,ev.sender['nickname'],image,3)
|
||||||
|
290
getDB.py
@ -1,11 +1,98 @@
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import os
|
import sys
|
||||||
import yaml
|
|
||||||
import random
|
from httpx import AsyncClient
|
||||||
|
|
||||||
|
from nonebot import *
|
||||||
|
import requests,random,os,json,re
|
||||||
|
import hoshino
|
||||||
|
import asyncio
|
||||||
|
import time
|
||||||
|
import string
|
||||||
|
import hashlib
|
||||||
|
import base64
|
||||||
|
|
||||||
|
mhyVersion = "2.11.1"
|
||||||
|
|
||||||
FILE_PATH = os.path.abspath(os.path.join(os.getcwd(), "hoshino"))
|
FILE_PATH = os.path.abspath(os.path.join(os.getcwd(), "hoshino"))
|
||||||
DATA_PATH = os.path.join(FILE_PATH,'config')
|
DATA_PATH = os.path.join(FILE_PATH,'config')
|
||||||
|
|
||||||
|
async def OpenPush(uid,qid,status):
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
cursor = c.execute("SELECT * from NewCookies WHERE UID = ?",(uid,))
|
||||||
|
c_data = cursor.fetchall()
|
||||||
|
if len(c_data) != 0:
|
||||||
|
try:
|
||||||
|
c.execute("UPDATE NewCookies SET StatusA = ?,QID = ? WHERE UID=?",(status,qid,uid))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return "成功!"
|
||||||
|
except:
|
||||||
|
return "未找到Ck绑定记录。"
|
||||||
|
else:
|
||||||
|
return "未找到Ck绑定记录。"
|
||||||
|
|
||||||
|
async def CheckDB():
|
||||||
|
str = ''
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
cursor = c.execute("SELECT Cookies,UID from NewCookies")
|
||||||
|
for row in cursor:
|
||||||
|
try:
|
||||||
|
ltuid = re.search(r"ltuid=(\d*)", row[0])
|
||||||
|
mysid_data = ltuid.group(0).split('=')
|
||||||
|
mysid = mysid_data[1]
|
||||||
|
|
||||||
|
mys_data = await GetMysInfo(mysid,row[0])
|
||||||
|
mys_data = mys_data[0]
|
||||||
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
|
|
||||||
|
str = str + f"uid{row[1]}/mysid{mysid}的Cookies是正常的!\n"
|
||||||
|
except:
|
||||||
|
str = str + f"uid{row[1]}/mysid{mysid}的Cookies是异常的!已删除该条Cookies!\n"
|
||||||
|
c.execute("DELETE from NewCookies where UID=?",(row[1],))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return str
|
||||||
|
|
||||||
|
async def TransDB():
|
||||||
|
str = ''
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
test = c.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'CookiesTable'")
|
||||||
|
if test == 0:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return "你没有需要迁移的数据库。"
|
||||||
|
else:
|
||||||
|
c.execute('''CREATE TABLE IF NOT EXISTS NewCookies
|
||||||
|
(Cookies TEXT PRIMARY KEY NOT NULL,
|
||||||
|
UID INT,
|
||||||
|
StatusA TEXT,
|
||||||
|
StatusB TEXT,
|
||||||
|
QID INT,
|
||||||
|
NUM INT,
|
||||||
|
Extra TEXT);''')
|
||||||
|
cursor = c.execute("SELECT * from CookiesTable")
|
||||||
|
c_data = cursor.fetchall()
|
||||||
|
for row in c_data:
|
||||||
|
try:
|
||||||
|
ltuid = re.search(r"ltuid=(\d*)", row[0])
|
||||||
|
mysid_data = ltuid.group(0).split('=')
|
||||||
|
mysid = mysid_data[1]
|
||||||
|
mys_data = await GetMysInfo(mysid,row[0])
|
||||||
|
mys_data = mys_data[0]
|
||||||
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
|
c.execute("INSERT OR IGNORE INTO NewCookies (Cookies,UID,StatusA,StatusB,NUM) \
|
||||||
|
VALUES (?, ?,?,?,?)",(row[0],uid,"off","off",140))
|
||||||
|
str = str + f"uid{uid}/mysid{mysid}的Cookies已转移成功!\n"
|
||||||
|
except:
|
||||||
|
str = str + f"uid{uid}/mysid{mysid}的Cookies是异常的!已删除该条Cookies!\n"
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return str
|
||||||
|
|
||||||
async def connectDB(userid,uid = None,mys = None):
|
async def connectDB(userid,uid = None,mys = None):
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
@ -25,20 +112,25 @@ async def connectDB(userid,uid = None,mys = None):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
async def selectDB(userid):
|
async def selectDB(userid,mode = "auto"):
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
cursor = c.execute("SELECT * FROM UIDDATA WHERE USERID = ?",(userid,))
|
cursor = c.execute("SELECT * FROM UIDDATA WHERE USERID = ?",(userid,))
|
||||||
for row in cursor:
|
for row in cursor:
|
||||||
if row[0]:
|
if mode == "auto":
|
||||||
if row[2]:
|
if row[0]:
|
||||||
return [row[2],3]
|
if row[2]:
|
||||||
elif row[1]:
|
return [row[2],3]
|
||||||
return [row[1],2]
|
elif row[1]:
|
||||||
|
return [row[1],2]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
else:
|
elif mode == "uid":
|
||||||
return None
|
return [row[1],2]
|
||||||
|
elif mode == "mys":
|
||||||
|
return [row[2],3]
|
||||||
|
|
||||||
def deletecache():
|
def deletecache():
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
@ -68,9 +160,7 @@ async def cacheDB(uid,mode = 1,mys = None):
|
|||||||
c_data = cursor.fetchall()
|
c_data = cursor.fetchall()
|
||||||
|
|
||||||
if len(c_data)==0:
|
if len(c_data)==0:
|
||||||
cookiesrow = c.execute("SELECT * FROM CookiesTable ORDER BY RANDOM() limit 1")
|
cookiesrow = c.execute("SELECT * FROM NewCookies ORDER BY RANDOM() limit 1")
|
||||||
#r = cookiesrow.fetchall()
|
|
||||||
#random.randint(0,len(r))
|
|
||||||
for row2 in cookiesrow:
|
for row2 in cookiesrow:
|
||||||
if mode == 1:
|
if mode == 1:
|
||||||
c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \
|
c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \
|
||||||
@ -82,20 +172,180 @@ async def cacheDB(uid,mode = 1,mys = None):
|
|||||||
else:
|
else:
|
||||||
use = c_data[0][2]
|
use = c_data[0][2]
|
||||||
if mys:
|
if mys:
|
||||||
c.execute("UPDATE CookiesCache SET UID = ? WHERE MYSID=?",(uid,mys))
|
try:
|
||||||
|
c.execute("UPDATE CookiesCache SET UID = ? WHERE MYSID=?",(uid,mys))
|
||||||
|
except:
|
||||||
|
c.execute("UPDATE CookiesCache SET MYSID = ? WHERE UID=?",(mys,uid))
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
return use
|
return use
|
||||||
|
|
||||||
async def cookiesDB(Cookies):
|
async def cookiesDB(uid,Cookies):
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS CookiesTable
|
|
||||||
(Cookies TEXT PRIMARY KEY NOT NULL);''')
|
|
||||||
|
|
||||||
c.execute("INSERT OR IGNORE INTO CookiesTable (Cookies) \
|
c.execute('''CREATE TABLE IF NOT EXISTS NewCookies
|
||||||
VALUES (?)",(Cookies,))
|
(Cookies TEXT PRIMARY KEY NOT NULL,
|
||||||
|
UID INT,
|
||||||
|
StatusA TEXT,
|
||||||
|
StatusB TEXT,
|
||||||
|
QID INT,
|
||||||
|
NUM INT,
|
||||||
|
Extra TEXT);''')
|
||||||
|
|
||||||
|
c.execute("INSERT OR IGNORE INTO NewCookies (Cookies,UID,StatusA,StatusB,NUM) \
|
||||||
|
VALUES (?, ?,?,?,?)",(Cookies,uid,"off","off",140))
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
async def OwnerCookies(uid):
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
|
||||||
|
try:
|
||||||
|
cursor = c.execute("SELECT * FROM NewCookies WHERE UID = ?",(uid,))
|
||||||
|
c_data = cursor.fetchall()
|
||||||
|
cookies = c_data[0][0]
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
|
||||||
|
return cookies
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def md5(text):
|
||||||
|
md5 = hashlib.md5()
|
||||||
|
md5.update(text.encode())
|
||||||
|
return md5.hexdigest()
|
||||||
|
|
||||||
|
def DSGet(q = "",b = None):
|
||||||
|
if b:
|
||||||
|
br = json.dumps(b)
|
||||||
|
else:
|
||||||
|
br = ""
|
||||||
|
s = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs"
|
||||||
|
t = str(int(time.time()))
|
||||||
|
r = str(random.randint(100000, 200000))
|
||||||
|
c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q)
|
||||||
|
return t + "," + r + "," + c
|
||||||
|
|
||||||
|
async def GetDaily(Uid,ServerID="cn_gf01"):
|
||||||
|
if Uid[0] == '5':
|
||||||
|
ServerID = "cn_qd01"
|
||||||
|
try:
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(
|
||||||
|
url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/dailyNote?server=" + ServerID + "&role_id=" + Uid,
|
||||||
|
headers={
|
||||||
|
'DS': DSGet("role_id=" + Uid + "&server=" + ServerID),
|
||||||
|
'x-rpc-app_version': mhyVersion,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
||||||
|
'x-rpc-client_type': '5',
|
||||||
|
'Referer': 'https://webstatic.mihoyo.com/',
|
||||||
|
"Cookie": await OwnerCookies(Uid)})
|
||||||
|
data = json.loads(req.text)
|
||||||
|
return data
|
||||||
|
except:
|
||||||
|
print("访问失败,请重试!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
async def GetInfo(Uid,ServerID="cn_gf01",Schedule_type="1",mysid = None):
|
||||||
|
if Uid[0] == '5':
|
||||||
|
ServerID = "cn_qd01"
|
||||||
|
try:
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(
|
||||||
|
url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/index?role_id=" + Uid + "&server=" + ServerID,
|
||||||
|
headers={
|
||||||
|
'DS': DSGet("role_id=" + Uid + "&server=" + ServerID),
|
||||||
|
'x-rpc-app_version': mhyVersion,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
||||||
|
'x-rpc-client_type': '5',
|
||||||
|
'Referer': 'https://webstatic.mihoyo.com/',
|
||||||
|
"Cookie": await cacheDB(Uid,1,mysid)})
|
||||||
|
data = json.loads(req.text)
|
||||||
|
return data
|
||||||
|
except:
|
||||||
|
print("访问失败,请重试!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
async def GetSpiralAbyssInfo(Uid, ServerID="cn_gf01",Schedule_type="1",mysid = None):
|
||||||
|
if Uid[0] == '5':
|
||||||
|
ServerID = "cn_qd01"
|
||||||
|
try:
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(
|
||||||
|
url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/spiralAbyss?schedule_type=" + Schedule_type + "&server="+ ServerID +"&role_id=" + Uid,
|
||||||
|
headers={
|
||||||
|
'DS': DSGet("role_id=" + Uid + "&schedule_type=" + Schedule_type + "&server="+ ServerID),
|
||||||
|
'Origin': 'https://webstatic.mihoyo.com',
|
||||||
|
'Cookie': await cacheDB(Uid,1,mysid),
|
||||||
|
'x-rpc-app_version': mhyVersion,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
||||||
|
'x-rpc-client_type': '5',
|
||||||
|
'Referer': 'https://webstatic.mihoyo.com/'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
data = json.loads(req.text)
|
||||||
|
return data
|
||||||
|
except:
|
||||||
|
print("1访问失败,请重试!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
async def GetCharacter(Uid,Character_ids, ServerID="cn_gf01",mysid = None):
|
||||||
|
if Uid[0] == '5':
|
||||||
|
ServerID = "cn_qd01"
|
||||||
|
try:
|
||||||
|
req = requests.post(
|
||||||
|
url = "https://api-takumi.mihoyo.com/game_record/app/genshin/api/character",
|
||||||
|
headers={
|
||||||
|
'DS': DSGet('',{"character_ids": Character_ids ,"role_id": Uid ,"server": ServerID}),
|
||||||
|
'Origin': 'https://webstatic.mihoyo.com',
|
||||||
|
'Cookie': await cacheDB(Uid,1,mysid),
|
||||||
|
'x-rpc-app_version': mhyVersion,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
||||||
|
'x-rpc-client_type': '5',
|
||||||
|
'Referer': 'https://webstatic.mihoyo.com/'
|
||||||
|
},
|
||||||
|
json = {"character_ids": Character_ids ,"role_id": Uid ,"server": ServerID}
|
||||||
|
)
|
||||||
|
data2 = json.loads(req.text)
|
||||||
|
return data2
|
||||||
|
except:
|
||||||
|
print("访问失败,请重试!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
async def GetMysInfo(mysid,cookies = None):
|
||||||
|
if cookies:
|
||||||
|
ck = cookies
|
||||||
|
else:
|
||||||
|
ck = await cacheDB(mysid,2)
|
||||||
|
try:
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(
|
||||||
|
url="https://api-takumi.mihoyo.com/game_record/card/wapi/getGameRecordCard?uid=" + mysid,
|
||||||
|
headers={
|
||||||
|
'DS': DSGet("uid="+mysid),
|
||||||
|
'x-rpc-app_version': mhyVersion,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
||||||
|
'x-rpc-client_type': '5',
|
||||||
|
'Referer': 'https://webstatic.mihoyo.com/',
|
||||||
|
"Cookie": ck})
|
||||||
|
data = json.loads(req.text)
|
||||||
|
return [data,mysid]
|
||||||
|
except:
|
||||||
|
print ("访问失败,请重试!")
|
||||||
|
#sys.exit (1)
|
||||||
|
return
|
151
getData.py
@ -1,151 +0,0 @@
|
|||||||
# https://github.com/Womsxd/YuanShen_User_Info
|
|
||||||
#import hashlib
|
|
||||||
#import json
|
|
||||||
#import random
|
|
||||||
#import string
|
|
||||||
import sys
|
|
||||||
#import time
|
|
||||||
|
|
||||||
from httpx import AsyncClient
|
|
||||||
|
|
||||||
from .getDB import cookiesDB,cacheDB
|
|
||||||
|
|
||||||
from nonebot import *
|
|
||||||
import json
|
|
||||||
from random import randint
|
|
||||||
import requests,random,os,json,re
|
|
||||||
from hoshino import Service,R,priv,util
|
|
||||||
from hoshino.typing import MessageSegment,CQEvent, HoshinoBot
|
|
||||||
from hoshino.util import FreqLimiter,pic2b64
|
|
||||||
import hoshino
|
|
||||||
import asyncio
|
|
||||||
import time
|
|
||||||
import string
|
|
||||||
import random
|
|
||||||
import hashlib
|
|
||||||
import requests
|
|
||||||
import os
|
|
||||||
from PIL import Image,ImageFont,ImageDraw
|
|
||||||
from io import BytesIO
|
|
||||||
import base64
|
|
||||||
|
|
||||||
mhyVersion = "2.11.1"
|
|
||||||
|
|
||||||
def md5(text):
|
|
||||||
md5 = hashlib.md5()
|
|
||||||
md5.update(text.encode())
|
|
||||||
return md5.hexdigest()
|
|
||||||
|
|
||||||
def DSGet(q = "",b = None):
|
|
||||||
if b:
|
|
||||||
br = json.dumps(b)
|
|
||||||
else:
|
|
||||||
br = ""
|
|
||||||
s = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs"
|
|
||||||
t = str(int(time.time()))
|
|
||||||
r = str(random.randint(100000, 200000))
|
|
||||||
c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q)
|
|
||||||
return t + "," + r + "," + c
|
|
||||||
|
|
||||||
async def GetInfo(Uid,ServerID="cn_gf01",Schedule_type="1",mysid = None):
|
|
||||||
if Uid[0] == '5':
|
|
||||||
ServerID = "cn_qd01"
|
|
||||||
try:
|
|
||||||
async with AsyncClient() as client:
|
|
||||||
req = await client.get(
|
|
||||||
url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/index?role_id=" + Uid + "&server=" + ServerID,
|
|
||||||
headers={
|
|
||||||
#'Accept': 'application/json, text/plain, */*',
|
|
||||||
'DS': DSGet("role_id=" + Uid + "&server=" + ServerID),
|
|
||||||
#'Origin': 'https://webstatic.mihoyo.com',
|
|
||||||
'x-rpc-app_version': mhyVersion,
|
|
||||||
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
|
||||||
'x-rpc-client_type': '5',
|
|
||||||
'Referer': 'https://webstatic.mihoyo.com/',
|
|
||||||
#'Accept-Encoding': 'gzip, deflate',
|
|
||||||
#'Accept-Language': 'zh-CN,en-US;q=0.8',
|
|
||||||
#'X-Requested-With': 'com.mihoyo.hyperion',
|
|
||||||
"Cookie": await cacheDB(Uid,1,mysid)})
|
|
||||||
data = json.loads(req.text)
|
|
||||||
return data
|
|
||||||
except:
|
|
||||||
print("访问失败,请重试!")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
async def GetSpiralAbyssInfo(Uid, ServerID="cn_gf01",Schedule_type="1",mysid = None):
|
|
||||||
if Uid[0] == '5':
|
|
||||||
ServerID = "cn_qd01"
|
|
||||||
try:
|
|
||||||
async with AsyncClient() as client:
|
|
||||||
req = await client.get(
|
|
||||||
url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/spiralAbyss?schedule_type=" + Schedule_type + "&server="+ ServerID +"&role_id=" + Uid,
|
|
||||||
headers={
|
|
||||||
'Accept': 'application/json, text/plain, */*',
|
|
||||||
'DS': DSGet("role_id=" + Uid + "&schedule_type=" + Schedule_type + "&server="+ ServerID),
|
|
||||||
'Origin': 'https://webstatic.mihoyo.com',
|
|
||||||
'Cookie': await cacheDB(Uid,1,mysid),
|
|
||||||
'x-rpc-app_version': mhyVersion,
|
|
||||||
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
|
||||||
'x-rpc-client_type': '5',
|
|
||||||
'Referer': 'https://webstatic.mihoyo.com/',
|
|
||||||
'Accept-Encoding': 'gzip, deflate',
|
|
||||||
'Accept-Language': 'zh-CN,en-US;q=0.8',
|
|
||||||
'X-Requested-With': 'com.mihoyo.hyperion'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
data = json.loads(req.text)
|
|
||||||
return data
|
|
||||||
except:
|
|
||||||
print("1访问失败,请重试!")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
async def GetCharacter(Uid,Character_ids, ServerID="cn_gf01",mysid = None):
|
|
||||||
if Uid[0] == '5':
|
|
||||||
ServerID = "cn_qd01"
|
|
||||||
try:
|
|
||||||
req = requests.post(
|
|
||||||
url = "https://api-takumi.mihoyo.com/game_record/app/genshin/api/character",
|
|
||||||
headers={
|
|
||||||
'Accept': 'application/json, text/plain, */*',
|
|
||||||
'DS': DSGet('',{"character_ids": Character_ids ,"role_id": Uid ,"server": ServerID}),
|
|
||||||
'Origin': 'https://webstatic.mihoyo.com',
|
|
||||||
'Cookie': await cacheDB(Uid,1,mysid),
|
|
||||||
'x-rpc-app_version': mhyVersion,
|
|
||||||
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
|
||||||
'x-rpc-client_type': '5',
|
|
||||||
'Referer': 'https://webstatic.mihoyo.com/',
|
|
||||||
'Accept-Encoding': 'gzip, deflate',
|
|
||||||
'Accept-Language': 'zh-CN,en-US;q=0.8',
|
|
||||||
'X-Requested-With': 'com.mihoyo.hyperion'
|
|
||||||
},
|
|
||||||
json = {"character_ids": Character_ids ,"role_id": Uid ,"server": ServerID}
|
|
||||||
)
|
|
||||||
data2 = json.loads(req.text)
|
|
||||||
return data2
|
|
||||||
except:
|
|
||||||
print("访问失败,请重试!")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
async def GetMysInfo(mysid):
|
|
||||||
try:
|
|
||||||
async with AsyncClient() as client:
|
|
||||||
req = await client.get(
|
|
||||||
url="https://api-takumi.mihoyo.com/game_record/card/wapi/getGameRecordCard?uid=" + mysid,
|
|
||||||
headers={
|
|
||||||
#'Accept': 'application/json, text/plain, */*',
|
|
||||||
'DS': DSGet("uid="+mysid),
|
|
||||||
#'Origin': 'https://webstatic.mihoyo.com',
|
|
||||||
'x-rpc-app_version': mhyVersion,
|
|
||||||
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
|
|
||||||
'x-rpc-client_type': '5',
|
|
||||||
'Referer': 'https://webstatic.mihoyo.com/',
|
|
||||||
#'Accept-Encoding': 'gzip, deflate',
|
|
||||||
#'Accept-Language': 'zh-CN,en-US;q=0.8',
|
|
||||||
#'X-Requested-With': 'com.mihoyo.hyperion',
|
|
||||||
"Cookie": await cacheDB(mysid,2)})
|
|
||||||
data = json.loads(req.text)
|
|
||||||
return [data,mysid]
|
|
||||||
except:
|
|
||||||
print ("访问失败,请重试!")
|
|
||||||
return
|
|
465
getImg.py
@ -7,7 +7,7 @@ import math
|
|||||||
|
|
||||||
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
||||||
|
|
||||||
from .getData import GetInfo,GetCharacter,GetSpiralAbyssInfo,GetMysInfo
|
from .getDB import GetInfo,GetCharacter,GetSpiralAbyssInfo,GetMysInfo
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@ -57,14 +57,7 @@ def get_chardone_pic(id,url,star):
|
|||||||
def get_weapon_pic(url):
|
def get_weapon_pic(url):
|
||||||
urllib.request.urlretrieve(url, os.path.join(WEAPON_PATH, url.split('/')[-1]))
|
urllib.request.urlretrieve(url, os.path.join(WEAPON_PATH, url.split('/')[-1]))
|
||||||
|
|
||||||
async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
async def draw_abyss0_pic(uid,nickname,image = None,mode = 2,date = "1"):
|
||||||
is_edit = False
|
|
||||||
if image != None:
|
|
||||||
image_file= image.group(1)
|
|
||||||
image_data = image.group(2)
|
|
||||||
urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png'))
|
|
||||||
is_edit = True
|
|
||||||
|
|
||||||
if mode == 3:
|
if mode == 3:
|
||||||
mys_data = await GetMysInfo(uid)
|
mys_data = await GetMysInfo(uid)
|
||||||
mysid_data = mys_data[1]
|
mysid_data = mys_data[1]
|
||||||
@ -73,11 +66,11 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
nickname = mys_data['data']['list'][0]['nickname']
|
nickname = mys_data['data']['list'][0]['nickname']
|
||||||
#role_region = mys_data['data']['list'][0]['region']
|
#role_region = mys_data['data']['list'][0]['region']
|
||||||
role_level = mys_data['data']['list'][0]['level']
|
role_level = mys_data['data']['list'][0]['level']
|
||||||
raw_data = await GetSpiralAbyssInfo(uid,"cn_gf01","1",mysid_data)
|
raw_data = await GetSpiralAbyssInfo(uid,"cn_gf01",date,mysid_data)
|
||||||
raw_char_data = await GetInfo(uid,"cn_gf01","1",mysid_data)
|
raw_char_data = await GetInfo(uid,"cn_gf01",date,mysid_data)
|
||||||
else:
|
else:
|
||||||
raw_data = await GetSpiralAbyssInfo(uid)
|
raw_data = await GetSpiralAbyssInfo(uid,"cn_gf01",date)
|
||||||
raw_char_data = await GetInfo(uid)
|
raw_char_data = await GetInfo(uid,"cn_gf01",date)
|
||||||
|
|
||||||
if (raw_data["retcode"] != 0):
|
if (raw_data["retcode"] != 0):
|
||||||
if (raw_data["retcode"] == 10001):
|
if (raw_data["retcode"] == 10001):
|
||||||
@ -96,6 +89,295 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
raw_data = raw_data["data"]
|
raw_data = raw_data["data"]
|
||||||
raw_char_data = raw_char_data['data']["avatars"]
|
raw_char_data = raw_char_data['data']["avatars"]
|
||||||
|
|
||||||
|
is_edit = False
|
||||||
|
if image != None:
|
||||||
|
image_file= image.group(1)
|
||||||
|
image_data = image.group(2)
|
||||||
|
urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png'))
|
||||||
|
is_edit = True
|
||||||
|
|
||||||
|
bg_list = random.choice([x for x in os.listdir(BG_PATH)
|
||||||
|
if os.path.isfile(os.path.join(BG_PATH, x))])
|
||||||
|
|
||||||
|
bg2_path = os.path.join(BG_PATH,bg_list)
|
||||||
|
|
||||||
|
abyss0_path = os.path.join(TEXT_PATH,"abyss_0.png")
|
||||||
|
abyss2_path = os.path.join(TEXT_PATH,"abyss_2.png")
|
||||||
|
abyss3_path = os.path.join(TEXT_PATH,"abyss_3.png")
|
||||||
|
abyss_star0_path = os.path.join(TEXT_PATH,"abyss_star0.png")
|
||||||
|
abyss_star1_path = os.path.join(TEXT_PATH,"abyss_star1.png")
|
||||||
|
|
||||||
|
floors_data = raw_data['floors'][-1]
|
||||||
|
levels_num = len(floors_data['levels'])
|
||||||
|
|
||||||
|
based_w = 900
|
||||||
|
based_h = 880+levels_num*315
|
||||||
|
based_scale = '%.3f' % (based_w/based_h)
|
||||||
|
|
||||||
|
if is_edit == True:
|
||||||
|
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
|
||||||
|
else:
|
||||||
|
bg_path_edit = bg2_path
|
||||||
|
|
||||||
|
edit_bg = Image.open(bg_path_edit)
|
||||||
|
w, h = edit_bg.size
|
||||||
|
scale_f = '%.3f' % (w / h)
|
||||||
|
new_w = math.ceil(based_h*float(scale_f))
|
||||||
|
new_h = math.ceil(based_w/float(scale_f))
|
||||||
|
if scale_f > based_scale:
|
||||||
|
bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS)
|
||||||
|
else:
|
||||||
|
bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS)
|
||||||
|
|
||||||
|
bg_img = bg_img2.crop((0, 0, based_w, based_h))
|
||||||
|
|
||||||
|
x1, y1 = 45, 271
|
||||||
|
radius = 10
|
||||||
|
cropped_img1 = bg_img.crop((x1, y1, 857, 831))
|
||||||
|
blurred_img1 = cropped_img1.filter(ImageFilter.GaussianBlur(5),).convert("RGBA")
|
||||||
|
bg_img.paste(blurred_img1, (x1, y1), create_rounded_rectangle_mask(cropped_img1,radius))
|
||||||
|
|
||||||
|
for i in range(0,len(floors_data['levels'])):
|
||||||
|
x2, y2 = 45, 850 + 315*i
|
||||||
|
radius = 10
|
||||||
|
cropped_img2 = bg_img.crop((x2, y2, 855, 1145+315*i))
|
||||||
|
blurred_img2 = cropped_img2.filter(ImageFilter.GaussianBlur(5),).convert("RGBA")
|
||||||
|
bg_img.paste(blurred_img2, (x2, y2), create_rounded_rectangle_mask(cropped_img2,radius))
|
||||||
|
|
||||||
|
abyss0 = Image.open(abyss0_path)
|
||||||
|
abyss3 = Image.open(abyss3_path)
|
||||||
|
abyss_star0 = Image.open(abyss_star0_path)
|
||||||
|
abyss_star1 = Image.open(abyss_star1_path)
|
||||||
|
|
||||||
|
for i in range(0,4):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["reveal_rank"][i]["avatar_id"],raw_data["reveal_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["reveal_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,117),f'{str(raw_data["reveal_rank"][i]["value"])}次',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (70 + 123*i,331)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
for i in range(0,1):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["damage_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["damage_rank"][i]["avatar_id"],raw_data["damage_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["damage_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["damage_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,117),f'{str(raw_data["damage_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (592,331)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
for i in range(0,3):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["defeat_rank"][i]["avatar_id"],raw_data["defeat_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["defeat_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,117),f'{str(raw_data["defeat_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (70 + 123*i,503)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
for i in range(0,3):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["take_damage_rank"][i]["avatar_id"],raw_data["take_damage_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["take_damage_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,117),f'{str(raw_data["take_damage_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (466 + 123*i,503)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
for i in range(0,3):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["normal_skill_rank"][i]["avatar_id"],raw_data["normal_skill_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["normal_skill_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,117),f'{str(raw_data["normal_skill_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (70 + 123*i,676)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
for i in range(0,3):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png")):
|
||||||
|
get_chardone_pic(raw_data["energy_skill_rank"][i]["avatar_id"],raw_data["energy_skill_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == raw_data["energy_skill_rank"][i]["avatar_id"]:
|
||||||
|
char_draw.text((63.5,118),f'{str(raw_data["energy_skill_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm")
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (466 + 123*i,676)
|
||||||
|
abyss0.paste(char_img,char_crop,char_img)
|
||||||
|
|
||||||
|
bg_img.paste(abyss0,(0,0),abyss0)
|
||||||
|
|
||||||
|
for j in range(0,len(floors_data["levels"])):
|
||||||
|
abyss2 = Image.open(abyss2_path)
|
||||||
|
num_1 = 0
|
||||||
|
for i in floors_data['levels'][j]['battles'][0]['avatars']:
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")):
|
||||||
|
get_chardone_pic(i['id'],i['icon'],i['rarity'])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == i['id']:
|
||||||
|
char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18))
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (70 + 125*(num_1%4),46)
|
||||||
|
abyss2.paste(char_img,char_crop,char_img)
|
||||||
|
num_1 = num_1 + 1
|
||||||
|
num_2 = 0
|
||||||
|
for i in floors_data['levels'][j]['battles'][1]['avatars']:
|
||||||
|
if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")):
|
||||||
|
get_chardone_pic(i['id'],i['icon'],i['rarity'])
|
||||||
|
char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")
|
||||||
|
char_img = Image.open(char)
|
||||||
|
char_draw = ImageDraw.Draw(char_img)
|
||||||
|
for k in raw_char_data:
|
||||||
|
if k['id'] == i['id']:
|
||||||
|
char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18))
|
||||||
|
char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18))
|
||||||
|
if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者":
|
||||||
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
|
else:
|
||||||
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
char_crop = (70 + 125*(num_2%4),180)
|
||||||
|
abyss2.paste(char_img,char_crop,char_img)
|
||||||
|
num_2 = num_2 + 1
|
||||||
|
star_num = floors_data['levels'][j]['star']
|
||||||
|
if star_num == 1:
|
||||||
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
|
abyss2.paste(abyss_star0,(685,155),abyss_star0)
|
||||||
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
|
elif star_num == 0:
|
||||||
|
abyss2.paste(abyss_star0,(640,155),abyss_star0)
|
||||||
|
abyss2.paste(abyss_star0,(685,155),abyss_star0)
|
||||||
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
|
elif star_num == 2:
|
||||||
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
|
abyss2.paste(abyss_star1,(685,155),abyss_star1)
|
||||||
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
|
else:
|
||||||
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
|
abyss2.paste(abyss_star1,(685,155),abyss_star1)
|
||||||
|
abyss2.paste(abyss_star1,(730,155),abyss_star1)
|
||||||
|
abyss2_text_draw = ImageDraw.Draw(abyss2)
|
||||||
|
abyss2_text_draw.text((87,30),f"第{j+1}间", (20,20,20), ys_font(21))
|
||||||
|
timeStamp1 = int(floors_data['levels'][j]['battles'][0]['timestamp'])
|
||||||
|
timeStamp2 = int(floors_data['levels'][j]['battles'][1]['timestamp'])
|
||||||
|
timeArray1 = time.localtime(timeStamp1)
|
||||||
|
timeArray2 = time.localtime(timeStamp2)
|
||||||
|
otherStyleTime1 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray1)
|
||||||
|
otherStyleTime2 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray2)
|
||||||
|
abyss2_text_draw.text((167,33), f"{otherStyleTime1}/{otherStyleTime2}", (40,40,40), ys_font(19))
|
||||||
|
bg_img.paste(abyss2,(0,830+j*315),abyss2)
|
||||||
|
|
||||||
|
bg_img.paste(abyss3,(0,len(floors_data["levels"])*315+840),abyss3)
|
||||||
|
|
||||||
|
text_draw = ImageDraw.Draw(bg_img)
|
||||||
|
|
||||||
|
text_draw.text((250, 85), f"{nickname}", (217,217,217), ys_font(32))
|
||||||
|
text_draw.text((260, 125), 'UID ' + f"{uid}", (217,217,217), ys_font(14))
|
||||||
|
|
||||||
|
text_draw.text((690, 52),raw_data['max_floor'], (65, 65, 65), ys_font(26))
|
||||||
|
text_draw.text((690, 97),str(raw_data['total_battle_times']), (65, 65, 65), ys_font(26))
|
||||||
|
text_draw.text((690, 142),str(raw_data['total_star']), (65, 65, 65), ys_font(26))
|
||||||
|
|
||||||
|
bg_img = bg_img.convert('RGB')
|
||||||
|
result_buffer = BytesIO()
|
||||||
|
bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90)
|
||||||
|
#bg_img.save(result_buffer, format='PNG')
|
||||||
|
imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode()
|
||||||
|
resultmes = f"[CQ:image,file={imgmes}]"
|
||||||
|
return resultmes
|
||||||
|
|
||||||
|
async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2,date = "1"):
|
||||||
|
if mode == 3:
|
||||||
|
mys_data = await GetMysInfo(uid)
|
||||||
|
mysid_data = mys_data[1]
|
||||||
|
mys_data = mys_data[0]
|
||||||
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
|
nickname = mys_data['data']['list'][0]['nickname']
|
||||||
|
#role_region = mys_data['data']['list'][0]['region']
|
||||||
|
role_level = mys_data['data']['list'][0]['level']
|
||||||
|
raw_data = await GetSpiralAbyssInfo(uid,"cn_gf01",date,mysid_data)
|
||||||
|
raw_char_data = await GetInfo(uid,"cn_gf01",date,mysid_data)
|
||||||
|
else:
|
||||||
|
raw_data = await GetSpiralAbyssInfo(uid,"cn_gf01",date)
|
||||||
|
raw_char_data = await GetInfo(uid,"cn_gf01",date)
|
||||||
|
|
||||||
|
if (raw_data["retcode"] != 0):
|
||||||
|
if (raw_data["retcode"] == 10001):
|
||||||
|
return ("Cookie错误/过期,请重置Cookie")
|
||||||
|
elif (raw_data["retcode"] == 10101):
|
||||||
|
return ("当前cookies已达到30人上限!")
|
||||||
|
elif (raw_data["retcode"] == 10102):
|
||||||
|
return ("当前查询id已经设置了隐私,无法查询!")
|
||||||
|
return (
|
||||||
|
"Api报错,返回内容为:\r\n"
|
||||||
|
+ str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
is_edit = False
|
||||||
|
if image != None:
|
||||||
|
image_file= image.group(1)
|
||||||
|
image_data = image.group(2)
|
||||||
|
urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png'))
|
||||||
|
is_edit = True
|
||||||
|
|
||||||
|
raw_data = raw_data["data"]
|
||||||
|
raw_char_data = raw_char_data['data']["avatars"]
|
||||||
|
|
||||||
floors_data = raw_data['floors']
|
floors_data = raw_data['floors']
|
||||||
|
|
||||||
based_data = []
|
based_data = []
|
||||||
@ -103,12 +385,12 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
if str(i['index']) == floor_num:
|
if str(i['index']) == floor_num:
|
||||||
based_data = i
|
based_data = i
|
||||||
|
|
||||||
floor_star = based_data['star']
|
#floor_star = based_data['star']
|
||||||
floors1_star = based_data['levels'][0]['star']
|
#floors1_star = based_data['levels'][0]['star']
|
||||||
floors2_star = based_data['levels'][1]['star']
|
#floors2_star = based_data['levels'][1]['star']
|
||||||
floors3_star = based_data['levels'][2]['star']
|
#floors3_star = based_data['levels'][2]['star']
|
||||||
start_time1 = based_data['levels'][0]['battles'][0]['timestamp']
|
#start_time1 = based_data['levels'][0]['battles'][0]['timestamp']
|
||||||
start_time2 = based_data['levels'][0]['battles'][1]['timestamp']
|
#start_time2 = based_data['levels'][0]['battles'][1]['timestamp']
|
||||||
|
|
||||||
bg_list = random.choice([x for x in os.listdir(BG_PATH)
|
bg_list = random.choice([x for x in os.listdir(BG_PATH)
|
||||||
if os.path.isfile(os.path.join(BG_PATH, x))])
|
if os.path.isfile(os.path.join(BG_PATH, x))])
|
||||||
@ -123,9 +405,9 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
|
|
||||||
levels_num = len(based_data['levels'])
|
levels_num = len(based_data['levels'])
|
||||||
|
|
||||||
based_w = 800
|
based_w = 900
|
||||||
based_h = 240+levels_num*340
|
based_h = 240+levels_num*340
|
||||||
based_scale = math.ceil(based_w/based_h)
|
based_scale = '%.3f' % (based_w/based_h)
|
||||||
|
|
||||||
if is_edit == True:
|
if is_edit == True:
|
||||||
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
|
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
|
||||||
@ -134,23 +416,20 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
|
|
||||||
edit_bg = Image.open(bg_path_edit)
|
edit_bg = Image.open(bg_path_edit)
|
||||||
w, h = edit_bg.size
|
w, h = edit_bg.size
|
||||||
scale_f = math.ceil(w / h)
|
scale_f = '%.3f' % (w / h)
|
||||||
new_w = math.ceil(based_w/float(scale_f))
|
new_w = math.ceil(based_h*float(scale_f))
|
||||||
new_h = math.ceil(based_h*float(scale_f))
|
new_h = math.ceil(based_w/float(scale_f))
|
||||||
if w > h:
|
if scale_f > based_scale:
|
||||||
bg_img2 = edit_bg.resize((new_h, based_h),Image.ANTIALIAS)
|
bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS)
|
||||||
else:
|
else:
|
||||||
if scale_f > based_scale:
|
bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS)
|
||||||
bg_img2 = edit_bg.resize((900, new_h),Image.ANTIALIAS)
|
|
||||||
else:
|
|
||||||
bg_img2 = edit_bg.resize((900, new_h),Image.ANTIALIAS)
|
|
||||||
|
|
||||||
bg_img = bg_img2.crop((0, 0, based_w, based_h))
|
bg_img = bg_img2.crop((0, 0, based_w, based_h))
|
||||||
|
|
||||||
for i in range(0,len(based_data['levels'])):
|
for i in range(0,len(based_data['levels'])):
|
||||||
x, y = 40, 220 + 340*i
|
x, y = 45, 220 + 340*i
|
||||||
radius = 40
|
radius = 10
|
||||||
cropped_img = bg_img.crop((x, y, 760, 518+340*i))
|
cropped_img = bg_img.crop((x, y, 855, 517+340*i))
|
||||||
blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert("RGBA")
|
blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert("RGBA")
|
||||||
bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img,radius))
|
bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img,radius))
|
||||||
|
|
||||||
@ -179,7 +458,7 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
else:
|
else:
|
||||||
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
char_crop = (41 + 125*(num_1%4),46)
|
char_crop = (70 + 125*(num_1%4),46)
|
||||||
abyss2.paste(char_img,char_crop,char_img)
|
abyss2.paste(char_img,char_crop,char_img)
|
||||||
num_1 = num_1 + 1
|
num_1 = num_1 + 1
|
||||||
num_2 = 0
|
num_2 = 0
|
||||||
@ -197,47 +476,47 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15))
|
||||||
else:
|
else:
|
||||||
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18))
|
||||||
char_crop = (41 + 125*(num_2%4),180)
|
char_crop = (70 + 125*(num_2%4),180)
|
||||||
abyss2.paste(char_img,char_crop,char_img)
|
abyss2.paste(char_img,char_crop,char_img)
|
||||||
num_2 = num_2 + 1
|
num_2 = num_2 + 1
|
||||||
star_num = based_data['levels'][j]['star']
|
star_num = based_data['levels'][j]['star']
|
||||||
if star_num == 1:
|
if star_num == 1:
|
||||||
abyss2.paste(abyss_star1,(570,155),abyss_star1)
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
abyss2.paste(abyss_star0,(615,155),abyss_star0)
|
abyss2.paste(abyss_star0,(685,155),abyss_star0)
|
||||||
abyss2.paste(abyss_star0,(660,155),abyss_star0)
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
elif star_num == 0:
|
elif star_num == 0:
|
||||||
abyss2.paste(abyss_star0,(570,155),abyss_star0)
|
abyss2.paste(abyss_star0,(640,155),abyss_star0)
|
||||||
abyss2.paste(abyss_star0,(615,155),abyss_star0)
|
abyss2.paste(abyss_star0,(685,155),abyss_star0)
|
||||||
abyss2.paste(abyss_star0,(660,155),abyss_star0)
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
elif star_num == 2:
|
elif star_num == 2:
|
||||||
abyss2.paste(abyss_star1,(570,155),abyss_star1)
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
abyss2.paste(abyss_star1,(615,155),abyss_star1)
|
abyss2.paste(abyss_star1,(685,155),abyss_star1)
|
||||||
abyss2.paste(abyss_star0,(660,155),abyss_star0)
|
abyss2.paste(abyss_star0,(730,155),abyss_star0)
|
||||||
else:
|
else:
|
||||||
abyss2.paste(abyss_star1,(570,155),abyss_star1)
|
abyss2.paste(abyss_star1,(640,155),abyss_star1)
|
||||||
abyss2.paste(abyss_star1,(615,155),abyss_star1)
|
abyss2.paste(abyss_star1,(685,155),abyss_star1)
|
||||||
abyss2.paste(abyss_star1,(660,155),abyss_star1)
|
abyss2.paste(abyss_star1,(730,155),abyss_star1)
|
||||||
abyss2_text_draw = ImageDraw.Draw(abyss2)
|
abyss2_text_draw = ImageDraw.Draw(abyss2)
|
||||||
abyss2_text_draw.text((58,30),f"第{j+1}间", (20,20,20), ys_font(21))
|
abyss2_text_draw.text((87,30),f"第{j+1}间", (20,20,20), ys_font(21))
|
||||||
timeStamp1 = int(based_data['levels'][j]['battles'][0]['timestamp'])
|
timeStamp1 = int(based_data['levels'][j]['battles'][0]['timestamp'])
|
||||||
timeStamp2 = int(based_data['levels'][j]['battles'][1]['timestamp'])
|
timeStamp2 = int(based_data['levels'][j]['battles'][1]['timestamp'])
|
||||||
timeArray1 = time.localtime(timeStamp1)
|
timeArray1 = time.localtime(timeStamp1)
|
||||||
timeArray2 = time.localtime(timeStamp2)
|
timeArray2 = time.localtime(timeStamp2)
|
||||||
otherStyleTime1 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray1)
|
otherStyleTime1 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray1)
|
||||||
otherStyleTime2 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray2)
|
otherStyleTime2 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray2)
|
||||||
abyss2_text_draw.text((138,33), f"{otherStyleTime1}/{otherStyleTime2}", (40,40,40), ys_font(19))
|
abyss2_text_draw.text((167,33), f"{otherStyleTime1}/{otherStyleTime2}", (40,40,40), ys_font(19))
|
||||||
bg_img.paste(abyss2,(0,200+j*340),abyss2)
|
bg_img.paste(abyss2,(0,200+j*340),abyss2)
|
||||||
|
|
||||||
bg_img.paste(abyss3,(0,len(based_data['levels'])*340+200),abyss3)
|
bg_img.paste(abyss3,(0,len(based_data['levels'])*340+200),abyss3)
|
||||||
|
|
||||||
text_draw = ImageDraw.Draw(bg_img)
|
text_draw = ImageDraw.Draw(bg_img)
|
||||||
|
|
||||||
text_draw.text((171.6,89.3), f"{nickname}", (217,217,217), ys_font(32))
|
text_draw.text((210,77), f"{nickname}", (217,217,217), ys_font(32))
|
||||||
text_draw.text((189.6, 126.3), 'UID ' + f"{uid}", (217,217,217), ys_font(14))
|
text_draw.text((228, 110), 'UID ' + f"{uid}", (217,217,217), ys_font(14))
|
||||||
if floor_num == "9":
|
if floor_num == "9":
|
||||||
text_draw.text((650, 79), f"{floor_num}", (29,30,63), ys_font(50))
|
text_draw.text((687, 67), f"{floor_num}", (29,30,63), ys_font(50))
|
||||||
else:
|
else:
|
||||||
text_draw.text((630, 79), f"{floor_num}", (29,30,63), ys_font(50))
|
text_draw.text((670, 67), f"{floor_num}", (29,30,63), ys_font(50))
|
||||||
|
|
||||||
bg_img = bg_img.convert('RGB')
|
bg_img = bg_img.convert('RGB')
|
||||||
result_buffer = BytesIO()
|
result_buffer = BytesIO()
|
||||||
@ -248,25 +527,17 @@ async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2):
|
|||||||
return resultmes
|
return resultmes
|
||||||
|
|
||||||
async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
||||||
is_edit = False
|
|
||||||
if image:
|
|
||||||
image_file= image.group(1)
|
|
||||||
image_data = image.group(2)
|
|
||||||
urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png'))
|
|
||||||
is_edit = True
|
|
||||||
|
|
||||||
if mode == 3:
|
if mode == 3:
|
||||||
mys_data = await GetMysInfo(uid)
|
mys_data = await GetMysInfo(uid)
|
||||||
mysid_data = mys_data[1]
|
mysid_data = mys_data[1]
|
||||||
mys_data = mys_data[0]
|
mys_data = mys_data[0]
|
||||||
uid = mys_data['data']['list'][0]['game_role_id']
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
nickname = mys_data['data']['list'][0]['nickname']
|
nickname = mys_data['data']['list'][0]['nickname']
|
||||||
#role_region = mys_data['data']['list'][0]['region']
|
|
||||||
role_level = mys_data['data']['list'][0]['level']
|
role_level = mys_data['data']['list'][0]['level']
|
||||||
raw_data = await GetInfo(uid,"cn_gf01","1",mysid_data)
|
raw_data = await GetInfo(uid,"cn_gf01","1",mysid_data)
|
||||||
else:
|
else:
|
||||||
raw_data = await GetInfo(uid)
|
raw_data = await GetInfo(uid)
|
||||||
|
|
||||||
if (raw_data["retcode"] != 0):
|
if (raw_data["retcode"] != 0):
|
||||||
if (raw_data["retcode"] == 10001):
|
if (raw_data["retcode"] == 10001):
|
||||||
return ("Cookie错误/过期,请重置Cookie")
|
return ("Cookie错误/过期,请重置Cookie")
|
||||||
@ -320,9 +591,16 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
|||||||
char_lie = char_num%6
|
char_lie = char_num%6
|
||||||
|
|
||||||
based_w = 900
|
based_w = 900
|
||||||
based_h = 840+char_hang*130
|
based_h = 890+char_hang*130
|
||||||
based_scale = '%.3f' % (based_w/based_h)
|
based_scale = '%.3f' % (based_w/based_h)
|
||||||
|
|
||||||
|
is_edit = False
|
||||||
|
if image:
|
||||||
|
image_file= image.group(1)
|
||||||
|
image_data = image.group(2)
|
||||||
|
urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png'))
|
||||||
|
is_edit = True
|
||||||
|
|
||||||
if is_edit == True:
|
if is_edit == True:
|
||||||
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
|
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
|
||||||
else:
|
else:
|
||||||
@ -352,8 +630,8 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
|||||||
|
|
||||||
bg_img.paste(panle1,(0,0),panle1)
|
bg_img.paste(panle1,(0,0),panle1)
|
||||||
for i in range(0,char_hang):
|
for i in range(0,char_hang):
|
||||||
bg_img.paste(panle2,(0,750+i*130),panle2)
|
bg_img.paste(panle2,(0,800+i*130),panle2)
|
||||||
bg_img.paste(panle3,(0,char_hang*130+750),panle3)
|
bg_img.paste(panle3,(0,char_hang*130+800),panle3)
|
||||||
|
|
||||||
text_draw = ImageDraw.Draw(bg_img)
|
text_draw = ImageDraw.Draw(bg_img)
|
||||||
|
|
||||||
@ -367,42 +645,47 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
|||||||
text_draw.text((640, 139.3),str(raw_data['stats']['achievement_number']), (65, 65, 65), ys_font(26))
|
text_draw.text((640, 139.3),str(raw_data['stats']['achievement_number']), (65, 65, 65), ys_font(26))
|
||||||
text_draw.text((640, 183.9),raw_data['stats']['spiral_abyss'], (65, 65, 65), ys_font(26))
|
text_draw.text((640, 183.9),raw_data['stats']['spiral_abyss'], (65, 65, 65), ys_font(26))
|
||||||
|
|
||||||
text_draw.text((241, 390),str(raw_data['stats']['common_chest_number']),(65, 65, 65), ys_font(26))
|
text_draw.text((258, 382.4),str(raw_data['stats']['magic_chest_number']), (65, 65, 65), ys_font(24))
|
||||||
text_draw.text((241, 432),str(raw_data['stats']['exquisite_chest_number']),(65, 65, 65), ys_font(26))
|
text_draw.text((258, 442),str(raw_data['stats']['common_chest_number']),(65, 65, 65), ys_font(24))
|
||||||
text_draw.text((241, 474),str(raw_data['stats']['precious_chest_number']), (65, 65, 65), ys_font(26))
|
text_draw.text((258, 501.6),str(raw_data['stats']['exquisite_chest_number']),(65, 65, 65), ys_font(24))
|
||||||
text_draw.text((241, 516),str(raw_data['stats']['luxurious_chest_number']), (65, 65, 65), ys_font(26))
|
text_draw.text((258, 561.2),str(raw_data['stats']['precious_chest_number']), (65, 65, 65), ys_font(24))
|
||||||
|
text_draw.text((258, 620.8),str(raw_data['stats']['luxurious_chest_number']), (65, 65, 65), ys_font(24))
|
||||||
|
|
||||||
text_draw.text((241, 558),str(raw_data['stats']['avatar_number']),(65, 65, 65), ys_font(26))
|
text_draw.text((258, 680.4),str(raw_data['stats']['avatar_number']),(65, 65, 65), ys_font(24))
|
||||||
text_draw.text((241, 600),str(raw_data['stats']['way_point_number']),(65, 65, 65), ys_font(26))
|
|
||||||
text_draw.text((241, 642),str(raw_data['stats']['domain_number']),(65, 65, 65), ys_font(26))
|
text_draw.text((745, 474.5),str(raw_data['stats']['way_point_number']),(65, 65, 65), ys_font(24))
|
||||||
|
text_draw.text((745, 514),str(raw_data['stats']['domain_number']),(65, 65, 65), ys_font(24))
|
||||||
|
|
||||||
#蒙德
|
#蒙德
|
||||||
text_draw.text((480, 380),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(23))
|
text_draw.text((490, 370),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((480, 410),'lv.' + str(raw_data['world_explorations'][3]['level']),(65, 65, 65), ys_font(23))
|
text_draw.text((490, 400),'lv.' + str(raw_data['world_explorations'][3]['level']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((505, 440), str(raw_data['stats']['anemoculus_number']), (65, 65, 65), ys_font(23))
|
text_draw.text((513, 430), str(raw_data['stats']['anemoculus_number']), (65, 65, 65), ys_font(22))
|
||||||
|
|
||||||
#璃月
|
#璃月
|
||||||
text_draw.text((715, 380),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(23))
|
text_draw.text((490, 490),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((715, 410),'lv.' + str(raw_data['world_explorations'][2]['level']),(65, 65, 65), ys_font(23))
|
text_draw.text((490, 520),'lv.' + str(raw_data['world_explorations'][2]['level']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((740, 440), str(raw_data['stats']['geoculus_number']), (65, 65, 65), ys_font(23))
|
text_draw.text((513, 550), str(raw_data['stats']['geoculus_number']), (65, 65, 65), ys_font(22))
|
||||||
|
|
||||||
#雪山
|
#雪山
|
||||||
text_draw.text((480, 522),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(23))
|
text_draw.text((745, 379.5),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((480, 556),'lv.' + str(raw_data['world_explorations'][1]['level']),(65, 65, 65), ys_font(23))
|
text_draw.text((745, 413.1),'lv.' + str(raw_data['world_explorations'][1]['level']),(65, 65, 65), ys_font(22))
|
||||||
|
|
||||||
#稻妻
|
#稻妻
|
||||||
text_draw.text((715, 497),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(23))
|
text_draw.text((490, 608),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%',(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((715, 525),'lv.' + str(raw_data['world_explorations'][0]['level']),(65, 65, 65), ys_font(23))
|
text_draw.text((490, 635),'lv.' + str(raw_data['world_explorations'][0]['level']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((715, 553),'lv.' + str(raw_data['world_explorations'][0]['offerings'][0]['level']),(65, 65, 65), ys_font(23))
|
text_draw.text((490, 662),'lv.' + str(raw_data['world_explorations'][0]['offerings'][0]['level']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((740, 581), str(raw_data['stats']['electroculus_number']), (65, 65, 65), ys_font(23))
|
text_draw.text((513, 689), str(raw_data['stats']['electroculus_number']), (65, 65, 65), ys_font(22))
|
||||||
|
|
||||||
if len(raw_data['homes']):
|
if len(raw_data['homes']):
|
||||||
text_draw.text((480, 622),'lv.' + str(raw_data['homes'][0]['level']),(65, 65, 65), ys_font(24))
|
text_draw.text((693, 572.4),'lv.' + str(raw_data['homes'][0]['level']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((480, 653),str(raw_data['homes'][0]['visit_num']),(65, 65, 65), ys_font(24))
|
text_draw.text((693, 610.4),str(raw_data['homes'][0]['visit_num']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((715, 622),str(raw_data['homes'][0]['item_num']),(65, 65, 65), ys_font(24))
|
text_draw.text((693, 648.4),str(raw_data['homes'][0]['item_num']),(65, 65, 65), ys_font(22))
|
||||||
text_draw.text((715, 653),str(raw_data['homes'][0]['comfort_num']),(65, 65, 65), ys_font(24))
|
text_draw.text((693, 686.4),str(raw_data['homes'][0]['comfort_num']),(65, 65, 65), ys_font(22))
|
||||||
else:
|
else:
|
||||||
text_draw.text((650, 640),'未开',(0, 0, 0), ys_font(26))
|
text_draw.text((693, 572.4),"未开",(65, 65, 65), ys_font(22))
|
||||||
|
text_draw.text((693, 610.4),"未开",(65, 65, 65), ys_font(22))
|
||||||
|
text_draw.text((693, 648.4),"未开",(65, 65, 65), ys_font(22))
|
||||||
|
text_draw.text((693, 686.4),"未开",(65, 65, 65), ys_font(22))
|
||||||
|
|
||||||
if mode == 1:
|
if mode == 1:
|
||||||
char_data.sort(key=lambda x: (-x['rarity'],-x['level'],-x['fetter']))
|
char_data.sort(key=lambda x: (-x['rarity'],-x['level'],-x['fetter']))
|
||||||
@ -420,7 +703,7 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
|||||||
else:
|
else:
|
||||||
char_draw.text((95.3,40.5),f'{str(char_data[num]["fetter"])}',(21,21,21),ys_font(18))
|
char_draw.text((95.3,40.5),f'{str(char_data[num]["fetter"])}',(21,21,21),ys_font(18))
|
||||||
|
|
||||||
char_crop = (68+129*(num%6),750+130*(num//6))
|
char_crop = (68+129*(num%6),800+130*(num//6))
|
||||||
bg_img.paste(char_img,char_crop,char_img)
|
bg_img.paste(char_img,char_crop,char_img)
|
||||||
num = num+1
|
num = num+1
|
||||||
else:
|
else:
|
||||||
@ -542,7 +825,7 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None):
|
|||||||
else:
|
else:
|
||||||
char_draw.text((100,41),f'{str(char_fetter)}',(21,21,21),ys_font(16))
|
char_draw.text((100,41),f'{str(char_fetter)}',(21,21,21),ys_font(16))
|
||||||
|
|
||||||
char_crop = (68+129*(num%6),750+130*(num//6))
|
char_crop = (68+129*(num%6),800+130*(num//6))
|
||||||
bg_img.paste(charpic,char_crop,charpic)
|
bg_img.paste(charpic,char_crop,charpic)
|
||||||
num = num+1
|
num = num+1
|
||||||
|
|
||||||
|
BIN
mys/bg/1.jpg
Normal file
After Width: | Height: | Size: 288 KiB |
BIN
mys/bg/2.jpg
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
mys/bg/2.png
Before Width: | Height: | Size: 252 KiB |
BIN
mys/texture2d/abyss_0.png
Normal file
After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 286 KiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 283 KiB |
BIN
readme/1.PNG
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 436 KiB |
BIN
readme/10.png
Before Width: | Height: | Size: 7.9 KiB |
BIN
readme/11.png
Before Width: | Height: | Size: 25 KiB |
BIN
readme/12.png
Before Width: | Height: | Size: 131 KiB |
BIN
readme/13.png
Before Width: | Height: | Size: 126 KiB |
BIN
readme/14.png
Before Width: | Height: | Size: 132 KiB |
BIN
readme/2.png
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 487 KiB |
BIN
readme/3.png
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 40 KiB |
BIN
readme/4.png
Before Width: | Height: | Size: 187 KiB |
BIN
readme/5.PNG
Before Width: | Height: | Size: 1.4 MiB |
BIN
readme/6.PNG
Before Width: | Height: | Size: 1.1 MiB |
BIN
readme/7.PNG
Before Width: | Height: | Size: 1.6 MiB |
BIN
readme/8.PNG
Before Width: | Height: | Size: 1.6 MiB |
BIN
readme/9.PNG
Before Width: | Height: | Size: 1.2 MiB |