Я пытаюсь отправить боту команду с аргументами через URL. Я видел такие решения: https://t.me/_bot?start=my_data, но у меня это не работает и просто следует ссылка на бота. Напишите пожалуйста как правильно сгенерировать url для моей задачи и нужен ли для этого дополнительный обработчик в коде
Пользователь просматривает qr-код, отправленный ему ботом. В qr коде ссылка на бота в таком виде t.me/mybot?getreward=id_reward, а дальше он якобы должен нажать на ссылку и бот отправит эту команду. Ссылку на бота предоставить не могу, извините. И да, код правильный, я просто хочу нажать на эту ссылку, чтобы отправить команду боту, но на моих устройствах ссылка просто перенаправляет на моего бота.
Я не доверяю вашему коду.
@furas Я просто хочу понять, почему диплинк не работает. Какое это имеет отношение к коду?
насколько я помню, telegram
позволяет только start=parameters
, но не getreward=id_reward
. И вам нужно создать команду /start
, которая будет получать параметры update.message.text
в виде текста /start paremeter1 parameter2
или в context.args
в виде списка ['parameter1', 'parameter2']
. И отображается кнопка START
, которую пользователь должен нажать.
Возможно, вам придется отправить его как строку getreward-id_reward
в start=getreward-id_reward
и в команде start
разделить на -
. ИЛИ вы можете преобразовать dict {"getreward": id_reward}
в base64
и в команде start
использовать модуль base64.decode()
в строку JSON и позже json.loads()
, чтобы преобразовать эту строку JSON в словарь.
Для t.me/<bot>
вы можете использовать только некоторые значения, например start=
, game=
.
См. документ: Глубокие ссылки — Ссылки ботов
Если вы используете start=params
, то он переключается на вашего бота
и он выполняет команду /start params
и отображается кнопка START
, которую пользователь должен нажать.
Если вы используете пустой start=
или start
, то он переключается на вашего бота
но он не выполняет команду /start
.
Поэтому, возможно, вам придется поставить всю информацию после start=
лайка
https://t.me/mybot?start=getreward-id_reward
и в команде start
вы можете использовать -
для разделения getreward-id_reward
Но... есть еще одна проблема. Он допускает только некоторые символы в parameters
— например, он не допускает +
или space
— поэтому может потребоваться преобразовать данные в строку base64
(Кстати: base64 позволяет использовать +
, но у telegram
могут возникнуть проблемы с +
, поэтому, возможно, придется использовать urlsafe_b64encode()
вместо популярного b64encode()
)
import base64
text = '++ hello world ++'
text_base64 = base64.urlsafe_b64encode(text.encode('utf-8')).decode('utf-8')
print(f'https://t.me/mybot?start = {text_base64}')
и позже
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
#print('text:', update.message.text) # /start something
#print('args:', context.args) # ['something']
text_base64 = context.args[0]
text = base64.urlsafe_b64decode(text_base64.encode('utf-8')).decode('utf-8')
print('text:', text)
await context.bot.send_message(chat_id=update.effective_chat.id, text=f"start params: {text}")
Если вы хотите отправить что-то более сложное (например, list
или dict
), вы можете использовать json
.
import base64
import json
data = {'method': 'xyz', 'id': 1234}
text_json = json.dumps(data)
text_base64 = base64.urlsafe_b64encode(text_json.encode('utf-8')).decode('utf-8')
print(f'https://t.me/furasbot?start = {text_base64}')
и позже
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
#print('text:', update.message.text) # /start something
#print('args:', context.args) # ['something']
text_base64 = context.args[0]
text_json = base64.urlsafe_b64decode(text_base64.encode('utf-8')).decode('utf-8')
data = json.loads(text_json)
print('data:', data)
print('keys:', data.keys())
print('method:', data['method'])
print(' id:', data['id'])
await context.bot.send_message(chat_id=update.effective_chat.id, text=f"start method: {data['method'}, id: {data['id']")
Обновлено:
Минимальный рабочий код для тестов (с python-telegram-bot
):
import os
import logging
from telegram import Update
from telegram.ext import filters, ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler
import base64
import json
def generate_link(text=None, data=None, b64=True, botname='<bot_name>'):
if text:
if b64:
output = base64.urlsafe_b64encode(text.encode('utf-8')).decode('utf-8')
else:
output = text
print(f'text: https://t.me/{botname}?start = {output}')
if data:
text = json.dumps(data)
output = base64.urlsafe_b64encode(text.encode('utf-8')).decode('utf-8')
print(f'data: https://t.me/{botname}?start = {output}')
generate_link(botname='furasbot', text='hello-world', b64=False)
generate_link(botname='furasbot', text='hello world')
generate_link(botname='furasbot', data = {'method': 'xyz', 'id': 1234})
# ----------------------------------
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
print('text:', update.message.text) # /start something
print('args:', context.args) # ['something']
#text = str(context.args)
text_base64 = context.args[0]
try:
text = base64.urlsafe_b64decode(text_base64.encode('utf-8')).decode('utf-8')
except Exception as e: # binascii.Error: Incorrect padding
print('Exception:', e)
text = text_base64
try:
data = json.loads(text)
except Exception as e: # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
print('Exception:', e)
data = dict()
print('text:', text)
print('data:', data)
print('keys:', data.keys())
for key, val in data.items():
print(f'> {key} = {val}')
await context.bot.send_message(chat_id=update.effective_chat.id, text=f"start params: {text}")
if __name__ == '__main__':
TOKEN = os.getenv('TELEGRAM_TOKEN')
application = ApplicationBuilder().token(TOKEN).build()
start_handler = CommandHandler('start', start)
application.add_handler(start_handler)
application.run_polling()
Некоторые ссылки:
https://t.me/<bot_name>?start=hello-world
https://t.me/<bot_name>?start=aGVsbG8gd29ybGQ=
https://t.me/<bot_name>?start=eyJtZXRob2QiOiAieHl6IiwgImlkIjogMTIzNH0=
какой бот? Какая команда? возможно, у вас неправильный код в боте — но мы не можем видеть ваш код и можем прочитать его в вашей голове — поэтому мы не можем вам помочь. Вы должны указать все детали, о которых идет речь (не в комментариях). И не ждите, что мы напишем за вас весь код.