Пишем юзербота для MAX:, Green-API и автоматизация рутины. Личный опыт и примеры кода

от автора

Юзербот — это обычный аккаунт MAX с подтвержденным номером телефона, которым управляет скрипт. В отличие от официальных чат-ботов, юзербот сидит под капотом обычного клиентского профиля. Официального API для этого нет, платформа такие вольности не любит. Но если нужно обойти ограничения и автоматизировать рутину — приходится использовать сторонние библиотеки.

 

Что нужно знать перед запуском:

Скрипт работает 24/7 с обычного аккаунта.

Доступны любые действия, которые может выполнить живой человек.

Нужно жестко контролировать частоту запросов. Ошибка в лимитах — улетаете в бан.

 

На чем писать юзербота:

Green-API — Есть техподдержка, SLA, стабильные коннекты.

PyMax — open-source, Настраиваете сами, падают без предупреждения.

 

Разбираем Green-API

Green-API дает готовый интерфейс для управления аккаунтом MAX. Смотрим, что умеет этот шлюз.

 

1. Работа с сообщениями

 

Отправка:

SendMessage — текст до 4000 символов, поддерживает эмодзи.

SendFileByUrl — отправляет медиа по внешней ссылке.

SendFileByUpload — грузит локальный файл через multipart/form-data.

SendLocation — кидает геопозицию (широта, долгота, название).

SendContact — отправляет карточку vCard.

 

Скачивание файлов:

Для личных и групповых чатов используется метод DownloadFile. Тянет картинки, документы, аудио и видео.

 

2. Парсинг истории:

Чтобы выгрузить переписку из группы или диалога используется метод GetChatHistory, при этом максимальная глубина выгрузки чатов — до 5000 сообщений за 3 месяца, которые можно отфильтровать по дате.

 

HTTP-запрос:

HTTP

POST {{apiUrl}}/waInstance{{idInstance}}/getChatHistory/{{apiTokenInstance}}

Параметры:

Отправляем

url = «https://3100.api.green-api.com/waInstance{id}/getChatHistory/{token}«

payload = {

«chatId»: «-730*******5943»,

«count»: 500

}

headers = {

  ‘Content-Type’: ‘application/json’

}

Ответ приходит в таком виде:

[

    {

        «type»: «outgoing»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754999812,

        «typeMessage»: «extendedTextMessage»,

        «chatId»: «10000000»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «extendedTextMessage»: {

            «text»: «Я использую GREEN-API для отправки этого сообщения!»,

            «description»: «»,

            «title»: «»,

            «jpegThumbnail»: «»,

            «forwardingScore»: 0,

            «isForwarded»: false

        },

        «statusMessage»: «»,

        «sendByApi»: true,

 

    },

    {

        «type»: «outgoing»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754987080,

        «typeMessage»: «extendedTextMessage»,

        «chatId»: «-69876543210123»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «extendedTextMessage»: {

            «text»: «Я использую GREEN-API для отправки этого сообщения!»,

            «description»: «»,

            «title»: «»,

            «jpegThumbnail»: «»,

            «forwardingScore»: 0,

            «isForwarded»: false

        },

        «statusMessage»: «»,

        «sendByApi»: true,

 

    },

    {

        «type»: «incoming»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754986980,

        «typeMessage»: «textMessage»,

        «chatId»: «10000000»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «senderId»: «10000000»,

        «senderName»: «Ходабрыш Пробешёлов»,

        «senderContactName»: «Ходабрыш Пробешёлов»

    },

    {

        «type»: «incoming»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754986980,

        «typeMessage»: «textMessage»,

        «chatId»: «-69876543210123»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «senderId»: «10000000»,

        «senderName»: «Ходабрыш Пробешёлов»,

        «senderContactName»: «Ходабрыш Пробешёлов»

    }

]

 

 

Для точечных задач есть методы GetMessage (получить конкретное сообщение по ID), а также LastIncomingMessages и LastOutgoingMessages (последние диалоги).

 

3 Ограничения:

—       отправка сообщений, файлов, локаций, контактов — не более 50 в секунду

—       загрузка файлов, получение истории чата, создание и обновление настроек группы, удаление участников, установка админа, получение своих контактов — не более 1 в секунду

—       редактирование сообщений — не  более 50 в секунду.

В целом, для рутинных задач лимитов более, чем достаточно.

 

 

3. Администрирование групп

 

Автоматизируем управление чатами (работа с каналами GreenApi Пока не реализовано).

 

—       Создание и настройка:

Используем CreateGroup для создания чата. Сразу закидываем туда участников через AddGroupParticipant и установить аватарку через SetGroupPicture.

Позже можно поменять название (UpdateGroupName) и настройки (UpdateGroupSettings), добавить или наоборот, отобрать права админа.

 

—       Разрешения, которые можно установить в группе через GreenApi:

JSON

{

  «chatId»: «-10000000000000»,

  «allowParticipantsAddMembers»: true,

  «allowParticipantsEditGroupSettings»: false,

  «allowParticipantsPinMessages»: true

}

allowParticipantsAddMembers — разрешение на добавление участников.

allowParticipantsEditGroupSettings — разрешение на редактирование профиля группы.

allowParticipantsPinMessages — закреп сообщений.

 

—       Получение информации о группе через GetGroupData:

—       id чата

—       владелец

—       наименование

—       описание

—       дата создания обычно хранится в формате Unix timestamp (целое число — количество секунд или миллисекунд с 1 января 1970 года)

—       если открыто владельцем — инвайт ссылка на группу

—       разрешение добавлять участников

—       разрешение изменять настройки группы участниками

—       разрешение менять аватарку группы участниками

—       количество участников

—       список участников (сейчас возвращается только в случае, если участников >=100, если больше- только админов)

Пример ответа:

JSON

{

  «chatId»: «-10000000000000»,

  «owner»: «79001234567»,

  «subject»: «Название группы»,

  «description»: «Описание группы»,

  «creation»: 1764637936,

  «groupInviteLink»: «https://invite.link/abc123«,

  «allowParticipantsAddMembers»: true,

  «allowParticipantsEditGroupSettings»: false,

  «allowParticipantsPinMessages»: true,

  «size»: 150,

  «participants»: [

    {

      «chatId»: «79001234567»,

      «isAdmin»: true,

      «isSuperAdmin»: true

    }

  ]

}

Нюанс: если в группе больше 100 человек, API вернет роль только вашего бота. Спарсить всех участников не выйдет.

 

—       Работа с участниками:

Добавление — AddGroupParticipant.

Удаление — RemoveGroupParticipant.

Даем админку — SetGroupAdmin.

Забираем админку — RemoveAdmin.

 

4. Сервисные функции

GetChats — собираем список всех диалогов пользователя. Групповые чаты ID всегда со знаком минус.

Пример:

JSON

[

  {

    «chatId»: «-10000000000000»,

    «phoneNumber»: 0

  },

  {

    «chatId»: «79001234567»,

    «phoneNumber»: 79001234567

  }

]

 

У групп phoneNumber всегда равен 0.

У личных чатов номер виден только если юзер не скрыл его настройками приватности.

 

CheckAccount — проверяем регистрацию (зарегистрирован ли номер в MAX):

Пример ответа:

JSON

{

  «exist»: true,

  «chatId»: «79001234567»

}

 

!Внимание: У GreenApi жёсткие лимиты на этот запрос (ограничение самого макса). Пользоваться точечно и в крайней необходимости. За чек базы контактов можно получить блокировку на 2 недели.

 

GetContacts — вытягиваем записную книжку юзера (контакты, сохраненные в телефонной книге юзера, если аккаунт подтянул ее с телефона, на котором зарегистрирован)

Пример ответа:

JSON

[

  {

    «chatId»: «79001234567»,

    «name»: «Иван Петров»,

    «contactName»: «Иван»,

    «type»: «user»,

    «phoneNumber»: 79001234567

  }

]

 

Примеры из практики

1. Модератор группы

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

 

Python

def moderate_group_messages():

    notifications = client.receive_notification()

   

    for notification in notifications:

        if notification[‘type’] == ‘incomingMessageReceived’:

            message = notification[‘messageData’][‘textMessage’]

            chat_id = notification[‘senderData’][‘chatId’]

           

            if is_spam(message):

                client.delete_message(chat_id, message_id)

                client.send_message(

                    chat_id,

                    «⚠️ Нарушение правил чата»

                )

2. Автоинвайтер сотрудников

Скрипт раскидывает новичков по рабочим чатам в зависимости от отдела.

 

Python

def add_employee_to_groups(phone, department):

    groups = get_groups_by_department(department)

   

    for group in groups:

        client.add_group_participant(

            chat_id=group[‘chatId’],

            participant_chat_id=phone

        )

3. Генератор отчетов

Сам собирает данные из CRM и пушит сводку в рабочий чат.

 

Python

