Граббер файлов для нетсталкинга

Граббер файлов для нетсталкинга

рандом со скиллами выше среднего

TL;DR: исходник скрипта здесь, ссылки на каналы спрашивать у бота.

Вступление. Зачем?

Создание скрипта для скачивания случайных файлов с файлообменников было вдохновлено роликом Катана про рандомсталкинг. Напомню, что нетрандом - это изучение случайного контента в сети в нетсталкинге. Это могут быть различные приемы - сканирование случайных диапазонов сети, использование рандомайзеров, использование дорков и случайных слов для поиска, просмотр последних загруженных файлов на разных хостингах. Как вы понимаете, последний способ и лег в основу скрипта.

Зачем смотреть случайные файлы? Тут нет универсального ответа. Как и всё остальное в рандомсталкинге - это как минимум изучение контента, трендов, Сети, расширение кругозора, понимание того что происходит за пределами твоей комнаты и так далее. Ну и конечно у тебя могут быть специфические интересы, что немаловажно. Текстовики с логинами и паролями, чьи-то фотки, лабораторные работы, вирусные файлы.

Зачем это автоматизировать? Всегда можно упороться и руками перебирать последние загруженные файлики через веб-интерфейс, скажете вы. А я скажу, что вы же не можете сидеть за компом 24/7, как следить за появлением новых файлов круглосуточно? Плюс многие файлы после скачивания удаляются, и ссылок на них не остается, что же делать? А если мы хотим искать файлы по таким критериям, которых нет даже в самом файлообменнике?

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

rgho.st не позволяет искать по файлам кроме как по залитым сегодня и по 7 типам

В целом, автоматизация рутины освобождает новые ресурсы для разумной работы с контентом. Например, вам интересны не все файлы, а только текстовые - тут уже фильтры самого сайта не помогут. Или вам не хватает банально места на диске, чтобы хранить весь входящий поток файлов - храните его в облаке, где они не будут удалены!

Исходя из всего этого, при помощи основ программирования и здравого смысла был сделан скрипт, который скачивает все новые файлы и загружает их туда, где они будут всегда вам доступны - в Telegram.

Начало. Как это создавалось?

За вечер был написан простенький прототип скрипта на питоне: файлы качались с RGhost на компьютер, оттуда через бота загружались в специально созданный канал (ныне приостановленный, но там остались результаты работы за 10 дней). Это был MVP, minimum viable product = минимально жизнеспособный продукт - то с чего и полагается делать подобные вещи. Со временем, конечно, скрипт был переписан и стал чуть сложнее: сейчас он качает с трёх файлообменников (rgho.st, goload.ru, files.dp.ua), после чего раскидывает файлы с дополнительной информацией по 20 каналам.

Это если вкратце, но давайте поговорим о теоретической части. Взглянем на эту схему:

В большой индустрии обработка данных давно стала краеугольным камнем работы, и к ней выработались различные подходы. ETL - Extract, Transform and Load - для больших уже сохраненных объемов данных, стриминговая обработка данных - для многочисленных мелких потоков информации, лямбда-архитектура - объединение обоих принципов для обеспечения быстрого доступа к большим данным. На самом деле, ни в чем этом я не разбираюсь, ничего из этого не использовал и в статье эта схема только для красоты. Скрипт для сохранения файлов из файлообменников можно сделать, не будучи специалистом по BigData.

Без специалистов тем не менее не обошлось - разработка строилась на идеях сканера Медвед (доступен в Telegram в каналах Common, HTTP, FTP, Gopher). Одно время я активно изучал результаты работы этого сканера, общался с автором, и почерпнул много идей. Разложу по полочкам выводы всех размышлений о том, каким надо сделать скрипт, с учетом всех идейных составляющих:

  • Сбор данных. У нас изначально есть входная информация, будь то айпишники, порты или адреса файлообменников в нашем случае. Нам нужно каким-то образом обработать эту инфу и получить то, что будет первичным результатом. Для нас это файлы, и эти файлы нам, очевидно, надо скачать.
    Это делается несложно: у rgho.st есть специальный файл sitemap_recent.xml, в котором хранятся и обновляются последние загруженные файлы, а у goload.ru, например, есть API, в котором сразу даётся ссылка на скачивание.
    Итак, нам нужно на этом этапе получить список файлов, которые мы планируем скачать.
Общедоступный список последних файлов в rgho.st
  • Получение первичного результата. Для нашего случая "сырым", первичным результатом я называю сами файлы. После предыдущего этапа появились ссылки, мы можем дернуть каждую и скачать файл. А что дальше?
  • Сохранение первичного результата. Тут пару слов о том, ради чего мы все делаем. Наверное, всегда стоит помнить, что у твоих действий должна быть цель, иначе в результате получишь совсем не то. Наша цель - доставлять файлы в место, где они будут потом лежать и ждать нас, и делать это быстро, пока их не удалили на файлообменнике. Что это для нас означает?
    Прежде всего, что предыдущий и текущий этап должны быть соединены вместе - нам нет смысла сначала скачивать пару гигов файлов, потом заливать это в облако. Мы хотим минимизировать задержку от появления файла до его надежного сохранения, так давайте сразу его закачивать в Telegram.
  • Фильтрация результата, поиск интересного. Как мы помним, файлов много разных, и хорошо бы их сортировать. И хотелки у всех разные: кто-то хочет содержимое архивов просматривать, а кто-то находить рарджипеги. Что мы можем с этим сделать?
    Давайте вспомним о том, что у нас уже есть есть - о возможностях Telegram, куда мы заливаем файлы. Любое сообщение, даже содержащее файл, можно переслать в другое место, в том числе в другой канал (но там надо быть админом). И что важно для нас, повторно файл не загружается, и напрягаться почти не надо! Что можно сделать?
    Например, мы видим, что залитый файл имеет расширение .zip. Мы знаем, что это расширение архивов, поэтому после сохранения файла мы берём сообщение с ним и форвардим в канал, в котором у нас хранятся архивы. Довольно просто, не так ли?
    Может быть много критериев: расширение файла, начало названия файла, тип файла (по первым байтам), текст файла... Главное, чтобы в скрипте была реализована пересылка, а дальше функциональность можно расширять бесконечно.
  • Дополнительная обработка. И вот у нас есть тематические каналы. В одном архивы, в другом изображения, в третьем программы и так далее. По сути, это однотипный контент, над которым дальше придется совершать однотипные операции: вы же наверняка будете открывать каждый архив, чтобы посмотреть что внутри?
    Не будем долго рассуждать, просто возьмем и запилим для каждого канала после фильтрации дополнительную обработку. Для архивов это будет извлечение содержимого, которое текстом мы запостим после форварда сообщения с файлом. Для картинок это будет постинг изображения со сжатием, чтобы можно было быстро предпросматривать, на загружая все 15 Мб высококачественной фотки с айфона.
    Всё это относительно просто и не требует от нас много ресурсов.

Их боялись даже чеченцы! Самая отмороженная ОПГ за всю историю...

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

Условное разбиение частей скрипта

Забегая вперёд, на текущий момент сделаны такие каналы и соответствующие форвардеры: Общий, Изображения, Архивы, Аудио, Программы, Документы, Pcap-файлы, Логи стилеров, Маленькие файлы, Текстовые файлы, Базы данных, Видео, Хэши, RarJpeg, Игровые файлы, Проверка VirusTotal, Типы, Фотографии, Cкриншоты, Разработка.

Разработка. Как это реализовано?

Любой человек, имеющий представление об объектно-ориентированном программировании, уже сориентировался по схеме выше, я думаю.

Каждая из частей - Downloader, Uploader и Forwarder - представляет собой класс, который реализует свою функцию. Причём не обязательно усложнять его чтобы, скажем, скачивать из goload.ru вместо rgho.st: мы можем создать общий класс BasicDownloader, в котором будут все нужные нам функции, а потом от него унаследовать классы для любого файлообменника, переопределив для них функции получения списка файлов и скачивания одного файла. Сложно? Да нет, всё просто, просто надо немного разобраться.

Реализация даунлоадера для goload.ru

Выше на картинке описан класс "скачивалки" файлов с одного из файлообменников. С ним работа самая простая, т.к. через API в JSON возвращаются и имя файла, и ссылка на него, и ссылка на страницу. Не надо дополнительно ничего парсить.

Как видно, есть только 5 функций, все остальные уже есть в базовом классе и используются там. Тут же только обновление ссылок (на самом деле, тоже достаточно шаблонное), скачивание файла, получение ссылки/имя/подписи для сообщения и проверка, скачивался ли файл раньше.

За кадром остаётся сам процесс: как обновляется и обрабатывается список файлов? Всё просто, это реализует бесконечный цикл в BasicDownloader, по задержкам времени периодически получающий обновление списка файлов из url_recent и скачивающий всё по порядку. Список файлов закончился? Начинаем сначала. Список файлов пустой? Штош, может сейчас ночь и никто ничего нового не аплоадит, подождём и продолжим.

