Привет, Хабр! Позвольте представиться: меня зовут Сергей Агальцов, и я "программист по жизни". Это значит, что я давно уже IT-менеджер, а вовсе не программист по профессии, но программирование использую постоянно, как в своей основной деятельности, так и как хобби. Как часто говорил один из моих бывших начальников — "Серёга! Ты опять скатился в программирование!" Правда, не могу сказать, что этим был сильно не доволен он или кто-то другой когда-либо.


После появления Bot API у мессенджера ТамТам, я как истинный, а значит ленивый программист, создал 2 библиотеки Python для работы с ним:


  • open API клиента (далее — OAC) — изначально сгенерировал её при помощи OpenAPI Generator на основе схемы API, затем адаптировал с учётом особенностей генератора;
  • оболочку для этого клиента — TamTamBot (далее — TTB), упрощающую работу с OAC.

Так появился некий ТамТам Python SDK.


Сделал это я в первую очередь "для себя, для души", но также предложил и комьюнити ТамТам при желании им воспользоваться. Но, как известно, ни одно доброе дело не остаётся безнаказанным — народ попросил написать обучающую статью. И вот я здесь с этой статьёй. В ней я расскажу, как разработать простого бота при помощи этих библиотек.


Задача


Разработать бот, предназначенный для упрощения действий разработчиков ботов. Бот должен работать в режиме перманентного опроса состояния bot-api (long polling). В этой статье бот будет обучен показывать внутренности пересылаемого ему сообщения, а также настроен в соответствие разработанной функциональности.


Подразумевается, что у читателя имеется установленный Python 3, git, подключенный к среде разработки PyCharm (среда разработки может быть и другой, но рассказ будет на основе PyCharm). Желательно понимание основ ООП.


Получение токена бота


Получение токена происходит через обращение к специализированному боту @PrimeBot


Находим этого бота в ТамТам, вводим команду /create и отвечаем на вопросы:


  • Введите уникальное короткое имя бота латиницей — это юзернейм бота, по которому он будет доступен через @ или по ссылке вида https://tt.me/username. Особых ограничений на юзернейм нет. В частности, слово bot необязательно.
  • Введите имя — это отображаемое имя бота. Здесь уже можно кириллицей.

Если всё введено корректно, то созданный бот будет добавлен в контакты и в ответ мы получим токен — последовательность символов вида: HDyDvomx6TfsXkgwfFCUY410fv-vbf4XVjr8JVSUu4c.


Первичная настройка


Показать

Создаём каталог:


mkdir ttBotDevHelper

Переходим в него:


cd ttBotDevHelper/

Инициализируем хранилище git:


git init

Качаем необходимые библиотеки, добавляя их как подмодули git:


git submodule add https://github.com/asvbkr/openapi_client.git openapi_client
git submodule add https://github.com/asvbkr/TamTamBot.git TamTamBot

Открываем созданный каталог в PyCharm (например из проводника по контекстному меню "Open Folder as PyCharm project") и создаём файл, который и будет содержать наш бот — File/New/Python file. В появившемся диалоге вводим имя — ttBotDevHelper, и отвечаем положительно на вопрос о добавлении в git.


Теперь нужно создать виртуальную среду для нашего проекта.


Для создания виртуальной среды выбираем File/Settings и на закладке проекта выбираем подраздел Project Interpreter. Далее, справа нажимаем на иконку шестерёнки и выбираем Add:


image


PyCharm предложит свой вариант размещения.


image


Имеет смысл с ним согласиться.


После создания виртуальной среды откроется предыдущий экран, но на нём уже будет информация о созданной среде. На этом экране необходимо установить необходимые пакеты, нажимая справа иконку с "+" и вводя имена пакетов:


  • requests
  • six

Затем добавляем к проекту файл .gitignore, исключающий файлы, не требующиеся в git, со следующим содержимым:


venv/
.idea/

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

*.log
*.log.*

.env
ttb.sqlite3

Добавим переменную среды с именем TT_BOT_API_TOKEN, в которой укажем значение токена нашего бота, полученного от https://tt.me/primebot и перезапустим PyCharm.


