Google Translate Transport (service) for XMPP

Еще один проектик для jabber’а.

В конференции саппорта сервера jabbercity.ru с Lex’ом как-то зашла речь за перевод через гугл. Собственно, мне самому давно была интересна эта тема – боты переводчики, бывшие в таблице на JabberWorld, давно перестали работать, а новых не появлялось. Но я считал, что там надо будет активно изучать API гугла, создавать пары ключей и заниматься тому подобными вещами. Тут же Lex кинул пару функций, там все оказалось гораздо проще. Потом на stackoverflow нашел еще более интересный вариант (фактически – упрощенный и использующий меньше библиотек) – и завертелось.

Код взял с RSS-транспорта, благо я его хорошо знал и примеров было достаточно. Вычистил все лишнее – фактически, тут был нужен только диалоговый режим и минимальная регистрация для удобства добавления контактов. Можно было выкинуть всю работу с базой, поиск, loop-цикл, а в обработке статусов оставить простейшее “зеркало”: получил “онлайн” – вернул “онлайн”. Т.е., достаточно было добавить известный JID, авторизовать (а можно и не авторизовывать) и просто пользоваться.

Список языков сначала нашел в сети где-то на github’e. Как получать его в реалтайме в тот момент не понял, поэтому пошел таким путем. А позже обновил список, вытянув его напрямую со странички https://translate.google.com – однострочник на bash’e для этого оставил в комментариях кода транспорта.

Так как теперь не требовался учет пользователей – эти части в коде тоже были вычищены, также упрощен vCard. Регистрация – просто обход сохраненного в коде списка (наверное, уже пора учиться разбивать код на отдельные файлы и инклудить их) и генерация пар; с выбранной делается JID, от которого приходит запрос подписки. Вокруг кода запроса на сервер гугла была сделана обвязка из try/except и таймаутов и первая версия была запущена в работу. JID’ы проверяются на соответствие регулярке – транспорт работает только с тем, что попадает под “С2НА@сервер”, при этом “С” и “НА” проверяются по списку языков.

Позже возникло обсуждение о (возможно) необходимых лимитах на частоту отправки сообщений и через время их тоже реализовал. Есть лимит на частоту отправки с одного JID’а – в таком случае отдается соответствующее сообщение. Если с разных JID’ов начинают сильно часто слать, то формируется пул, который постепенно обрабатывается. Ну и, наконец, есть максимальное число сообщений за сутки.

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

Попутно сделал генерацию списка ботов в “Браузере сервисов”. Изначально планировал сделать 2 списка – “С языка” и “На язык”, однако так и не придумал, как красиво получать значение того, какое именно дерево развернуто: либо как-то получать parent node, чего я не умел (или это было нельзя сделать); либо на первом уровне формировать имя ноды с префиксом/суффиксом (в зависимости от того, в каком дереве смотрим) – но это создавало неудобства в дальнейшем. В итоге оставил одно дерево.

На пока все. Был фикс на учет числа пользователей – забыл убрать обрезание ресурса. На сейчас еще есть непонятка с числом активных пользователей (как-то многовато, что не соответствует логам), но пока не копал.

Код проекта, как и раньше, выложен на github. Статью на JabberWorld, возможно, сделаю позже – а пока просто добавил данные на страничке ботов.

И да – фактически, если способ получения перевода перестанет работать (например, все же надо будут ключи для API), или если надо будет изменить источник перевода (вместо Гугла взять Яндекс) – достаточно поменять одну функцию. Или добавить выбор.

Update: как-то еще возникло обсуждение, что было бы неплохо иметь возможность получения произношения текста в качестве аудиосообщения. Не для всех пар, правда, оно есть, но в целом – реально. Из того, что нашлось по теме: https://stackoverflow.com/questions/69281223/extract-sound-from-translate-google-com – фактически, надо делать второй запрос, который вытащит аудио по тем примерам, что в топике, потом заменит кодек и контейнер на нужные – чтобы в jabber-клиенте оно воспроизводилось через плеер – и отправит ответы.

Добавить комментарий