Как появился бот и что умеет
На работе я – 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 каждый день, в удобной форме доставляя свежий контент друзьям. Но если бот поможет кому-то облегчить жизнь знакомых, ненавидящих лучшую соцсесть, я буду чертовски рад!
Это супер круто! Буквально пару дней как думал как мне нужен такой бот, но так и не сел писать)
P.S.
Интересно, есть что-то подобное, что бы фотки из инстаграм так же инлайнить?
Благослови тебя боженька, мил человек! А то реально, форварды из тви в тг ужасные
Респект за tiktokproxy, бахнул лайк на гитхаб. Просто и гениально. Ничего, если я буду использовать твой хероку-инстанс?
Советую ещё прикупить домен типа https://stiktok.com/@nerfut/video/7114817640434060550?is_from_webapp=1&sender_device=pc
Так работает savefrom.net, если добавить в адрес ролика на ютубе две буквы s, например https://www.ssyoutube.com/watch?v=qxwy8kpFwZ0
Классная идея! А как использовать инлайн-вызов? Когда я ввожу @twt2tgbot + сслыку в какую-нибудь переписку, ничего не происходит. Нужно как-то добавить бота в переписку?