Как отправить боту команду по URL?

Я пытаюсь отправить боту команду с аргументами через URL. Я видел такие решения: https://t.me/_bot?start=my_data, но у меня это не работает и просто следует ссылка на бота. Напишите пожалуйста как правильно сгенерировать url для моей задачи и нужен ли для этого дополнительный обработчик в коде

какой бот? Какая команда? возможно, у вас неправильный код в боте — но мы не можем видеть ваш код и можем прочитать его в вашей голове — поэтому мы не можем вам помочь. Вы должны указать все детали, о которых идет речь (не в комментариях). И не ждите, что мы напишем за вас весь код.

furas 05.05.2024 16:13

Пользователь просматривает qr-код, отправленный ему ботом. В qr коде ссылка на бота в таком виде t.me/mybot?getreward=id_reward, а дальше он якобы должен нажать на ссылку и бот отправит эту команду. Ссылку на бота предоставить не могу, извините. И да, код правильный, я просто хочу нажать на эту ссылку, чтобы отправить команду боту, но на моих устройствах ссылка просто перенаправляет на моего бота.

user24736035 05.05.2024 16:19

Я не доверяю вашему коду.

furas 05.05.2024 16:21

@furas Я просто хочу понять, почему диплинк не работает. Какое это имеет отношение к коду?

user24736035 05.05.2024 16:31

насколько я помню, telegram позволяет только start=parameters, но не getreward=id_reward. И вам нужно создать команду /start, которая будет получать параметры update.message.text в виде текста /start paremeter1 parameter2 или в context.args в виде списка ['parameter1', 'parameter2']. И отображается кнопка START, которую пользователь должен нажать.

furas 05.05.2024 17:43

Возможно, вам придется отправить его как строку getreward-id_reward в start=getreward-id_reward и в команде start разделить на -. ИЛИ вы можете преобразовать dict {"getreward": id_reward} в base64 и в команде start использовать модуль base64.decode() в строку JSON и позже json.loads(), чтобы преобразовать эту строку JSON в словарь.

furas 05.05.2024 17:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для 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=

Другие вопросы по теме