Бот Для Скачивания Актуального из Инстаграм • Менеджер запуска

Instagram-бот для улучшения личной жизни / Хабр

Тем более что у соцсети вроде как есть открытый API.

Instagram-бот для улучшения личной жизни

Недавно мы с девушкой серьезно поговорили и выяснилось, что я даже не пишу ей «С добрым утром» и вообще редко пишу по утрам. В целом, причина кроется в том, что я не просыпаюсь с восходом первых лучей солнца (как она), а переписываться не очень люблю. Ну а ей, конечно же, приятно получать нежности по утрам и все такое.

Так как общаемся мы исключительно в Instagram, я подумал, что неплохо бы совместить все это и автоматизировать процесс. Тем более что у соцсети вроде как есть открытый API.

Как оказалось, полноценного официального API там нет, а тот что есть – поддерживает только бизнес-аккаунты. Но так или иначе — попробовать хотелось.

Я уверен, что существуют сервисы для этого, но сделать собственного рабочего бота вот прямо очень хотелось. Я нашел на Хабре статью про отправку сообщений на PHP из которой взял адрес для отправки запроса (ссылка на статью в конце). А здесь я постараюсь описать, по сути, тот же процесс, но на Питоне с маленькой доработкой. Тот же бот, с минимальным набором функций. Может, кому-то пригодится.

Полный код и README на Github, а ниже — ключевые моменты.

Схема скрипта

Для организации кода и какой-никакой возможности расширения функционала в будущем, скрипт разбился на 3 класса:

Login – отвечает за авторизацию и создает сессию;

MessageMaker – формирование сообщения;

SendMsg – непосредственная отправка сообщения.

И дополнительно, 2 конфигурационных файла auth.txt и conf.txt: данные авторизации и словарь с сообщениями соответственно и менеджер запуска – insta_bot_manager.py.

Структура директории

Класс Login — авторизация

Посмотрим как работает авторизация Instagram. Для этого смотрим исходящие запросы прям в инструментах браузера:

Как видно – запрос отправляется на адрес https://www.instagram .com/accounts/login/ajax/, да и выглядит довольно просто. Нет ни токенов, ни каких-то левых параметров. Вот только пароль в зашифрованном виде. Как я выяснил, это кодировка AES-GCM256, очевидно, с каким-то префиксом. Строка из запроса выглядит так:

Параметр «10» — обозначает пароль в зашифрованном виде, далее — время и сам пароль. Делать свой шифровальщик я, конечно же, не буду, но есть и другой способ залогиниться с паролем в чистом виде. Для передачи обычной строки достаточно заменить «10» на «0»:

Вы используете Instagram для развлечения или работы?
РазвлеченияРаботы

Для хранения данных авторизации используется файл – auth.txt. Знаю, что лучше хранить это все в зашифрованном виде, но так как данные находится только на сервере – это относительно безопасно.

Конструкция auth.txt выглядит так:

Ig_user_id (id пользователя которому отправляем сообщение)

Просто текст. Каждый параметр должен быть записан с новой строки. Читаем из файла:

Теперь авторизуемся, используя requests :

Отправляем POST-запрос с полученными данными:

Полный ответ должен выглядеть как-то так:

Успешный ответ попытки авторизации

Успешный ответ попытки авторизации

Ищем csrf-токен вручную

Если меняется IP, агент, пароль и, наверняка, какие-то другие параметры клиента – Инстаграм начинает требовать нормальный POST-запрос невозможен.

Если посмотреть текстовое представление ответа на первый GET-запрос по адресу /accounts/login/– можно найти токен в форме авторизации.

csrf-токен в ответе. 19 г. до н. э.

csrf-токен в ответе. 19 г. до н. э.

Для поиска сделаем простую регулярку, которая не будут работать только с этим ответом:

Как правило, это срабатывает только для первой попытки, после изменения параметров. Почему-то после авторизации куки начинают выдаваться как обычно. НО, важно следить за значением токена перезаписать.

«Умный» выбор сообщения

Так как бот создан с единственной целью – отправлять девушке сообщения по утрам, то стоило бы добавить ему немного «мозгов». Вообще, схема подбора сообщения выглядит довольно-таки тривиально – читается список доступных фраз из файла и рандомно выбирается заветная.

Поскольку скрипт будет срабатывать каждый день, а сообщения попадаются вида «Доброе утро, уже на работе?» — лучше следить за тем, чтобы такое не отправлялось в выходные дни, и наоборот.

Для этого создадим словарь conf.txt с предложенными фразами в папке рядом со скриптом и придумаем для него простейший синтаксис. Мне пришло в голову выделять сообщения для выходного дня символом «@», будних дней — «!», а блоки без выделения отправлять каждый день. Ну и комментарии (куда без них) — «/». Пример словаря:

Обработка словаря и псевдорандомный выбор

Заниматься подбором сообщения будет класс MessageMaker. В конструктор добавим только with as для чтения словаря:

Для определения дня недели можно использовать datetime.today().weekday() :

Функция array_sort() принимает 2 параметра: массив строк из conf.txt и разделитель, сообщения которого нужно игнорировать. Результатом выполнения будет новый, отсортированный список, из которого можно будет рандомно выбирать любую фразу (функция random.choice() )

Сама сортировка выглядит ужасно примерно так:

Теперь добавим главную функцию, которая возвращает непосредственно выбранную строку:

Поскольку Instagram сам экранирует символы и конвертирует любой тип в str – нет нужды принудительно приводить их вручную.

Тестовый запуск select_str() :

Подбор сообщения

Подбор сообщения

SendMsg – непосредственная отправка сообщения

В классе SendMsg – Login и MessageMaker. А также добавим в конструктор инициализацию родительских классов:

И, непосредственно, отправляем сообщение, используя весь функционал. Создаем функцию send_message() с необязательными параметрами:

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

Логинимся и создаем сессию:

Если функция вернула success в словаре, значит, можно продолжать:

Определяем набор параметров для отправки POST запроса:

Позже добавлю функция проверки X-IG-App-ID. Так как он возвращается в заголовках после успешной авторизации. Не сложно сверить значения и обновить, если требуется.

И отправляем запрос:

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

Запускаем и смотрим лог:

Сообщение было отправлено на мой второй аккаунт

Сообщение было отправлено на мой второй аккаунт

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

Менеджер запуска

Для удобства запуска, создадим менеджер скрипта – insta_bot_manager.py и поместим его в папку рядом с insta_bot.py.

Разместим функцию-обработчик и импортируем написанный модуль:

А также проверку существования файла auth.txt. Потому что запускать это все без данных авторизации не имеет смысла:

Теперь если auth.txt по каким-то причинам отсутствует — будет поднято исключение.

Автоматизация процесса в Cron

Поскольку я не хотел добавлять insta_bot_manager.py шебанги bash, то решил просто сделать еще один launcher специально для Cron.

В папке со скриптом создаем файл launcher:

$ touch launcher && nano launcher

Добавим что-то такое:

Получается, перед непосредственным запуском скрипт засыпает на рандомное время до 70 минут.

Вообще, при добавлении в cron стоит проследить за переменными окружения. В частности — PWD. Я получал ошибки из-за различия домашней директории и папки со скриптом. Для ее устранения можно приколхозить, в качестве первой, команду cd с полным путем к папке.

Выводы

Стоит быть осторожным, поскольку такая рассылка не совсем легальна и, вроде как, можно хватануть банхаммером Инстаграмма по лицу. Однако, как мне кажется, отправка 1-2 сообщений в сутки на один и тот же ID не вызовет подозрений. Лично я за несколько недель использования бота не получал никаких предупреждений, но мало ли.

Не известна реакция девушки на такое. С одной стороны – бот сделан с любовью и шлет приятности, с другой – это может пойти по статье «Наплевательское отношение». Но пока что полет нормальный, посмотрим, что будет дальше. Возможно в будущем мне придется слать голосовые сообщения :)

Пример работы

Пример работы

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: