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

Ссылка скопирована
1 ответ

у меня есть код рп команды для сообщества вк. но он работает ток через ответ на сообщение нужного человека.
нужно что бы он так же мог работать через упоминание пользователя через @ тоесть Рп погладить [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}")

@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}")

Дополнительно:

Поместите свой код в тег

  • Евгений Мартынов, как?
  • kreyzi,

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

  • dim5x, да
  • Евгений Мартынов, исправил
  • kreyzi, не совсем понятно, в чем именно вопрос? Помочь правильно написать regexp, который бы из текста вида "что-то там @id12345 и так далее" вытащил "12345", я так понимаю это пытались сделать? Если так, то достаточно "@id(d+)"
  • o5a, да, но и цыфры может скрыто за именим пользователя (такая особность вк)
  • o5a, не сработало. хотя может я не правильно сделал
    @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}")

    @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}")

  • kreyzi, зачем вы строку поиска regexp (шаблон) в квадратные скобки заключаете? У них другое назначение. Указанное у вас '[id(d+)]' будет искать строку вида ".... [id12345]"
    В тексте вопросе же вроде речь шла про "... @id12345". Какого вида текст тогда все-таки использовать планируется?
  • o5a, [id513340695|@vredinka_panda] вот пример использования
  • kreyzi, как именно это в тексте будет выглядеть? Так в скобках и будут писать что ли? Или все-таки текст будет в таком виде: "Погладить id1235", "Погладить @vredinka_panda"?
  • o5a,

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

    Вот, хотелось бы что бы бот мог воспринимать 2 варианта и где просто id и тот где айди перекрыт именем

  • kreyzi, Т.е. все-таки в самом тексте квадратных скобок нет. Я не особо в курсе, как в vk отображается "перекрытие именем", если там как раз и идет id12345, то можно так:
    mentioned_users = re.findall(r'(?:id|@)(.+?)b', message.text) mentioned_users[0]

    mentioned_users = re.findall(r'(?:id|@)(.+?)b', message.text) mentioned_users[0]

  • o5a, внес в код. не работает, перекрытие работает так: 'text': 'Рп погладить [id559313892|@valia_frosya] сначала айди, потом каким текстом хочешь перекрыть.
  • kreyzi, это из логов
  • kreyzi, т.е. получается, что в тексте с упоминанием всегда будет использован idxxx ? Тогда достаточно только его и искать, вообще не важно, кто там в подмене:
    mentioned_users = re.findall(r'[id(d+)', text)
  • kreyzi, если все-таки хотите из текста 'Рп погладить [id559313892|@valia_frosya]' доставать именно 'valia_frosya', то так:
    mentioned_users = re.findall(r'|@(.+?)b', text)
  • o5a, ERROR:vkbottle:name 'text' is not defined
    Traceback (most recent call last):
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchbase.py", line 22, in route
    await view.handle_event(event, ctx_api, self.state_dispenser)
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchviewsabcmessage.py", line 73, in handle_event
    handler_response = await handler.handle(message, **context_variables)
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchhandlersfrom_func_handler.py", line 32, in handle
    return await self.handler(event, **acceptable_context)
    File "c:bot2.py", line 555, in pat_user
    mentioned_users = re.findall(r'[id(d+)', text)
    NameError: name 'text' is not defined
  • kreyzi, я думал, поймете сами, что там не просто text, а message.text, я же просто показывал шаблон
    mentioned_users = re.findall(r'|@(.+?)b', message.text)

    mentioned_users = re.findall(r'|@(.+?)b', message.text)

  • o5a, ERROR:vkbottle:list index out of range
    Traceback (most recent call last):
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchbase.py", line 22, in route
    await view.handle_event(event, ctx_api, self.state_dispenser)
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchviewsabcmessage.py", line 73, in handle_event
    handler_response = await handler.handle(message, **context_variables)
    File "C:UserssamarAppDataLocalProgramsPythonPython39libsite-packagesvkbottledispatchhandlersfrom_func_handler.py", line 32, in handle
    return await self.handler(event, **acceptable_context)
    File "c:bot2.py", line 556, in pat_user
    mentioned_users[0]
    IndexError: list index out of range
  • o5a, извините за неудобство, но сам я правда не разберусь
  • kreyzi, проверку наличия найденного значения пропускать тоже не надо, которую до этого делали. Без нее конечно будет в ошибку уходить, если присылать сообщение, в котором вообще нет такого кода
    mentioned_users = re.findall(r'|@(.+?)b', message.text) if mentioned_users:     mentioned_user_id = mentioned_users[0]

    mentioned_users = re.findall(r'|@(.+?)b', message.text) if mentioned_users: mentioned_user_id = mentioned_users[0]

    Если же эту ошибку выдает даже на "правильном" сообщении с указанием пользователя, то приведите полный текст того сообщения, в котором пользователь есть, но не находит.

  • o5a, ошибка пропала. но теперь бот просто молчит
  • o5a,
    @bot.on.message(text=["Призми погладить", "Рп погладить"] async def pat_user(message: Message):     # Проверяем, было ли упоминание пользователя через @     mentioned_users = re.findall(r'|@(.+?)b', 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}")

    @bot.on.message(text=["Призми погладить", "Рп погладить"] async def pat_user(message: Message): # Проверяем, было ли упоминание пользователя через @ mentioned_users = re.findall(r'|@(.+?)b', 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}")

  • kreyzi, Да, что-то этим упоминанием больше запутали. Т.е. помимо обычных команд просто хотите чтобы срабатывало и от формата с упоминанием. Само упоминание насколько я понимаю в данном случае не важно для обработки, все равно важен только id. В таком случае насколько я понимаю, можно без 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{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

    @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|кто-тотам]", для второго аналогично сделать.

  • 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{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

    @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|кто-тотам]", для второго аналогично сделать.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Алексей Денисов Ответ

    Для использования команды через @ в различных языках программирования, включая PHP, можно воспользоваться специальными синтаксическими конструкциями или функциями, которые позволяют обращаться к переменным или функциям с использованием символа @.

    Например, в PHP символ @ перед именем функции или переменной подавляет вывод ошибок, которые могли бы возникнуть при ее вызове. Это может быть полезно, если вы хотите избежать вывода ошибок на экран, но продолжить выполнение программы.

    Пример использования символа @ в PHP:

    // Без использования @
    echo $undefinedVariable; // Выведет ошибку, так как переменная не определена
     
    // С использованием @
    echo @$undefinedVariable; // Ошибка не будет выведена на экран

    // Без использования @ echo $undefinedVariable; // Выведет ошибку, так как переменная не определена // С использованием @ echo @$undefinedVariable; // Ошибка не будет выведена на экран

    Также символ @ может использоваться в других языках программирования для подавления вывода ошибок или для обращения к переменным с особым способом. Например, в JavaScript символ @ может использоваться для доступа к свойствам объекта через прототип.

    Обратите внимание, что использование символа @ может быть не самым лучшим решением, так как это может затруднить отладку программы и усложнить поиск ошибок. Поэтому рекомендуется использовать его осторожно и только в случаях, когда это необходимо.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно