Obtener enlaces a perfiles Vk de los resultados de SearchFace usando Python (pero esto no es exacto)

Imagen para llamar la atención:


Fotograma de la serie Persona de interés

Hoy hablaremos sobre el reconocimiento facial sencillo con las herramientas disponibles.
Usado: Python 3.6, searchface.ru, un servicio externo para convertir enlaces a fotos en id (bot en telegram, actualmente)


Entonces, tenemos un sitio web que busca por caras.
Echa un vistazo al interior.

Dentro está el formulario habitual que envía una solicitud de publicación, que devuelve json en respuesta.

un ejemplo
Enviamos una foto, por ejemplo, de Harold Finch de la serie Persona de interés (Michael Emerson):


Obtenemos:

[[0.991, [['https://pp.userapi.com/h2ViUULg76AaNRw9XBBJOkBMOhQbphQivldE8A/wledD6KFj7I.jpg', 310, 136, 122]]], [0.984, [['https://pp.userapi.com/c622531/v622531393/4fa11/x-N_Rv4lUp0.jpg', 251, 178, 99]]], [0.972, [['https://pp.userapi.com/c840426/v840426427/5f090/m9XVCm9Zd4k.jpg', 200, 143, 78]]], [0.918, [['https://pp.userapi.com/c840339/v840339996/30f51/h_HS2peh0Hs.jpg', 80, 100, 75], ['https://pp.userapi.com/c840138/v840138996/52746/lgYobQh0EIo.jpg', 281, 201, 112], ['https://pp.userapi.com/c840420/v840420996/32a0e/MsauPmM6obU.jpg', 293, 137, 80]]], [0.906, [['https://pp.userapi.com/uacyJQkkoESbTNhRAo6JcqfyKVsPMwZYqTEzfw/GZKQ9rLNlpA.jpg', 310, 122, 127], ['https://pp.userapi.com/QQJWVDF2YT1MvkupPgahB2Uz3_vkZ7-FAhIucw/tva0l9dBAj8.jpg', 642, 325, 257], ['https://pp.userapi.com/LI5hCDYqB8Ju9KA8hQjf1yzYVmuliA7uBXuJoA/_4q-yoLXCRI.jpg', 293, 277, 170]]], [0.893, [['https://pp.userapi.com/xvSllwTcM3tJ8bwi8yhn10fnCgT68X_24Q3peQ/yY8N1DxpQ5o.jpg', 324, 340, 194], ['https://pp.userapi.com/h2ViUULg76AaNRw9XBBJOkBMOhQbphQivldE8A/wledD6KFj7I.jpg', 310, 136, 122], ['https://pp.userapi.com/HJeMSYoCLGdub2ueloZA7pqOin9QVkLhnHCRUw/49ngz53y4gw.jpg', 306, 347, 140], ['https://pp.userapi.com/SpuLGp49INoN0mr0J1cs5uQD6G9Zqb8boABlpQ/Zfh9Ay8zHvc.jpg', 235, 254, 66]]], [0.891, [['https://pp.userapi.com/c628825/v628825986/ac15/ucROr8sUVto.jpg', 304, 120, 90]]], [0.886, [['https://pp.userapi.com/nxyVWitUFsvxOP1bAbabmGGEg8GPrjEryvFRRQ/NOjnG-Oxl_Q.jpg', 142, 192, 121], ['https://pp.userapi.com/L-40BbkBjFiy4BZJNIlFBqASysOPldnZEqzraA/HM9rgh9hKpo.jpg', 813, 383, 172], ['https://pp.userapi.com/tJpeoXXZzm2EIgajpUxh8AuXHDtBcF1NJ1OefA/TMrMSuLb9eE.jpg', 497, 357, 199]]], [0.879, [['https://pp.userapi.com/c836527/v836527332/5212c/pz-mv3JoSoY.jpg', 298, 216, 161]]], [0.877, [['https://pp.userapi.com/c637416/v637416770/60691/dfGmo0NzQxE.jpg', 298, 215, 156]]], [0.871, [['https://pp.userapi.com/c636926/v636926559/35798/8VjR2jNfPfU.jpg', 399, 381, 216], ['https://pp.userapi.com/c636927/v636927559/33577/vFJobCuXEAw.jpg', 199, 150, 65], ['https://pp.userapi.com/c636927/v636927559/337d5/OAeQ3Hw2mb4.jpg', 506, 139, 65], ['https://pp.userapi.com/c841334/v841334162/799ce/R0XkD7T4B44.jpg', 521, 288, 293], ['https://pp.userapi.com/c824204/v824204162/f0dec/q_cZvfXl8Wc.jpg', 317, 407, 246]]], [0.869, [['https://pp.userapi.com/QJ1FU4eGuSes4UxeitONvx3uolZvNDXq61JDcg/9bBDAO3RKwo.jpg', 330, 236, 170]]], [0.861, [['https://pp.userapi.com/c305901/v305901469/57ed/y3u2vHkdbLY.jpg', 235, 192, 197], ['https://pp.userapi.com/c622124/v622124469/51cc/sCsVgsWILT8.jpg', 234, 202, 223], ['https://pp.userapi.com/c625321/v625321469/1093d/RL1x2C9ZXXo.jpg', 255, 154, 135], ['https://pp.userapi.com/c630924/v630924469/3baf2/wUNtCyOtxkk.jpg', 311, 264, 561], ['https://pp.userapi.com/c630924/v630924469/3bb6c/gCq6-DJMrxw.jpg', 466, 170, 211]]], [0.849, [['https://pp.userapi.com/c604631/v604631165/12043/vFf7H0_YMn8.jpg', 300, 145, 223], ['https://pp.userapi.com/c636625/v636625165/3ebc1/xNAwmB38DLM.jpg', 989, 223, 156], ['https://pp.userapi.com/c636625/v636625165/3ebcb/BoFgWTDlNt4.jpg', 725, 381, 247]]], [0.847, [['https://pp.userapi.com/c621930/v621930615/1fee3/mxs1ujqVJNw.jpg', 797, 362, 345], ['https://pp.userapi.com/c625428/v625428615/391fa/czEn2oj77kQ.jpg', 462, 205, 152], ['https://pp.userapi.com/c623928/v623928615/344b0/fntYJm5VtWw.jpg', 744, 789, 461]]], [0.841, [['https://pp.userapi.com/rw-gkzZmq2p_HqVCFmUKcY6DWveJFqS6P4mqTA/uLsYHKv1u2E.jpg', 332, 179, 135], ['https://pp.userapi.com/ObAY2Vt1s1xF7MacRbdMEDtOoQ8mvdIPZpMPtA/e8jJydqmyRM.jpg', 303, 369, 240], ['https://pp.userapi.com/TWNCYtNxiq1KadoXtILhiKIx2XKcmg-56Ks8ow/siomQIkxTiU.jpg', 174, 249, 141], ['https://pp.userapi.com/3kDEgo6u3pnVfDq5wj3FLYJtDVPJReTpuL_cPg/o-pZesCYX3s.jpg', 357, 238, 111], ['https://pp.userapi.com/xaPb0xwcLy9NPVfujOv8EmZJnscQeKhiITWvyg/rCAfnO81Mco.jpg', 426, 292, 288]]]] 


Un tipo de API, con un único método (?) .

Automaticé este proceso en Python, guardando los enlaces en un archivo para su posterior análisis:

Ejemplo
Enviar foto photo.jpg, guardar el resultado en file.txt

 import requests import os import sys import re photo = 'photo.jpg' file = 'file.txt' url = 'http://searchface.ru/request/' proxies = { 'http': '46.101.1.221:80', 'https': '46.101.1.221:80', } def request_page(filename): try: files = { 'upl': (filename, open(filename, 'rb')), } r = requests.post(url, files=files, proxies=proxies) return r except: print("no file") r = {} return r def save_image_links(r, filename): try: j = r.json() # print(j) except: print("no json") return False print("Save images links:") img_file = open(filename, 'w') for i in r.json(): # print(i[1][0][0]) print(i[0]) img_file.write(str(i[0]) + '\n') for k in i[1]: # print(str(k)) print(str(k[0])) img_file.write(str(k[0])+ '\n') img_file.close() return True def main(): r = request_page(photo) print(r) save_image_links(r, file) if __name__ == '__main__': try: main() except KeyboardInterrupt: exit() 


La idea de la aplicación práctica es simple: enviamos fotos de las personas adecuadas, ponemos enlaces (o hashes de enlaces) en la base de datos, enviamos un montón de fotos a su vez, si la persona que nos interesa está sola en la foto y no habrá errores , el enlace al verificar en la base de datos nos señalará.


Fotograma de la serie Persona de interés

Queda por descubrir id en vk.

Hay varias opciones:

1. Obtener identificación de algunos enlaces antiguos

ejemplo de código
 import re def id_in_string(s): result = re.findall(r'/u\d+/', s) a = s.find('/u') if(len(result) > 0): b = str(result).find("/']") return 'https://vk.com/id' + str(result)[4:b] 

2. Cree su base de personas con identificaciones famosas (amigos, conocidos, celebridades ...)

3. Use un servicio externo, como La tarea de analizar la base de la foto VK es trivial, simplemente no había demanda antes. Ahora tales servicios están apareciendo.

Por ejemplo, usaremos el bot en el telegrama @VkUrlBot.

La base de datos de bot es limitada, no se busca toda la identificación, por lo tanto, la búsqueda manual es inconveniente, pero gratuita (en el momento de la publicación) .

Dado que los telegramas no permiten que los bots se comuniquen entre sí, para evitar bucles, haremos de usuario. Para hacer esto, instale telethon, registre una nueva aplicación de telegrama, maneje las credenciales recibidas (id y hash).

Ejemplo
 import socks import time import re from telethon import TelegramClient, sync from telethon.tl.functions.messages import SendMessageRequest api_id = #int api_hash = '' phone = '' username = '' file = "file.txt" def string_to_vk_id(s): return re.findall(r'(https?://[^\s]+)', s) def main(): with TelegramClient(username, api_id, api_hash, proxy=(socks.SOCKS5, '127.0.0.1', 9150)) as client: print("Client OK") ''' ,  'some_name'      ( ,      ),  'some_name.session'  .         Python sqlite3. ,           ,          .         ,     .''' # Ensure you're authorized if not client.is_user_authorized(): client.send_code_request(phone) try: client.sign_in(phone, input('Enter the code: ')) except SessionPasswordNeededError: client.sign_in(password=input('Password: ')) me = client.get_me() print(me) from telethon.tl.functions.messages import GetDialogsRequest from telethon.tl.types import InputPeerEmpty message_id_prev = 0 get_dialogs = GetDialogsRequest( offset_date=None, offset_id=0, offset_peer=InputPeerEmpty(), limit=30, hash=0 ) f = open(file, 'r') for line in f: line = str(line) line = line[:line.find('\n')] if len(str(line)) > 10: print("read line:", line) dialogs = client(get_dialogs) print() print("------") print() print("------") print() print(dialogs.messages[0]) print("***") print('Message: ', dialogs.messages[0].id) if message_id_prev != dialogs.messages[0].id: if int(dialogs.messages[0].from_id) == 758548535: #id=758548535, username='VkUrlBot' print("------") print(dialogs.messages[0].message) print("------") print(string_to_vk_id(str(dialogs.messages[0].message))) # print(dialogs.messages[0].media) print("...sleep") time.sleep(4) #  print(".........") message_str = str(line) try: result = client(SendMessageRequest(client.get_input_entity('VkUrlBot'), message_str)) except: print("Exception") time.sleep(1) print("------") time.sleep(1) print("------") dialogs = client(get_dialogs) print(dialogs.messages[0].message) if __name__ == '__main__': try: main() except KeyboardInterrupt: exit() 


Utilicé Telegram Portable + cuenta izquierda, en caso de un posible bloqueo. Además, en la aplicación es conveniente monitorear el progreso:


los datos están manchados de decencia, tiene poco sentido.

El bot no siempre da el resultado correcto, puede producir varios.

Comentario del desarrollador sobre esto:


Puede mejorar este proceso, por ejemplo, escribir en un archivo virtual y verificarlo inmediatamente.
Esto se puede hacer de varias maneras: por ejemplo, crear un archivo virtual en RAM usando tempfile.SpooledTemporaryFile , o escribir en una variable de tipo String usando StringIO .
Esto puede ser conveniente al descargar fotos desde el mismo VK y el procesamiento posterior.

Además, combiné los dos ejemplos en uno, para mayor conveniencia. El ejemplo no es perfecto, sino que funciona.

Creo que todos podrán corregirlo según sus necesidades.

