Примерно с начала декабря провожу эксперимент по продвижению (если угодно - хайпу) в Твиттере своего бота. Результаты мне нравятся. Возможно кому будет интересно как почти при нулевом бюджете сделать эффективную рекламную кампанию в сети. Скриншоты, статистика, части кода и рассказы ниже.
По моему мнению реклама в сети скоро будет активно осваивать короткие звуковые споты. Всё чаще люди начинают слушать интернет, а не только его смотреть. Интернет-радио,Spotify,iTunesи множество других служб для "прослушки" сети очень быстро внедряются в массовое употреблением. Даже Твиттер вывел на рынок звуковые твитты.Росту значения звука способствует и рост числа индивидуальных устройств для прослушивания - наушники стали обыденным явлением и значит звуковая реклама можетбыть индивидуализированна и подана отдельному человеку в зависимости от его предпочтений как и традиционная контекстная реклама.
О своём боте для звукодзи я уже писал в статье на Хабр
В начале декабря я добавил к нему функцию озвучки гифок и картинок. То есть нужно послать боту изображение в виде файла, а потом голосовое сообщение. Бот вернёт короткий спот видео, который можно уже вставить куда угодно. Мы проводили эксперименты с размещением готовых видео роликов в Твиттере чтобы оценить реакцию пользователей и их "вовлечённость".
Чтобы бот работал корректно в социальной сети во время тестирования были обнаружены и устранены некоторые проблемы. В частности:
Обрезка по времени.
Пользователи чаще всего не попадают точно в начало гифок. Тем более, что и при отсылке голосовых сообщений запись начинается не сразу - есть задержка физическая, то есть буквально зависание пальца на кнопке, и есть задержка логическая, то есть мессенджер вставляет небольшую паузу от начала записи. Для устранения задержек я "сдвинул" начало записи к началу видео. Вот таким образом:
Объяснение кодаФункция вырезана из класса.
Для обработки звуков/видео используется ffmpeg
PWF
--> место хранение файлов для последующий
обработки
cmd
--> это переименованная функция
system
встроенной в python библиотеки
os
В функции connect_video_voice
соединяется звук, и
видео.
Также есть функция по соединению звука и картинки.
def connect_photo_audio(self,imagepath, audiopath, name=urandom(30).hex()): targetvideotype = "mp4" cmd(f'ffmpeg -y -loop 1 -i "{imagepath}" -i "{audiopath}" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pixfmt yuv420p -shortest -vf "scale=trunc(iw/2)2:trunc(ih/2)2" "{self.PWF}/{targetvideotype}/{name}.{targetvideotype}"') return f'{self.PWF}{targetvideotype}/{name}.{targetvideo_type}'
def connect_video_voice(self,videopath, audiopath, name=urandom(30).hex(),): sourcevideotype = "mp4" cmd(f'ffmpeg -streamloop -1 -i "{videopath}" -i "{audiopath}" -shortest -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 -y "{self.PWF}/{sourcevideotype}/{name}.{sourcevideotype}"') return f'{self.PWF}/{sourcevideotype}/{name}.{sourcevideo_type}'
Логика обрезания
Если звук длинее видео, то видео повторяется по кругу, если же звук меньше чем видео, то видео обрезается до размера звука.
f"ffmpeg -stream_loop -1 -i "{video_path}" -i "{audio_path}" -shortest -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 -y "{self.PWF}/{source_video_type}/{name}.{source_video_type}"
Ограничение по времени
Чтобы пользователь не записывал слишком длинные видео, не перегружал систему ради своих приколов да и для того чтобы избежать случайных нажатий я предусмотрел ограничение по времени в одну минуту кодом:
Пояснение о кодеДля работы с телеграммом используется PyTelegramBotAPI
После получения голосового сообщения, в
message.voice
хранится информация о нем. В том числе
хранится и duration
, в ней хранится длительность
голосового сообщения.
if message.voice.duration > 60: self.BOT.send_message(message.fromuser.id, "Your message too long. Max size of message: 1 minute") return
Бот был активно использован для одного свежего "чистого" аккаунта в сети Твиттер без фоловеров. На скриншотах видны два читателя - это те, которые сами присоединились по своей инициативе. Никаких "раскруток" или подобных действий для статистики не предпринималось. Мне было самому интересно сможет ли такая своеобразная реклама без бюджета бота в сети обеспечить рост его известности.
Ежедневно мы публиковали несколько твиттов с внедрённым видео. Вот статистика просмотров
Статистика в ТвиттерДля измерения переходов к самому боту я написал дополнительный код, собирающий статистику обращений к боту и манипуляций с ним.
Объяснение кодаget_users_graphic__activity__
функция, которая
вызывается при команде /activity к боту.
Здесь идет проверка на доступы, если пользователь написавший боту /activity не занесен в базу данных как админ, или же как helper, то в графике ему будет отказано.
create_graphic_activity
--> функция, которая
строит графики на основе функции которая получает данные о
пользовательской активности в боте.
limit
--> переменная, используемая для указания
лимита возвращаемой активности в дня. По умолчанию
limit
имеет значение Продвижение бота с услугами через
твиттер
/activity 3 вернет график активности за последние 3 дня.
def get_users_graphic__activity__(self): if self.MESSAGE.chat.id in HELPERS or self.MESSAGE.chat.id == ADMIN_USER_ID: graphic = create_graphic_activity() if graphic: try: limit = int(re.sub('\D', '', self.MESSAGE.text)) except Exception: limit = 7 self.BOT.send_photo(self.MESSAGE.chat.id, photo=create_graphic_activity(limit=limit)) else: self.BOT.send_message(self.MESSAGE.chat.id, LANGUAGES["commands"]["server_crashed"]) else: self.BOT.send_message(self.MESSAGE.chat.id,LANGUAGES["commands"]["you_not_have_permissions"])
При использовании бота я заметил рост обращений к нему. При том что в самих Твиттах ссылка на бот не содержится - она есть только в профиле пользователя. Это значит что в бот перешли самые активные участники, не ограничивающие себя просмотром.
Возможно некоторым рекламодателям уже можно использовать моего бота для продвижения своих товаров и услуг. Можно включать свой логотип или изображение товара в картинку или дополнять слоганом звуковое сообщение. Я пока продолжу совершенствовать функционал программы. В ближайшее время я планирую дополнить бота функциями выравнивания по силе звука и перезаписью дублей. Если для перезаписей дублей код не трудно дописать, то выравнивание силы звука - нетривиальная задача, поскольку для рекламных целей как раз изменение силы звука может быть "цепляющим" внимание фактором.
Хочу поделиться одной моей поделкой, возможно, кому-то она тоже будет полезна. В этой статье я поделюсь тем, что я сделал, чтобы читать Twitter-аккаунт Маска в удобном мне месте и имея под рукой перевод англоязычных твитов на русский.
Проблема
Последние несколько лет замечаю за собой, что хочу начать регулярно почитывать тот или иной блог, но если он не находится в зоне удобного или привычного доступа (к сожалению весь твиттер для меня таков, ничего не могу с собой поделать, не читатель я твиттера), то я довольно быстро забиваю на это. Еще хуже, если блог на другом языке, тут появляется дополнительная проблема, когда из-за технических терминов или разговорного жаргона сложно понять смысл. Собственно такие "преграды" обычно и приводят к тому, что вроде бы и хочется, но как-то не делается.
Идея
Сейчас я делаю на заказ программных роботов, которые в онлайне обрабатывают новостные потоки в соцсетях, фильтруют, выбирают наиболее интересные и цитируемые, и передают заказчику. Я подумал, почему бы мне не использовать свои навыки и не облегчить себе жизнь в описанной выше проблеме. Для этого нужно только каждые сколько-то минут заходить в твиттер, забирать новые сообщения, прогонять их через переводчик и отправлять в канал в телеграме. Кажется, ничего сложного.
Подводные камни
Первая проблема, с которой я столкнулся, это фрилансеры, у которых я пытался заказать кусок кода, который непосредственно выгружает новые посты из твиттера, все подряд отказывались от выполнения заказа. Прямо брали, а потом у одного компьютер сломался, у другого появились другие дела, третий в последний момент передумал.
Вторая проблема, отказ твиттера в выдаче доступа к API в описанных мной кейсах. То есть остается единственный вариант заниматься веб-скраппингом. Ну что ж.
Третья проблема, оказалось, что требуется довольно много ручной работы, чтобы преобразовать пост из твиттера в формат телеграма, и чтобы он прилично выглядел. В частности, картинки, предпросмотры ссылок, упоминания и тд.
Технологии
Я решил попробовать самостоятельно и начал гуглить что-то вроде "parsing twitter without API". Нашлось достаточно много решений, сразу скажу, что решениеtwint библиотека с открытым исходным кодом, которая вполне работоспособна и подошла под мою задачу.
Для того, чтобы перевести текст с английского на русский, я сначала было собирался использовать google translate, но понимал, что в нем ограниченное количество бесплатных переводов, решил что попробую использовать единственную известную мне нейросеть для перевода с английского на русскийfairseqот Facebook AI Research. Качество перевода показалось мне вполне приемлемым с точки зрения того, чтобы понять в чем суть твита, хотя оно и не было идеальным.
Все это я обернул в скрипт на языке программирования python и запустил на постоянную работу на своем сервере.
Примеры кода
Чтобы собрать данные из твиттера без использования выделенных девелоперских доступов, логинов, паролей и API, нужно сделать следующее:
Установить библиотеку twint
pip3 install twint
Запустить код формата
twint -u <name_of_twitter_user> -o output.csv --csv --since 2020-01-01 --retweets
Здесь есть важный момент, что запускается это все из-под bash, при том что у библиотеки есть python API (да и написана она на питоне), но при этом я потратил довольно много времени и оно ни в какую не заводилось. При этом если запускать из командной строки - все кроме автоматического перевода постов у меня работало.
Из функционала, который есть у библиотеки еще отмечу:
Возможность искать твиты пользователя по ключевому слову
twint -u username -s pineapple
Возможность находить твиты пользователя с указанием номеров телефонов и почт
twint -u username --email --phone
Поиск твитов вокруг определенной локации
twint -g="48.880048,2.385939,1km" -o file.csv --csv
Сохранение в Elasticsearch или SQLite
twint -u username -es localhost:9200twint -u username --database tweets.db
Сохранение фоловеров, подписок и избранных для пользователя
twint -u username --followerstwint -u username --followingtwint -u username --favorites
Данные сохраняются в csv файл, в котором присутствуют такие поля как (перечислю те, которые использовал сам, так как их много и большинство несут мало информации):
id - идентификатор сообщения
conversation_id - идентификатор беседы
created_at - дата создания сообщения
tweet - текст сообщения
mentions - упоминания пользователей твиттера ( список словарей)
urls - вставленные по правилам твиттера ссылки (например на youtube)
photos - ссылки на картинки
link - ссылка на твит
reply_to - список словарей с пользователямя, ответом на твиты которых является твит
У библиотеки есть также возможность перевода на другой язык, но она у меня совсем не заработала. Собственно по этой причине я искал другую возможность. Нашел я, как упоминал выше, открытую разработку Facebook AI Research - библиотеку fairseq, в которой можно скачать веса нейронки для перевода в частности из английского в русский и наоборот.
pip install hydra-core
Итого необходимо было установить:
pip install torch pip install hydra-core==1.0.0 omegaconf==2.0.1pip install fastBPE regex requests sacremoses subword_nmt
Вообще мануал по установке и пример использование есть на сайте pytorch, но как видите у меня он немного отличается. Для того, чтобы сделать перевод можно пользоваться следующим куском из примера - он вполне рабочий:
import torch# Compare the results with English-Russian round-trip translation:en2ru = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-ru.single_model', tokenizer='moses', bpe='fastbpe')ru2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.ru-en.single_model', tokenizer='moses', bpe='fastbpe')paraphrase = ru2en.translate( en2ru.translate('PyTorch Hub is an awesome interface!'))assert paraphrase == 'PyTorch is a great interface!'
В нем два раза производится перевод и проверяется соотвествие результата исходному варианту. При первом запуске с серверов torch хаба выкачивается большая нейронка, которая довольно шустро работает и на процессоре.
В целом, если не считать способов использования библиотек, у меня набралось еще довольно много кода, чтобы делать полученные сообщения достаточно читабельными, но это уже детали моего применения.
Как пользоваться
Выглядит сейчас это следующим образом. Каждый твит и ретвит на главной странице твиттера Илона Маска пропускается через переводчик, подбираются ссылки и картинки из поста, дальше все это сохраняется в пост в телеграм-канале. Выглядит это так
Итого у меня получилсятелеграм-каналпод названием "Твиттер Илона Маска" (подписывайтесь, мне будет приятно, что это нужно кому-то еще , будет дополнительный стимул поддерживать в будущем), в котором можно
1) читать новые и старые посты Илона Маска
2) видеть перевод текста на русский язык
3) перейти по ссылке на исходный пост в твиттере
И все это без регистрации и смс:)
Если эта статья показалась вам интересной, поставьте, пожалуйста апвоут (так ее увидит больше людей) и подписывайтесь на мой блог втелеграме, там я ежедневно рассказываю о всех своих экспериментах. Если хотите решить похожую проблему для своего бизнеса пишите вличку.