(!) Вместо добавления переменной среды непосредственно в окружение ОС, в PyCharm оптимально использовать специальный файл .env. Его настройка будет рассмотрена ниже.


Поздравляю, теперь можно приступать к самому интересному — написанию своего бота.


Запуск простейшего бота


Открываем файл ttBotDevHelper.py и пишем первые строки:


# -*- coding: UTF-8 -*-
from TamTamBot.TamTamBot import TamTamBot

class BotDevHelper(TamTamBot):
    pass

Здесь мы создаём класс своего бота, основываясь на классе TamTamBot.


PyCharm подсказывает, что класс BotDevHelper содержит абстрактные методы, которые необходимо имплементировать. Нажимаем Alt-Enter на названии класса, выбираем "Implement abstract methods", выбираем все методы (их 2), предложенные PyCharm и нажимаем ОК. В результате будут добавлены два пустых метода-свойства: token и description. Модифицируем получившийся код следующим образом:


# -*- coding: UTF-8 -*-
import os

from TamTamBot.TamTamBot import TamTamBot
from TamTamBot.utils.lng import set_use_django

class BotDevHelper(TamTamBot):
    @property
    def token(self):
        return os.environ.get('TT_BOT_API_TOKEN')

    @property
    def description(self):
        return 'Этот бот помогает в разработке и управлении ботами.\n\n'                'This bot is an helper in the development and management of bots.'

if __name__ == '__main__':
    set_use_django(False)
    BotDevHelper().polling()

Свойство token возвращает токен нашего бота, значение которого берётся из переменной окружения TT_BOT_API_TOKEN. Свойство description возвращает расширенное описание нашего бота, которое будет показываться пользователям.


Код в конце файла необходим для запуска нашего бота в режиме опроса состояния.


Отмечу, что базовый класс TamTamBot предполагает использование веб-сервера django для работы в режиме вебхуков. Но сейчас задача проще, и django нам не требуется, о чём мы и сообщаем в строке set_use_django(False). Здесь для объекта нашего класса вызывается метод polling(), который и обеспечивает работу в нужном режиме.


Минимум необходимого сделан. Этот код уже вполне рабочий. Запустим его на выполнение. Для этого нажмём комбинацию клавиш Ctrl-Shift-F10.


Если Вы не добавляли переменную среды ранее, непосредственно в ОС, то при запуске произойдёт ошибка с сообщением "No access_token". Для её устранения настройте PyCharm на использование .env-файла.


Показать как

Создайте текстовый файл .env. Его содержимое в нашем случае должно быть следующим:


TT_BOT_API_TOKEN=токен_нашего_бота

Теперь нужно его подключить к конфигурации запуска в PyCharm:


Выбираем Run/Edit configuration и на закладке EnvFile подключаем наш .env-файл:


image


После чего нажимаем Apply.


После запуска бота можно перейти в ТамТам, открыть диалог с нашим ботом и нажать кнопку "Начать". Бот сообщит информацию о своих скрытых суперспособностях. Это и означает, что бот работает. Пока бот работает в демо-режиме, в котором доступны 4 команды. Просто ознакомьтесь с ними.


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


Приём сообщения-источника и отправка ответного сообщения с внутренним представлением сообщения-источника


Перекроем метод receive_text(), управление которому передаётся при отправке текста в чат с ботом:


    def receive_text(self, update):
        res = self.msg.send_message(NewMessageBody(f'Ваше сообщение: {update.message}', link=update.link), user_id=update.user_id)
        return bool(res)

Объект update класса UpdateCmn, который передаётся в данный метод, содержит различную полезную информацию и, в частности, всё то, что нам сейчас необходимо:


  • update.message — объект, содержащий само сообщение;
  • update.link — готовая ответная ссылка на это сообщение;
  • update.user_id — идентификатор пользователя, отправившего сообщение.