Да, и где-то нам требуется хранить факт того, что файл уже скачан. Это делается сохранением ссылки в текстовом файле loaded.txt. Мама ругалась, конечно, но работает.

Аплоадер файлов в Telegram. Большая часть кода - магия с разделением файлов на части

Выше на картинке отображена "закачивалка" файлов в Telegram. По сути, всё делает функция upload через бота BOT из глобальной переменной.

Однако, для файлов, превышающих 50 Мб (а у телеги такое ограничение на максимальный размер закачки с бота) реализован костыль, использующий команду zip для создания нескольких частей архивов, в которых сохранен один и тот же файл. Здесь мама ругалась больше всего, и не столько из-за вызова через консоль специфических команд, сколько из-за нарушения описанного выше принципа: сохраняем одно сообщение, форвардим его, добавляем к нему информацию. В текущий момент происходит форвард только последней части архива, а по заголовку "Forwarded from ..." можно перейти к оригинальному каналу и всем частям архива, чтобы его извлечь.

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

Но соблазн и тяга к абстрагированию была всё еще велика, и в порядке эксперимента был запилен VirusTotalUploader, который выполняет похожие функции, только закачивает файл на проверку в virustotal.com. Были запросы на создание подобного канала, но перекладывать на форвардеры операции по загрузке файлов не совсем честно, так что сейчас разделение по классам выглядит не так, как выше.

Но что тогда форвардить, если VirusTotalUploader не создает сообщение в телеге? Ну, он создает сущность внутри себя, проверяемый файл, и ссылку на него с результатами мы можем постить в канале.

И раз мы уже заговорили о форвардерах, то посмотрим на примеры.

Так выглядит типовой "пересыльщик" файлов вроде видео. Он ориентируется только на расширения, и не содержит ни одной строки кода больше. Вся магия спрятана в классе BasicExtensionTgForwarder. Но несложно догадаться, что и там ничего особенного - проверяется соответствие букв после точки в названии файла и списка. Если есть в списке, то пересылаем.

Но так можно штамповать каналы до бесконечности, скажете вы? Верно! Пишите-звоните, сделаем ещё :) А пока посмотрим пример посложнее:

Это определялка типов файлов как на основе расширения, так и через первые (magic) байты содержимого файлов, через две разные библиотеки.

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

Соответственно, для каждого из форвард-каналов был создан такой класс, и в процессе разработки получилось целое дерево наследования (неидеальное, впрочем, но в перфекционизм впадать нет времени). Осторожно, большая схема.

Дерево классов Forwarder

Как видим, от некоторых классов идут две стрелки, как это и зачем?

Дело в том, что часть файлов проверяется на архивное содержимое: канал архивов, канал рарджипегов, каналы фотографий, скриншотов и разработки, для которых подобное содержимое чаще всего пакуется в архивы, а потому надо проверять и название файла, и названия внутри файла. Для этого было использовано множественное наследование, от BasicTgForwarder и от Archiver.

Итак, мы рассмотрели каждый компонент по отдельности, но что их связывает вместе? Для менеджинга связи между файлами был создан специальный класс, который прибивает гвоздями все процессы обработки информации.

Все довольно просто: мы создаём экземпляры скачивалок, и каждой скачивалке говорим, какие есть закачивалки и форвардеры. Внутри скачивалки обработка идёт так:

Что в итоге? Весь код для запуска работы помещается в 5 выражениях на питоне. Это объявление всех компонентов (списки из классов), запуск бота-помощника и запуск менеджера обработки.

На этом краткое описание внутренностей можно считать оконченным, перейдем к каверзным вопросам.

Расширяемость. Как сделать себе такое же?

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

Небольшая инструкция по подключению кастомного канала к существующей системе постинга:

  1. Регистрируете новый приватный канал, даете название и аватарку в стиле остальных.
  2. Добавляете в админы канала @rghost_mirror_uploader_bot, можно дать только права на постинг.
  3. Пишете любое сообщение в канале, форвардите это сообщение в @userinfobot, копируете ID канала в ответном сообщении.
  4. Присылаете нам в @rghost_mirror_feedback_bot ссылку на приватный чат, ID, краткое название и само описание того, что нужно фильтровать. Это может быть как список расширений, так и готовые куски кода, по которым нужно определять файлы.

