Автоматизированный реверсивный поиск видеороликов с YouTube по заставке
Статья была впервые опубликована в блоге AutomatingOSINT.com.
У Элиота Хиггинса есть очень интересный пост, в котором он рассказывает, как проверить подлинность видео с YouTube по заставке или даже найти другие сайты, на которых это видео было опубликовано или с которыми оно связано. Этот метод называется «реверсивным поиском», и я уже рассказывал о нем в этом блоге. Это один из методов расследования с использованием открытых источников информации (англ. OSINT – open source intelligence), иногда невероятно полезный: с его помощью вы можете найти определенное видео на других сайтах и узнать, кто и где его размещал, а иногда даже установить, что на сайте, где вы впервые посмотрели это видео, его дата указана неверно. Я расскажу вам, как автоматизировать этот поисковый процесс при помощи интерфейса API YouTube и платного интерфейса API TinEye. Смысл в том, чтобы создать скрипт, который после ввода идентификатора видео с YouTube извлекает заставки этого видео и отправляет их в TinEye для реверсивного поиска. Это поможет нам ускорить процесс проверки на подлинность.
Извлекаем заставки видео при помощи интерфейса API YouTube
Интерфейс API YouTube – отличный инструмент как для поиска видео, так и для извлечения из него метаданных (подробнее об этом можно узнать в моем курсе). Мы воспользуемся этим интерфейсом для извлечения заставок определенного видео, которые затем отправим в интерфейс API TinEye для реверсивного поиска. Для начала вам нужно будет получить ключ разработчика API YouTube (это можно сделать здесь). Кроме того, есть формат URL, при помощи которого можно извлечь дополнительные заставки видео. Мы включим этот формат в скрипт, чтобы получить максимальный охват при реверсивном поиске.
Интерфейс API TinEye
Ребята из TinEye позаботились о нас и создали для своего платного интерфейса API библиотеку Python. Библиотека находится здесь, документация – здесь. Установите библиотеку Python, следуя приведенным по первой ссылке инструкциям.
Пишем код
Ну что, программисты, пора размять пальцы и взяться за дело. Открываем новый файл под названием bellingcatyoutube.py. Начинаем вводить код (исходный код можно загрузить здесь):
Пока мы просто подгружаем нужные библиотеки, вызываем функцию API TinEye и добавляем способы разбора аргументов командной строки. Ничего сложного. Создаем запрос API YouTube:
Давайте разберем этот момент поподробнее.
- Строка 20: определяем функцию youtube_video_details , которая получает в качестве аргумента идентификатор видео.
- Строки 22-24: создаем переменную api_url, подставив идентификатор видео и ключ API YouTube.
- Строка 26: делаем запрос к серверам Google.
- Строки 28-32: если страница найдена (28), разбираем JSON (30) и возвращаем результаты запроса (32).
Готово. Эта функция извлекает все заставки, которые по умолчанию существуют у видео с YouTube. Теперь используем эту функцию для создания списка URL-адресов, который можно будет отправить в TinEye. Вводим следующий код:
- Строка 38: при помощи созданной нами функции извлекаем все данные нашего видео (примечание: можете подставить переменную video_data и получить все метаданные видео).
- Строка 40: извлекаем список заставок из результата запроса.
- Строки 47-49: проходим по очереди каждую заставку (47) и добавляем их в основной список URL (49). Основной список понадобится нам позже.
Существует широко известный, но нигде не зафиксированный способ, который поможет нам извлечь дополнительные заставки видео с YouTube. Это очень просто: берем известный маршрут до серверов YouTube и идентификатор видео и запрашиваем последовательный список заставок. В этом нам поможет вот такой код:
Ничего сложного тут нет: мы прорабатываем цикл от 0 до 3 и создаем список URL-адресов при помощи счетчика и идентификатора видео, который мы ввели в скрипт. В итоге получаем такой список:
Здорово, да? Теперь проходим каждый URL-адрес и отправляем их в API TinEye. Вводим код:
Поясню пару моментов.
- Строка 60: создаем список результатов, куда будут сохраняться все совпадения, приходящие из TinEye.
- Строки 63-73: прорабатываем список URL-адресов (63) и отправляем их в API TinEye, используя функцию search_url (68). Все найденные совпадения (72) добавляются в список results (73).
Отлично, теперь у нас есть список объектов TinEye Match, в котором представлены результаты поиска. Сейчас возьмем каждый объект по отдельности и извлечем нужные данные, а именно: URL-адрес всех совпадающих сайтов, на которых опубликована интересующая нас заставка, и дату, когда она была найдена поисковыми роботами TinEye. Наберитесь терпения, мы почти закончили
- Строки 75-76: создаем список result_urls (75), где будут храниться все URL-адреса, найденные в индексной библиотеке TinEye, и словарь dates, где URL-адреса будут рассортированы по дате, чтобы можно было найти самый старый URL-адрес, содержащий интересующие нас изображения.
- Строки 78-85: анализируем список совпадений (78), а потом проходим каждую ссылку, содержащуюся в объекте TinEye Match (80). Проверяем, был ли URL-адрес уже сохранен (82), если нет – сохраняем его (84) и дату его извлечения (85).
Самое сложное уже позади. Осталось только вывести результаты – и все готово. Вводим последнюю часть кода:
Ну, тут все понятно. Мы просто анализируем все найденные URL-адреса (ВНИМАНИЕ: все эти URL-адреса можно передать в другие созданные нами скрипты, например в Google Analytics или в Common Crawl). Путем сортировки дат определяем первую дату нахождения URL поисковыми роботами TinEye и используем ее как ключ в словаре dates. Готово!
Погнали!
К сожалению, того видео, которое использовал в своем посте Элиот, нет в индексной базе TinEye, но мой друг Джозеф Овид Адамс прислал мне запись запуска ракеты с земли в Сирии в 2014 году, и я решил проверить подлинность этого видео. Вот ссылка на него:
www.youtube.com/watch?v=zGM47VtGQ-4
Находим идентификатор видео: zGM47VtGQ-4
justin$:> python bellingcatyoutube.py -v zGM47VtGQ-4
[*] Извлечение идентификатора видео: zGM47VtGQ-4
[*] Заставки видео извлечены. Отправка информации в TinEye.
[*] Поиск в TinEye: https://i.ytimg.com/vi/zGM47VtGQ-4/default.jpg
[*] Поиск в TinEye: https://i.ytimg.com/vi/zGM47VtGQ-4/hqdefault.jpg
[*] Поиск в TinEye: https://i.ytimg.com/vi/zGM47VtGQ-4/mqdefault.jpg
[*] Поиск в TinEye: https://i.ytimg.com/vi/zGM47VtGQ-4/maxresdefault.jpg
[*] Поиск в TinEye: https://i.ytimg.com/vi/zGM47VtGQ-4/sddefault.jpg
[*] Поиск в TinEye: https://img.youtube.com/vi/zGM47VtGQ-4/0.jpg
[*] Поиск в TinEye: https://img.youtube.com/vi/zGM47VtGQ-4/1.jpg
[*] Поиск в TinEye: https://img.youtube.com/vi/zGM47VtGQ-4/2.jpg
[*] Поиск в TinEye: https://img.youtube.com/vi/zGM47VtGQ-4/3.jpg
[*] Найдено 725 уникальных URL-адресов с совпадающими изображениями.
http://nnm.me/blogs/Y2k_live/chto-mogut-protivopostavit-boeviki-igil-rossiyskim-samoletam/
http://edition.cnn.com/2014/11/12/world/meast/syria-isis-child-fighter/index.html
http://www.cnn.com/2014/11/12/world/meast/syria-isis-child-fighter/index.html
http://www.aktuel.com.tr/multimedya/galeri/gundem/isid-2-adet-helikopter-dusurdu?albumId=67897&page=8&tc=12
http://www.cnn.com/2014/11/14/world/meast/isis-setbacks-iraq-lister/
http://www.tinmoi.vn/thach-thuc-tag.html
http://www.abc.net.au/news/2015-11-20/two-australians-accused-of-being-part-of-terrorist-kuwait-plot/6957330
http://finance.chinanews.com/stock/2013/10-11/5364352.shtml
….
[*] Первое совпадение было найдено поисковыми роботами 10.10.2014 в 00:00:00 на http://finance.chinanews.com/stock/2013/11-15/5508881.shtml
Итак, теперь в вашем распоряжении есть список сайтов, которые помогут вам провести самостоятельное расследование. Если вы хотите узнать, старое это видео или новое, проверьте дату первого совпадения, найденного поисковыми роботами. Конечно, результаты поиска зависят от охвата индексной базы TinEye. Если вам попалось редкое видео, почитайте, что пишет Элиот в своем посте о работе с реверсивным поиском Google.