codigo
 import requests import socks import time import re from telethon import TelegramClient, sync from telethon.tl.functions.messages import SendMessageRequest api_id = api_hash = '' phone = '' username = '' file = "file.txt" photo = 'photo.jpg' url = 'http://searchface.ru/request/' proxies = { 'http': '46.101.1.221:80', 'https': '46.101.1.221:80', } def request_page(filename): #    ,     files = { 'upl': (filename, open(filename, 'rb')), } r = requests.post(url, files=files, proxies=proxies) return r def id_in_string(s): result = re.findall(r'/u\d+/', s) a = s.find('/u') if(len(result) > 0): b = str(result).find("/']") return 'https://vk.com/id' + str(result)[4:b] else: return '' def save_image_links(r, filename): try: j = r.json() # print(j) except: print("no json") return False print("Save images links:") img_file = open(filename, 'w') imagename = 0 for i in r.json(): # print(i[1][0][0]) print(i[0]) img_file.write(str(i[0]) + '\n') for k in i[1]: # print(str(k)) print(str(k[0])) img_file.write(str(k[0])+ '\n') img_file.close() return True def string_to_vk_id(s): return re.findall(r'(https?://[^\s]+)', s) def main(): r = request_page(photo) #  #   -     print(r) save_image_links(r, file) #   ,     #    with TelegramClient(username, api_id, api_hash, proxy=(socks.SOCKS5, '127.0.0.1', 9150)) as client: print("Client OK") ''' ,  'some_name'      ( ,      ),  'some_name.session'  .         Python sqlite3. ,           ,          .         ,     .''' # Ensure you're authorized if not client.is_user_authorized(): client.send_code_request(phone) try: client.sign_in(phone, input('Enter the code: ')) except SessionPasswordNeededError: client.sign_in(password=input('Password: ')) me = client.get_me() print(me) from telethon.tl.functions.messages import GetDialogsRequest from telethon.tl.types import InputPeerEmpty message_id_prev = 0 get_dialogs = GetDialogsRequest( offset_date=None, offset_id=0, offset_peer=InputPeerEmpty(), limit=30, hash=0 ) for i in r.json(): # print(i[1][0][0]) print(i[0]) for k in i[1]: # print(str(k)) # print(str(k[0])) print("link to image: ", str(k[0])) dialogs = client(get_dialogs) print() print("---------") print() print(dialogs.messages[0]) print("---------") print('Message: ', dialogs.messages[0].id) if message_id_prev != dialogs.messages[0].id: if int(dialogs.messages[0].from_id) == 758548535: #id=758548535, username='VkUrlBot' print("---------") print(dialogs.messages[0].message) print("---------") print("vk id list: ",string_to_vk_id(str(dialogs.messages[0].message))) # print(dialogs.messages[0].media) print("...sleep") time.sleep(4) #  print(".........") message_str = str(k[0]) try: result = client(SendMessageRequest(client.get_input_entity('VkUrlBot'), message_str)) except: print("Exception") time.sleep(1) print("---------") time.sleep(1) print("---------") dialogs = client(get_dialogs) print(dialogs.messages[0].message) if __name__ == '__main__': try: main() except KeyboardInterrupt: exit() 


¿Por qué necesito esto? Digamos que tengo un microcontrolador ESP-32 con una cámara.

Por ejemplo, tal


Si configura el envío de una solicitud de reconocimiento facial a un servidor externo, por ejemplo, por alarma, puede obtener un sistema avanzado sin cargar los recursos de micras. Para ESP hay bibliotecas de reconocimiento facial en el marco, respectivamente, puede seleccionar el marco apropiado para enviar.

Descargo de responsabilidad
El autor no es partidario de la vigilancia global, pero esta es la realidad de hoy. Durante mucho tiempo pensé si publicar esta instrucción o no, pero Pandora's Box ya está abierta. Sistemas similares seguirán apareciendo.

El autor no es responsable de las acciones de terceros.
No utilice el sistema en detrimento de las personas.
Recomiendo abstenerse de la política en los comentarios.
El proyecto es completamente solo por diversión.

Un agradecimiento especial a los creadores de la serie mencionada y
Saransh kejriwa
Además, los creadores de SearchFace y VkUrlBot.

Imagen para el pensamiento:


Fotograma de la serie Persona de interés

Source: https://habr.com/ru/post/441744/


All Articles