Программа для мониторинга ключевых слов с использованием Python, Pastebin и Searx

Эта статья была впервые опубликована в блоге AutomatingOSINT.com.

Система раннего предупреждения – незаменимый инструмент для любого исследователя, работающего с открытыми источниками информации. Мониторить поисковые системы и другие сайты на предмет наличия ключевых слов, IP, названий документов и электронных адресов важно и полезно. Вы всегда будете знать, что говорят о вас в Интернете ваши враги, соперники и друзья.  В этом посте я расскажу вам, как создать мониторинговую программу, при помощи которой можно отслеживать появление выбранных вами ключевых слов, украденных данных и вообще чего угодно как в популярных поисковиках, так и в Pastebin.

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

Программу мы запускаем с виртуальной машины, так что в качестве хоста будет выступать ваш собственный компьютер. Если вы не прочь поуправлять собственным сервером или просто хотите вести круглосуточное наблюдение, не пользуясь своей виртуальной машиной, не упустите шанс и получите временный бесплатный доступ к Digital Ocean по этой ссылке.

Итак, за дело!

Установка и настройка Searx

Searx – это очень крутая штука для одновременного запроса к нескольким разным поисковикам, которую можно хостить на домашнем компьютере. Такие системы называются метапоисковыми, они были на пике популярности в конце 1990-х годов. Да, представьте себе, я настолько старый.

При работе с Searx результаты запроса можно получить в формате JSON. А это значит, что для управления поисковой системой мы можем написать программу на Python, а для обработки полученных результатов нам не нужны ни веб-скрейпинг, ни ключи API, которые стоят немалых денег.

Установка и настройка Searx

Если вы никогда не настраивали VirtualBox VM и не работали с операционной системой Ubuntu, посмотрите вот это видео об установке Searx. В нем подробно рассказано про весь процесс с начала и до конца.

После входа на сервер запускаем следующий алгоритм. Команды я взял из руководства по настройке Searx (ссылка) и адаптировал их под наши нужды. Можете просто скопировать весь этот текст.

Отредактируем файл settings.yml, чтобы у нас был доступ к поисковому интерфейсу Searx для поиска во всем Интернете. Для этого сделаем следующее:

Находим строку bind_address и меняем ее значение на 127.0.0.1, чтобы Searx выполняла команды только с того компьютера, на котором она установлена.

Вот что у нас должно получиться:

bind_address : “127.0.0.1”

Закончив редактирование, нажимаем  CTRL + O, а потом CTRL + X, чтобы выйти из редактора nano.

Давайте-ка проверим, что у нас получилось. Запускаем приложение Searx:

Проверка Searx после установки

Вводим в браузер следующий адрес:

http://127.0.0.1:8888

В результате у вас должна открыться страница Searx (как на картинке ниже). Введите какой-нибудь поисковый запрос, чтобы посмотреть, как это работает.

Отлично! Теперь займемся учетной записью Pastebin Pro.

Pastebin Pro

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

Оптимальный вариант – потратить 29 баксов на бессрочный аккаунт Pastebin Pro, чтобы внести свой IP-адрес в «белый список», а потом просто пользоваться их API и без ограничений качать любые коды. Если вы готовы на такие затраты, заведите платный аккаунт и читайте дальше.

Регистрируемся вот по этой ссылке.

Затем переходим сюда, чтобы внести свой IP в белый список. Если вы пользуетесь услугами Digital Ocean или другого подобного провайдера, вам нужно будет указать публичный IP-адрес вашего сервера. Если нет, то просто вбейте в Google запрос «узнать свой IP» и скопируйте его в следующую строку:

Все готово, теперь примемся за код для веб-скрейпера Pastebin (документацию см. здесь). Итак, за дело!

Пишем мониторинговую программу

Сейчас мы напишем программу, которая будет безостановочно мониторить результаты поисковых запросов в Searx и Pastebin. Программа будет знать адрес вашей электронной почты на GMail и отправит вам уведомление, если что-то заметит. Если у вас нет почтового ящика на GMail, советую вам его завести или изменить код таким образом, чтобы программа использовала тот почтовый сервер, которым вы пользуетесь.

Открываем новый файл Python (исходный код целиком приведен здесь), называем его keywordmonitor.py и начинаем вбивать следующий код:

Ну, тут все понятно. Импортируем нужные библиотеки, указываем наш электронный адрес и путь к Searx. Подгружаем сохраненные ключевые слова, по которым будет производиться поиск, и создаем файл, в который будут сохраняться все URL-адреса (чтобы не было повторяющихся результатов).

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

