Telegram бот для служби підтримки (частина 1)



У цьому циклі статей ми реалізуємо службу підтримки для онлайн-чатів. Система повинна повідомляти команду операторів про новий повідомленні, ділити навантаження на команду будь-якого розміру, делегувати повідомлення в залежності від пріоритету. Звучить моторошно. Але без паніки, я поділюся з вами нашим досвідом побудови такої системи, яка вмістилася всього в пару сотень рядків коду. Так, ми будемо використовувати Telegram-бота. Але не тому, що це модно, а тому що супер зручно.


Все почалося з того, як ми захотіли робити мобільний додаток, де люди можуть писати будь-яке питання в чати закладів навколо і отримати швидку відповідь. Зробити чат — не проблема. Але що якщо ми хочемо отримувати повідомлення про нові повідомлення в real-time, для миттєвої відповіді користувачеві?

У першій частині статті я покажу на тестовому прикладі, як можна управляти системою служби підтримки через чат-бота, чому це дуже простий і зручний спосіб. А у другій частині статті ми реалізуємо цей приклад на Python.

Проблема і рішення

Будь-яка команда операторів служби підтримки повинна відповідати на запити оперативно, для цього її потрібно оперативно повідомляти. Немає потреби вигадувати щось своє — будь-який сучасний месенджер впорається з цим завданням на ура. Я вибрав Telegram. Він зручний, працює на всіх основних платформах, а функціонал ботів випереджає навіть титанів ринку месенджерів як мінімум на рік. До чого це я про ботів?

В нашому випадку, бот являє собою інформаційний канал, до якого легко можна підключати людей, з якими можна взаимодествовать текстовими командами. Після того, як ми створили бота, підключити до нього людей легко, досить кинути їм посилання. Однак, наш бот виключно для внутрішнього використання. Не можна допустити, щоб будь-хто міг отримати доступ за цим посиланням. Посилання ми надійно ховати не можемо, а ось включати функціонал спеціальною командою з підтвердженням пароля — запросто.



Telegram бот дозволяє задавати для бота свої текстові команди. Робимо так: створимо команду "/on" яка «включає» функціонал бота для користувача. Але тільки після підтвердження паролем! Ну і на всяк випадок можна передбачити команду "/off", яка відключає функціонал.



Тепер наш бот знає групу людей — операторів служби підтримки. Поки що уявімо, що група операторів у нас всього одна, кожне питання від клієнта дуже важливий, тому будемо розсилати повідомлення всій групі. У цьому немає ніякої магії, звичайно Telegram має апі для розсилки повідомлень людям, підключились до нашого боту.



Тепер кожен член команди операторів отримає повідомлення. У текст повідомлення можна вставити посилання, по якому можна відповісти клієнту. Наприклад, це може бути посилання на веб-версію чату, через який ви здійснюєте підтримку.

Система, яку ми розробили, працює коректно, коли оператор служби підтримки один. Безумовно, ми можемо розсилати повідомлення будь-якій кількості людей. Але як зрозуміти, що хто-то вже відповідає на запит клієнта? Як розподіляти навантаження, щоб не виникло плутанини? Це ми будемо робити в наступній статті з допомогою… кнопок в чаті. Не так давно Telegram опублікував Bot Api 2.0. Тепер стало можливим додавати кнопки до повідомлень і відстежувати натискання на них користувачів. Чим ми і займемося в наступній статті. Ну і скріншот для превью того, що ми будемо робити.



Реалізація

Все необхідне для створення бота можна почитати в документації. Після того, як ми створили бота, приступаємо до коду. Будемо використовувати Python бібліотеки — обгортку Telegram API. Вона дозволяє писати обробку повідомлень у звичайних функції з декораторами, що досить зручно. Повний код нашого тестового прикладу доступний тут, по мірі виходу наступних статей я буду його оновлювати.

@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
bot.reply_to(message, "Welcome to Support_Bot!")

Так виглядає код, який реагує на команди "/start", "/help", а так само вітає нових користувачів бота (при першому відкритті бота автоматично надсилається команда "/start").

@bot.message_handler(commands=['on'])
def subscribe_chat(message):
if message.chat.id in team_users:
bot.reply_to(message, "You are already an operator")
else:
user_step[message.chat.id] = TEAM_USER_LOGGING
bot.reply_to(message, "Enter team secret phrase:")

Це вже обробка не стандартних команд ("/start" і "/help" є за замовчуванням у всіх ботів). Ми створили обробник команди "/on". Після обробки ми просимо ввести пароль.

@bot.message_handler(func=lambda message: user_step.get(message.chat.id) == TEAM_USER_LOGGING)
def team_user_login(message):
if message.text == 'password1':
team_users.add(TeamUser(message.chat.id))
user_step[message.chat.id] = TEAM_USER_ACCEPTED
bot.reply_to(message, "you've started receiving messages")
else:
bot.reply_to(message, "Wrong secrete phrase, try again")

Ця функція перевіряє пароль на валідність. Але як зрозуміти, що останнє повідомлення було паролем? В процесорі "/on" ми зберігаємо статус діалогу глобальної змінної. Декоратори обробників повідомлень можуть приймати lambda-функції, які попадют вхідні повідомлення і якщо lambda-функція повернула True — йдемо в обробник. Насправді, в нашому випадку текст повідомлення не так важливий, але ми перевіряємо статус глобальної змінної. Якщо користувач до цього викликав команду "/on" — значить потрібно інтерпретувати його повідомлення, як пароль. Якщо пароль проходить перевірку — збережемо так званий chat id куди-небудь, наприклад в файл. За допомогою цього id пізніше ми будемо відправляти повідомлення в чат оператору.

@bot.message_handler(commands=['off'])
def team_user_logout(message):
if message.chat.id not in team_users:
bot.reply_to(message, "You are not an operator anyway")
else:
team_users.remove_by_chat_id(message.chat.id)
bot.reply_to(message, "you've stopped receiving messages")

Аналогічно реалізуємо команду відключення оператора, який більше не хоче отримувати повідомлення.

def process(message):
text = '%s\n%s writes to %s\nReply: %s' %\
(message, 'Vasya', 'Super Support Team', '*reply_url*')
for user in team_users:
bot.send_message(user.chat_id, text, disable_web_page_preview=True)

Ну і розсилка повідомлень робиться ще простіше. Так як в повідомленнях ми можемо передавати різну інформацію, включаючи посилання, не будемо змушувати додаток Telegram намагатися розпарсити їх, це буде тільки заважати. З допомогою прапора disable_web_page_preview = True Telegram не буде намагатися проходити за нашими посиланнями і видавати картинку превью в чаті.

threading.Thread(target=bot.polling).start()

Запускаємо бота одним рядком (метод polling, ще доступні webhook-й, але для початку цього вистачить з головою).

У цій статті ми зробили бота, навчили його додавати операторів тільки після введення пароля, так само навчили його розсилати всім у групі операторів повідомлення. Я буду продовжувати цикл і розповім, як прибрати можливу плутанину «хто на який запит відповідає», як на основі бота зробити розбивку операторів на групи, делегування повідомлення певній групі, а так само як відповідати на запитання клієнтів не виходячи з Telegram чату. Таку систему ми використовуємо в роботі нашого додатка (Android і iOS). Ну і, звичайно, будемо вивчати нові класні фішки Telegram Bot API 2.0. Сподіваюся, наш досвід буде корисний.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.