бот не видит file_id в сообщении t.me/game_and_dot_bot?start=1e6J4SQo1CenmaJ_Bt-EfTffAaD6mP6gL

Есть код:

import requests
import telebot
import sqlite3
import os
from _sqlite3 import Error
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

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

# Обработчик команды "/start"
@bot.message_handler(commands=['start'])
def handle_start(message):
    file_id = None
    if '=' in message.text:
        file_id = message.text.split('=')[1]

    if file_id:
        # Поиск файла в базе данных по идентификатору
        conn = create_connection()
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM files WHERE file_id=?", (file_id,))
        result = cursor.fetchone()
        cursor.close()
        conn.close()

        if result:
            file_name = result[2]
            file_path = result[3]
            google_drive_link = result[4]

            # Отправка файла пользователю с Google Диска
            response = requests.get(google_drive_link)
            if response.status_code == 200:
                with open(file_path, 'wb') as file:
                    file.write(response.content)
                with open(file_path, 'rb') as file:
                    bot.send_document(message.chat.id, file)
            else:
                bot.reply_to(message, 'Не удалось загрузить файл с Google Диска.')
        else:
            bot.reply_to(message, 'Файл с таким идентификатором не найден в базе данных.')
    else:
        bot.reply_to(message, 'Некорректный формат команды. Используйте t.me/game_and_dot_bot?start=<file_id>')


# Создание подключения к базе данных
def create_connection():
    conn = None
    try:
        conn = sqlite3.connect('database.db', check_same_thread=False)
        return conn
    except Error as e:
        print(e)
    return conn

# Подключаемся к базе данных
conn = create_connection()
cursor = conn.cursor()

# Создание таблицы файлов, если она не существует
cursor.execute('''
    CREATE TABLE IF NOT EXISTS files (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        file_id TEXT,
        file_name TEXT,
        file_path TEXT,
        google_drive_link TEXT
    )
''')

# Подключаемся к Google Диску
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

# Обработчик события присланного файла
@bot.message_handler(content_types=['document'])
def handle_file(message):
    file_info = message.document
    file_id = file_info.file_id
    # Генерируем уникальный идентификатор для файла
    file_id_short = file_id[:10].lower()
    file_name = file_info.file_name
    file_size = file_info.file_size

    file_directory = 'files'
    if not os.path.exists(file_directory):
        os.makedirs(file_directory)

    # Загружаем файл на Google Диск
    file_path = f'files/{file_id_short}_{file_name}'
    file_data = bot.get_file(file_id)
    downloaded_file = bot.download_file(file_data.file_path)
    with open(file_path, 'wb') as f:
        f.write(downloaded_file)

    # Создаем ссылку на скачивание файла
    file = drive.CreateFile({'title': file_name})
    file.SetContentFile(file_path)
    file.Upload()
    file_id = file['id']
    download_link = f"https://drive.google.com/uc?id={file_id}"

    # Сохраняем данные файла в базе данных
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute("INSERT INTO files (file_id, file_name, file_path, google_drive_link) VALUES (?, ?, ?, ?)",
                   (file_id, file_name, file_path, download_link))
    conn.commit()
    cursor.close()
    conn.close()

    # Отправляем ссылку на скачивание файла в чат
    bot.reply_to(message, download_link)

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

В этом коде бот сохраняет данные о файле в базу данных, создает для этого файла id и скачивает этот файл на google диск, а при отправке боту id файла, бот отправляет пользователю файл с диска. Но проблема в том, что когда отправляешь боту сообщение - t.me/game_and_dot_bot?start=1e6J4SQo1CenmaJ_Bt-EfTffAaD6mP6gL, где перейдя по этой ссылке нас отправляет в бота и боту отправляется команды start, и в этой команде скрыт id файла, но бот почему то не видит этот id. Перепробовал несколько вариантов, но ничего не помогло. Что делать?


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

Автор решения: Medvedev

В этой части ваша раковая ошибка:

@bot.message_handler(commands=['start'])
def handle_start(message):
    file_id = None
    if '=' in message.text:
        file_id = message.text.split('=')[1]

Что бы ваш код работал, вам необходимо отправлять сообщение: "/start =file_id". Во всех остальных случаях message.text равен "/start". Так как сообщение от вас уходит "/start" - здесь всё просто. И следовательно все условия прописанные под этим хендлером ни в каких случаях не будут работать, если вы отправляете просто "/start".

Ссылка формата t.me/game_and_dot_bot?start=1e6J4SQo1CenmaJ_Bt-EfTffAaD6mP6gL будет работать независимо от того что стоит после "start" в ссылке. Ссылка просто активирует кнопку старт в диалоге с ботом, и никак не передаёт то, что вы хотите.

→ Ссылка
Автор решения: CausonQ

В данном случае необходимо обратиться к документации Телеграм - Deep Linking

Когда кто-то переходит по ссылке вида https://t.me/your_bot?start=airplane, то от получает /start airplane. Тут нет знака =, на который вы проверяете.

А чтобы получить аргумент, используем argument = message.get_args()

В вашем случае, примерно так:

# Обработчик команды "/start"
@bot.message_handler(commands=['start'])
def handle_start(message):
    file_id = message.get_args()
    if file_id:
    # Поиск файла в базе данных по идентификатору
.
.
.
→ Ссылка