Проект: Бот-конвертер Twitter → Telegram, бонусом еще и TikTok  Публичный пост
3 июля 2022  713
Бот-конвертер Twitter → Telegram, бонусом еще и TikTok

Как появился бот и что умеет

На работе я – iOS-разработчик, а в свободное время не прочь покодить что-нибудь не связанное с мобилками. Также я люблю прокрастинировать в твиттере и, конечно, я скидываю ссылки на понравившиеся твиты друзьям в Telegram.

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

Проблема 1 (почти решена Telegram'ом)

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

Пример твита с несколькими абзацами
Пример твита с несколькими абзацами

Именно ради починки переноса строк и отсутствия превью был написан twt2tgbot.

Так выглядит сконвертированный твит
Так выглядит сконвертированный твит

Проблема 2

Другая сложность связана с видео-контентом. Чтобы посмотреть видео из твиттера, нужно кликнуть по ссылке, открыть браузер или нативный клиент. Т.е. покинуть уютный мессенджер. Бот поможет и с этим.

Как пользоваться

Можно постить ссылки в диалог с ботом и потом форвардить результат. Но удобнее использовать инлайновый вызов бота сразу в нужном диалоге:

@twt2tgbot  https://twitter.com/vas3k/status/1433968896235773959?s=20&t=jJc9WIkQL8GrkPVVun_kXQ

Как устроен бот

Бот написан на Rust, в основе лежат библиотеки teloxide для работы с API Telegram и egg-mode для работы с API Twitter.

Rust был выбран в целях самообразования. На нем я раньше не писал ничего, кроме задачек из курса на Udemy. Казалось бы две вышеупомянутые либы – всё, что нужно для бота, но Rust заставил помучиться в тривиальных вещах.

К примеру, я потратил несколько часов, только чтобы передать строку в асинхронный блок. Наилучшим решением с моими околонулевыми знаниями мне показалось использование структуры Arc.

let twitter_token = twitter_api_token_value(twitter_client_id, twitter_secret).await?;
...
let token = Arc::new(twitter_token);
{
  let token = Arc::clone(&token_copy);
  ...
}

Не смотря на борьбу, Rust оправдал мои надежды на тезис:

если скомпилировалось, то работает без ошибок

Бот хостится на бесплатном Heroku, поэтому работает не супер-быстро.

Пользователи

Мне точно известно, что ботом пользуется два человека: я и мой друг Геннадий.

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

Но тут я мысленно упоролся GDPR, который обязывает уведомлять о сборе персональной статистики. А телега - это не браузер. У телеги нет разрешения экрана, а IP адрес – это IP хероковской железки. Вебсайт по паре обезличенных параметров может создавать анонимные ID.

Телега, в свою очередь, присылает ID пользователя и по нему автоматически определяется конкретный юзер. Т.е. соблюдая GDPR, нельзя подсчитать MAU без получения явного согласия пользователя. Добавлять такую функциональность или делать простой счетчик мне не захотелось. Так что число пользователей больше или равно двум и меня это устраивает.

Бонус: конвертер TikTok → Telegram

Аналогичный бот я написал и для TikTok. Называется tiktok2tgbot. В диалоге с ним так же можно кидать ссылки на видео, а в ответ будет приходить готовый mp4.

Бот был написано по-быстрому на JavaScript. Но есть у него техническая особенность.

Для скачивания видео TikTok в запросе желает получить хитрые заголовки. Их помогает вытащить библиотека tiktok-scraper.

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

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

URL запроса к прокси выглядит как домен-прокси/url-поста. Такие ссылки отдаются в API телеги.

Но также получился забавный эффект. Если скопировать ссылку на пост в TikTok и заменить https-префикс на адрес прокси, то можно получить прямую ссылку на видео файл.

Как-то так:
https://tiktokproxy.herokuapp.com/www.tiktok.com/@nerfut/video/7114817640434060550?is_from_webapp=1&sender_device=pc

Несколько раз бот ломался и во всех случаях проблема была со сылками, которые шарятся из мобильного приложения TikTok. Ссылки вида vt.tiktok.com/ZSdEo1JGX – это их кастомные сокращенные ссылки.

Один раз бот перестал работать, потому что изначально ссылки всегда были с префиксом vm., но позже добавился vt. и мне пришлось фиксить регулярку на входе.

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

https.get(url, (res) => {
    if(res.statusCode === 301 || res.statusCode === 302) {
    	resolve(res.headers.location);
    } else {
    	reject(new Error("No redirect data for mobile request"));
    }
})

Резюме

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

8 комментариев 👇

Это супер круто! Буквально пару дней как думал как мне нужен такой бот, но так и не сел писать)
P.S.
Интересно, есть что-то подобное, что бы фотки из инстаграм так же инлайнить?

  Развернуть 1 комментарий

Благослови тебя боженька, мил человек! А то реально, форварды из тви в тг ужасные

  Развернуть 1 комментарий

Респект за tiktokproxy, бахнул лайк на гитхаб. Просто и гениально. Ничего, если я буду использовать твой хероку-инстанс?

  Развернуть 1 комментарий

@rm_bk, спасибо, я только за! Правда инстанс бесплатный, так что работает медленно.

  Развернуть 1 комментарий

Если скопировать ссылку на пост в TikTok и заменить https-префикс на адрес прокси, то можно получить прямую ссылку на видео файл.

Советую ещё прикупить домен типа https://stiktok.com/@nerfut/video/7114817640434060550?is_from_webapp=1&sender_device=pc

Так работает savefrom.net, если добавить в адрес ролика на ютубе две буквы s, например https://www.ssyoutube.com/watch?v=qxwy8kpFwZ0

  Развернуть 1 комментарий

Классная идея! А как использовать инлайн-вызов? Когда я ввожу @twt2tgbot + сслыку в какую-нибудь переписку, ничего не происходит. Нужно как-то добавить бота в переписку?

  Развернуть 1 комментарий

@Slavsquat, по-моему, ничего специально добавлять не нужно.

Инлайн работает так: вводится @twt2tgbot, пробел, ссылка на твит. Далее нужно подождать несколько секунд и нажать на плашку над ссылкой

Пример
Пример

Можно также зайти в диалог с ботом, отправить команду /start, потом просто скидывать ссылки.

  Развернуть 1 комментарий

@crivlaldo, заработало после перезапуска Telegram for Mac, спасибо!

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб