Как использовать команду через @?
у меня есть код рп команды для сообщества вк. но он работает ток через ответ на сообщение нужного человека.
нужно что бы он так же мог работать через упоминание пользователя через @ тоесть Рп погладить [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}")
Дополнительно:
Поместите свой код в тег
@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}")
В тексте вопросе же вроде речь шла про "... @id12345". Какого вида текст тогда все-таки использовать планируется?
Вот, хотелось бы что бы бот мог воспринимать 2 варианта и где просто id и тот где айди перекрыт именем
mentioned_users = re.findall(r'(?:id|@)(.+?)b', message.text) mentioned_users[0] |
mentioned_users = re.findall(r'(?:id|@)(.+?)b', message.text) mentioned_users[0]
mentioned_users = re.findall(r'[id(d+)', text)
mentioned_users = re.findall(r'|@(.+?)b', text)
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
mentioned_users = re.findall(r'|@(.+?)b', message.text) |
mentioned_users = re.findall(r'|@(.+?)b', message.text)
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
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]
Если же эту ошибку выдает даже на "правильном" сообщении с указанием пользователя, то приведите полный текст того сообщения, в котором пользователь есть, но не находит.
@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}")
Вместо всего этого
@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|кто-тотам]", для второго аналогично сделать.
Можно без 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|кто-тотам]", для второго аналогично сделать.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для использования команды через @ в различных языках программирования, включая PHP, можно воспользоваться специальными синтаксическими конструкциями или функциями, которые позволяют обращаться к переменным или функциям с использованием символа @.
Например, в PHP символ @ перед именем функции или переменной подавляет вывод ошибок, которые могли бы возникнуть при ее вызове. Это может быть полезно, если вы хотите избежать вывода ошибок на экран, но продолжить выполнение программы.
Пример использования символа @ в PHP:
// Без использования @ echo $undefinedVariable; // Выведет ошибку, так как переменная не определена // С использованием @ echo @$undefinedVariable; // Ошибка не будет выведена на экран
Также символ @ может использоваться в других языках программирования для подавления вывода ошибок или для обращения к переменным с особым способом. Например, в JavaScript символ @ может использоваться для доступа к свойствам объекта через прототип.
Обратите внимание, что использование символа @ может быть не самым лучшим решением, так как это может затруднить отладку программы и усложнить поиск ошибок. Поэтому рекомендуется использовать его осторожно и только в случаях, когда это необходимо.