WhatsApp demo чат-бот с GPT на Python#
Демонстрационная версия WhatsApp чат-бота основанного на API сервиса GREEN-API. При помощи API чат-бот отправляет текстовые сообщения, файлы, изображения, музыку, видео, контакты, геолокацию, проводит опросы, запрашивает аватар, отправляет ссылки, создает группу с ботом, цитирует сообщение.
Чат-бот наглядно демонстрирует использование API для отправки текстовых сообщений, файлов, картинок, локаций и контактов.
Отсканируйте QR-код или перейдите по ссылке для начала общения с чат-ботом.
Для запуска чат-бота на собственном Whatsapp аккаунте следуйте инструкциям:
- Установка среды для запуска чатбота
- Авторизация в GREEN-API
- Запуск чатбота
- Как запустить чатбота локально в debug-режиме
- Настройка чатбота
- Использование
- Структура кода
- Управление сообщениями
- Интеграция с ChatGPT
1. Установка среды для запуска чатбота#
Для запуска чат-бота необходимо иметь установленный интерпретатор Python. На Linux & MacOS он уже установлен. Для Windows скачайте последнюю стабильную версию с официального сайта, запустите установщик и следуйте рекомендациям.
Проверьте версию Python, для этого откройте командную строку (PowerShell - для Windows) и введите запрос:
python --version
Python 3.N.N
у вас должен быть Python версии 3.8 и выше.
Сделайте копию чат бота с помощью:
git clone https://github.com/green-api/whatsapp-demo-chatbot-python.git
Или скачайте архив whatsapp-demo-chatbot-python.
Перейдите в папку с чат-ботом в командной строке и установите необходимые библиотеки Python. Убедитесь, что у вас установлен пакетный менеджер pip.
Перечень необходимых библиотек находится в файле requirements.txt. Выполните следующую команду для их установки:
python -m pip install -r requirements.txt
2. Авторизация в GREEN-API#
Для того, чтобы настроить чат-бот на своем аккаунте Whatsapp, Вам необходимо перейти в личный кабинет и зарегистрироваться. Для новых пользователей предоставлена инструкция для настройки аккаунта и получения необходимых для работы чат-бота параметров, а именно:
idInstance
apiTokenInstance
3. Запуск чат-бота#
Бота можно запустить на сервере или локально. Для локального развертывания необходимо либо включить DEBUG MODE, либо запустить локальный сервер для передачи необходимых данных.
Файл конфигурации .env находится в папке config. При получении данных с сервера конфигурационный файл имеет вид:
active_profile=GreenAPI
spring_cloud_config_uri=http://localhost:8000
Где active_profile - идентификатор вашего профиля, в виде значений принимает строку. spring_cloud_config_uri - адрес до сервера с указание порта, откуда приходит json c указанием параметров.
Можете написать небольшой локальный сервер для передачи данных Вашему боту.
Пример сервера:
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse
import json
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_path = urlparse(self.path)
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps({
'user_id': 'Ваш ID',
'api_token_id': 'ВАШ ТОКЕН',
'link_pdf': 'url ССЫЛКА НА ФАЙЛ',
'link_jpg': 'url ССЫЛКА НА картинку',
'link_audio_ru': 'url ССЫЛКА НА аудио файл',
'link_video_ru': 'url ССЫЛКА НА видео файл',
'link_audio_en': 'url ССЫЛКА НА аудио файл',
'link_video_en': 'url ССЫЛКА НА видео файл'
}).encode())
return
if __name__ == '__main__':
server = HTTPServer(('localhost', 8000), RequestHandler)
print('Starting server at http://localhost:8000')
server.serve_forever()
python bot.py
В библиотеке whatsapp-chatbot-python прописан механизм изменения настроек инстанса методом SetSettings, который запускается при включении чат-бота.
Все настройки по получению уведомлений выключены по умолчанию, чат-бот включит следующие настройки:
"incomingWebhook": "yes",
"outgoingMessageWebhook": "yes",
"outgoingAPIMessageWebhook": "yes",
Процесс изменения настроек занимает несколько минут, в течение этого времени инстанс будет недоступен. Сообщения отправленные чат-боту в это время не будут обработаны.
После того, как будут применены настройки, произойдет удаление уведомлений о полученных ранее входящих сообщениях. Этот процесс так же прописан в библиотеке whatsapp-chatbot-python и автоматически запускается после изменения настроек.
Это необходимо для того, чтобы чат-бот не начал обрабатывать сообщения со старых чатов.
После того, как изменения настроек и удаление входящих уведомлений будут исполнены, чат-бот начнет стандартно отвечать на сообщения. Суммарно этот процесс занимает не больше 5 минут.
Чтобы остановить работу чат-бота, наведите курсор на командную строку и используйте сочетание клавиш Ctrl + C
4. Как запустить чат-бота локально в debug-режиме#
Для того, чтобы запустить бота локально, используйте переменную окружения DEBUG=True
. Все прочие необходимые переменные представлены ниже (создайте файл .env
и вставить свои действительные значения):
DEBUG=True
DEBUG_USER_ID=<Your Instance ID>
DEBUG_API_TOKEN_ID=<Your Api token ID>
DEBUG_LINK_PDF=<Full URL string for .pdf file>
DEBUG_LINK_JPG=<Full URL string for .jpg file>
DEBUG_LINK_AUDIO_RU=<Full URL string for .mp3 file (RU)>
DEBUG_LINK_VIDEO_RU=<Full URL string for .mp4 file (RU)>
DEBUG_LINK_AUDIO_EN=<Full URL string for .mp3 file (EN)>
DEBUG_LINK_VIDEO_EN=<Full URL string for .mp4 file (EN)>
LINK_PREVIEW=True
ACTIVE_PROFILE=<Any name>
SPRING_CLOUD_CONFIG_URI=http://localhost:8000
Пример ссылки
DEBUG_LINK_JPG="https://google.com/i/db/2022/11/1817828/image.jpg"
Значения ACTIVE_PROFILE и SPRING_CLOUD_CONFIG_URI - используются для совместимости.
Далее чат-бот получит доступ к Вашему аккаунту через эти данные:
bot = GreenAPIBot(id_instance, api_token_instance)
python bot.py
5. Настройка чатбота#
По умолчанию чат-бот использует ссылки для выгрузки файлов из сети, однако пользователи могут добавить свои ссылки на файлы, одну для файла любого расширения pdf / docx /... и одну для картинки.
Ссылки должны вести на файлы из облачного хранилища или открытого доступа. Все они либо прописываются непосредственно в файле .env, либо передаются по сети.
'link_pdf': 'url ССЫЛКА НА ФАЙЛ',
'link_jpg': 'url ССЫЛКА НА картинку',
'link_audio_ru': 'url ССЫЛКА НА аудио файл',
'link_video_ru': 'url ССЫЛКА НА видео файл',
'link_audio_en': 'url ССЫЛКА НА аудио файл',
'link_video_en': 'url ССЫЛКА НА видео файл'
Для более глубокой настройки пройдитесь по всем пунктам меню, смотрите в функциях - def main_menu_option_1_handler до main_menu_option_13_handler.
Все изменения должны быть сохранены, после чего можно запускать чат-бот.
Ссылки должны вести на файлы из облачного хранилища или открытого доступа и прописываются в .env. Текстовая информация содержится в data.yml. На 159-й строке в bot.py находится def main_menu_option_2_handler в функции есть следующий код:
try:
sender_lang_code = sender_state_data[LANGUAGE_CODE_KEY]
second_option_answer_text = (
f'{answers_data["send_file_message"][sender_lang_code]}'
f'{answers_data["links"][sender_lang_code]["send_file_documentation"]}'
)
except KeyError as e:
logger.exception(e)
return
notification.api.sending.sendFileByUrl(
notification.chat,
config.link_pdf,
"corgi.pdf",
caption=second_option_answer_text,
Таким же образом введите ссылку и название для картинки на 221-й строке:
notification.api.sending.sendFileByUrl(
notification.chat,
config.link_jpg,
"corgi.jpg",
caption=third_option_answer_text,
)
6. Использование#
Если предыдущие шаги были выполнены, то на вашем аккаунте Whatsapp должен работать чат-бот. Важно помнить, что вы должны быть авторизованы в личном кабинете.
Теперь можно отправлять сообщения чат-боту!
Чатбот откликнется на любое сообщение отправленное на аккаунт. Так как чатбот поддерживает 5 языков - English, Қазақша, Русский, Español, עברית. Прежде чем поприветствовать собеседника, чат-бот попросит выбрать язык общения:
*1* - English
*2* - Қазақша
*3* - Русский
*4* - Español
*5* - עברית
GREEN API предоставляет отправку данных следующих видов.
Выберите цифру из списка, чтобы проверить как работает метод отправки!
*1*. Текстовое сообщение 📩
*2*. Файл 📋
*3*. Картинка 🖼\
*4*. Аудио 🎵
*5*. Видео 📽
*6*. Контакт 📱
*7*. Геолокация 🌎
*8*. Опрос ✔
*9*. Получить картинку моего аватара 👤
*10*. Отправить ссылку 🔗
*11*. Создать группу с ботом 👥
*12*. Цитировать сообщение ©️
*13*. О PYTHON GREEN API чат-боте 🦎
Чтобы вернуться в начало напишите *стоп* или *0*
Например, отправив 1, пользователь получит в ответ:
Это сообщение отправлено через sendMessage метод
Чтобы узнать как работает метод, пройдите по ссылке
https://green-api.com/docs/api/sending/SendMessage/
Извините, я не совсем вас понял, напишите меню, чтобы посмотреть возможные опции
Спасибо за использование чат-бота GREEN-API, пользователь!
7. Структура кода#
Функциональная часть чат-бота находится в файле bot.py
. Здесь импортируется класс чат-бота GreenAPIBot
и входящее уведомление Notification
для обработки сообщений:
from whatsapp_chatbot_python import GreenAPIBot, Notification
bot = GreenAPIBot(id_instance, api_token_instance)
@bot.router.message(type_message=TEXT_TYPES, state=None)
@debug_profiler(logger=logger)
def initial_handler(notification: Notification) -> None:
Обработчик получает сообщения через входящие уведомления типа webhook. Проверив данные о пользователе, который отправил сообщение, чат-бот сохраняет отправителя используя библиотеку internal/utils.py.
Возвращаясь к файлу bot.py
, после того, как пользователь отправит первое сообщение чат-боту, чат-бот проверяет есть ли данный пользователь в списке пользователей. Если нет, то новый пользователь создается.
Потом, чат-бот ставит статус авторизации данного пользователя на True
, чтобы обозначить что данный чат активен и просит пользователя выбрать язык общения:
def initial_handler(notification: Notification) -> None:
sender_state_data_updater(notification)
notification.answer(answers_data["select_language"])
notification.answer()
это функция библиотеки чат-бота, которая проверяет данные о пользователе из входящего уведомления и отправляет ответ данному пользователю. data['select_language']
это один из текстовых ответов чат-бота, приготовленных заранее: *1* - English
*2* - Қазақша
*3* - Русский
*4* - Español
*5* - עברית
Чат-бот принимает входящее уведомление и видит, что чат с данным пользователем активен проверив статус авторизации. После этого чат-бот передает входящее уведомление в локальную функцию chosen_language_code
, устанавливает язык общения с пользователем:
try:
answer_text = (
f'{answers_data["welcome_message"][chosen_language_code]}'
f'*{notification.event["senderData"]["senderName"]}*!'
f'{answers_data["menu"][chosen_language_code]}'
)
После того, как установлен язык общения, все входящие уведомления переходят к функции options
, которые отвечают на команды 1-13, стоп, меню.
Например, если пользователь отправит 1, следующий код будет запущен:
try:
sender_lang_code = sender_state_data[LANGUAGE_CODE_KEY]
first_option_answer_text = (
f'{answers_data["send_text_message"][sender_lang_code]}'
f'{answers_data["links"][sender_lang_code]["send_text_documentation"]}'
)
Это сообщение отправлено через sendMessage метод
Чтобы узнать, как работает метод, пройдите по ссылке
https://green-api.com/docs/api/sending/SendMessage/
data.yml
и загружены в bot.py
: YAML_DATA_RELATIVE_PATH = "config/data.yml"
with open(YAML_DATA_RELATIVE_PATH, encoding="utf8") as f:
answers_data = safe_load(f)
data['welcome_message']['ru']
вернет приветственное сообщение на русском языке, а data['welcome_message']['eng']
- на английском языке: welcome_message:
en: "Welcome the to the GREEN API chatbot, "
kz: "GREEN API чат-ботына қош келдіңіз, "
ru: "Добро пожаловать в GREEN API чат-бот, "
es: "Bienvenido al chatbot GREEN API, "
he: "ברוכים הבאים לצ'אטבוט GREEN API, "
current_last_interaction_ts
обновляется новым временем: current_last_interaction_ts = current_sender_state_data[LAST_INTERACTION_KEY]
MAX_INACTIVITY_TIME_SECONDS = 300
if now_ts - current_last_interaction_ts > MAX_INACTIVITY_TIME_SECONDS:
return sender_state_reset(notification)
8. Управление сообщениями#
Как и указывает чат-бот в ответах, все сообщения отправлены через API. Документацию по методам отправки сообщений можно найти на сайте в разделе Методы отправки.
Что касается получения сообщений, то сообщения вычитываются через HTTP API. Документацию по методам получения сообщений можно найти на сайте.
Чат-бот использует библиотеку whatsapp-chatbot-python, где уже интегрированы методы отправки и получения сообщений, поэтому сообщения вычитываются автоматически, а отправка обычных текстовых сообщений упрощена.
Например, чат-бот автоматически отправляет сообщение контакту, от которого получил сообщение:
notification.answer(answers_data["select_language"])
notification.api.sending.sendContact(
chatId=notification.chat,
contact={
"phoneContact": notification.chat.split("@")[0],
"firstName": notification.event["senderData"]["senderName"],
},
9. Интеграция с ChatGPT#
Демо чат-бот теперь включает интеграцию с ChatGPT (опция 14 в меню), которая позволяет пользователям вести интерактивные беседы с моделями GPT от OpenAI прямо в чате WhatsApp.
Настройка#
Для включения функциональности ChatGPT необходимо настроить API-ключ OpenAI:
- Получите API-ключ на сайте OpenAI
- Добавьте ключ в переменные окружения или файл
.env
:
OPENAI_API_KEY=ваш_api_ключ_openai
Если API-ключ OpenAI не настроен, чат-бот отобразит сообщение об ошибке, когда пользователь попытается использовать функцию ChatGPT.
Конфигурация#
Интеграция с ChatGPT настраивается при инициализации бота:
gpt_bot = WhatsappGptBot(
id_instance=config.user_id,
api_token_instance=config.api_token_id,
openai_api_key=config.openai_api_key,
model="gpt-4o",
system_message="You are a helpful assistant in a WhatsApp chat. Be concise and accurate in your responses.",
max_history_length=10,
temperature=0.7
)
Вы можете настроить следующие параметры: - model
: Модель OpenAI для использования (по умолчанию "gpt-4o") - system_message
: Системное сообщение, которое определяет поведение ChatGPT - max_history_length
: Количество предыдущих сообщений, сохраняемых в контексте - temperature
: Управление "случайностью" в ответах (от 0.0 до 1.0)
Использование#
Пользователи могут получить доступ к функции ChatGPT, отправив "14" в главном меню. Чат-бот перейдет в специальный режим разговора с ChatGPT, где все сообщения будут пересылаться модели GPT для обработки.
Чтобы выйти из разговора с ChatGPT и вернуться в главное меню, пользователи могут написать одно из следующих ключевых слов (в зависимости от выбранного языка): - Английский: "exit", "menu", "stop", "back"
- Русский: "выход", "меню", "стоп", "назад"
- Казахский: "шығу", "мәзір", "тоқта", "артқа", "menu", "меню"
- Испанский: "salir", "menú", "parar", "atrás", "menu", "exit"
- Иврит: "יציאה", "תפריט", "עצור", "exit", "menu", "חזור"
Ограничения#
- Использование API может повлечь за собой расходы в зависимости от вашего плана подписки OpenAI
- Время ответа может варьироваться в зависимости от задержки API OpenAI и скорости вашего интернет-соединения
Лицензия#
Лицензировано на условиях Creative Commons Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0).