Собираем базу людей из открытых данных WhatsApp и VK

Собираем базу людей из открытых данных WhatsApp и VK

675
ПОДЕЛИТЬСЯ

кадр из кинофильма Миссия Невыполнима II

Эта история началась пару месяцев назад, в 1-ый день рождения моего отпрыска. На мой телефон пришло СМС-сообщение с поздравлением и пожеланиями от неизвестного номера. Думаю, раз бы это был мой день рождения мне бы хватило наглости выслать в ответ, не совершенно культурное, по моему мнению, «Спасибо, а Вы кто?». Но день рождения не мой, а выяснить кто передаёт поздравления было любопытно.

1-ый фуррор
Было решено испытать последующий вариант:

Добавить неизвестный номер в адресную книжку телефона;
Зайти по очереди в приложения, привязанные к номеру (Viber, WhatsApp);
Открыть новейший чат с вновь сделанным контактом и по фото найти отправителя.

Мне подфартило и в моём случае в перечне контактов Viber рядом с вновь сделанным контактом возникла миниатюра фото, по которой я, не открывая её полностью, распознал отправителя и удовлетворенный проведенным «расследованием» написал смс с благодарностью за поздравления.

Сходу же за секундным промежутком эйфории от успешного поиска в голове возникла мысль перебором по списку номеров мобильных операторов составить базу [номер_телефона => фото]. А еще через секунду мысль пропустить эти фото через систему определения лиц и связать с иными открытыми данными, к примеру, фото из соц сетей.

Естественно на пт 3 (по фото найти отправителя) нас может настигнуть неудача и у данной неудачи есть 6 вариантов:

Номер не привязан к WhatsApp либо Viber
Юзер есть, но он не устанавливал для себя Фото профиля
Фото установлено, но настроены характеристики «приватности» либо «конфиденциальности» («Показывать фото лишь моим контактам», а Вас в этом перечне нет)
Для вас доступно фото, но на нём изображён кот
На фото человек, но черт лица и/либо особенностей телосложения не разобрать (отсутствие резкости, малюсенькое разрешение, затемнённые очки, шапки, кепки, грим)
На фото обладатель номера; анфас; высочайшая четкость, но вспомнить этого человека вы не сможете

4-ый пункт (на фото кот) имеет множество вариантов: это и фото знаменитостей, и персонажи мультов, и фото пищи, каров, орудия и пр.

Тесты на малых порядках.
На телефонах с ОС Android фото контактов Viber хранит в папке /sdcard/viber/media/User photos в виде [Хэш].jpg. Файлы сохраняются лишь при условии, что вы общались с данным контактом либо хотя бы открывали его профиль и удаляются через некое время. В качестве пробы пера было решено экспериментировать на собственном перечне контактов. Для опыта вручную откроем/закроем профили 20-ти юзеров.

Для похожих лиц в окне «Пользователи» возникают иконки с вопросительным знаком. На последующем шаге скармливаем Picas’e папку с фото из Viber. Часть знакомых, для которых были найдены файлы были также найдены в соц сетях, загружены в програмку Picasa с включенной опцией «Распознавать лица автоматически». Распознанные програмкой лица потом были названы соответственно их обладателям.

В моём случае для начальных 20 юзеров Viber Picasa нашла лишь два совпадения. Эти два варианта при этом довольно комично совпали: в каждой паре фото различались меж собой, но были сняты в один и тот же день (для первого человека на 2-ух фото различался поворот головы и наличие/отсутствие ухмылки, для второго различалась лишь ухмылка).

Промежный результат достаточно удачный:
Подборка из Viber: 20 (все попорядку и с котами и с пищей)
Подборка из VK: 5 (лишь раз на фото можно кого-то распознать визуально)
Совпадений верных: 2
Совпадений ложных: 0

Начинаем перебор
Viber берёт контакты из телефонной книжки, которая в свою очередь в ОС Android связана с Google Contacts, которые имеют ограничение в 25 000 номеров на акк. Так что мысль получить базу таковым вот «решением в лоб» отпадает. Москва — 93 311 000. Попробуем получить данные с помощью телефона. На нынешний момент количество номеров мобильных операторов, закрепленных за г. Тем наиболее, что даже раз Viber возьмет хотя бы первую пачку в 25 000 номеров, все равно в каждый профиль необходимо зайти, а позже еще связать получившийся файл [Хэш].jpg с определенным номером (что, наверняка, можно отследить по дате сотворения файла, но это всё равно чрезвычайно трудоёмко и долго).

Этот код при первом и следующих пусках доходил до 220-250 номеров и уходил в timeout — пробуем опосля каждого 200-го делать паузу sleep(5) — не помогает, всё равно timeout. Экспериментировать я не стал, а убил 2-ух зайцев, переписав php скрипт, чтоб он обрабатывал лишь 200 номеров и добавив управляющий скрипт на Bash, который в цикле запускает php с параметром $startPhoneNumber и дожидается его завершения. Чтоб начать процесс нужен *nix сервер и необходимо осознать как можно обнаглеть с частотой и скоростью запросов. Все вызовы идут через php. Соответственно имеем дело или с ограничением на сервере (нужно опосля 200 запросов поновой авторизоваться), или с ошибкой в данной php реализации. Для опыта был написан php код, который авторизуется в Whatsapp и в нескончаемом цикле получает/не получает для номеров +7XXXXXXXXXX getProfilePicture и выдаёт на экран временную метку. Пробуем завершить процесс и сходу запустить поновой — фуррор. Решение было найдено быстро: в сети есть программная реализация другого популярного сервиса — WhatsApp. Есть готовый скрипт регистрации новейшего юзера и фактически пример вызова getProfilePicture.

Таковым образом получили работающую схему перебора со скоростью 5,7 номеров в секунду.
Для обработки всей столичной ёмкости нам будет нужно:

93 311 000 (номеров) / 5.7 (номеров в секунду) / 60 (секунд) / 60 (минут) / 24 (часа) ~ 190 дней.

Многопоточность
Авторизация в WhatsApp идет через связку

username — номера телефона в формате +7XXXXXXXXXX
password — приобретенный через скрипт регистрации (для регистрации нужна работающая симкарта для получения кода доказательства)
nickname — может быть хоть каким

любая. Соотношение количества номеров к сохраненным фотографиям держалось в районе 10 к 1-му; позже разница возросла благодаря «сотням» и «тысячам», которые видимо еще не распределены и для всего спектра не дают ни 1-го изображения. WhatsApp запрещает >1 авторизации на один username мгновенно. В связи с чем в официальном магазине было куплено три SIM-карты оператора Мегафон по 200р. С 1-го и того же сервера на ОС Centos все три номера были зарегистрированы в WhatsApp и на всех 3-х было запущено по скрипту с куском емкости «Билайн Бизнес».

Блокировка
В лицензионном соглашении WhatsApp (с которым я соглашаюсь, когда прохожу регистрацию) сказано:

You agree not to spam, or solicit for commercial purposes, any users of the Service. You agree not to collect or harvest any personally identifiable information, including phone number, from the Service, nor to use the communication systems provided by the Service for any commercial solicitation or spam purposes. or «load testers» such as wget, apache bench, mswebstress, httpload, blitz, Xcode Automator, Android Monkey, etc., that accesses the Service in a manner that sends more request messages to the WhatsApp servers in a given period of time than a human can reasonably produce in the same period by using a WhatsApp application, and you are forbidden from ripping the content unless specifically allowed. WhatsApp reserves the right to revoke these exceptions either generally or in specific cases. Отрывок из соглашения ENGC. You agree not to use or launch any automated system, including without limitation, «robots,» «spiders,» «offline readers,» etc. While we don’t disallow the use of sniffers such as Ethereal, tcpdump or HTTPWatch in general, we do disallow any efforts to reverse-engineer our system, our protocols, or explore outside the boundaries of the normal requests made by WhatsApp clients. You must secure our permission before you measure, test, health check or otherwise monitor any network equipment, servers or assets hosted on our domain. We have to disallow using request modification tools such as fiddler or whisker, or the like or any other such tools activities that are meant to explore or harm, penetrate or test the site. Notwithstanding the foregoing, WhatsApp grants the operators of public search engines permission to use spiders to copy materials from the website for the sole purpose of creating publicly available searchable indices of the materials, but not caches or archives of such materials.

