Создание чата в открытых линиях битрикс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"}

Подсобите, в чем проблема?


Ответы (0 шт):