бот не видит 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 шт):
В этой части ваша раковая ошибка:
@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" в ссылке. Ссылка просто активирует кнопку старт в диалоге с ботом, и никак не передаёт то, что вы хотите.
В данном случае необходимо обратиться к документации Телеграм - 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:
# Поиск файла в базе данных по идентификатору
.
.
.