import os import json import requests import base64 import nonebot import time from nonebot import on_command, CommandSession import config # type: ignore bot = nonebot.get_bot() master = config.MASTER() key = config.FACE_KEY() secret = config.FACE_SECRET() #获取图片的人脸特征参数 def find_face(imgpath): url='https://api-cn.faceplusplus.com/facepp/v3/detect' data = {'api_key':key,'api_secret':secret,'image_url':imgpath,'return_landmark':1} files = {'image_file':open(imgpath,'rb')} response = requests.post(url,data=data,files=files) res_json = response.json() faces = res_json['faces'][0]['face_rectangle'] #获取面部大小的四个值,分别为长宽高低{'width': 176, 'top': 128, 'left': 80, 'height': 176} return faces #换脸,函数传参中number表示两张脸的相似度为99% def change_face(image_1, image_2, user, number=99): url = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface" find_p1 = find_face(image_1) find_p2 = find_face(image_2) rectangle1 = str(str(find_p1['top'])+','+str(find_p1['left'])+','+str(find_p1['width'])+','+str(find_p1['height'])) #得到一个坐标 rectangle2 = str(str(find_p2['top'])+','+str(find_p2['left'])+','+str(find_p2['width'])+','+str(find_p2['height'])) page1 = open(image_1,'rb') #以二进制打开图片1 page1_64 = base64.b64encode(page1.read()) #将字符串转成成base64编码 page1.close() page2 = open(image_2,'rb') page2_64 = base64.b64encode(page2.read()) page2.close() data = {'api_key':key,'api_secret':secret,'template_base64':page1_64, 'template_rectangle':rectangle1,'merge_base64':page2_64,'merge_rectangele':rectangle2,'merge_rate':number} response = requests.post(url,data=data).json() results = response['result'] image = base64.b64decode(results) files = f'ATRI/data/temp/face/{user}' if not os.path.exists(files): os.mkdir(files) with open(files + '/img3.jpg','wb') as file: file.write(image) print('success!') # change_face('1.jpg','2.jpg') @on_command('ai_ch_face', aliases = ['AI换脸', 'ai换脸'], only_to_me = False) async def _(session: CommandSession): user = session.event.user_id with open("ATRI/plugins/switch/switch.json", 'r') as f: data = json.load(f) if data["change_face"] == 0: with open('ATRI/plugins/noobList/noobList.json', 'r') as f: data0 = json.load(f) if str(user) in data0.keys(): pass else: img1 = session.get('message1', prompt = '请发送需要换脸的图片') print(img1) img2 = session.get('message2', prompt = '请发送素材图片') # 我承认了,我是取名废! a = img1.split(',') a = a[2].replace(']', '') a = a.replace('url=', '') print(a) imgres1 = requests.get(a) b = img2.split(',') b = b[2].replace(']', '') b = b.replace('url=', '') imgres2 = requests.get(b) try: file1 = f'ATRI/data/temp/face/{user}' if not os.path.exists(file1): os.mkdir(file1) with open(file1 + '/img1.jpg', 'wb') as f: f.write(imgres1.content) file2 = f'ATRI/data/temp/face/{user}' if not os.path.exists(file2): os.mkdir(file2) with open(file2 + '/img2.jpg', 'wb') as f: f.write(imgres2.content) except: session.finish('请求数据貌似失败了...') img1File = f'ATRI/data/temp/face/{user}/img1.jpg' img2File = f'ATRI/data/temp/face/{user}/img2.jpg' try: change_face(img1File, img2File, user) except: session.finish('emm...貌似失败了呢......') time.sleep(0.5) doneIMG = f'ATRI/data/temp/face/{user}/img3.jpg' img = os.path.abspath(doneIMG) await session.send(f'[CQ:image,file=file:///{img}]') files = f'ATRI/data/temp/face/{user}' os.remove(files) @on_command('change_u_head', aliases = ['接头霸王'], only_to_me = False) async def _(session: CommandSession): pass # 明天做