Давайте посмотрим, что тут к чему:

  • Строка 24: для функции send_alert прописываем параметр alert_email. Это словарь совпадений по ключевым словам.
  • Строки 29-37: проверяем, есть ли результаты из Searx (29), и если они есть, проходим по каждому ключевому слову, с которым были обнаружены совпадения (31), и добавляем каждое из этих совпадений (35-37).
  • Строки 40-46: проверяем, есть ли результаты из Pastebin (40), и если они есть, проходим по каждому результату (42) и выводим данные из Pastebin (в том числе оригинальный текст записи). Люди часто удаляют записи, но благодаря этой команде нам удастся их сохранить.
  • Строки 50-54: создаем объект электронного письма и задаем тему, отправителя и получателя.
  • Строка 55: устанавливаем соединение с серверами GMail.
  • Строки 57-61: здесь мы подсоединяемся к почтовому серверу (57, 58), заходим в почту (59) и отправляем письмо с уведомлением (60).

Теперь создадим еще одну функцию, которая будет сравнивать URL-адреса, найденные в Searx, с адресами в нашем списке. Это нужно для того, чтобы знать, встречался нам этот URL раньше или нет.

Вводим следующий код:

Строка 70: функция принимает аргумент keyword, которому соответствуют совпадения, а также список urls – URL-адресов, которые мы собираемся проверить.

  • Строки 74-78: проверяем, есть ли у нас файл с результатами по текущему ключевому слову (74), и если его нет, открываем файл (76) и переносим каждую строку в список (78).
  • Строки 80-86: проходим по списку результатов (80), и если URL еще не был сохранен (82), добавляем его в список new_urls (86), чтобы сохранить его позже.
  • Строка 90: если по текущему ключевому слову совпадений нет, берем все результаты и добавляем их в список new_urls.
  • Строки 93-99: открываем файл с ключевыми словами, где хранятся все результаты (93), и добавляем в него все новые URL-адреса, которые удалось найти (95, 96). Возвращаем список новых URL-адресов (99), чтобы включить их в уведомление, которое будет отправлено по электронной почте.

Итак, у нас есть схема, при помощи которой мы будем управлять уведомлениями и новыми результатами поиска в Searx. Теперь нам нужно прописать команды, которые отвечают непосредственно за сам поиск. Начнем с Searx. Печатаем следующий фрагмент кода:

Давайте разберем этот отрезок поподробнее:

  • Строка 105: функция check_searx принимает значение keyword (ключевое слово).
  • Строки 110-114: задаем параметры для поискового запроса в Searx. Обратите внимание: функции time_range (строка 113) в качестве значения можно придать любой промежуток времени.
  • Строки 119-122: отправляем запрос (120), используя созданные ранее словари параметров. Разбираем результаты JSON, полученные из Searx (122). Если запрос или разбор JSON не дают результатов, возвращаем пустой список (125).
  • Строки 128-140: если по итогам запроса у нас сформировался список результатов (128), проходим по каждому из них (132) и добавляем каждый уникальный результат в переменную urls (136). Пройдя по всем адресам, используем ранее созданную функцию check_urls (138), чтобы определить, какие URL-адреса нам еще не попадались. И, наконец, возвращаем совпадения (140), которые будут отправлены в уведомлении по электронной почте.

Ну что, с Searx мы закончили, теперь переходим к командам для Pastebin, и там логика уже будет несколько другая.


Ого, как много текста! Давайте посмотрим, что тут к чему:

  • Строка 145: функция check_pastebin принимает значение keywords – это список ключевых слов, которые мы будем искать в каждой записи.
  • Строка 147: каждой записи, размещенной пользователями в Pastebin, присваивается уникальный идентификатор. Создаем список, чтобы отслеживать все новые идентификаторы записей в Pastebin, которые нам встретились (147). Это мы делаем для того, чтобы не проверять бесконечно старые записи, которые наша программа уже просмотрела.
  • Строки 151-154: отправляем запрос к веб-скрейперу Pastebin. Важно правильно ввести свой IP-адрес в белый список, иначе данные извлечены не будут и функция вернет пустой список совпадений (154).
  • Строка 157: разбираем ответ JSON, чтобы затем пройти по всем результатам.
  • Строки 160-164: как я уже писал выше, нам нужно регистрировать все идентификаторы Pastebin, которые мы уже просмотрели. Проверяем, существует ли этот файл (160), и если он существует, открываем его (161) и добавляем все идентификаторы Pastebin в список (162). Если у нас нет списка с уже проверенными идентификаторами, создаем новый пустой список, куда будем добавлять идентификаторы, которые собираемся проверить (164).
  • Строки 166-170: проходим по результатам (166), и если идентификатор записи нам еще не встречался (168), добавляем его в список новых идентификаторов (170).
  • Строки 174-175: отправляем вторичный запрос (174), чтобы извлечь весь текст записи, и преобразуем все буквы в строчные (175).
  • Строки 177-182: создаем список для совпадений по ключевым словам (177), проходим по списку ключевых слов (172) и смотрим, встречаются ли они в тексте записи (181). Если ключевое слово встречается, добавляем его в список keyword_hits (182).
  • Строки 184-187: если в текущей записи встретились совпадения (184), добавляем их и полный текст записи (185) в словарь paste_hits, ключом к которому служит идентификатор записи.
  • Строки 190-198: закончив проверку по ключевым словам, открываем регистрационный файл идентификаторов записей (190) и вносим в него все идентификаторы записей (192, 194). Возвращаем совпадения, чтобы затем использовать их в тексте уведомления (198).

Спасибо, что дочитали досюда! Потерпите еще немного, мы почти закончили. Сейчас мы создадим функцию-декоратор, которая будет вызывать другие функции и возвращать результаты для уведомления. Вбиваем следующий код:

В принципе, тут все понятно, но давайте все же разберем основные моменты:

  • Строка 203: создаем словарь alert_email, который функция send_alert будет использовать для отправки уведомлений.
  • Строка 205: регистрируем текущее время, чтобы понимать, сколько длится поиск по ключевым словам. Это нам пригодится позже.
  • Строки 207-218: в этом отрезке кода мы проходим по списку ключевых слов (207) и проверяем, попадаются ли совпадения в Searx (211). Если совпадения есть (213), добавляем их в словарь alert_email (218).
  • Строки 221-226: проверяем Pastebin на наличие результатов (221), и если они есть (223), добавляем их в словарь alert_email (226).
  • Строки 229-240: в очередной раз засекаем время (229), вычитаем время начала time_start, которое мы зарегистрировали раньше (230), чтобы определить, сколько нам понадобилось на выполнение всей задачи. Если поиск был выполнен менее чем за максимальное время max_sleep_time (234), решаем, на какое время следует уйти в режим ожидания (236), и уходим в этот режим (240). У Pastebin есть ограничение скорости, зависящее от времени, и благодаря этим командам мы всегда будем соблюдать их требования. Рекомендую вам оставить настройку 120 секунд.

Отлично! Последнее, что нам потребуется – это создать прописать цикл, который будет раз за разом вызывать функции check_keywords и send_alert. Вставляем последний небольшой фрагмент кода:

Все просто. Вызываем функцию check_keywords (на этом этапе уведомление еще не отсылается) и запускаем бесконечный цикл, который ищет ключевые слова и отправляет уведомление, если поиск дал результаты. Этот цикл будет повторяться, пока мы не остановим выполнение программы.

Погнали!

Пришла пора опробовать нашу чудесную программу! Создайте новый файл в том же месте, где у вас лежит keywordmonitor.py, и назовите его keywords.txt. Внесите в него ключевые слова, по которым будет вестись поиск (каждое в отдельную строку). У меня это выглядит вот так:

jms_dot_py
justin@automatingosint.com

Сохраните файл и запустите программу поиска по ключевым словам через Wing (Debug Menu -> Set Current as Main Debug File, затем нажмите кнопку Play) или из командной строки. Не забудьте, что файл keywords.txt с ключевыми словами должен находиться в том же месте, что и скрипт.

Примерно такой результат вы увидите в итоге:

searx@searx:~$ python keywordmonitor.py
[*] Querying Searx for (Запрос к Searx): jms_dot_py
[*] New URL for jms_dot_py discovered (Обнаружен новый URL для jms_dot_py): https://twitter.com/jms_dot_py/status/768559761818324992
[*] New URL for jms_dot_py discovered (Обнаружен новый URL для jms_dot_py): https://twitter.com/jms_dot_py/status/826116048541859841
[*] New URL for jms_dot_py discovered (Обнаружен новый URL для jms_dot_py): https://twitter.com/jms_dot_py/status/791704263999295488
[*] Querying Searx for (Запрос к Searx): automatingosint.com
[*] Querying Searx for (Запрос к Searx): justin@automatingosint.com
[*] New URL for justin@automatingosint.com discovered (Обнаружен новый URL для justin@automatingosint.com): https://computercrimeinfo.com/wp/?cat=9&paged=2
[*] Querying Searx for (Запрос к Searx): hunchly
[*] New URL for hunchly discovered (Обнаружен новый URL для hunchly): https://www.reddit.com/r/craftofintelligence/comments/5otcmz/bulk_extracting_exif_metadata_with_hunchly_and/
[*] Successfully processed 48 Pastebin posts (Обработано записей Pastebin: 48).
[*] Sleeping for 97 s (Режим ожидания: 97 сек)
[!] Alert email sent! (Уведомление отправлено на почту!)

Вот и все. Вам на почту придет уведомление с найденными ключевыми словами и ссылками на соответствующие страницы. Если вы используете виртуальную машину или настроили Searx на Digital Ocean (хотите 2 месяца бесплатно? Жмите сюда!), то проверка по вашим ключевым словам будет осуществляться круглосуточно.

Чтобы быстренько проверить, как работает программа, зайдите на Pastebin.com и создайте запись, в которой будет одно из ваших ключевых слов. Через несколько минут вам на почту придет уведомление. Круто, правда?