Instagram-бот для улучшения личной жизни / Хабр
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»:
Для хранения данных авторизации используется файл – auth.txt. Знаю, что лучше хранить это все в зашифрованном виде, но так как данные находится только на сервере – это относительно безопасно.
Конструкция auth.txt выглядит так:
Ig_user_id (id пользователя которому отправляем сообщение)
Просто текст. Каждый параметр должен быть записан с новой строки. Читаем из файла:
Теперь авторизуемся, используя requests :
Отправляем POST-запрос с полученными данными:
Полный ответ должен выглядеть как-то так:
Успешный ответ попытки авторизации
Ищем csrf-токен вручную
Если меняется IP, агент, пароль и, наверняка, какие-то другие параметры клиента – Инстаграм начинает требовать нормальный POST-запрос невозможен.
Если посмотреть текстовое представление ответа на первый GET-запрос по адресу /accounts/login/– можно найти токен в форме авторизации.
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 не вызовет подозрений. Лично я за несколько недель использования бота не получал никаких предупреждений, но мало ли.
Не известна реакция девушки на такое. С одной стороны – бот сделан с любовью и шлет приятности, с другой – это может пойти по статье «Наплевательское отношение». Но пока что полет нормальный, посмотрим, что будет дальше. Возможно в будущем мне придется слать голосовые сообщения
Пример работы
Вопросы по Instagram - вы можете прочитать интересующую вас информацию на сайте
Таргетированная реклама Через телефон Через компьютер Личная жизнь Коротко о главном в Инстаграм Проблемы при работе с Инстаграм Реклама в instagram Хорошие хештеги Подробные инструкции