Избавляемся от головной боли за час

Костя kik0s Амеличев · August 27, 2020

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

Здесь я хочу рассказать о разработке мини-проекта под кодовым названием «Почему я не сделал это раньше?».

Нам понадобится:

  • Знание основ Python 3
  • Представление о том, что такое веб-серверы и HTTP-запросы
  • Гугл
  • Бесстыдство, чтобы скопипастить все туториалы мира

А что вы хотели, иллюстрации бюджетные

Проблема

У меня есть блог, в котором я ежедневно публикую пост. Пост выходит в 22:22 на двух платформах — Telegram и ВКонтакте. Разумеется, я не стою с часами над кнопкой «Send». Для этого уже давно придумали отложенные посты.

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

«Привет, ты тут пост выложил. Посмотреть не хочешь?»

Нет, не хочу.

В общем, за полгода я возненавидел Telegram. За ним нужно следить, о нем нельзя забывать, он шлет мерзкое уведомление вечером. Там не такое удобное редактирование текста, как ВКонтакте, помимо всего прочего.

Дублирование поста из ВКонтакте занимало минуту каждый день. Но это была чертовски раздражающая минута.

/(/images/tgbot-guide-2.jpg) Синюю или красную, Нео?

Идея

Не любишь рутинную работу — автоматизируй ее. Остался только вопрос, как именно. Есть два варианта — либо автоматически публиковать посты на двух платформах, либо автоматически пересылать их с одной на другую.

Я посчитал, что публиковать пост в нескольких местах неудобно. Мне придется написать свой интерфейс, чтобы писать текст и прикеплять картинки. ВКонтакте меня в этом плане полностью устраивает.

Решено — давайте пересылать пост из ВКонтакте в Telegram.

План-капкан

Инструменты

Реализовать данную идею можно миллионом способов. Я выбирал тот, который требует минимальное количество моих действий.

План такой — ВКонтакте делает все, что касается поста ВКонтакте, Telegram делает все, что касается поста в Telegram, я фиксирую прибыль.

У Вконтакте для сообществ есть Callback API. Это сервис, который позволяет получать информацию обо всех обновлениях в сообществе. В том числе и о новых постах.

У Telegram есть Bot API, которое позволяет сделать ботов буквально для всего. Сделаем бота, который будет отправлять посты в канал.

У меня есть Python 3, на котором будет написана минимальная логика для связи между двумя API.

/(/images/tgbot-guide-4.jpg) Тупо отдыхаю

ВКонтакте

Открываем окошко «Настройки сообщества». Выбираем «Работа с API». От нас просят адрес сервера, а также дают инструкцию по подтверждению адреса. Инструкция очень простая — ВКонтакте пришлет определенный запрос, мы должны выдать определенный ответ. После этого наши серверы подружатся.

Там же дается описание данных, которые придут в запросе. В соседнем окошке много галочек — я выбираю «новые публикации». После подтверждения мне начнут приходить запросы о новых постах. Ровно то, что я и хочу.

Теперь мне надо создать веб-сервер. Я создаю скрипт на Python 3 с использованием Flask — он позволяет в три строчки получать HTTP-запросы. От ВКонтакте все просто: POST-запрос, который содержит информацию в JSON-формате. С помощью модуля JSON конвертирую данные в стандартный dict. Осталось только прочитать формат данных: там будет сказано, где конкретно лежит текст и прикрепленное фото. Получается что-то такое:

Когда получилось продраться через вложенные друг в друга словари, у меня в руках оказываются две переменные: текст и ссылка на фото. Осталось отправить все в Telegram.

Telegram

Сначала создаем бота. Для этого идем к BotFather и придумываем валидный ник. В ответ получаем ключ, который API использует вместо связки логин-пароль — по нему бот идентифицируется.

Теперь можно отправить HTTP-запрос, в котором прописать все элементы поста. Но мне лень. Я беру python-telegram-bot и создаю две функции по две строчки каждая: отправка текста и отправка фото.

Просто. Даже слишком.

Осталось дать боту права для отправки в канал.

Не даю лишних разрешений — а то вдруг восстание машин

Тестирование

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

Это помогло узнать, что я брал неправильные данные для фотографии. Надо было брать не ‘m’-фотку, а ‘photo-807’. Текст сразу пересылался без проблем.

Запуск

Я запускаю все на удаленном сервере (так называемом VPS). Это позволяет мне не думать о всяких проблемах типа белых IP-адресов или того, выключен ли мой домашний компьютер. Но надо платить порядка 350 рублей в месяц. Два обеда с бигмаком придется пропустить.

Чтобы отправить проект на сервер, я создал проект на гитхабе — оттуда можно будет все скачать простым git clone. Можно было бы просто отправить файл через утилиту scp, но тогда я потеряю зеленый квадратик.

Видите жирный квадратик? Оно самое!

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

Итог

Теперь можно забыть о мерзких уведомлениях и спокойно гулять с друзьями — вся активность в блоге произойдет автоматически, независимо от меня.

Учитывая то, что суммарно пришлось потратить один час, я очень доволен.

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