@kreyzi

Как использовать команду через @?

у меня есть код рп команды для сообщества вк. но он работает ток через ответ на сообщение нужного человека.
нужно что бы он так же мог работать через упоминание пользователя через @ тоесть Рп погладить [id513340695|@vredinka_panda] помогите прошу

@bot.on.message(text=["Призми погладить", "Рп погладить", "[id{user_id}|Фурина]"])
async def pat_user(message: Message):
    # Проверяем, было ли упоминание пользователя через @
    mentioned_user_id = None
    mentioned_users = re.findall(r'\[id(\d+)\|.*?\]', message.text)
    if mentioned_users:
        mentioned_user_id = mentioned_users[0]

    # Получаем информацию об отправителе и упомянутом пользователе
    user_id = message.from_id
    user_info = await bot.api.users.get(user_ids=user_id)

    replied_user_id = mentioned_user_id or message.reply_message.from_id
    replied_user_info = await bot.api.users.get(user_ids=replied_user_id)

    user_name = user_info[0].first_name
    replied_user_name = replied_user_info[0].first_name

    try:
        target_name_out = morph.parse(replied_user_name)[0]
        gent = target_name_out.inflect({'accs'})
        replied_user_name_inflected = morph.parse(replied_user_name)[0].inflect({'accs'}).word.capitalize()

        owner_id = -193467820  # ID сообщества, у которого нужно получить фотографии
        album_id = 299924575  # ID альбома, из которого нужно получить фотографии

        response = await api.photos.get(owner_id=owner_id, album_id=album_id, count=100)
        photos = response.items

        random_photo = random.choice(photos)

        photo_attachment = f"photo{owner_id}_{random_photo.id}"

        await message.answer(
            message=f"@id{user_id} ({user_name}) погладил(а) @id{replied_user_id} ({replied_user_name_inflected})",
            attachment=photo_attachment
        )
    except Exception as e:
        print(f"An error occurred: {e}")
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
@o5a
Можно без regexp обойтись, просто методами самого vkbottle.
Вместо всего этого
@bot.on.message(text=["Призми погладить", "Рп погладить", "[id{user_id}|Фурина]"])
async def pat_user(message: Message):
    # Проверяем, было ли упоминание пользователя через @
    mentioned_user_id = None
    mentioned_users = re.findall(r'\[id(\d+)\|.*?\]', message.text)
    if mentioned_users:
        mentioned_user_id = mentioned_users[0]

Просто напрямую прописать этот формат в хэндлере, и затем использовать найденные им значения в функции
@bot.on.message(text=["Рп погладить [id<mentioned_user_id>|<mentioned_user_name>]", "Призми погладить", "Рп погладить"])
async def pat_user(message: Message, mentioned_user_id=None, mentioned_user_name=None):
    mentioned_user_id ... # уже можно использовать напрямую
    # можно и само имя использовать, если вдруг пригодится mentioned_user_name

Так должно работать для "Рп погладить [idxxx|кто-тотам]", для второго аналогично сделать.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы