Задать вопрос
@jabl0k0

Почему python скрипт локально работает без каких-либо проблем, а на сервере отваливается функционал и падает скрипт?

A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: chat not found
Падает бот с ошибкой 400, когда жму кнопку проверить
Не выводятся сообщения пользователю
Отвалилась админка

скрипт представляет собой Telegram-бот, написанный на языке Python с использованием библиотеки `telebot`. Он выполняет следующие функции:

1. Импортирует необходимые модули: `telebot`, `sqlite3`, `types`, `os`.
2. Создает экземпляр бота, используя токен для доступа к API Telegram.
3. Определяет список `admin_chat_id`, который содержит идентификаторы администраторов чата.
4. Устанавливает соединение с базой данных SQLite (`users.db`).
5. Создает таблицу `users` в базе данных для хранения информации о пользователях, если она не существует.
6. Определяет функции для работы с базой данных: `get_users` (получение списка пользователей) и `update_user_info` (обновление информации о пользователе).
7. Определяет обработчики различных команд и сообщений, используя декораторы `@bot.message_handler` и `@bot.channel_post_handler`.
- Обработчик команды `/start` отправляет приветственное сообщение с клавиатурой и анимацией, добавляет пользователя в базу данных.
- Обработчик нажатия на кнопку "Чат команды" отправляет ссылку на чат команды с описанием и кнопкой "Проверить".
- Обработчик нажатия на кнопку "Проверить" проверяет статус заявки пользователя и уведомляет администраторов.
- Обработчик нажатия на кнопку "Назад" возвращает пользователя к основному меню.
- Обработчик команды `/update` обновляет информацию о пользователях в базе данных.
- Обработчик команды `/users` отправляет список пользователей администраторам.
- Обработчик новых сообщений в канале "Panda Project Выплаты" проверяет упоминания пользователей из базы данных и отправляет уведомления администраторам бота.
8. Запускает бота и ожидает новых сообщений (`bot.polling()`).

Сам скрипт:
развернуть

import telebot
import sqlite3
from telebot import types
import os

# Создание экземпляра бота
bot = telebot.TeleBot('...')

admin_chat_id = [5903933731, 6284726838]



# Подключение к базе данных
conn = sqlite3.connect('users.db', check_same_thread=False)

# Создание таблицы пользователей, если она не существует
with conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, tg_id INTEGER UNIQUE, application_sent INTEGER)")

# Получение списка пользователей из базы данных
def get_users():
    with conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users")
        return cursor.fetchall()

# Обновление информации о пользователе в базе данных
def update_user_info(user_id, username):
    with conn:
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET username=? WHERE tg_id=?", (username, user_id))
        conn.commit()


# Обработчик команды /start
@bot.message_handler(commands=['start'])
def start_command(message):
    # Создание клавиатуры с кнопками
    keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
    button1 = types.KeyboardButton("Чат команды")
    button2 = types.KeyboardButton("Мануал для новичков")
    keyboard.add(button1, button2)

        # Отправка приветственного сообщения с клавиатурой и анимацией
    script_dir = os.path.dirname(os.path.abspath(__file__))
    animation_path = os.path.join(script_dir, "1.mp4")
    caption_text = " PANDA PROJECT \n\n" \
                   "Test"
                   "Test"
                   
    # Отправка анимации с прикрепленным текстом
    with open(animation_path, 'rb') as animation_file:
        bot.send_animation(message.chat.id, animation_file, caption=caption_text, reply_markup=keyboard)
    bot.send_message(message.chat.id, "Выбери одну из опций:", reply_markup=keyboard)

    # Добавление пользователя в базу данных (если он уникален)
    user = message.from_user
    with conn:
        cursor = conn.cursor()
        cursor.execute("INSERT OR IGNORE INTO users (username, tg_id, application_sent) VALUES (?, ?, ?)",
               (user.username if user.username else "", user.id, 0))

        conn.commit()

# Обработчик нажатия на кнопку "Чат команды"
@bot.message_handler(func=lambda message: message.text == "Чат команды")
def team_chat_command(message):
    # Создание клавиатуры с кнопками "Проверить" и "Назад"
    keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
    button_check = types.KeyboardButton("Проверить")
    button_back = types.KeyboardButton("Назад")
    keyboard.add(button_check, button_back)
 


    # Отправка ссылки на чат команды с описанием и кнопкой "Проверить"
    chat_link = "https://t.me/+auRG72uUdCQxMWFi"
    chat_description = "Нажмите кнопку \"Проверить\", если Вы подали заявку на вступление. Мы уведомим админа."
    bot.send_message(message.chat.id, chat_description, reply_markup=keyboard)
    bot.send_message(message.chat.id, chat_link)

# Обработчик нажатия на кнопку "Проверить"
@bot.message_handler(func=lambda message: message.text == "Проверить")
def check_button_command(message):
    # Получение информации о пользователе из базы данных
    with conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users WHERE tg_id=?", (message.from_user.id,))
        user = cursor.fetchone()

        if user:
            if user[3] == 1:  # Проверяем значение столбца application_sent
                bot.send_message(message.chat.id, "Мы уже уведомили админа. Ожидайте!")
            else:
                # Уведомление администратору
                for admin_id in admin_chat_id:
                    bot.send_message(admin_id, f"Пользователь @{user[1]} с tg_id {user[2]} отправил заявку на вступление в чат.")

                # Обновление статуса заявки пользователя в базе данных
                cursor.execute("UPDATE users SET application_sent=1 WHERE tg_id=?", (message.from_user.id,))
                conn.commit()

                # Удаление кнопки "Проверить"
                keyboard = types.ReplyKeyboardRemove()
                bot.send_message(message.chat.id, "Мы уведомили админа. Ожидайте.", reply_markup=keyboard)
        else:
            bot.send_message(message.chat.id, "Мы уже уведомили админа. Ожидайте!")


@bot.message_handler(func=lambda message: message.text == "Назад")
def back_button_command(message):
    # Создание клавиатуры с кнопками
    keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
    button1 = types.KeyboardButton("Чат команды")
    button2 = types.KeyboardButton("Мануал для новичков")
    keyboard.add(button1, button2)

    # Отправка сообщения с клавиатурой
    bot.send_message(message.chat.id, "Выбери одну из опций:", reply_markup=keyboard)



# Обработчик нажатия на кнопку "Мануал для новичков"
@bot.message_handler(func=lambda message: message.text == "Мануал для новичков")
def newbie_manual_command(message):
    # Отправка ссылки на мануал для новичков
    manual_link = "https://t.me/+2N-xPdAwfk0xZGMy"
    bot.send_message(message.chat.id, f"Прочитайте мануал для новичков.\n\nЕсли останутся вопросы - обращайтесь к @scamswat\n\n{manual_link}", disable_web_page_preview=True)


# Обработчик команды /update
@bot.message_handler(commands=['update'])
def update_command(message):
    # Проверка, является ли отправитель администратором
    if str(message.chat.id) not in map(str, admin_chat_id):
        bot.reply_to(message, "У вас нет доступа к этой команде.")
        return

    # Получение списка пользователей
    users = get_users()

    # Обновление информации о пользователях в базе данных
    for user_id, username, tg_id, _ in users:
        try:
            user = bot.get_chat(tg_id)
            if user.username:
                new_username = user.username
                if username != new_username:  # Проверка изменения username
                    update_user_info(tg_id, new_username)
        except telebot.apihelper.ApiException:
            pass  # Обработка ошибки, если пользователь удален или заблокирован

    bot.send_message(message.chat.id, "Информация о пользователях успешно обновлена.")

# Обработчик команды /users
@bot.message_handler(commands=['users'])
def users_command(message):
    # Проверка, является ли отправитель администратором
    if str(message.chat.id) not in map(str, admin_chat_id):
        bot.reply_to(message, "У вас нет доступа к этой команде.")
        return

    # Получение списка пользователей
    users = get_users()

    # Отправка списка пользователей
    if len(users) > 0:
        response = "Список пользователей:\n"
        for i, (id, username, tg_id, application_sent) in enumerate(users, 1):
            response += f"{i}. | @{username} | {tg_id} | {'отправил заявку' if application_sent else 'не отправил заявку'}\n"
        bot.send_message(message.chat.id, response)
    else:
        bot.send_message(message.chat.id, "Список пользователей пуст.")

# Обработчик новых сообщений в Panda Project Выплатах
@bot.channel_post_handler(func=lambda message: message.chat.id == -1001861465135)  # ID канала
def channel_message_handler(message):
    # Проверка упоминаний пользователей из базы данных
    mentioned_users = get_users()

    for user in mentioned_users:
        username = user[1]
        tg_id = user[2]
        mention = f"@{username}"
        id = f"{tg_id}"

        if mention in message.text:
            # Отправка дубликата сообщения администраторам бота
            for admin_id in admin_chat_id:
                bot.send_message(admin_id, f"Упоминание {mention} с tg_id {id} в Panda Project Выплатах:\n\n{message.text}")


# Запуск бота
bot.polling()

  • Вопрос задан
  • 99 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы