Как получить ID пользователя после его выхода из беседы ВК
Не могу получить user id пользователя после его выхода с беседы. Help.
import vk_api from vk_api.utils import get_random_id from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType token_vk = 'zxc' autorizate = vk_api.VkApi(token = token_vk) longpoll = VkBotLongPoll(autorizate, group_id = 1234567890) vk = autorizate.get_api() while True: for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat and event.message.get('text'): if #пользователь вышел/его кикнули: vk.message.send('message = 'Пользователь вышел из беседы.', random_id = get_random_id(), chat_id = 123')
Отслеживать
47.5k 17 17 золотых знаков 56 56 серебряных знаков 99 99 бронзовых знаков
Как получить информацию о пользователе ВКонтакте
В этой статье мы расскажем вам, как получить информацию о пользователе с помощью API ВКонтакте.
Базовые данные, такие как имя пользователя, фамилию и ID вы можете получить с помощью переменной $rawRequest. А чтобы получить дополнительную информацию, такую как, например, дата рождения пользователя и номер телефона, воспользуемся API ВКонтакте. В данной статье мы приведем пример того, как можно использовать API ВКонтакте. Вы можете найти документацию по использованию API ВКонтакте здесь: https://vk.com/dev/first_guide
API (application programming interface) — это посредник между разработчиком приложений и какой-либо средой, с которой это приложение должно взаимодействовать. API упрощает создание кода, поскольку предоставляет набор готовых классов, функций или структур для работы с имеющимися данными.
| Если ваш бот опубликован не только в ВКонтакте, но и в другом канале, то вы можете использовать системную переменную $channelType для определения канала.
Тестировать описанную в этой инструкции функциональность нужно в ВКонтакте! Если вы будете использовать описанную ниже функциональность и тестировать ее в тестовом виджете Aimylogic, вы будете получать ошибку, так как бот пытается использовать API ВКонтакте и, естественно, не может при тестировании не в ВКонтакте.
Прежде чем приступить к выполнению инструкции, создайте базовый сценарий, состоящий из парочки текстовых экранов (приветствие + фразы для принятия ввода пользователя), и опубликуйте его в ВКонтакте, как описано в данной инструкции.
Как узнать страну пользователя?
| Обратите внимание, что мы увидим эти данные только если они указаны в профиле и не закрыты настройками приватности. Если пользователь не указал страну или данные доступны для ограниченного круга лиц, мы не сможем получить доступ к этой информации.
Подключили канал ВКонтакте? Тогда приступим.
Попробуем получить информацию о стране пользователя.
- На экран приветствия в вашем сценарии добавьте блок «Переход» и соедините его с блоком условий, с помощью которого будем получать ID пользователя: $id = $rawRequest.object.user_id
- От блока условий сделаем связь с HTTP-запросом, чтобы получить страну пользователя из информации о странице вк:
- Вот как будет выглядеть этот HTTP-запрос:
- Метод — GET.
- Вкладка RESPONSE HTTP-запроса должна содержать:Имя переменной $country Значение $httpResponse.response[0].country.title
- Вкладки BODY и HEADERS заполнять не нужно.
- URL нашего запроса выглядит так: https://api.vk.com/method/users.get?user_ids=$&fields=country&access_token=ACCESS_TOKEN&v=5.101
Скопируйте этот URL, подставив вместо ACCESS_TOKEN ключ, который вы получили на этапе добавления бота в сообщество. Вы всегда можете заново получить этот токен в настройках сообщества: Настройки — Работа с API — Ключи доступа. Подробнее о добавлении канала ВКонтакте.
| Больше ничего менять в этом URL не нужно.
Разберемся в структуре этого URL
Нижеследующее объяснение может помочь вам понять, как использовать API ВКонтакте.
- Мы используем метод users.get. Вы можете почитать об этом методе здесь.* Так как мы до этого получили ID пользователя с помощью блока условий, наш запрос содержит следующее значение: user_ids=$ вместо будет подставлен реальный идентификатор пользователя ВКонтакте.* Мы используем параметр fields метода users.get* в параметре fields мы используем значение country. Это также определено документацией API ВКонтакте.* access_token определяет токен нашего канала. Поэтому вместо ACCESS_TOKEN нужно вставить ключ, полученный из ВКонтакте.* И, наконец, 5.101 — это последняя версия протокола API ВКонтакте. Вам нужно указать актуальную версию протокола API ВКонтакте. Посмотреть, какая версия является актуальной на данный момент, вы можете здесь (самая верхняя версия — актуальная): https://vk.com/dev/versions
У вас может получиться такой url:
Нам нужно присвоить все полученные значения соответствующим переменным, что мы и делаем, добавляя переменную в Http-запрос на вкладке RESPONSE и записывая в эту переменную полученную информацию.
- От блока «Завершен с ошибкой» добавим связь с текстовым блоком со следующим содержанием: Ошибка $httpStatus
Этот блок поможет нам понять, в чем ошибка, если запрос не будет успешным.
Если вы получаете ошибку, вернитесь к пункту 3 и убедитесь, что вы правильно оформили запрос.
- Убедимся, что мы получили эту информацию от пользователя
Далее, проверим, получили ли мы эту информацию — указана ли страна у данного пользователя, и не закрыта ли эта информация настройками приватности. Свяжем вариант «Завершен успешно» HTTP-запроса с блоком условие, в котором пропишем: $country
мы пишем здесь ту же переменную, которую указали в HTTP-запросе:
- Если это условие выполняется, можем продвигаться по сценарию (далее будем добавлять HTTP-запрос). А если нет (вариант else) добавим текстовый блок с вопросом о стране проживания.
- Прежде чем вывести название страны, мы можем воспользоваться сервисом morpher.ru для того чтобы склонять название страны. Будем совершать это с помощью этого блока HTTP-запрос:
Блок HTTP-запрос, в котором будем склонять название страны, будет выглядеть так:Url: http://ws3.morpher.ru/russian/declension?s=$&format=json
Здесь мы в фигурных скобках указали название переменной, содержание которой будем склонять. В нашем случае это переменная $country, но вы можете склонять значение любой другой переменной.Имя переменной: $newcountry — запишем полученный от морфера массив в эту переменнуюЗначение: $httpResponse
- Далее, после варианта «Выполнен успешно», сделаем связь с текстовым блоком, содержащим следующее: Ты живешь в $newcountry.П, верно?
Сервис morpher.ru будет склонять название страны. Нам нужно выбрать, какой нам нужен падеж. В данном случае нам нужен Предложный падеж, поэтому пишем $newcountry.П. Вы можете посмотреть содержание массива, который выдает morpher.ru, если пройдете по ссылке: http://ws3.morpher.ru/russian/declension?s=Россия&format=json
Вместо «Россия» вы можете подставить любое другое слово и увидеть парадигму склонения. Выберите букву, соответствующую нужному вам падежу.
Как получить другие данные?
Вы можете запрашивать другие данные, используя метод users.get. Следуйте шагам из инструкции по получению страны пользователя, за исключением нижеследующих изменений.
Как запросить дату рождения?
URL для получения даты рождения: https://api.vk.com/method/users.get?user_ids=$&fields=bdate&access_token=ACCESSTOKEN&v=5.101
Здесь мы используем параметр bdate метода users.get.
Имя переменной: bd Значение: $httpResponse.response[0].bdate
Далее, аналогично случаю со страной:
Как запросить номер телефона?
URL запроса — https://api.vk.com/method/users.get?user_ids=$&fields=contacts&access_token=ACCESSTOKEN&v=5.101
Имя переменной $cellphone Значение $httpResponse.response[0].mobile_phone
Вы можете получить номер телефона и город, если пропишете в HTTP
- Далее, выдаем полученные данные с помощью обычного текстового блока.
Твоя страна — $country.response[0].country.titleТвой день рождения — $bd.response[0].bdateТвой город — $city.response[0].city.titleТвой телефон — $cellphone.response[0].mobile_phone
Впоследствии, вы можете дорабатывать сценарий, продумывая логику перехода в зависимости от значений этих переменных.
Лабораторная работа №4. Работа с API ВКонтакте
Эта работа посвящена взаимодействию с API ВКонтакте.
Замечание: Если вы не знакомы с термином «API», то рекомендую прочитать статью: What is an API? In English, please.
Чтобы начать работать с API от вас требуется зарегистрировать новое приложение. Для этого зайдите на форму создания нового Standalone приложения https://vk.com/editapp?act=create и следуйте инструкциям. Вашему приложению будет назначен идентификатор, который потребуется для выполнения работы.
Запросы к API ВКонтакте имеют следующий формат (из документации):
https://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN&v=V
- METHOD_NAME — это название метода API, к которому Вы хотите обратиться.
- PARAMETERS — входные параметры соответствующего метода API, последовательность пар name=value , объединенных амперсандом & .
- ACCESSS_TOKEN — ключ доступа.
- V — используемая версия API (в настоящий момент 5.53).
Например, чтобы получить список друзей, с указанием их пола, нужно выполнить следующий запрос:
https://api.vk.com/method/friends.get?fields=sex&access_token=0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5bc866455623bd560732ab&v=5.53
Внимание: Токен доступа ненастоящий, поэтому этот запрос работать не будет.
Чтобы получить токен доступа вы можете воспользоваться написанным для вас скриптом access_token.py следующим образом:
$ python access_token.py YOUR_CLIENT_ID -s friends,messages
где вместо YOUR_CLIENT_ID необходимо подставить идентификатор вашего приложения.
После выполнения команды откроется новая вкладка браузера, из адресной строки которого вам необходимо скопировать токен доступа.
Внимание: На этом этапе вы можете повторить ранее представленный пример запроса, чтобы убедиться, что вы делаете все верно.
Далее приведено содержимое файла access_token.py :
import webbrowser import argparse def get_access_token(client_id, scope): assert isinstance(client_id, int), 'clinet_id must be positive integer' assert isinstance(scope, str), 'scope must be string' assert client_id > 0, 'clinet_id must be positive integer' url = """\ https://oauth.vk.com/authorize?client_id=&\ redirect_uri=https://oauth.vk.com/blank.hmtl&\ scope=&\ &response_type=token&\ display=page\ """.replace(" ", "").format(client_id=client_id, scope=scope) webbrowser.open_new_tab(url) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("client_id", help="Application Id", type=int) parser.add_argument("-s", dest="scope", help="Permissions bit mask", type=str, default="", required=False) args = parser.parse_args() get_access_token(args.client_id, args.scope)
Задание №1. Требуется написать функцию прогнозирования возраста пользователя по возрасту его друзей.
def get_friends(user_id, fields): """ Returns a list of user IDs or detailed information about a user's friends """ assert isinstance(user_id, int), "user_id must be positive integer" assert isinstance(fields, str), "fields must be string" assert user_id > 0, "user_id must be positive integer" # PUT YOUR CODE HERE pass
Для выполнения этого задания нужно получить список всех друзей для указанного пользователя, отфильтровать тех у кого возраст не указан или указаны только день и месяц рождения.
Для выполнения запросов к API мы будем использовать библиотеку requests :
$ pip install requests
Список пользователей можно получить с помощью метода friends.get . Ниже приведен пример обращения к этому методу для получения списка всех друзей указанного пользователя:
domain = "https://api.vk.com/method" access_token = # PUT YOUR ACCESS TOKEN HERE user_id = # PUT USER ID HERE query_params = < 'domain' : domain, 'access_token': access_token, 'user_id': user_id, 'fields': 'sex' > query = "/friends.get?access_token=&user_id=&fields=&v=5.53".format(**query_params) response = requests.get(query)
Функция requests.get выполняет GET запрос и возвращает объект Response , который представляет собой ответ сервера на посланный нами запрос.
Объект Response имеет множество атрибутов:
>>> response. response.apparent_encoding response.history response.raise_for_status response.close response.is_permanent_redirect response.raw response.connection response.is_redirect response.reason response.content response.iter_content response.request response.cookies response.iter_lines response.status_code response.elapsed response.json response.text response.encoding response.links response.url response.headers response.ok
Нас будет интересовать только метод response.json , который возвращает JSON объект:
>>> response.json() 'response': 'count': 136, 'items': ['first_name': 'Drake', 'id': 1234567, 'last_name': 'Wayne', 'online': 0, 'sex': 1>, 'first_name': 'Gracie' 'id': 7654321, 'last_name': 'Habbard', 'online': 0, 'sex': 0>, . >>> response.json()['response']['count'] 136 >>> response.json()['response']['items'][0]['first_name'] 'Drake'
Поле count содержит число записей, а items список словарей с информацией по каждому пользователю.
Выполняя запросы мы не можем быть уверены, что не возникнет ошибок. Возможны различные ситуации, например:
- есть неполадки в сети;
- удаленный сервер по какой-то причине не может обработать запрос;
- мы слишком долго ждем ответ от сервера.
В таких случаях необходимо попробовать повторить запрос. При этом повторные запросы желательно посылать не через константные промежутки времени, а по алгоритму экспоненциальной задержки.
Описание алгоритма с примерами можно найти в статье Exponential Backoff или как «не завалить сервер». Почитать про обработку исключений при работе с библиотекой requests можно тут.
Напишите функцию get() , которая будет выполнять GET-запрос к указанному адресу, а при необходимости повторять запрос указанное число раз по алгоритму экспоненциальной задержки:
def get(url, params=<>, timeout=5, max_retries=5, backoff_factor=0.3): """ Выполнить GET-запрос :param url: адрес, на который необходимо выполнить запрос :param params: параметры запроса :param timeout: максимальное время ожидания ответа от сервера :param max_retries: максимальное число повторных запросов :param backoff_factor: коэффициент экспоненциального нарастания задержки """ # PUT YOUR CODE HERE pass
>>> get("https://httpbin.org/get") >>> 200]> >>> get("https://httpbin.org/delay/2", timeout=1) ReadTimeout: HTTPSConnectionPool(host='httpbin.org', port=443): Read timed out. (read timeout=1) >>> get("https://httpbin.org/status/500") HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: https://httpbin.org/status/500 >>> get("https://noname.com", timeout=1) ConnectionError: HTTPSConnectionPool(host='noname.com', port=443): Max retries exceeded with url: /
На текущий момент вы должны заполнить тело функции get_friends так, чтобы она возвращала список друзей для указанного пользователя. Аргумент fields представляет из себя строку, в которой через запятую указываются какие поля необходимо получить по каждому пользователю.
Теперь мы можем написать функцию age_predict для «наивного» прогнозирования возраста пользователя с идентификатором user_id (под «наивным» прогнозированием подразумевается вычисление среднего арифметического или медианы):
def age_predict(user_id): """ >>> age_predict(. ) . """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" # PUT YOUR CODE HERE pass
Замечание: Так как дата рождения пользователя может быть не указана или указаны только день и месяц, то для обработки таких ситуаций вы можете использовать конструкцию try. except , где except будет содержать только pass .
Задание №2: Требуется написать функцию, которая бы выводила график частоты переписки с указанным пользователем.
Давайте начнем с того, что получим всю или часть переписки с указанным пользователем. Для этого вам потребуется реализовать метод API messages.getHistory по аналогии с тем, как вы реализовывали получение списка друзей пользователя:
def messages_get_history(user_id, offset=0, count=20): assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" assert isinstance(offset, int), "offset must be positive integer" assert offset >= 0, "user_id must be positive integer" assert count >= 0, "user_id must be positive integer" # PUT YOUR CODE HERE pass
Замечание: В реализации функции messages_get_history нужно учитывать, что API ВКонтакте устанавливает ограничение на число запросов в одну секунду (на сегодняшний день это три запроса). Число сообщений, которое вы можете получить за одно запрос — 200.
Далее приведен пример использования функции messages_get_history :
>>> user_id = # PUT USER ID HERE >>> history = messages_get_history(user_id) >>> from pprint import pprint as pp >>> message = history['response']['items'][0] >>> pp(message) 'body': 'Это текст сообщения.', 'date': 1474811631, 'from_id': USER_ID_HERE, 'id': 168989, 'out': 0, 'read_state': 1, 'user_id': USER_ID_HERE>
Каждое сообщение содержит следующие поля:
- body — текст сообщения;
- date — дата отправки сообщения в формате unixtime;
- from_id — идентификатор автора сообщения;
- id — идентификатор сообщения;
- out — тип сообщения (0 — полученное, 1 — отправленное, не возвращается для пересланных сообщений);
- read_state — статус сообщения (0 — не прочитано, 1 — прочитано, не возвращается для пересланных сообщений);
- user_id — идентификатор пользователя, в диалоге с которым находится сообщение.
Нас интересует поле date , которое представляет дату отправки сообщения в формате unixtime. Чтобы изменить формат даты представления можно воспользоваться функцией strftime из модуля datetime :
>>> from datetime import datetime >>> date = datetime.fromtimestamp(message['date']).strftime("%Y-%m-%d") '2016-09-25'
Формат представления указывается в виде строки форматирования, например, %Y-%m-%d — год, месяц и день, соответственно.
На данный момент вашей задачей является написать функцию count_dates_from_messages , которая возвращает два списка: список дат и список частоты каждой даты, а принимает список сообщений:
def count_dates_from_messages(messages): #PUT YOUR CODE HERE pass
Замечание: При большом количестве сообщений вы их можете разбить по неделям или месяцам.
Далее мы воспользуемся сервисом Plot.ly, который предоставляет API для рисования графиков. Запрос содержит информацию о точках, которые нужно отобразить на графике. Вам нужно зарегистрироваться и получить ключ доступа ( API KEY ). Для более простого взаимодействия с Plot.ly мы воспользуемся готовым модулем (существуют решения и для других языков):
$ pip3 install plotly
Перед началом его использования нужно провести предварительную настройку, указав ключ доступа и имя пользователя:
import plotly plotly.tools.set_credentials_file(username='YOUR_USER_NAME', api_key='YOUR_API_KEY')
Ниже приведен пример построения графика, где переменная x содержит даты, а y — количество сообщений в этот день:
import plotly.plotly as py import plotly.graph_objs as go from datetime import datetime x = [datetime(year=2016, month=09, day=23), datetime(year=2016, month=09, day=24), datetime(year=2016, month=09, day=25)] data = [go.Scatter(x=x,y=[142, 50, 8])] py.iplot(data)
Созданный график вы можете найти в своем профиле:
Задание №3: Требуется написать функцию get_network() , которая для указанного списка пользователей users_ids строит граф и представляет его либо в виде матрицы смежности ( as_edgelist=False ), либо в виде списка ребер ( as_edgelist=True ). В полученном графе необходимо выделить сообщества и визуализировать результат.
def get_network(users_ids, as_edgelist=True): """ Building a friend graph for an arbitrary list of users """ # PUT YOUR CODE HERE pass
Поиск сообществ на графе (community detection) является хорошо изученной задачей, а ряд наиболее известных алгоритмов реализован в библиотеке igraph .
$ pip install python-igraph $ pip install numpy $ pip install cairocffi $ brew install cairo # Только для MacOS X. Для других ОС см. https://www.cairographics.org/download/
from igraph import Graph, plot import numpy as np vertices = [i for i in range(7)] edges = [ (0,2),(0,1),(0,3), (1,0),(1,2),(1,3), (2,0),(2,1),(2,3),(2,4), (3,0),(3,1),(3,2), (4,5),(4,6), (5,4),(5,6), (6,4),(6,5) ] g = Graph(vertex_attrs="label":vertices>, edges=edges, directed=False) N = len(vertices) visual_style = <> visual_style["layout"] = g.layout_fruchterman_reingold( maxiter=1000, area=N**3, repulserad=N**3) plot(g, **visual_style)
g.simplify(multiple=True, loops=True)
communities = g.community_edge_betweenness(directed=False) clusters = communities.as_clustering() print(clusters)
Clustering with 7 elements and 2 clusters [0] 0, 1, 2, 3 [1] 4, 5, 6
pal = igraph.drawing.colors.ClusterColoringPalette(len(clusters)) g.vs['color'] = pal.get_many(clusters.membership)
topwanderings / gist:6963383
Вконтакте является социальным ресурсом и основным его напрвлением, является знакомство, общение и нахождение друзей. С использованием открытого VK API можно получать следующую информацию о пользователях.
Краткая информация о пользователе
Под краткой информацией о пользователе подразумевается, информация которая располагается на главной страницы пользователя.
Для получения данной информации используется метод users.get .
users.get( < uids: 123456, putty fields: uid, first_name, last_name, name_case: nom >);
Возвращает информацию о пользователях в виде набора массива объектов, каждый из которых может иметь поля uid , first_name , last_name , nickname , sex , bdate (birthdate), city , country , timezone , photo , photo_medium , photo_big , photo_rec , connections .
Если в параметре fields было указано поле contacts , то будут доступны также поля: home_phone , mobile_phone .
Если в параметре fields было указано поле education , то будут доступны также поля: university , university_name , faculty , faculty_name , graduation .
Если в параметре fields было указано поле counters , а в параметре uids задан только один идентификатор, то будет доступно поле counters в котором будет находится объект со счетчиками различных объектов у пользователя.
Информация со стены
У каждого пользователя на главной странице присутствукет, так называемая стена. По сути это микроблог, в который пользователи могут добавлять свои сообщения и медиа-контент.
Для предоставления информации информации со стены пользователя, используюся следующие методы:
- wall.get – возвращает список записей со стены.
- wall.getComments – получает комментарии к записи на стене пользователя.
- wall.getById — получает записи со стен пользователей по их идентификаторам.
- wall.getLikes – получает информацию о пользователях которым нравится данная запись.
Информация с фотоальбомов
У каждого пользователя, есть возможность добавить фотоальбом, загрузить в него фотографии, а также отметить людей из списка друзей, которые есть на этих фотографиях.
Для предоставления информации с фотоальбомов пользователя, используются следующие методы:
- photos.getAlbums – возвращает список альбомов пользователя.
- photos.get – возвращает список фотографий в альбоме.
- photos.getProfile – возвращает список фотографий со страницы пользователя.
- photos.getAll – возвращает все фотографии пользователя в антихронологическом порядке.
- photos.getById – возвращает информацию о фотографиях.
Информация о друзьях
Пользователь может добавлять, удалять, скрывать своих друзей и получать список возможных друзей.
Для предоставления информации о друзьях пользователя, используются следующие методы:
- friends.get – возвращает список id друзей пользователя.
- friends.getOnline — возвращает список id друзей пользователя, находящихся сейчас на сайте.
- friends.getMutual – возвращает список id общих друзей между парой пользователей.
- friends.areFriends – возвращает информацию о дружбе между двумя пользователями.
Информация о группах
Пользователь может состоять в сообществах, так называемых группах. В группах публикуются темы, создаются опросы. И так же, как и на странице пользователя присутствует стена обсуждений, фотоальбомы, аудио- и видео-контент.
Для предоставления информации о группах пользователя, используются следующие методы:
- groups.get – возвращает список групп пользователя.
- groups.getById – возвращает информацию о группах по их идентификаторам.
- groups.isMember – возвращает информацию о том, является ли пользователь участником группы.
- groups.getMembers – возвращает список участников группы.
- groups.search – осуществляет поиск групп по заданной подстроке.
Информация о заметках
Пользователь имеет возможность создавать заметки, коментировать и опубликововать их на своей стене.
Для предоставления информации о заметках пользователя, используются следующие методы:
- notes.get – возвращает список заметок пользователя.
- notes.getById – возвращает текущую заметку пользователя.
- notes.getFriendsNotes – возвращает список заметок друзей пользователя.
- notes.getComments – возвращает список комментариев к заметке.
Информация о геолакации
Пользователь имеет возможность делать отметки мест на карте, в которых были сделаны фотографии из его фотоальбомов.
Для предоставления информации об отметках пользователя, используются следующие методы:
- places.getCheckins – возвращает список отметок.
- places.getById – возвращает информацию о местах.
Информация о документах
Пользователь может загружать на сервер vk свои документы, для обмена между пользователями. После того, как пользователь загрузил файлы на сервер, он может отправлять их прикрепляя к сообщениям.
Для предоставления информации о документах пользователя, используются следующие методы:
- docs.get – возвращает информацию о документах текущего пользователя или группы.
- docs.getById – возвращает информацию о документах текущего пользователя по их id.