Создание чата в открытых линиях битрикс24
Коллеги, есть вопрос такого характера. Сделали бота в Тг на питоне. Функционал супер простой: ЧаВо и задать вопрос администратору. Вопрос администратору должен прилетать в б24 в открытые линии, где админ уже может ответить пользователю и пользователь получит ответ в ТГ. Вот сам код ТГ-бота:
import requests
import logging
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, CallbackQueryHandler, ContextTypes, ConversationHandler, filters
# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Токен, который вы получили от BotFather
TELEGRAM_TOKEN = '__'
# URL вебхука Bitrix24
BITRIX_WEBHOOK_URL_TEMPLATE = '_____'
# Стадии разговора
CHOOSING, ADMIN_REQUEST, CONFIRM_ADMIN_REQUEST = range(3)
def send_message_to_bitrix24(webhook_url_template, user_id, message):
"""Отправка данных в Bitrix24 через вебхук."""
if not message.strip():
logging.error("Ошибка: сообщение не может быть пустым.")
return None, "MESSAGE_EMPTY: Message can't be empty"
# Формирование URL с параметрами
webhook_url = webhook_url_template + 'imopenlines.network.message.add'
data = {
'USER_ID': user_id,
'USER_CODE': f'imol|{user_id}',
'MESSAGE': message
}
# Отправка сообщения
message_response = requests.post(webhook_url, json=data)
logging.info(f"Ответ от API: {message_response.text}")
if message_response.status_code == 200:
logging.info("Сообщение успешно отправлено в Bitrix24.")
else:
logging.error(f"Ошибка при отправке сообщения: {message_response.status_code} - {message_response.text}")
return message_response.status_code, message_response.text
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
keyboard = [
[InlineKeyboardButton("Информация об обучении", callback_data='info_training')],
[InlineKeyboardButton("Информация о займе", callback_data='info_loan')],
[InlineKeyboardButton("Когда старт обучения?", callback_data='start_date')],
[InlineKeyboardButton("Я не получил письмо", callback_data='missing_email')],
[InlineKeyboardButton("Личный кабинет?", callback_data='access_account')],
[InlineKeyboardButton("Ссылка на соц.сети", callback_data='social_links')],
[InlineKeyboardButton("Запись на МК", callback_data='workshop_registration')],
[InlineKeyboardButton("Связь с админом", callback_data='contact_admin')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(f'Привет, {update.message.from_user.first_name}! Что вы хотите сделать?', reply_markup=reply_markup)
return CHOOSING
async def info_training(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text=, reply_markup=reply_markup)
return CHOOSING
async def info_loan(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text=, reply_markup=reply_markup)
return CHOOSING
async def start_date(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="-Обучение начнется (дата) и продлится до….?", reply_markup=reply_markup)
return CHOOSING
async def missing_email(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Если вы не получили письмо, пожалуйста, свяжитесь с нами по адресу [email protected].", reply_markup=reply_markup)
return CHOOSING
async def access_account(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Чтобы получить доступ к вашему личному кабинету, перейдите по ссылке https://example.com и используйте свои учетные данные.", reply_markup=reply_markup)
return CHOOSING
async def social_links(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Наши социальные сети:\n", reply_markup=reply_markup)
return CHOOSING
async def workshop_registration(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Назад", callback_data='back')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Для записи на мастер-класс перейдите по ссылке: https://example.com/workshop", reply_markup=reply_markup)
return CHOOSING
async def contact_admin(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Подтвердить", callback_data='confirm_admin_request')],
[InlineKeyboardButton("Отменить", callback_data='cancel')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Вы хотите связаться с администратором?", reply_markup=reply_markup)
return ADMIN_REQUEST
async def confirm_admin_request(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
user_id = query.from_user.id
user_message = "Запрос на связь с администратором от пользователя."
status_code, response_text = send_message_to_bitrix24(BITRIX_WEBHOOK_URL_TEMPLATE, user_id, user_message)
if status_code == 200:
await query.edit_message_text(text="Ваш запрос был отправлен администратору.")
else:
await query.edit_message_text(text=f"Произошла ошибка при отправке запроса: {response_text}")
return CHOOSING
async def back(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
keyboard = [
[InlineKeyboardButton("Информация об обучении", callback_data='info_training')],
[InlineKeyboardButton("Информация о займе", callback_data='info_loan')],
[InlineKeyboardButton("Когда старт обучения?", callback_data='start_date')],
[InlineKeyboardButton("Я не получил письмо", callback_data='missing_email')],
[InlineKeyboardButton("Личный кабинет?", callback_data='access_account')],
[InlineKeyboardButton("Ссылка на соц.сети", callback_data='social_links')],
[InlineKeyboardButton("Запись на МК", callback_data='workshop_registration')],
[InlineKeyboardButton("Связь с админом", callback_data='contact_admin')],
[InlineKeyboardButton("Главное меню", callback_data='start')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await query.edit_message_text(text="Что вы хотите сделать?", reply_markup=reply_markup)
return CHOOSING
def main():
application = Application.builder().token(TELEGRAM_TOKEN).build()
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CHOOSING: [
CallbackQueryHandler(info_training, pattern='^info_training$'),
CallbackQueryHandler(info_loan, pattern='^info_loan$'),
CallbackQueryHandler(start_date, pattern='^start_date$'),
CallbackQueryHandler(missing_email, pattern='^missing_email$'),
CallbackQueryHandler(access_account, pattern='^access_account$'),
CallbackQueryHandler(social_links, pattern='^social_links$'),
CallbackQueryHandler(workshop_registration, pattern='^workshop_registration$'),
CallbackQueryHandler(contact_admin, pattern='^contact_admin$'),
CallbackQueryHandler(start, pattern='^start$')
],
ADMIN_REQUEST: [
CallbackQueryHandler(confirm_admin_request, pattern='^confirm_admin_request$'),
CallbackQueryHandler(back, pattern='^back$'),
],
},
fallbacks=[CommandHandler('start', start)]
)
application.add_handler(conv_handler)
application.run_polling()
if __name__ == '__main__':
main()
Получаем ошибку:
2024-05-29 15:11:45,939 - root - INFO - Ответ от API: {"error":"CODE","error_description":"You entered an invalid code"} 2024-05-29 15:11:45,939 - root - ERROR - Ошибка при отправке сообщения: 400 - {"error":"CODE","error_description":"You entered an invalid code"}
Подсобите, в чем проблема?