Как получить id пользователя с помощью vk_api & longpoll в беседе вк, на Python?
Вообщем, нужна функция которая сможет получить id пользователя в беседе(желательно по сообщению).
Создаю бота на вк и вот сложность в том, что сейчас он принимает только т.е если кто-то напишет боту «профиль» , то высветиться мой профиль. т.к from_id постоянно имеет значение с конкретно моим id. Вот как достать этот id, думаю над этим уже второй день. и в документацию лез, и вопросы искал похожие. Думаю вы поняли мою мысль.
У меня получалось нечто подобное:
def get_id(user_id): if reseived_message == "id": vk.users.get('message.send', ) print(user_id)
reseived_message — переменная с сообщением пользователя:
вот часть кода где находилась фукция:
for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat and event.message.get('text') !="": reseived_message = event.message.get('text'.lower()) sender = event.chat_id if 'ку' in str(reseived_message) or 'привет' in str(reseived_message): write_message(sender, "Добрый день" + " " + take_name(from_id=573881719) + "!")
Простой 2 комментария
def get_id(user_id): if reseived_message == "id": vk.users.get('message.send', ) print(user_id)
О боже, что я только что увидел, господа, запомните раз и навсегда: VkLongPoll- ТОЛЬКО для работы в ЛС, BotsLongPoll — в беседе. Еще, если вы хотите сделать профиль для каждого пользователя, то вам нужна база данных, (смотря что хотите написать в профиль)
Пример реализации того чего вы хотите на BotsLongPoll:
import time get_name(from_id): # Имя Фамилия пользователя if from_id > 0: sender_info = getting_api.users.get(user_ids=from_id)[0] full_name = sender_info.get('first_name') + ' ' + sender_info['last_name'] return full_name pass def profilesender(id, text) vk.method('messages.send', ) def chatsender(id, text): vk.method('messages.send', ) for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW: if event.from_chat: user_id = event.object.message['from_id'] mes = event.object.message['text'] if mes == 'профиль': vremya = '⏰Текущее время беседы:⏰\n' + str(time.asctime()) + '\n' chat = event.chat_id + '\n' #можете указать ид вашего чата user_name = get_name(from_id) chatsender(id, 'Вот ваш профиль\n' + '@id' + user_id) profilesender(id, 'Имя:' + user_name + '\n' + vremya + chat +)
P.S я незнаю что вы хотите добавить в профиль пользователя, но это был пример, вообще, для этого нужно создать класс, но если вы хотите узнать айди пользователя, не нужно создавать функцию, достаточно написать:
event.object.message[‘from_id’]
sender_info = getting_api.users.get(user_ids=from_id)[0]
chatsender(id, 'Вот ваш профиль\n' + '@id' + user_id)
def chatsender(id, text): vk.method('messages.send', )
??
3) и почему мы не могли использовать одну функцию? просто вызвал ее с разными параметрами:
chatsender(id, ‘Вот ваш профиль\n’ + ‘@id’ + user_id)
chatsender(Код с именем и временем)
. Господин, вам бы уроки по пайтону посмотреть, зачем вы лезете делать бота если вы не знаете что одна функция выполняет одну роль.
1.Если бы вы посмотрели уроки, вы бы поняли что ноль в «массиве» это срез чтобы что-то достать из списка.
2.Функция отправляет что-то в чат, первый ее аргумент: id — айди чата где произошло событие, второй — text, это любое ваше сообщение.
3.Запомните раз и навсегда, чтобы объединить две функции, можно создать одну функцию к примеру:
def rpsender(id, text, url): # Функция РП команд vk.method("messages.send", ) vk.method("messages.send", ) pass
Функция выше отправляет сообщение, а потом фото.
В функцию можно передать только аргументы которые есть в методе вк. Аргумент — переменная. Например, функция chatsender(id, text) принимает id и text. id — это переменная равная event.chat_id. Text- это текст вашего сообщения. В функции лежит метод «messages.send». Данный метод принимает значения chat_id и message. В значение chat_id мы передаем переменную id, в message text. В значение text можете передать что угодно, и время. Можно конечно в одну функцию все передать, вы можете это сделать, просто я немного торопился и создал отдельную (в этом ничего плохого нет) только для удобства создайте файл с расширением .py и создайте там лист. В лист передайте текст функции. Вот так:
#Support.py sup = ('текст функции без переменных!') #Итог chatsender(id, 'Вот ваш профиль\n' + '@id' + user_id + '\n' 'Имя:\n' + user_name + vremya + chat + '\n')
Usage
Several types of APIs are implemented in this module. Each of them is needed for certain purposes, but they are all united by the way of accessing the VK API. After initializing the class, you can call any method. Let’s try to figure out what’s going on here:
>>> import vk >>> api = vk.API(access_token='. ', v='5.131') >>> print(api.users.get(user_ids=1)) []
It gets user info with user id equal to 1. vk.api.APINamespace object is used to create API request and send it via original vk.session.API class object (or another), which in turn, manages access token, sends API request, gets JSON response, parses and returns it.
vk.API
The simplest VK API implementation. Can process any API method that can be called from the server
- access_token (Optional[str]) – Access token for API requests obtained by any means (see documentation ). Optional when using InteractiveMixin
- **kwargs (any) – Additional parameters, which will be passed to each request. The most useful is v — API version and lang — language of responses (see documentation )
>>> import vk >>> api = vk.API(access_token='. ', v='5.131') >>> print(api.users.get(user_ids=1)) []
vk.UserAPI
Subclass of vk.session.API . It differs only in that it can get access token using user credentials (Implicit flow authorization).
This implementation uses the web version of VK to log in and receive cookies, and then obtains an access token through Implicit flow authorization. In the future, VK may change the approach to authorization (for example, replace it with VK ID) and maintaining operability will become quite a difficult task, and most likely it will be deprecated. Use vk.session.DirectUserAPI instead
- user_login (Optional[str]) – User login, optional when using InteractiveMixin
- user_password (Optional[str]) – User password, optional when using InteractiveMixin
- client_id (Optional[int]) – ID of the application to authorize with, defaults to “VK Admin” app ID
- scope (Optional[Union[str,int]]) – Access rights you need. Can be passed comma-separated list of scopes, or bitmask sum all of them (see official documentation). Defaults to ‘offline’
- **kwargs (any) – Additional parameters, which will be passed to each request. The most useful is v — API version and lang — language of responses (see documentation )
>>> import vk >>> api = vk.UserAPI( . user_login='. ', . user_password='. ', . scope='offline,wall', . v='5.131' . ) >>> print(api.users.get(user_ids=1)) []
Callback to retrieve authentication check code (if account supports 2FA). Default behavior is to raise exception, redefine in a subclass
The authentication check code can be obtained in the sent SMS, using Google Authenticator (or another authenticator), or it can be one of ten backup codes
vk.DirectUserAPI
Subclass of vk.session.UserAPI . Can get access token using user credentials (through Direct authorization).
Necessary data (client_id and client_secret) from other official applications
- user_login (Optional[str]) – User login, optional when using InteractiveMixin
- user_password (Optional[str]) – User password, optional when using InteractiveMixin
- client_id (Optional[int]) – ID of the official application, defaults to “VK for Android” app ID
- client_secret (Optional[str]) – Client secret of the official application, defaults to client secret of “VK for Android” app
- scope (Optional[Union[str,int]]) – Access rights you need. Can be passed comma-separated list of scopes, or bitmask sum all of them (see official documentation). Defaults to ‘offline’
- **kwargs (any) – Additional parameters, which will be passed to each request. The most useful is v — API version and lang — language of responses (see documentation )
>>> import vk >>> api = vk.DirectUserAPI( . user_login='. ', . user_password='. ', . scope='offline,wall', . v='5.131' . ) >>> print(api.users.get(user_ids=1)) []
vk.CommunityAPI
Subclass of vk.session.UserAPI . Can get community access token using user credentials (Implicit flow authorization for communities). To select a community on behalf of which to make request to the API method, you can pass the group_id param (defaults to the first community from the passed list)
This implementation uses the web version of VK to log in and receive cookies, and then obtains an access tokens through Implicit flow authorization for communities. In the future, VK may change the approach to authorization (for example, replace it with VK ID) and maintaining operability will become quite a difficult task, and most likely it will be deprecated.
You can create a group token on the management page: Community -> Management -> Working with API -> Access Tokens -> Create a token (bonus — the token has no expiration date)
- user_login (Optional[str]) – User login, optional when using InteractiveMixin
- user_password (Optional[str]) – User password, optional when using InteractiveMixin
- group_ids (List[int]) – List of community IDs to be authorized
- client_id (Optional[int]) – ID of the application to authorize with, defaults to “VK Admin” app ID
- scope (Optional[Union[str,int]]) – Access rights you need. Can be passed comma-separated list of scopes, or bitmask sum all of them (see official documentation). Defaults to None . Be careful, only manage, messages, photos, docs, wall and stories are available for communities
- **kwargs (any) – Additional parameters, which will be passed to each request. The most useful is v — API version and lang — language of responses (see documentation )
>>> import vk >>> api = vk.CommunityAPI( . user_login='. ', . user_password='. ', . group_ids=[123456, 654321], . scope='messages', . v='5.131' . ) >>> print(api.users.get(user_ids=1)) [] >>> print(api.users.get(group_id=654321, user_ids=1)) []
© Copyright 2015, Dmitry Voronin. Revision c3cfe06e .
Как сделать бота VK, который получает цифровой ID из ссылки и отправляет пользователю?
Не подскажете ли вы, как создать бота, а именно команду, которая будет принимать ссылки типа: vk.com/ и https://vk.com
А далее обрабатывать их и выдавать цифровой ID пользователя ВКонтакте, сам пытался что-то сделать, но в итоге потерял просто 6 часов
Пример:
Пользователь вводит команду: ID vk.com/durov
Ответ бота: ID пользователя: 1
P.S Бот должен отвечать в беседах
- скармливаешь ему screen_name
- получаешь ID пользователя и дополнительный поля (если надо)
total4c, раз ты знаешь, почему не указал это в вопросе?
Выкладывай код, как пробовал. Иначе это уже задание
https://api.vk.com/method/(метод)?(Аргументы идущие через & )&access_token=(Ваш токен)&v=5.92
В этом случае можно вызвать метод с ключом доступа сообщества или через сервисный ключ доступа.
(Ключ доступа пользователя уже сами гуглите)
1. Используешь, к примеру, библиотеку vk_api (Установка pip install vk_api).
2. Импортируешь в программе: import vk_api
3. Начинаем работать с API вконтакте:
login, password = 'ВАШ_ЛОГИН', 'ВАШ_ПАРОЛЬ' vk_session = vk_api.VkApi(login, password) try: vk_session.auth() except vk_api.AuthError as error_msg: print(error_msg) return vk = vk_session.get_api()
4. Отправляем запрос и выдираем из него ID (вставляй его на место этой строки id1 = vk.method(«users.get»)[«id»]):
id_user = vk.users.get(user_ids = id1)[0][‘id’]
Надеюсь не сильно сумбурно )))
1. Из ссылки оставляем только короткое имя или id страницы
2. Передаём то, что получили в метод utils.resolveScreenName, или users.get
3. .
import vk_api vk = vk_api.VkApi(token="ТОКЕН") def resolve_url(url): # url - 'vk.com/durov' screen_name = url.split('/')[-1] # screen_name - 'durov' id_ = vk.method('users.get', )[0]['id'] # id_ - 1 return id_
import vk_api vk_session = vk_api.VkApi('номер', 'пароль') vk_session.auth() vk = vk_session.get_api() ids = vk.utils.resolveScreenName(screen_name='durov') print(ids['object_id'])