Для отправки сообщения от бота используем переменную self.msg, в которой содержится объект MessagesApi, реализовывающий функциональность, описанную в разделе messages описания API. Этот объект содержит нужный нам метод send_message(), который и обеспечивает отправку сообщений. По минимуму, в этот метод необходимо передать объект класса NewMessageBody и адресата — идентификатор пользователя, в нашем случае.


В свою очередь, объект класса NewMessageBody в данном случае создаётся посредством передачи текстового представления объекта сообщения-источника и ответной ссылки на сообшение-источник.


Перезапускаем нашего бота и проверяем в диалоге с ботом, что на любое наше сообщение бот формирует ответ, содержащий внутреннее представление объекта сообщения-источника.


Исходный код данного состояния см. здесь.


Добавление новой команды бота с параметром — показ внутреннего представления сообщения по его идентификатору


При разработке ботов зачастую требуется посмотреть внутреннее представление сообщения по одному или нескольким известным идентификаторам сообщений (message id — mid). Добавим такую функциональность нашему боту. Для этого, вначале, вынесем в отдельный метод функциональность вывода информации о внутреннем представлении сообщений:


    def view_messages(self, update, list_mid, link=None):
        res = False
        msgs = self.msg.get_messages(message_ids=list_mid)
        if msgs:
            for msg in msgs.messages:
                r = self.msg.send_message(NewMessageBody(f'Сообщение {msg.body.mid}:\n`{msg}`'[:NewMessageBody.MAX_BODY_LENGTH], link=link), user_id=update.user_id)
                res = res or r
        return res

В этот метод мы передаём список mid.


Для получения объектов сообщений мы используем метод self.msg.get_messages, возвращающий список объектов в свойстве messages.


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


Затем добавим метод, обрабатывающий команду. Назовём её vmp. В команду можно будет передать список mid через пробел.


ТТБ спроектирован таким образом, что обработчик команды должен создаваться как метод с именем cmd_handler_%s, где %s — имя команды. Т.е. для команды vmp метод будет называться cmd_handler_vmp. В обработчик команды передаётся объект класса UpdateCmn. Дополнительно, для команды он может содержать свойство cmd_args, в котором содержится словарь строк и слов в них, которые были введены вместе с командой


Код будет выглядеть так:


    def cmd_handler_vmp(self, update):
        res = None
        if not update.this_cmd_response:  # Это прямой вызов команды, а не текстовый ответ на команду
            if update.cmd_args:  # Если вместе с командой сразу переданы аргументы
                list_id = []
                parts = update.cmd_args.get('c_parts') or []
                if parts:
                    for line in parts:
                        for part in line:
                            list_id.append(str(part))
                if list_id:
                    res = self.view_messages(update, list_id, update.link)
        return bool(res)

