使用Python从SearchFace结果中获取Vk配置文件的链接(但这并不准确)

图片引起关注:


感兴趣的人系列的框架

今天,我们将讨论使用可用工具进行人脸识别的简便方法。
使用的:Python 3.6,searchface.ru,用于将照片链接转换为id的外部服务(电报中的漫游器,当前)


因此,我们有一个按人脸搜索的网站
看看里面。

内部是发送Post请求的通常形式,该请求返回json作为响应。

一个例子
例如,我们发送了“感兴趣的人”(迈克尔·爱默生)系列中的Harold Finch的照片:


我们得到:

[[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]]]] 


一种API,具有单个(?)方法。

我使用Python自动执行了此过程,将链接保存到文件中以进行进一步分析:

例子
发送照片photo.jpg,将结果保存在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() 


实际应用的想法很简单:我们将合适的人的照片发送,将链接(或链接的哈希)放入数据库中,然后依次发送一堆照片,如果照片中我们感兴趣的人一个人并且没有错误 ,则在检查数据库时的链接会将我们指向它。


感兴趣的人系列的框架

仍然需要找出vk中的ID。

有几种选择:

1.从一些旧链接获取ID

代码示例
 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.由具有著名ID(朋友,熟人,名人..)的人创建您的基地

3.使用外部服务,例如 解析VK照片基础的任务是微不足道的,以前根本没有需求。 现在出现了这样的服务。

例如,我们将在@VkUrlBot电报中使用该漫游器。

机器人数据库是有限的,并非搜索所有ID,因此,对于手动搜索而言,它很不方便,但是免费(在发布时)

由于电报不允许僵尸程序相互通信,因此为了避免循环,我们假装是用户。 为此,请安装telethon,注册一个新的电报应用程序,驱动接收的凭据(id和哈希)。

例子
 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() 


如果可能的话,我使用Telegram Portable +左帐户。 另外,在应用程序中,监视进度很方便:


数据被涂抹得井井有条,这毫无意义。

该漫游器并不总是给出正确的结果,它可以产生多个结果。

开发人员对此评论:


您可以改进此过程,例如,写入虚拟文件并立即检查它。
这可以通过多种方式完成:例如,使用tempfile.SpooledTemporaryFile在RAM中创建虚拟文件,或使用StringIO将其写入String类型的变量。
从相同的VK下载照片并进行后续处理时,这可能很方便。

另外,为了更大的方便,我将两个示例合并为一个。 这个例子不是完美的,但是可行的。

我相信每个人都可以根据自己的需要进行更正。

代号
 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() 


我为什么需要这个? 假设我有一个带相机的ESP-32微控制器。

例如,这样


如果您配置了将面部识别请求发送到外部服务器(例如通过警报),则无需加载微米级资源即可获得高级系统。 对于ESP,框架中分别有面部识别库,您可以选择适当的框架进行发送。

免责声明
作者不是全球监视的支持者,但这是当今的现实。 我考虑了很长时间是否发布此说明,但潘多拉魔盒已经打开。 类似的系统将继续出现。

作者不对第三方的行为负责。
请不要使用该系统损害人们的生命。
我建议不要在评论中使用该政策。
该项目完全是为了好玩。

特别感谢上述系列的作者和
萨兰什·凯里瓦
此外,SearchFace和VkUrlBot的创建者。

思考图片:


感兴趣的人系列的框架

Source: https://habr.com/ru/post/zh-CN441744/


All Articles