GenshinUID/getImg.py
KimigaiiWuyi db0de2ea39 fix
2021-08-14 15:04:05 +08:00

340 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
from base64 import b64encode
from io import BytesIO
import urllib
import math
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from .getData import GetInfo,GetCharacter
import os
import json
import random
FILE_PATH = os.path.dirname(__file__)
FILE2_PATH = os.path.join(FILE_PATH,'mys')
CHAR_PATH = os.path.join(FILE2_PATH,'chars')
CHAR_WEAPON_PATH = os.path.join(FILE2_PATH,'char_weapon')
TEXT_PATH = os.path.join(FILE2_PATH,'texture2d')
WEAPON_PATH = os.path.join(FILE2_PATH,'weapon')
def ys_font(size):
return ImageFont.truetype(os.path.join(FILE2_PATH,"yuanshen.ttf"), size=size)
async def draw_pic(uid,nickname,image = None):
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 = await GetInfo(uid)
if (raw_data["retcode"] != 0):
if (raw_data["retcode"] == 10001):
return ("Cookie错误/过期请重置Cookie")
if (raw_data["retcode"] == 10101):
return ("当前cookies已达到30人上限")
if (raw_data["retcode"] == 10102):
return ("当前查询id已经设置了隐私无法查询")
return (
"Api报错返回内容为\r\n"
+ str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在"
)
else:
pass
bg_list = ['bg_img_1.png','bg_img_2.png','bg_img_3.png']
bg_path = os.path.join(TEXT_PATH,"bg.png")
bg2_path = os.path.join(TEXT_PATH,random.choice(bg_list))
fg_path = os.path.join(TEXT_PATH,"fg_img_1.png")
mask_path = os.path.join(TEXT_PATH,"mask_img.png")
if is_edit == True:
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
edit_bg = Image.open(bg_path_edit)
w, h = edit_bg.size
scale_f = w / h
scale = '%.4f' % scale_f
new_w = math.ceil(1200*float(scale))
new_h = math.ceil(800/float(scale))
if w > h:
bg_img2 = edit_bg.resize((new_w, 1200),Image.ANTIALIAS)
elif float(scale) > 0.66:
bg_img2 = edit_bg.resize((new_w, 1200),Image.ANTIALIAS)
else:
bg_img2 = edit_bg.resize((800, new_h),Image.ANTIALIAS)
bg_img = bg_img2.crop((0, 0, 800, 1200))
else:
bg_img = Image.open(bg2_path)
raw_data = raw_data['data']
fg_img = Image.open(fg_path)
mask_img = Image.open(mask_path)
#img = Image.open(bg_path)
area = (37, 268, 764, 1154)
img_bb = bg_img.crop(area)
img_blur = img_bb.filter(ImageFilter.GaussianBlur(4))
bg_img.paste(img_blur, (37,268),mask_img)
bg_img.paste(fg_img,(0,0),fg_img)
text_draw = ImageDraw.Draw(bg_img)
text_draw.text((192.6,128.3), f"{nickname}", (217,217,217), ys_font(32))
text_draw.text((210.6, 165.3), 'UID ' + f"{uid}", (217,217,217), ys_font(14))
char_data = raw_data["avatars"]
index_char = ["神里绫华","","迪卢克","温迪","","可莉","钟离","达达利亚","七七","甘雨","阿贝多","莫娜","刻晴","胡桃","枫原万叶","优菈","丽莎","芭芭拉","凯亚","雷泽","安柏","香菱","北斗","行秋","凝光","菲谢尔","班尼特","诺艾尔","重云","迪奥娜","砂糖","辛焱","罗莎莉亚","烟绯","旅行者"]
five_star_char = ["神里绫华","","迪卢克","温迪","","可莉","钟离","达达利亚","七七","甘雨","阿贝多","莫娜","刻晴","胡桃","枫原万叶","优菈","宵宫"]
four_star_char = ["丽莎","芭芭拉","凯亚","雷泽","安柏","香菱","北斗","行秋","凝光","菲谢尔","班尼特","诺艾尔","重云","迪奥娜","砂糖","辛焱","罗莎莉亚","烟绯","早柚"]
for k in char_data:
if k['name'] in five_star_char:
k['star'] = 5
if k['name'] in four_star_char:
k['star'] = 4
if k['name'] == '旅行者':
k['star'] = 3
#char_data.sort(key=lambda x: index_char.index(x['name']))
char_data.sort(key=lambda x: (-x['star'],-x['level'],-x['fetter']))
text_draw.text((590, 94.8),str(raw_data['stats']['active_day_number']), (21, 21, 21), ys_font(26))
text_draw.text((590, 139.3),str(raw_data['stats']['achievement_number']), (21, 21, 21), ys_font(26))
text_draw.text((590, 183.9),raw_data['stats']['spiral_abyss'], (21, 21, 21), ys_font(26))
text_draw.text((635.4, 462.8), str(raw_data['stats']['anemoculus_number']), 'white', ys_font(26))
text_draw.text((635.4, 493.6), str(raw_data['stats']['geoculus_number']), 'white', ys_font(26))
text_draw.text((635.4, 524.8), str(raw_data['stats']['electroculus_number']), 'white', ys_font(26))
text_draw.text((224.6, 379.1),str(raw_data['stats']['common_chest_number']),'white', ys_font(28))
text_draw.text((436.5, 379.1),str(raw_data['stats']['exquisite_chest_number']),'white', ys_font(28))
text_draw.text((224.6, 416),str(raw_data['stats']['precious_chest_number']), 'white', ys_font(28))
text_draw.text((436.5, 416),str(raw_data['stats']['luxurious_chest_number']), 'white', ys_font(28))
text_draw.text((646.3, 379.1),str(raw_data['stats']['avatar_number']),'white', ys_font(26))
text_draw.text((646.3, 416),str(raw_data['stats']['way_point_number']),'white', ys_font(26))
text_draw.text((228.9, 502),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%','white', ys_font(20))
text_draw.text((228.9, 538),'lv.' + str(raw_data['world_explorations'][3]['level']),'white', ys_font(20))
text_draw.text((451.1, 502),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%','white', ys_font(20))
text_draw.text((451.1, 538),'lv.' + str(raw_data['world_explorations'][2]['level']),'white', ys_font(20))
text_draw.text((228.9, 606.4),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%','white', ys_font(20))
text_draw.text((228.9, 641),'lv.' + str(raw_data['world_explorations'][1]['level']),'white', ys_font(20))
text_draw.text((451.1, 597),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%','white', ys_font(20))
text_draw.text((451.1, 624),'lv.' + str(raw_data['world_explorations'][0]['level']),'white', ys_font(20))
text_draw.text((451.1, 652),'lv.' + str(raw_data['world_explorations'][0]['offerings'][0]['level']),'white', ys_font(20))
if len(raw_data['homes']):
text_draw.text((594.5, 565),'lv.' + str(raw_data['homes'][0]['level']),'white', ys_font(26))
text_draw.text((594.5, 598),str(raw_data['homes'][0]['visit_num']),'white', ys_font(26))
text_draw.text((594.5, 630),str(raw_data['homes'][0]['item_num']),'white', ys_font(26))
text_draw.text((594.5, 662),str(raw_data['homes'][0]['comfort_num']),'white', ys_font(26))
else:
text_draw.text((594.5, 616.6),'未开',(0, 0, 0), ys_font(26))
num = 0
for i in raw_data['avatars']:
if num < 15:
char = os.path.join(CHAR_PATH,str(char_data[num]['id']) + ".png")
char_img = Image.open(char)
char_draw = ImageDraw.Draw(char_img)
char_draw.text((40,108),f'Lv.{str(char_data[num]["level"])}',(21,21,21),ys_font(18))
char_draw.text((95.3,19),f'{str(char_data[num]["actived_constellation_num"])}','white',ys_font(18))
if str(char_data[num]["fetter"]) == "10":
char_draw.text((95.3,40.5),"F",(21,21,21),ys_font(17))
else:
char_draw.text((95.3,40.5),f'{str(char_data[num]["fetter"])}',(21,21,21),ys_font(18))
if num < 5:
char_crop = (74+133*num,750)
bg_img.paste(char_img,char_crop,char_img)
elif num >= 5 and num < 10:
char_crop = (74+133*(num-5),875)
bg_img.paste(char_img,(char_crop),char_img)
elif num >= 10 and num < 15:
char_crop = (74+133*(num-10),1000)
bg_img.paste(char_img,(char_crop),char_img)
else:
break
num = num+1
result_buffer = BytesIO()
bg_img.save(result_buffer, format='png')
imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode()
resultmes = f"[CQ:image,file={imgmes}]"
#return 'base64://' + b64encode(result_buffer.getvalue()).decode()
return resultmes
def get_weapon_pic():
f2 = open(os.path.join(WEAPON_PATH,"weapons.json"),"r")
ikk = json.load(f2)
for k in ikk:
m = ikk[f'{k}']['icon']
urllib.request.urlretrieve(f'{m}', os.path.join(WEAPON_PATH, m.split('/')[-1]))
print(k)
time.sleep(2)
async def draw_char_pic(uid,nickname,image = None):
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 = await GetInfo(uid)
if (raw_data["retcode"] != 0):
if (raw_data["retcode"] == 10001):
return ("Cookie错误/过期请重置Cookie")
return (
"Api报错返回内容为\r\n"
+ str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在"
)
else:
pass
bg_list = ['bg_img_1.png','bg_img_2.png',"bg_img_3.png"]
bg_path = os.path.join(TEXT_PATH,"bg.png")
bg2_path = os.path.join(TEXT_PATH,random.choice(bg_list))
fg_path = os.path.join(TEXT_PATH,"char_fg_img.png")
mask_path = os.path.join(TEXT_PATH,"char_mask_img.png")
if is_edit == True:
bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png")
edit_bg = Image.open(bg_path_edit)
w, h = edit_bg.size
scale_f = w / h
scale = '%.4f' % scale_f
new_w = math.ceil(1200*float(scale))
new_h = math.ceil(800/float(scale))
if w > h:
bg_img2 = edit_bg.resize((new_w, 1200),Image.ANTIALIAS)
elif float(scale) > 0.66:
bg_img2 = edit_bg.resize((new_w, 1200),Image.ANTIALIAS)
else:
bg_img2 = edit_bg.resize((800, new_h),Image.ANTIALIAS)
bg_img = bg_img2.crop((0, 0, 800, 1200))
else:
bg_img = Image.open(bg2_path)
fg_img = Image.open(fg_path)
mask_img = Image.open(mask_path)
#img = Image.open(bg_path)
area = (37, 58, 764, 1142)
img_bb = bg_img.crop(area)
img_blur = img_bb.filter(ImageFilter.GaussianBlur(4))
bg_img.paste(img_blur, (37,268),mask_img)
bg_img.paste(fg_img,(0,0),fg_img)
text_draw = ImageDraw.Draw(bg_img)
#text_draw.text((192.6,128.3), f"{nickname}", (217,217,217), ys_font(32))
text_draw.text((297.7, 83.8), 'UID ' + f"{uid}", (245,245,245), ys_font(26))
charid_data = raw_data['data']["avatars"]
char_ids = []
char_rawdata = []
for i in charid_data:
char_ids.append(i["id"])
char_rawdata = await GetCharacter(uid,char_ids)
char_data = char_rawdata["data"]["avatars"]
bar_5_path = os.path.join(TEXT_PATH,"jinglian_5.png")
bar_5 = Image.open(bar_5_path)
#bar_5.thumbnail((13, 30))
bar_4_path = os.path.join(TEXT_PATH,"jinglian_4.png")
bar_4 = Image.open(bar_4_path)
#bar_4.thumbnail((13, 30))
num = 0
char_data.sort(key=lambda x: (-x['rarity'],-x['level'],-x['fetter']))
for i in char_data:
char_mingzuo = 0
for k in i['constellations']:
if k['is_actived'] == True:
char_mingzuo += 1
char_id = i["id"]
char_level = i["level"]
char_fetter = i['fetter']
char_rarity = i['rarity']
char_weapon = i['weapon']
char_weapon_name = i['weapon']['name']
char_weapon_level = i['weapon']['level']
char_weapon_jinglian = i['weapon']['affix_level']
char_weapon_icon = i['weapon']['icon']
char = os.path.join(CHAR_WEAPON_PATH,str(char_id) + ".png")
weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))
char_img = Image.open(char)
weapon_img = Image.open(weapon)
weapon_img.thumbnail((57, 57))
char_draw = ImageDraw.Draw(char_img)
char_draw.text((47,109),f'Lv.{str(char_level)}',(21,21,21),ys_font(18))
char_draw.text((110,19.5),f'{str(char_mingzuo)}','white',ys_font(18))
if str(char_data[num]["fetter"]) == "10":
char_draw.text((110,41.5),"F",(21,21,21),ys_font(17))
else:
char_draw.text((110,41.5),f'{str(char_fetter)}',(21,21,21),ys_font(18))
char_img.paste(weapon_img,(70,52),weapon_img)
#if char_rarity == 4:
# for j in range(0,char_weapon_jinglian):
# char_img.paste(bar_4,(116,97-8*j),bar_4)
#elif char_rarity == 5:
# for j in range(0,char_weapon_jinglian):
# char_img.paste(bar_5,(116,97-8*j),bar_5)
if char_rarity == 4:
char_img.paste(bar_4,(110,92),bar_4)
char_draw.text((112,91),f'{str(char_weapon_jinglian)}','black',ys_font(14))
elif char_rarity == 5:
char_img.paste(bar_5,(110,92),bar_5)
char_draw.text((112,91),f'{str(char_weapon_jinglian)}','black',ys_font(14))
if num < 35:
char_crop = (53+137*(num%5),181+131*(num//5))
bg_img.paste(char_img,char_crop,char_img)
else:
break
num = num+1
result_buffer = BytesIO()
bg_img.save(result_buffer, format='png')
imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode()
resultmes = f"[CQ:image,file={imgmes}]"
#return 'base64://' + b64encode(result_buffer.getvalue()).decode()
return resultmes
async def get_char_data(uid,nickname,image = None):
pass