Перезапускаем бот. Теперь, если в диалоге бота набрать команду вида: /vmp mid1 mid2 (mid'ы можно взять их предыдущих проверок), то в ответ мы получим два сообщения с внутренним представлением объектов сообщений-источников, по каждому из переданных mid.


Исходный код данного состояния см. здесь.


Модификация команды бота для работы с текстовым ответом


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


Но что делать, если мы хотим увидеть информацию об оригинальном сообщении? В этом случае нужно брать mid из пересланного сообщения.


Для реализации этого режима модифицируем команду vmp таким образом, чтобы при её вызове без параметров она ожидала пересылки сообщения, а после этого брала mid пересланного сообщения и выводила информацию о нём.


(!) Для корректной работы данного функционала, боту должно быть предоставлено разрешение на чтение из канала/чата источника.


Код команды модифицируем следующим образом:


    def cmd_handler_vmp(self, update):
        res = None
        if not update.this_cmd_response:  # Это прямой вызов команды, а не текстовый ответ на команду
            if update.cmd_args:  # Если вместе с командой сразу переданы аргументы
                list_id = []
                parts = update.cmd_args.get('c_parts') or []
                if parts:
                    for line in parts:
                        for part in line:
                            list_id.append(str(part))
                if list_id:
                    res = self.view_messages(update, list_id, update.link)
            else:  # Вывод запроса для ожидания ответа
                self.msg.send_message(NewMessageBody(f'Перешлите *одно* сообщение канала/чата для показа его свойств:'), user_id=update.user_id)
                update.required_cmd_response = True  # Сообщаем о необходимости ожидания текстового ответа
        else:  # Текстовый ответ команде
            message = update.message
            link = message.link  # Доступ к пересланному сообщению через свойство link
            # Проверим - пересылка ли это.
            if link and link.type == MessageLinkType.FORWARD:
                res = self.view_messages(update, [link.message.mid], update.link)
            else:
                # Выведем сообщение об ошибке и сообщим в коде возврата, что команда не отработала.
                self.msg.send_message(NewMessageBody(f'Ошибка. Необходимо *переслать* сообщение из канала/чата. Повторите, пожалуйста.'), user_id=update.user_id)
                return False

        return bool(res)

А т.к. при таком подходе увеличивается риск из-за отсутствия доступа к сообщениям, то в метод view_messages() добавим проверку на соответствие количества запрошенных/полученных сообщений:


    def view_messages(self, update, list_mid, link=None):
        res = False
        msgs = self.msg.get_messages(message_ids=list_mid)
        if msgs:
            # Сравнение количества переданных mid с количеством полученных сообщений
            if len(msgs.messages) < len(list_mid):
                self.msg.send_message(NewMessageBody(
                    f'Не удалось получить все запрошенные сообщения. Проверьте доступ бота @{self.username} к каналам/чатам этих сообщений.', link=update.link
                ), user_id=update.user_id)
                return False
            else:
                for msg in msgs.messages:
                    r = self.msg.send_message(NewMessageBody(f'Сообщение {msg.body.mid}:\n`{msg}`'[:NewMessageBody.MAX_BODY_LENGTH], link=link), user_id=update.user_id)
                    res = res or r
        return res

Перезапускаем бот, даём команду /vmp и после вывода приглашения о необходимости пересылки, пересылаем сообщение из канала/чата. При наличии у бота прав на чтение сообщений в этом канале/чате, будет выведено текстовое представление объекта пересланного сообшения. Если доступа нет, то бот сообщит о возможной проблеме и будет ожидать пересылки из корректного источника.


Настройка свойств бота


Теперь осталось навести лоск. Перекроем свойство about, возвращающее текст, который бот выводит при начале работы с ним, а также по команде /start.


    @property
    def about(self):
        return 'Этот бот помогает в разработке и управлении ботами.'

Перекроем метод get_commands(), возвращающий список команд нашего бота, отображающийся в диалоге с ботом.


    def get_commands(self):
        # type: () -> [BotCommand]
        commands = [
            BotCommand('start', 'о боте'),
            BotCommand('menu', 'показать меню'),
            BotCommand('vmp', 'показать свойства сообщения'),
        ]
        return commands

Перекроем свойство main_menu_buttons, возвращающее список кнопок главного меню, вызываемого по команде /menu.


    def main_menu_buttons(self):
        # type: () -> []
        buttons = [
            # Кнопка будет выведена цветом по умолчанию - серым
            [CallbackButtonCmd('О боте', 'start')],
            # Кнопка будет выведена цветом для позитивных действий - синим. Также есть негативная - красная
            [CallbackButtonCmd('Показать свойства сообщения', 'vmp', intent=Intent.POSITIVE)],
        ]

        return buttons

Перезапускаем бот, убеждаемся что всё в порядке. Поздравляю, Ваш первый бот создан и, несмотря на некоторую игрушечность, обладает вполне востребованной функциональностью.


Исходный код данного состояния см. здесь.


Работающего бота @devhelpbot можно посмотреть здесь.


На этом, пока, всё. Если тема заинтересовала, то в следующих статьях могу рассмотреть дальнейшее развитие бота. Например, добавление кастомных кнопок (в частности Да/Нет) и их обработку, отсылку различного вида контента (файлы, фото и пр.), работа в режиме webhook и т.п.


Кстати, оперативно вопросы можно задать в специальном чате. Туда же направляйте и предложения/идеи.

Комментарии (43)


  1. mr_tron
    06.09.2019 16:42
    +3

    Но зачем?!


  1. hd_keeper
    06.09.2019 16:48
    +4

    Кто-то пользуется тамтамом, кроме ботов?


    1. sashalartey
      06.09.2019 17:07
      +1

      Да, 1М человек из разных стран ежемесячно ;)


      1. okeld
        06.09.2019 17:47

        Где-то есть статистика?


        1. sashalartey
          06.09.2019 18:51

          Цифры можно посмотреть здесь


          1. gudvinr
            07.09.2019 14:21

            Зачем вам нужно четыре отдельных мессенджера (те что по ссылке + вк)? Раз вы одна компания, почему бы не консолидировать силы на развитие одного нормального, в который можно войти через все платформы, которые итак являются частью MRG?


            По сравнению с аудиторией других мессенджеров 1млн в месяц — это примерно ноль. При этом, в сумме всеми платформами вы охватываете практически всех жителей России.
            Ладно, Агент старый как динозавры. ICQ тоже не молодой (хоть и переделан примерно полностью). Но для чего было делать отдельный мессенджер в 2019 году?


            1. sashalartey
              09.09.2019 13:18

              ТамТам был создан в 2017 году. По функциям у ТамТам свои особенности — видеозвонки в высоком качестве, безлимитное место в облаке, отправка файлов до 2Gb, логин через Gmail и другими способами, чаты до 20 000 участников с возможностью добавить администраторов, каналы также с возможностью назначать администраторов, Bot API, «живые» стикеры у нас были еще на старте. У продукта много своих «фишек», с которыми мы экспериментируем и смотрим, насколько людям это помогает общаться. При этом у MRG есть и другие команды, которые работают в сфере мессенджеров, и каждая может реализовать сове видение для своей аудитории.


              1. gudvinr
                09.09.2019 17:13
                +1

                И как это отвечает на вопрос зачем вам нужно столько мессенджеров? То, что вы говорите уже итак есть на официальной странице.


                Окей, особенности. Окей, есть команды. А дальше-то что? Получается, аудитория ICQ — это не люди и им не нужно помогать общаться, например?


                1. sashalartey
                  09.09.2019 19:13

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


                  1. gudvinr
                    09.09.2019 19:36

                    Вы же понимаете, что люди пользуются не тем сервисом, у которого фич больше, а тем, где они со своим кругом общения могут поддерживать связь?


                    Если все друзья/семья/знакомые пользуются вк, они не начнут пользоваться тамтамом потому что там стикеры дёргаются и видеозвонки есть.
                    А если учетная запись ВК позволяет пользоваться тамтамом без лишних телодвижений — взять с собой кого-то еще попробовать — уже проблем не составляет.


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


          1. AlexMt
            08.09.2019 08:22
            +1

            Простите, может я чего-то не нашёл… Но где цифры то? Статистику вроде бы спрашивали. А там примерно то же самое, только у вас про 1М, а там про 7М.
            Ничего не понял.


            1. sashalartey
              09.09.2019 13:20

              У ТамТам более 7 миллионов регистраций (это за все время, начиная с самого старта продукта) и сейчас 1М MAU, то есть людей, которые используют мессенджер хотя бы раз в месяц.


      1. lain8dono
        07.09.2019 01:36

        Один мужчина, ездящий из страны в страну?


        1. sashalartey
          07.09.2019 13:06

          Да-да, именно так, миллион раз в месяц. Знаете, как он устал уже :)


      1. shifttstas
        08.09.2019 11:43

        Разные страны — это боты через VPN как я полагаю ?


        1. sashalartey
          09.09.2019 13:20

          да нет же, рассказали всю праву выше :))))


    1. aborouhin
      06.09.2019 19:18

      У нас управляющая компания посёлка после начала «блокировки» Телеграма перенесла свой официальный чат, где можно вопросы задать, заявки что-то починить оставить и пр. в ТамТам (странный, конечно, выбор). Вот ровно ради одного этого чата ТамТам и стои?т у меня и ещё нескольких сотен соседей.


      1. sashalartey
        07.09.2019 13:36

        Вы можете еще попробовать наши видеозвонки, нам часто пишут хорошие отзывы о них. Или, например, создать чат с самим собой (пустой чат) и использовать его для заметок, хранения файлов, у ТамТам неограниченное место в облаке. Можно еще создавать каналы и анонсировать их в чате поселка.


        1. aborouhin
          07.09.2019 13:40

          Да нет, спасибо. Технически-то мессенджер неплохой, но, знаете, репутация такая вещь…


          1. asvbkr Автор
            07.09.2019 13:58

            Это точно, про репутацию сказано. Особенно когда она из серии "то ли он кошелёк украл, то ли у него украли — но была с ним, знаете ли, какая-то неприятная история."


            1. aborouhin
              07.09.2019 14:26

              Можно и так сказать… А можно представить себе некую воображаемую страну (все совпадения с реальностью случайны), в которой любая крупная IT-компания, зарегистрированная в этой стране, вынуждена без лишних вопросов делиться данными пользователей своих продуктов с людьми в погонах. И ладно бы это, но уж так всё неправильно в этой стране устроено, что как только к данным получают доступ люди в погонах — так их сразу становится легко купить и на чёрном рынке. Для чего не надо даже самостоятельно лазить во всякие даркнеты — если по роду деятельности тебе приходится разгребать всякие мутные истории, то к тебе прямо в офис с соответствующим предложением приезжают. И данные других продуктов интересующей нас IT-компании в таких предложениях фигурируют…


            1. aborouhin
              07.09.2019 14:46

              И ещё одну историю вспомнил. Даже если от результатов вашей работы не зависят перемещения в списке Форбс, а фотографии вашего котика вряд ли кого-то заинтересуют…

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

              Так вот, маркетинг ТамТама после начала блокировок Телеграма ровно так и выглядел, сорри. И это тоже репутация.


            1. pyrk2142
              08.09.2019 09:38

              Репутация довольно неплохо работает и в другую сторону. Имхо, у MRG и ребят оттуда нет репутации разработчика надёжных и безопасных сервисов. Когда разработчики ТамТама допустят какую-то уязвимость и данные утекут, какие будут комментарии? «А, ну а чего вы ожидали от Mail.ru? Вы бы ещё деревенской сплетнице свою флешку с секретами отдали». Что будет в случае серьёзной уязвимости у Телеграма? Дикие срачи в интернетах и потенциальный отток пользователей. Кто в этой ситуации может пойти на ланч, потом на полдник, а уже в понедельник работать нормально? А кому нужно все время думать о том, что он делает? Ответ, я думаю, довольно понятен.

              ВК (тот же MRG) потребовалась куча месяцев, чтобы исправить серьёзную уязвимость, которая позволяла получить доступ к данным множества пользователей. При этом невыплаченное вознаграждение за информацию выглядит весьма неоднозначно, как мне кажется. Не идеализирую Телеграм, но им понадобилось гораздо меньше времени, чтобы обнаружить схожую проблему и исправить ее. Другой вопрос, как такая уязвимость могла вообще появиться в «безопасном мессерждере», но это отдельная история.

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

              А навязывание ТамТама относительно подневольным студентам и попытка пляски на костях Телеграма — это уже вопросы к самоуважению.


              1. andrejkot
                09.09.2019 16:22
                +2

                Раз уж заговорили про репутацию. Как выглядит открытый призыв Павла Дурова к удалению Whatsapp и переходу на Telegram? В этой статье он рассказывает какой Whatsapp плохой (и это мягко сказано):
                telegra.ph/Pochemu-WhatsApp-nikogda-ne-budet-bezopasnym-05-16-7

                В отличии от разработчика Telegram авторы ТамТам нигде не высказывались о качестве других подобных продуктов.

                Давайте будем справедливы в суждениях.


                1. sashalartey
                  09.09.2019 17:39

                  Мы согласны, что промо-кампания ТамТам в прошлом выгоду вызвала разные реакции. Это был смелый и неоднозначный шаг, и мы сделали выводы по его результатам. Мы не комментируем действия коллег по рынку и всегда корректно отвечаем на комментарии в свой адрес. А поверьте, эмоции в комментариях порой зашкаливали. ТамТам действительно повезло с командой, мы сфокусированы на развитии мессенджера и на том, как сделать общение людей в нем лучше.


  1. andToxa
    06.09.2019 19:28

    Сергей, вопрос: кроме технической задачи, которую Вы сами себе поставили, есть применение у бота? или у вас поголовно все пользователи сидят в этом чате/мессенджере (что это?)


    1. asvbkr Автор
      06.09.2019 19:55

      Задача статьи не в разработке конкретного, соглашусь, достаточно абстрактного бота (хотя сам я им пользуюсь). Здесь я рассматриваю не бот как таковой, а методику работы с инструментом для разработчиков-ботоделов, создающих или желающих создавать своих ботов. А уж боты могут быть совершенно разными — есть боты для служб поддержки пользователей, боты для голосовалок, лайков в чатах и каналах, боты-переводчики и т.п. Какие именно боты разрабатывать, решают сами ботоделы по своим потребностям и исходя из возможностей бот-апи.


      Что такое ТамТам лучше посмотреть на его сайте — https://tamtam.chat/, а ещё лучше установив его. А в нескольких словах — это удобный месенджер для всех платформ с чатами и каналами.


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


      Ботов для ТТ я сейчас пишу в личных целях и потому, что мне это просто в кайф).
      А сама статья появилась потому, что комьюнити разработчиков ТТ попросили сделать инструкцию к созданному мной инструменту.


  1. tbl
    06.09.2019 19:32

    Хм, а почему нельзя было взять один-в-один бот апи от телеги, чтобы разрабам существующих ботов не пришлось дополнительное что-то делать, а просто поменять адрес и токен? Тем более вам не в первой заниматься копипастой технологий (я не умаляю заслуг в том, что некоторые вещи у вас действительно уникальные)?


    1. asvbkr Автор
      06.09.2019 20:01

      Наверное, будет правильным, если на этот вопрос ответят представители разработчиков бот-апи из МРГ.
      Я не являюсь ни сотрудником ни аффилированным лицом МРГ :-)


      1. tbl
        06.09.2019 20:52

        Ввело в заблуждение, что статья размещена в блоге МРГ


        1. sashalartey
          07.09.2019 12:58

          Мы разместили статью в блоге, так как она про наш продукт. И, как сказал Сергей, другие разработчики для Bot API ТамТам просили нас публиковать подобные инструкции. Спасибо Сергею за материал!


  1. chachaUnholy
    07.09.2019 10:11

    Очень сомневаюсь, что у ТамТам будет стабильный API, за которым не придется гоняться с раздражающей частотой ради поддержания ботов (привет, ВК). Так что я, во имя лени, поставил в конторе XMPP сервер и переписываю ботов под него.
    Жаль для широкой аудитории сейчас это так себе вариант...


    1. asvbkr Автор
      07.09.2019 10:20

      Апи ТТ сейчас в бета-режиме, но лично я не могу пожаловаться на какую то его нестабильность. Нужно только не забывать пользоваться его версионностью. OAC, кстати, её поддерживаeт "на борту".


      А насчёт опыта с XMMP — возможно, если Вы им поделитесь, то он заинтересует и широкую аудиторию?


      1. chachaUnholy
        07.09.2019 11:17

        К сожалению опыта в этой сфере пока мало, чтобы делать статью. Но для комментария должно хватить.
        Перейти на XMPP меня сподвигли частые смены сторонних API и желание получить независимый от санкций/блокировок мессенджер.
        Процесс настройки сервера (ejabberd 16.09) и подбора оптимальных мобильных клиентов ещё не окончен: кто-то не видит историю дальше одной записи, кто-то не видит http upload для обмена файлами (Xabber и Xmpp Messenger. Conversations урезанный либо платный). Благо с десктопами всё проще: от Linux до Win10 остановился на Gajim.
        Для ботов использую Python3. Библиотека slixmpp. Код из примеров прост и работает без танцев с бубном.
        Всё перечисленное выше без проблем работает с сертификатом от Let's Encrypt.
        Почитать из довольно свежего для интересующихся можно эту обзорную статью: habr.com/ru/post/359084


    1. sashalartey
      07.09.2019 13:04

      Наш API уже не в бета режиме, посмотреть документацию можно здесь. Если вам интересно попробовать, буду рада добавить вас в коммьюнити, напишите мне на tt.me/partners, добавлю вас в чат разработчиков. Если наши разработчики находят нестабильности или баги, мы их исправляем, добавляем новые фичи по просьбам. Помимо Python, энтузиасты создали клиенты для Java, JavaScript, Kotlin и Go. Все как у людей :)


  1. shifttstas
    08.09.2019 11:47

    Но зачем использовать это? Сейчас существует только два живых и популярных мессенджера которые развиваются: WhatsApp, Telegram. Зачем тут ещё что-то?


    Какие уникальные функции предоставляет это? Может быть безопастности и Е2Е шифрование? или хорошую репутацию?


    1. hd_keeper
      09.09.2019 13:15

      А как же Skype?


      1. shifttstas
        10.09.2019 11:59

        Скайп уже не развивается и отмирает...


    1. sashalartey
      09.09.2019 14:53

      А еще есть с Viber, ICQ, WeChat, Facebook Messenger, мессенджер VK, а многие переписываются еще в Instagram :) У каждого продукта есть свои преимущества и своя аудитория. У ТамТам есть логин через Gmail, безграничное место в облаке, видеозвонки в высоком качестве, отправка файлов до 2Gb, Bot API, живые стикеры, быстрое добавление контактов «кто рядом», чаты до 20 000 человек с администрированием, каналы с администрированием, отправка местоположения и возможность запросить его по одной кнопке в диалоге, чате или канале, отправка галерей, редактирование вложений, умные черновики с запоминанием всех правок, выбор качества видео при отправке и я могу продолжать так очень долго. Но, возможно, вопрос на самом деле не про функционал ;)


    1. andrejkot
      09.09.2019 15:48
      +2

      А зачем использовать два вышеназванных мессенджера, если есть один ТамТам совмещающий функционал обоих, плюс свои фишки?
      А теперь по делу. Судя по тексту, статья не является рекламой ТамТам, а помогает разработчикам, которые не желают преодолевать сложности вместе с Телеграм (хотя мне тоже этот мессенджер нравится), начать писать ботов под свои задачи. Многим не хватает элементарной подсказки, чтобы сдвинуть дело с мертвой точки, поэтому труд автора однозначно заслуживает похвалы, он не только объясняет с чего в принципе нужно начать, но и предлагает к использованию свою библиотеку для простоты написания кода.


      1. sashalartey
        09.09.2019 18:49

        Полностью согласны, статья — тьюториал по созданию ботов на Python, очень подробный и качественный. Спасибо автору!!!


      1. shifttstas
        10.09.2019 11:54
        -1

        Ну как вам сказать, у там-там есть фатальный недостаток, которого нет у WhatsApp и Телеграм


  1. asvbkr Автор
    09.09.2019 13:30

    Попробую от себя ответить на вопросы типа "зачем нужно", "кто пользуется" и т.п.
    Оговорюсь сразу, что я не являюсь сотрудником МРГ, это не проплаченная реклама ТамТам да и вообще эта статья не про ТамТам как таковой.


    Поэтому только ИМХО. В силу различных обстоятельств это единственный мессенджер, подходящий для меня и моих задач. Меня лично он устраивает. Пользуюсь им я и моё окружение (семья, работа и т.п). На его использовании другими я нисколько не настаиваю и не предлагаю.


    Для себя я разработал удобный мне механизм разработки ботов на Python. Им захотели пользоваться другие разработчики и попросили инструкцию.
    Эта статья и есть такая инструкция.
    Буду очень благодарен и за другие вопросы. Спасибо всем откликнувшимся — как уже, так и в дальнейшем.