Отрывок из соглашения; примерный перевод«Вы соглашаетесь не применять либо не запускать автоматизированные системы, которые отправляют больше запросов на сервис WhatsApp, чем способен человек…»

Все мои SIM-карты заблокировали на 3-ий день без разъяснения обстоятельств. При попытке зарегистрировать WhatsApp по-человечески с телефона выскакивает сообщение: «Извините, вы больше не сможете воспользоваться обслуживанием WhatsApp.» Что любопытно сервера WhatsApp поначалу стали чрезвычайно долго отвечать на запросы, а позже вообщем закончили авторизовывать. На попытку зарегистрировать номер поновой сервер отвечает "Failed; Reason: Blocked;". По логам видно, что отключение вышло в 00:22 по Москве по всем картам сразу (карты успели обработать любая около 500 000 номеров).

Не считая того, что все три запущенных скрипта делали одно то же с одной и той же скоростью у их было много общего, чтоб заблокировать их сразу, а конкретно: все логинились с одним и тем же nickname «V» и работали с 1-го и того же IP-адреса.

Усложняем схему

потраченные на те три SIM) умней. На этот раз покупаем 10 сим карт в «неофициальном магазине» у метро по 100р. за штуку. Считаем, что стали чуток-чуток (а конкретно на 600р. Усложняем скрипт, создаём массив симкарт и даём каждой собственный nickname согласно списку актёров 1-го восхитительного кинофильма:

Объявление массива// username,"password","nickname"
$SIMDict = array( <br>
"SIM1" => array(7969XXXXXXX,"123123211231231231231231231=","Zooey"),
"SIM2" => array(7916XXXXXXX,"123123211231231231231231231=","Martin"),
"SIM3" => array(7985XXXXXXX,"123123211231231231231231231=","Sam"),
"SIM4" => array(7916XXXXXXX,"123123211231231231231231231=","Bill"),
"SIM5" => array(7985XXXXXXX,"123123211231231231231231231=","Mos"),
"SIM6" => array(7985XXXXXXX,"123123123211231231231231231=","Warwick"),
"SIM7" => array(7916XXXXXXX,"123123211231231231231231231=","Anna"),
"SIM8" => array(7985XXXXXXX,"123123123123123123123123121=","John"),
"SIM9" => array(7,"","Kelly"),
"SIM10" => array(7,"","Jason")
);

Остается лишь вынудить процессы php выходить в веб каждый с различным ip адресом. Заставляем каждую сим карту выходить через отдельный IP адресНаш Centos — виртуальный сервер, запущенный под гипервизором Hyper-V, что дозволяет нам добавить в него еще 7 Ethernet адаптеров (ограничение Hyper-v: 8 Ethernet адаптеров + 4 legacy).

В вебе не так много статей про ip netns, а те которые есть дают различные показания по использованию физических интерфейсов — некие пишут, что нельзя физический интерфейс добавить в namespace хороший от default, некие, что можно, но лишь связать через tap интерфейс, некие, что можно и без tap. В системе по умолчанию есть подсистема ip namespaces (ip netns), которая дозволяет на сто процентов виртуализировать сетевой стек. Это значит что можно создавать так именуемые namespac’ы (ns), и в рамках каждого отдельного ns будут свои адреса, маршруты, правила, dns и пр.

А вот вариант сделать 7 namespace’ов и к каждому привязять отдельный физический интерфейс, невзирая на заверения веб общества, удалось без заморочек. Сделать семь secondary ip (alias) и раскидать их по различным namespace у меня не вышло, ни впрямую ни через tap интерфейсы.
Команды настройкиLINUX
ip netns add net1 && ip link set netns net1 dev eth1
ip netns exec net1 ip addr add Y.Y.Y.71/24 dev eth1
ip netns exec net1 ip link set up dev eth1
ip netns exec net1 ip route add default via Y.Y.Y.1
ip netns add net2 && ip link set netns net2 dev eth2
ip netns exec net2 ip addr add Y.Y.Y.72/24 dev eth2
ip netns exec net2 ip link set up dev eth2
ip netns exec net2 ip route add default via Y.Y.Y.1
CISCO
ip nat inside source static Y.Y.Y.71 X.X.X.71
ip nat inside source static Y.Y.Y.72 X.X.X.72

Legacy adapter не заработал вообщем, потому остановимся на 8-ми карточках.

Пример вызова: Сейчас скрипт Bash берёт на вход startNumber, endNumber, SIM, NS, где SIM имя симкарты в массиве, NS — имя namespace в котором запустить процесс php.
./run.sh 79671380000 79671780000 SIM1 net1 &
Сам скрипт run.sh… start=$1
last=$2
net=$4
startParam="ip netns exec $net"
./pushme.sh "$3 $4" "$start begins"

while [ $start -lt $last ]
do

$startParam php ./getProfiles.php instance=$start prefix=$start count=50 sim=$3 net=$4
#> $3.log
start=$(( $start + 50 ))

done

Также добавляем в Bash и php скрипты Push-уведомления через Pushover («7XXXXX start», «7XXXXX finish», «Houston we have a problem») Делим емкость на куски меньше 2 000 номеров.

Крайнее отправляем при необычных ответах сервера WhatsApp, или при чрезвычайно долгом (>5 секунд) отсутствии ответа.

Что уже полностью хорошо. В любом случае 8 000 000 телефонных номеров скрипты всё-таки удачно проработали и у нас на руках 411 279 фото. Соотношение 20 к 1. Забегая вперёд желаю огласить, что WhatsApp хитрее меня и все эти симкарты тоже были заблокированы через некое время и тоже практически сразу.

Москва Подборка из результатов обработки по г.

Ненецкий автономный округ
В конце концов вольная минутка возникла, а совместно с ней силы признать, что начинать перебор с Москвы (население 12 197 596 человек) — это лихо. Длительное время не было способности активировать оставшиеся сим-карты и запустить скрипты. Потому прячем глубже собственный юношеский максимализм и берём наименее населенный субъект, к примеру, Ненецкий автономный округ. Запускаем скрипт — и через 12 часов перебор всех емкостей Ненецкого округа завершен. Почему бы и нет. Перебегаем к последующему шагу. Для 169 995 номеров было найдено всего 2 208 фото в WhatsApp.

ВКонтакте
Задачка: получить все фото юзеров VK, у которых указан интересующий нас город.

Большое количество времени ушло, чтоб разобраться с VK API. И оказалось, что запрос getuser выполнить можно без заморочек, не имея access-token. В этом нам поможет статья Как я получал access token для взаимодействия с vk api. А вот запрос search (чтоб взять лишь людей из определенного городка) сработает лишь с токеном, при этом приобретенным на юзера, а не на standalone приложение. Но даже когда мы получили этот токен — мы утыкаемся в ограничение — получить можно лишь 1000 юзеров (не 1000 за один запрос, а 1000 всего), при том, что, к примеру, город Нарьян-Мар (Ненецкий АО) указан у 15 660 человек.

Пробуем пойти через get_users перебором: перебираем всех юзеров вконтакте от $id = 1 до N последующим запросом:
response=$(curl —silent "https:// api.vk.com /method/users.get?user_id=$id&fields=photo_max_orig,country,city")
В сети вконтакте на момент написания данной статьи было N = 300 000 000 юзеров. На один таковой запрос без скачки фото уходила 1 секунда.

300 000 000 (юзеров) / 1 (в секунду) / 60 (секунд) / 60 (минут) / 24 (часа) ~ 3472 дней.

Вариант отбрасываем. Итого около 3472 дней в одном потоке, при условии, что VK не будет перекрыть наши IP-адреса.

Возвращаемся к users.search с ограничением на количество в выдаче, но не на «качество» запроса. Итого 66 прогонов по 1000, с замечанием, что, раз для неких возрастов мы перевалим за 1000 — такие запросы мы повторим с доп разделением по полу. В запросе можно нескончаемо уточнять характеристики: к примеру, взять лишь дам либо парней, уменьшив выдачу в два раза, либо взять лишь тех, у кого есть фото, и что самое комфортное — взять лишь людей определенного возраста, естественно в цикле от $age = 14 до 80. Поясняю.

Распределение юзеров VK из г. Нарьян-Мар по возрасту

Скрипт постепенного скачки из VK01: acc_token="abc123abc123abc123abc123abc123abc123abc123abc123"
02: vk_url="api.vk.com/method/users.search?has_photo=1&count=1000&city=2487&country=1&access_token=$acc_token&fields=photo_max_orig"
03:
04: for age in {14..80}
05: do
06: echo -n $id " " >>vk.log
07: date +"%T" >>vk.log
08: mkdir photos/$id
09: list=$(curl —silent "$vk_url&age_from=$age&age_to=$age" | jq ‘.response | .[] | (.uid|tostring) + " " + .photo_max_orig’ |
sed ‘s/^"(.*)"$/1/’)
10: counter=0
11: while read -r line; do
12: let counter++
13: arr=($line)
14: echo -n "$counter." >>vk.log
15: photo=${arr[1]}
16: filename=${arr[0]}$(echo $photo | sed "s/.*(..*).*$/1/")
17: wget $photo -O photos/$id/$filename
18: done <<< "$list"
19:done

Фактически, скрипт, используя приобретенный заблаговременно (с того же IP) access_token запрашивает через VK API в цикле перечень всех людей определенного возраста из определенного городка (city=2487).
Самое увлекательное тут — строка № 9:
Она превращает JSON ответ от вконтакте вида ( {«response»:[COUNT,{«uid»:XXXXXXX,«first_name»:«Иван»,«last_name»:«Иванов»,«photo_max_orig»:«http://QQQ.vk.me/ZZZ/YYY.jpg»} ) в перечень
id photo_url (XXXXX http:// QQQ.vk.me /ZZZ/YYY и т.д.)
Методов это воплотить масса и наверное есть наиболее красивый вариант. Но в поисках как это сделать я наткнулся на так именуемый «jq is a lightweight and flexible command-line JSON processor», синтаксис которого мне понравился:
jq ‘.response | .[] | (.uid|tostring) + " " + .photo_max_orig’

Раз читать с конца, то: взять текстом id юзера (.uid|tostring) с ссылкой на фото .photo_max_orig для всех частей массива .[] в рамках объекта response

На 19 годах VK что-то заподозрили, и стали чрезвычайно медлительно отвечать на запросы. Еще 400 скачанных изображений оказались, по каким-то причинам битыми, или чрезвычайно малеханькими (<10 кб). У других 1 700 человек возраст видимо не был указан вообщем. Через полтора часа было скачано 13 967 изображений.

Определение и сопоставление лиц
Поможет нам с сиим OpenCV (Open Source Computer Vision Library, библиотека компьютерного зрения с открытым начальным кодом). Как мы уже узнали посреди приобретенных изображений множество котов и каров, потому для начала охото их отфильтровать.

Она же совместно с ImageMagick вырежет по координатам распознанное лицо в отдельный файл. Существует множество реализаций, на разных языках программирования, основанных на данной библиотеке. К примеру, facedetect, которая описывает координаты по которым находится лицо на фото.

По распознаванию лиц на фото, есть увлекательная реализация от компании Betaface. У их платное API для огромного количества изображений, но есть хорошая демо, которая распознает всех присутствующих на загруженном фото и не считая остального описывает пол, наличие усов, очков, ухмылки и (дамам это не понравится) указывает предположительный возраст (мне даёт 27, плюшевому зайчику на холодильнике — 42).

Он написал их в рамках чрезвычайно увлекательного проекта. Мы же возьмем готовые скрипты на python от британского разраба Terence Eden. В его задачке стояло: скачать открытую коллекцию картин Английского музея «Тейт Британия», и распознать на ней изображения людей. Web API он, к огорчению, не даёт, но все исходники есть на github. Потом с помощью получившейся базы лиц и собственной фото можно отыскать картину, на которой изображен человек очень схожий на тебя.

Корректируем скрипт Тэренса — выключаем скачка из Английской галереи и удаляем обработку по папкам.
Скрипт на pythonimport sys, os
import cv2
import urllib
from urlparse import urlparse

def detect(path):
img = cv2.imread(path)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
rects = cascade.detectMultiScale(img, 1.3, 4, cv2.cv.CV_HAAR_SCALE_IMAGE, (20,20))

if len(rects) == 0:
return [], img
rects[:, 2:] += rects[:, :2]
return rects, img

def box(rects, img, file_name):
i = 0 # Track how many faces found
for x1, y1, x2, y2 in rects:
print "Found " + str(i) + " face!" # Tell us what’s going on
cut = img[y1:y2, x1:x2] # Defines the rectangle containing a face
file_name = file_name.replace(‘.jpg’,’_’) # Prepare the filename
file_name = file_name + str(i) + ‘.jpg’
file_name = file_name.replace(‘n’,»)
print ‘Writing ‘ + file_name
cv2.imwrite(‘detected/’ + str(file_name), cut) # Write the file
i += 1 # Increment the face counter

def main():
for filename in os.listdir(‘whphotos’):
print filename + " "
rects, img = detect("whphotos/" + filename)
box(rects, img, filename)
os.remove("whphotos/" + filename)

if __name__ == "__main__":
main()

Результат обработки:
(с учетом / без учёта случаев с несколькими лицами на одном фото) 13 500 изображений из VK => 6 427 / 5 446 лиц.
2 208 из WhatsApp => 963 / 876 лиц

Проглядывается увлекательная закономерность — каждый 2-ой юзер не ставит фото на профиль.

Можно представить какого бы размера он был в случае с VK. Потому по одному комплекту готовим таковой файл, а из второго позже берём по одному элементу и ищем соответствие. Исправляем ошибку и ждём еще 20 минут. Следом за распознанием идёт создание модели eigenfaces.xml. Смешно бы было прождать несколько дней выполнения скрипта и лишь позже это найти. Техника решила за меня какой из комплектов брать за основной: 6 400 фото из VK скрипт обработать не сумел с ошибкой по памяти "Couldn’t allocate over 4GB". Скриптом предвидено по папке начальных фото сформировать XML файл, по которому в будущем будет производиться поиск. Время — 11 ночи — разбираться не охота — пропускаем через скрипт 963 фото из WhatsApp и через 20 минут имеем eigenfaces.xml размером 1.6 ГБ. Позднее оказалось, переделывая скрипт под себя, я случаем удалил строчку идентификации в модели, заместо неё все элементы имели идентификатор «0».

Потом для каждого файла из VK запускаем скрипт проверки.
find detectedVK/ -name *.jpg -exec ./myscript.sh {} ;

#myscript.sh
python recognise.py detectedWH $1 100000 >> result
`100000` тут — точность совпадения, при 100 — безупречное совпадение.
6 400 * 40 ~ 3 дня на одном процессоре. На одно сопоставление имеем 40 секунд. Оставляем на ночь; идем спать — завтра пн.

При том создавалось чувство, что эти двое родственники. Пока работали скрипты я временами смотрел на совпадения. Итог увлекательный, но это не совершенно то, что мы находили. Сходу скажу, что у меня были мысли, что для таковой малеханькой подборки совпадений будет ноль. С указанной мною точностью результатов было много, но при ближнем рассмотрении даже на совпадениях порядка `3500` было множество результатов мальчишка-девченка.

Для всех результатов с точностью <6000 с помощью convert объединяем совпавшие изображения, чтоб визуально совсем принять решение Женщина Яна из городка Нарьян-Мар поставила схожую фотографию и в WhatsApp и в VK. 1-ое попадание случилось к концу первой тыщи аккаунтов. Невзирая на то, что фото однообразные (различается лишь разрешение) точность совпадения ~3 000.

if [ "$precise" -lt 6000 ]
then
echo $precise $whIMG $vkIMG
convert detectedWH.bak/$whIMG detectedVK.bak/$vkIMG -append convertResults/${precise}_$whIMG$vkIMG
fi
… …

Итого к окончанию вторых суток удачно распознаны и привязаны к номеру телефона 25 аккаунтов VK.

Это 2% от числа отысканных лиц WhatsApp, или 1% от всех изображений.

Результаты анализа по г.Нарьян-Мар

Я верю, что это хороший итог, и вот почему:

У нас мелкие подборки, с большой различием меж ними (16 600 VK против 2 000 WhatsApp);
Для поиска совпадений мы употребляли лишь метод Eigenfaces, а можно добавить, к примеру, Fisherfaces;
Можно прирастить шансы на распознание добавив по аналогии перебор через Viber;
Из VK можно брать не лишь крайнее фото профиля, но и несколько прошлых;
В конце концов, к списку соц сетей можно добавить Facebook, Одноклассники и пр.

Процессорные мощности для этого естественно тоже нужно прирастить в несколько раз. Здесь трудно говорить о определенных цифрах, но можно точно огласить, что процент удачных попаданий существенно возрастет, раз соблюсти все пункты.

Заключение
Полезного для общества практического внедрения приобретенных данных я пока не выдумал. К чему это всё. Вышло маленькое исследование ради исследования.

Библиотека OpenCV хороший инструмент, используя который на приобретенных данных, можно провести еще ряд увлекательных тестов.

Не беря во внимание моральную составляющую (а конкретно, вопросец: культурно ли звонить незнакомым людям), набираем номер и приглашаем в кино. Прикольно ведь пойти в кино с женщиной, которая с точностью 3000 к 100 похожа на главную героиню. В заслугу дочитавшим до конца, таковой, к примеру, радостный вариант: Собрать модель eigenfaces.xml по фотографиям узнаваемых актрис, русских и забугорных, и провести перебор на соответствие по приобретенной из WhatsApp базе москвичей (у нас их на данный момент ~400 000).

Но я не большой приверженец параноидальных настроений (" Они знают где я", «Интернет-провайдер знает обо мне всё», «Большой брат смотрит за нами» и пр.). Еще в качестве вывода можно было бы огласить: «Не запамятовывайте ставить галочки в настройках приватности». Меня, к примеру, развлекает, когда моя супруга выключает сбор анонимных геоданных на телефоне, со словами, что её «найдут» (кто, а основное для чего она пока не выдумала).

habrahabr.ru Не знаю будет ли меня когда-нибудь кто-нибудь находить — я в собственной жизни вроде бы ничего не нарушал (не считая лицензионного соглашения WhatsApp).