def send_daily_report():

    stats = get_daily_statistics()

   

    report = f»📊 Отчет за {date.today()}:\n»

    report += f»Новые заказы: {stats[‘orders’]}\n»

    report += f»Выручка: {stats[‘revenue’]} руб.\n»

   

    client.send_message(

Чтобы выгрузить переписку из группы или диалога используется метод GetChatHistory, при этом максимальная глубина выгрузки чатов — до 5000 сообщений за 3 месяца, которые можно отфильтровать по дате.

 

HTTP-запрос:

HTTP

POST {{apiUrl}}/waInstance{{idInstance}}/getChatHistory/{{apiTokenInstance}}

Параметры:

Отправляем

url = «https://3100.api.green-api.com/waInstance{id}/getChatHistory/{token}«

payload = {

«chatId»: «-730*******5943»,

«count»: 500

}

headers = {

  ‘Content-Type’: ‘application/json’

}

 

 

Ответ приходит в таком виде:

[

    {

        «type»: «outgoing»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754999812,

        «typeMessage»: «extendedTextMessage»,

        «chatId»: «10000000»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «extendedTextMessage»: {

            «text»: «Я использую GREEN-API для отправки этого сообщения!»,

            «description»: «»,

            «title»: «»,

            «jpegThumbnail»: «»,

            «forwardingScore»: 0,

            «isForwarded»: false

        },

        «statusMessage»: «»,

        «sendByApi»: true,

 

    },

    {

        «type»: «outgoing»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754987080,

        «typeMessage»: «extendedTextMessage»,

        «chatId»: «-69876543210123»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «extendedTextMessage»: {

            «text»: «Я использую GREEN-API для отправки этого сообщения!»,

            «description»: «»,

            «title»: «»,

            «jpegThumbnail»: «»,

            «forwardingScore»: 0,

            «isForwarded»: false

        },

        «statusMessage»: «»,

        «sendByApi»: true,

 

    },

    {

        «type»: «incoming»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754986980,

        «typeMessage»: «textMessage»,

        «chatId»: «10000000»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «senderId»: «10000000»,

        «senderName»: «Ходабрыш Пробешёлов»,

        «senderContactName»: «Ходабрыш Пробешёлов»

    },

    {

        «type»: «incoming»,

        «idMessage»: «1763115112345»,

        «timestamp»: 1754986980,

        «typeMessage»: «textMessage»,

        «chatId»: «-69876543210123»,

        «textMessage»: «Я использую GREEN-API для отправки этого сообщения!»,

        «senderId»: «10000000»,

        «senderName»: «Ходабрыш Пробешёлов»,

        «senderContactName»: «Ходабрыш Пробешёлов»

    }

]

 

Для точечных задач есть методы GetMessage (получить конкретное сообщение по ID), а также LastIncomingMessages и LastOutgoingMessages (последние диалоги).

 

3 Ограничения:

—       отправка сообщений, файлов, локаций, контактов — не более 50 в секунду

—       загрузка файлов, получение истории чата, создание и обновление настроек группы, удаление участников, установка админа, получение своих контактов — не более 1 в секунду

—       редактирование сообщений — не  более 50 в секунду.

В целом, для рутинных задач лимитов более, чем достаточно.

 

3. Администрирование групп

Автоматизируем управление чатами (работа с каналами GreenApi Пока не реализовано).

 

—       Создание и настройка:

Используем CreateGroup для создания чата. Сразу закидываем туда участников через AddGroupParticipant и установить аватарку через SetGroupPicture.

Позже можно поменять название (UpdateGroupName) и настройки (UpdateGroupSettings), добавить или наоборот, отобрать права админа.

 

—       Разрешения, которые можно установить в группе через GreenApi:

JSON

{

  «chatId»: «-10000000000000»,

  «allowParticipantsAddMembers»: true,

  «allowParticipantsEditGroupSettings»: false,

  «allowParticipantsPinMessages»: true

}

allowParticipantsAddMembers — разрешение на добавление участников.

allowParticipantsEditGroupSettings — разрешение на редактирование профиля группы.

allowParticipantsPinMessages — закреп сообщений.

 

—       Получение информации о группе через GetGroupData:

—       id чата

—       владелец

—       наименование

—       описание

—       дата создания обычно хранится в формате Unix timestamp (целое число — количество секунд или миллисекунд с 1 января 1970 года)

—       если открыто владельцем — инвайт ссылка на группу

—       разрешение добавлять участников

—       разрешение изменять настройки группы участниками

—       разрешение менять аватарку группы участниками

—       количество участников

—       список участников (сейчас возвращается только в случае, если участников >=100, если больше- только админов)

Пример ответа:

JSON

{

  «chatId»: «-10000000000000»,

  «owner»: «79001234567»,

  «subject»: «Название группы»,

  «description»: «Описание группы»,

  «creation»: 1764637936,

  «groupInviteLink»: «https://invite.link/abc123«,

  «allowParticipantsAddMembers»: true,

  «allowParticipantsEditGroupSettings»: false,

  «allowParticipantsPinMessages»: true,

  «size»: 150,

  «participants»: [

    {

      «chatId»: «79001234567»,

      «isAdmin»: true,

      «isSuperAdmin»: true

    }

  ]

}

Нюанс: если в группе больше 100 человек, API вернет роль только вашего бота. Спарсить всех участников не выйдет.

 

—       Работа с участниками:

 

Добавление — AddGroupParticipant.

Удаление — RemoveGroupParticipant.

Даем админку — SetGroupAdmin.

Забираем админку — RemoveAdmin.

 

4. Сервисные функции

GetChats — собираем список всех диалогов пользователя. Групповые чаты ID всегда со знаком минус.

Пример:

JSON

[

  {

    «chatId»: «-10000000000000»,

    «phoneNumber»: 0

  },

  {

    «chatId»: «79001234567»,

    «phoneNumber»: 79001234567

  }

]

 

У групп phoneNumber всегда равен 0.

У личных чатов номер виден только если юзер не скрыл его настройками приватности.

 

CheckAccount — проверяем регистрацию (зарегистрирован ли номер в MAX):

Пример ответа:

JSON

{

  «exist»: true,

  «chatId»: «79001234567»

}

 

!Внимание: У GreenApi жёсткие лимиты на этот запрос (ограничение самого макса). Пользоваться точечно и в крайней необходимости. За чек базы контактов можно получить блокировку на 2 недели.

 

GetContacts — вытягиваем записную книжку юзера (контакты, сохраненные в телефонной книге юзера, если аккаунт подтянул ее с телефона, на котором зарегистрирован)

Пример ответа:

JSON

[

  {

    «chatId»: «79001234567»,

    «name»: «Иван Петров»,

    «contactName»: «Иван»,

    «type»: «user»,

    «phoneNumber»: 79001234567

  }

]

 

Примеры из практики

1. Модератор группы

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

 

Python

def moderate_group_messages():

    notifications = client.receive_notification()

   

    for notification in notifications:

        if notification[‘type’] == ‘incomingMessageReceived’:

            message = notification[‘messageData’][‘textMessage’]

            chat_id = notification[‘senderData’][‘chatId’]

           

            if is_spam(message):

                client.delete_message(chat_id, message_id)

                client.send_message(

                    chat_id,

                    «⚠️ Нарушение правил чата»

                )

2. Автоинвайтер сотрудников

Скрипт раскидывает новичков по рабочим чатам в зависимости от отдела.

 

Python

def add_employee_to_groups(phone, department):

    groups = get_groups_by_department(department)

   

    for group in groups:

        client.add_group_participant(

            chat_id=group[‘chatId’],

            participant_chat_id=phone

        )

3. Генератор отчетов

Сам собирает данные из CRM и пушит сводку в рабочий чат.

 

Python

def send_daily_report():

    stats = get_daily_statistics()

   

    report = f»📊 Отчет за {date.today()}:\n»

    report += f»Новые заказы: {stats[‘orders’]}\n»

    report += f»Выручка: {stats[‘revenue’]} руб.\n»

   

    client.send_message(

        chat_id=»-10000000000000″,

        message=report

    )

 

Юзерботы закрывают задачи, с которыми официальный API бота не справляется или не пускает из-за бюрократии. Платные шлюзы экономят время на поддержку инфраструктуры. Бесплатные библиотеки требуют прямых рук и готовности править код после каждого апдейта мессенджера.

 

Выбор зависит от ваших бюджетов и терпимости к рискам.

 

Техническая инфа актуальна на апрель 2026 года. Если копаете тему автоматизации и хотите обсудить кодинг по Max API — залетайте в топ 1 комьюнити разработчков: Max API Devs — 6max.ru/maxapidevs. В закрепе висит реализация кнопки, которую используют только разработчики Max в своём боте и никто больше не знает об этом методе. Статья написана участником этого Dev сообщества — 6max.ru/biser. Наш гитхаб — github.com/MaxApiDevs

 

ссылка на оригинал статьи https://habr.com/ru/articles/1022316/