import requests
from json import loads
from base64 import b64encode
import os
import shutil

API_key = '隐藏百度AK'
Secret_key = '隐藏百度SK'

#根据文档,定义获取access_token的url地址,传入API key和Secret key
token_url = token_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={api_key}&client_secret={api_sec}'.format(api_key=API_key,api_sec=Secret_key)
#请求秘钥,获得返回的文字内容
token_request = requests.get(token_url).text
#将返回的内容格式化为字典形式,并访问字典中"access_token"的值
access_token = loads(token_request)['access_token']

#写一个函数
def AiFace(img_path):

    url = 'https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=' + access_token       #请求的url,加上access_token参数
    img = open(img_path,'rb').read()    #二进制方式读取图片
    img_b64 = b64encode(img)     #将图片转为base64编码
    #发送的数据
    data = {
        'image':img_b64,      #图片的base64编码
        'image_type':'BASE64',  #图片类型
        'face_field':'beauty,gender',   #需要返回的参数
        'max_face_num':1    #每张图片中最多返回一张人脸
    }
    r = loads(requests.post(url,data).text)     #请求一下,然后把返回的内容转化为字典形式

    if r['error_code'] == 0:    #如果识别成功,函数结束,return出结果
        return r['result']['face_list'][0]
                    #如果不成功,那么啥都不return(None)

####开始运行

img_folder = 'd:/1/'     #图片文件夹
save_folder = 'd:/2/'  #结果保存的文件夹

#
for root,path,files in os.walk(img_folder):     #遍历图片文件夹
    info_dic = {}
    count = 0
    for file in files:
        complete_path = os.path.join(root,file)     #获得文件的完整路径
        if '.jpg' in complete_path:     #去除不是jpg的文件
            count += 1
            print(str(count)+'-检测--->'+complete_path)
            result = AiFace(complete_path)  # 实例化函数
            if result != None:      #去除识别错误的文件(没有人脸)
                face_probability = result['face_probability']  # 是人脸的可能性
                beauty = round(result['beauty'], 2)  # 颜值,保留二位小数
                gender = result['gender']['type']  # 男女
                if face_probability >0.75:  #去除人脸置信度小于0.75的图片
                    if gender == 'female':  #去除不是女性的图片
                        info_dic[complete_path] = beauty    #结果保存到字典中 {文件路径:颜值}
                        print('---检测到人脸,颜值'+str(beauty)+'分---')

os.makedirs(save_folder)
face_count = len(info_dic) #计算字典长度

for i in range(1,len(info_dic)+1):  #遍历字典中的内容
    max_beauty_file = max(info_dic,key=info_dic.get)    #找到最高颜值对应的key(文件路径)
    beauty_score = info_dic[max_beauty_file]        #找打到最高颜值
    img_name = str(i)+'-('+str(beauty_score)+'分).jpg'
    shutil.copy(max_beauty_file,save_folder+img_name)   #复制到新文件夹并改名为排名+颜值分
    info_dic.pop(max_beauty_file)     #删除字典中的这个元素
    i+=1

print('\n完成,共检测'+str(count)+'张图片,其中'+str(face_count)+'张有人脸')
print('颜值排序已保存到:'+save_folder)