Разумеется, кому-то хочется свой закрытый канал, только для себя, чтобы в него форвардились сообщения из общего. Но при этом не хочется скачивать все те же файлы, запускать с нуля весь скрипт. У нас есть простое решение и для таких случаев:

  1. Создаете своего бота через @BotFather.
  2. Создаете свой канал и дайте там боту админку.
  3. Присылаете нам юзернейм бота, и мы добавляем его в общий канал.
  4. После этого через API телеги в бота будут приходить уведомления о новых постах в канале. Имени файла уже будет достаточно, чтобы сделать простые проверки. В остальных случаях можно скачать файл, проверить и удалить, как сейчас и происходит работа в скрипте.

Хотите запустить полную копию такого же бота? Нет ничего проще, надо только зарегать своего бота, вписать в скрипт свой токен и соответствующие ссылки на каналы и их ID (см. первую инструкцию как их регистрировать).

И - вуаля - у вас свои приватные каналы с файлами!

Подводные камни. Что было сложно?

Конечно, были небольшие траблы, которые приходилось мужественно игнорировать.

К примеру, rgho.st сейчас не позволяет скачивать файл по прямой ссылке в течение первых N минут после его появления. Я честно пытался полностью эмулировать поведения пользователя, дёргая те же урлы и передавая все те же заголовки, но проблема, ихмо, кроется в интеллектуальном определении ботов от Cloudflare, которым закрыт rgho.st.

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

Ещё одна частая проблема с rgho.st - что файл пользователем не загружается до конца, на странице просто пишется "file is uploading", ссылки нет и она никогда не появится. Сейчас каждую из таких ссылок скрипт пытается скачать с некоторой периодичностью, а потом выбрасывает. А совсем недавно в rgho.st был сбой: на протяжении десятка часов любой файл не загружался в браузере, но при этом для него создавалась страница, и ссылка на нее появлялась в списке последних в xml. Как говорится, проблема не на нашей стороне.

Сеть каналов. Где смотреть?

Адреса всех каналов можно запросить у бота @rghost_mirror_uploader_bot, нажав Старт или написав любое сообщение. Он является частью скрипта, и в момент вызова берет из используемых питоновских классов адреса и названия каналов. Так что можете быть уверены, что у бота всегда актуальный полный список.

ЧАВО. Чаво?

- Почему остановили первый открытый канал? По политике Telegram на открытые каналы действует ряд ограничений, их необходимо постоянно администрировать. Это идёт вразрез с самой идеей потокового сохранения файлов, потому мы провели голосование. По итогам голосования решили сделать канал приватным, что и произошло.

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

- Где вы храните файлы? Мы их не храним, их хранит Telegram. После аплоада в телегу и обработки для форварда в другие каналы каждый файл удаляется.

- Я нашёл ошибку в исходном коде и/или мне кажется оно работает не так, что делать? Если хочешь, то напиши об этом в Точке Сбора, посмотрим что не так и поправим.

- Почему нет базы данных? Потому что она не нужна. Смысл был в том, чтобы с минимальными затратами по ресурсам доставлять до людей файлы. Любые не нужные для этого компоненты - лишние. Keep it simple, stupid.

- Но как мне искать файлы? Конечно, воспользоваться поиском Telegram. Можно искать как в одном канале, так и по всем.

- Для чего собирались запросы на контент в бота? Для того, чтобы сделать полезное для большинства разделение по приватным каналам. По всем запросам мы составили статистику и дальше ориентировались на неё.

- Почему по моему запросу не сделали канал? Было много единичных хотелок, а мы реализовывали топовые предложения большинства - картинки, архивы, программы. Но это не значит, что все потеряно - напомни нам о своем запросе и мы найдем время добавить такой канал.

- Как мне найти копии файлов? Вступи к канал с хэшами и нажми на хэш интересующего тебя файла. Telegram сделает поиск таких хэшей за всю историю канала.

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

Заключение. Ну и что?

Был написан скрипт на питоне для скачивания с файлообменников (сейчас это rgho.st, goload.ru, files.dp.ua), закачивания файлов в Телеграм и раскидывания по каналам в зависимости от содержимого. Скрипт можно запустить отдельно у себя, можно легко расширить функциональность, добавив пару строк кода, а можно запустить отдельные бот/канал для нового типа файлов, не меняя основной скрипт.
На текущий момент на старый канал подписано 150 человек, на новый общий приватный канал - 65 человек. Сделано 20 разных каналов с фильтрацией файлов по названию, содержанию, проверкам с помощью сайтов (VirusTotal).

На старый канал было залито более 100 Гб контента: 15791 файл, 4486 изображений и 1754 аудиофайла. В новый пока немного меньше, порядка 10000 файлов, но рекорды ещё впереди.

Удачного граббинга файлов!

До встречи в Точке Сбора!

Report Page