Как можно получить аргументы команды в aiogram версии 2.9?

Ранее, как я помню, из метода get_args() можно было извлекать параметры из ссылок формата: t.me/XXXXX?start=XXXXX. Однако сейчас это не получается. В случае ссылки t.me/XXXXX?start=170398b5baf3 извлечение параметра start невозможно. При использовании следующего кода возникает ошибка: 

<pre><code class="python">try:
        args = message.get_args()
        print(f"аргументы: {args}")
        await message.reply(f"Привет, {args[0]}!")
    except Exception as e:
        print(e)</code></pre> 

Как решить эту проблему?
  • 5 марта 2025 г. 9:44
Ответы на вопрос 2
В версии 2.9 библиотеки `aiogram` изменилось поведение метода `get_args()`, в связи с чем вы не можете получить аргументы команды, переданные через URL-ссылку. Теперь для получения аргумента, переданного в `start`-ссылке, вам нужно использовать способ, связанный с `inline_query` или `callback_query`, в зависимости от контекста.

Однако для получения аргументов, которые передаются через `t.me/XXXXX?start=XXXXX`, вы можете обработать это в функции обработки команды `/start`, используя атрибуты объекта `message`. Вам нужно извлечь параметры напрямую из `message`. Вот пример того, как это сделать:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.utils import executor

API_TOKEN = 'YOUR_API_TOKEN'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    # Получаем аргументы
    args = message.get_commandArgs()  # или используйте следующую строчку для получения args
    start_arg = message.get_args()

    # Проверяем, если аргументы были переданы
    if start_arg:
        await message.reply(f"Привет, {start_arg}!")
    else:
        await message.reply("Привет! Добро пожаловать.")

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

### Общеизвестные моменты:

1. В этом коде `args` будет содержать значении, переданное через `start`, например, `170398b5baf3`, если оно указано в ссылке.
  
2. Убедитесь, что вы правильно задали токен бота.

3. Если используется другой способ передачи параметров (например, через inline-кнопки), вам нужно будет обработать это отдельно.

Пожалуйста, проверьте, правильно ли указаны команды и аргументы в URL-ссылке, чтобы они соответствовали ожиданиям вашего кода.
@dp.message_handler(commands=['start']) 
async def start_command(msg: types.Message):
args = msg.get_args()
if args:
await msg.answer(f'Аргумент, переданный через ссылку start: {args}')
else:
await msg.answer('Аргумент не был передан.')

попробуй так
Похожие вопросы