diff options
Diffstat (limited to 'ATRI/plugins/AIchangeFace.py')
-rw-r--r-- | ATRI/plugins/AIchangeFace.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/ATRI/plugins/AIchangeFace.py b/ATRI/plugins/AIchangeFace.py new file mode 100644 index 0000000..1d82e12 --- /dev/null +++ b/ATRI/plugins/AIchangeFace.py @@ -0,0 +1,123 @@ +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 # 明天做
\ No newline at end of file |