Как получить данные о пользователе vk api

VK-API Пример выполнения кода методом execute и users.get

Brain_Script

2017-09-16 20:11:13

Войдите для добавления комментария.

Brain_Script

vk api, execute, vk api android, vk api c#, vk api ios, vk api java, vk api javascript, vk api js, vk api php, vk api python, vk api авторизация, vk api уроки, работа с vk api, execute, vk, api, php, вконтакте, видео уроки, users get, get, vk php, вк апи, онлайн уроки, api php, vk-api пример выполнения кода методом execute и users get, Пример, Пример выполнения кода, новичкам, вк, vk com, access token, vkontakte, вконтакте api, вк токен, php вк, токен, вк api, api vk, php vk, урок #авторизация #работа #вконтакте #видео #апи #онлайн #пример #кода #методом #новичкам #токен #урок #выполнения #вк #vk #api #execute #android #c #ios #java #javascript #js #php #python #users #get #vkapi #com #access #token #vkontakte #VkApi #Execute #VkApiAndroid #VkApiC #VkApiIos #VkApiJava #VkApiJavascript #VkApiJs #VkApiPhp #VkApiPython #VkApiАвторизация #VkApiУроки #РаботаСVkApi #Execute #Vk #Api #Php #Вконтакте #ВидеоУроки #UsersGet #Get #VkPhp #ВкАпи #ОнлайнУроки #ApiPhp #VkapiПримерВыполненияКодаМетодомExecuteИUsersGet #Пример #ПримерВыполненияКода #Новичкам #Вк #VkCom #AccessToken #Vkontakte #ВконтактеApi #ВкТокен #PhpВк #Токен #ВкApi #ApiVk #PhpVk #Урок

VK API docs.get получаем все документы определенного пользователя

2017-09-16 21:15:46

Источник: codly.ru

Быстрый поиск по всем пользователям ВК

Решили на днях поучаствовать в одном Хакатоне, который мы, конечно же, не выиграем. И одной из задач было создание датасета из социальной сети Вконтакте. Долго не думая, я сказал товарищам по команде, что беру эту часть на себя. Но оказалось все не так просто. Хочу поделиться с Вами какие проблемы встретились и как я их по ходу решал.

Задача

Нужно пройтись по 650 000 000 пользователям ВК и вытащить только тех, кто живет в Москве. Затем отдельно обработать уже полученные айдишники.

Решение

Ну чтож задача понятна, нужно ее как-то решать. Писать код будем на языке Python и сразу подумал, что на своем компе это обрабатывать не стоит, а будем использовать мощности Google Colab. Ссылка на полный код проекта гугл колаб будет в конце.

Вк апи

Чтобы получить данные пользователя есть два путя:

  1. Парсить веб-страницу пользователя и вытаскивать нужную информацию
  2. Использовать vk api и обрабатывать json

Оба вариант имеют свои подводные камни. В первом варианте слишком много лишней информации, что замедляет в разы обработку. Во втором варианте проблема в токенах и ограничениях. Я все-таки решил пойти вторым путем.

Еще по теме:  Сайт сокращение ссылок которую не блокирует ВК

Токены

Главная и первая проблема в ограничениях вк апи: 5 запросов в секунду для одного токена.

Для того чтобы обойти это ограничение, нам понадобится много токенов. Есть три варианта как их получить:

Работа с данными пользователя VK API — 2 урок

  1. Ручками регистрировать новых пользователей и получать токен
  2. Купить токены
  3. Сгенерировать токены с помощью библиотеки vk (pip install vk)

В итоге я сгенерировал 1000 токенов, используя библиотеку. Не буду тут выкладывать код генерации токенов (это и так толстая подсказка), если все-таки не догадаетесь, то напишите в личку скину скрипт.

Сохраняем токены в txt файл, каждый токен с новой строчки.

Время говнокодить

Когда файл с токенами получен, можем приступать к коду. Загружаем в гугл колаб файл.

Считываем файл tokens.txt и добавляем токены в лист:

list_token=[] with open(‘tokens.txt’, ‘r’) as f: for line in f: list_token.append(str(line).rstrip(‘n’)) len(list_token)

Сделать 650 000 000 запросов быстро без асинхронности мы никак не сможем. Я перепробовал много разных библиотек и максимальную скорость мне удалось выбить, используя библиотеку aiohttp.

Устанавливаем библиотеки для асинхронных запросов:

!pip install asyncio !pip install aiohttp !pip install nest_asyncio

А вот и сам сборщик:

import asyncio from aiohttp import ClientSession import json import nest_asyncio nest_asyncio.apply() # Доступ к гугл диск from google.colab import drive drive.mount(‘/content/gdrive’) list_data=[] async def bound_fetch_zero(sem,id,session): async with sem: await fetch_zero(id,session) async def fetch_zero(id, session): url = build_url(id) try: async with session.get(url) as response: # Считываем json resp=await response.text() js=json.loads(resp) list_users=[x for x in js[‘response’] if x != False] # Проверяем если город=1(Москва) тогда добавляем в лист for it in list_users: try: if it[0][‘city’][‘id’]==1: list_data.append(it[0][‘id’]) except Exception: pass except Exception as ex: print(f’Error: ‘) # Генерация url к апи вк, 25 запросов в одном def build_url(id): api = ‘API.users.get(,’fields’:’city’>>)’.format( id * 25 + 1) for i in range(2, 26): api += ‘,API.users.get(,’fields’:’city’>>)’.format( id * 25 + i) url = ‘https://api.vk.com/method/execute?access_token=<>code=return%20[<>];’.format( list_token[id%len(list_token)], api) return url async def run_zero(id): tasks = [] sem = asyncio.Semaphore(1000) async with ClientSession() as session: # Значение 3200 зависит от вашего числа токенов for id in range((id — 1) * 3200, id * 3200): task = asyncio.ensure_future(bound_fetch_zero(sem,id, session)) tasks.append(task) responses = asyncio.gather(*tasks) await responses del responses await session.close() # Запускаем сборщик for i in range(0,17): for id in range(i*500+1,(i+1)*500+1): print(id) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(run_zero(id)) # Сохраняем айдишники в файл на гугл диске и очищаем лист with open(f’/content/gdrive/My Drive/data_main.txt’, ‘w’) as f: for item in list_data: f.write(f’n’) print(len(list_data)) list_data.clear()

Разберем по блокам, чтобы было понятнее что тут происходит.

Начнем с метода def build_url(id)

У вк апи есть фича execute, которая позволяет делать 25 запросов в одном

Execute — универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты

# Генерация url к апи вк, 25 запросов в одном def build_url(id): api = ‘API.users.get(,’fields’:’city’>>)’.format( id * 25 + 1) for i in range(2, 26): api += ‘,API.users.get(,’fields’:’city’>>)’.format( id * 25 + i) url = ‘https://api.vk.com/method/execute?access_token=<>code=return%20[<>];’.format( list_token[id%len(list_token)], api) return url

Еще по теме:  Как сделать подарок своими руками ВК

Вот так выглядит итоговый запрос:

Если вам нужно вызывать другие методы вк апи, то просто замените ‘API.users.get(,’fields’:’city’>>)’ на нужный метод и данные.

Вот такой json мы получаем при вызове всего одно запроса:

Метод def fetch_zero(id, session)

В этом методе происходит сама обработка данных:

async def fetch_zero(id, session): url = build_url(id) try: async with session.get(url) as response: # Считываем json resp=await response.text() js=json.loads(resp) list_users=[x for x in js[‘response’] if x != False] # Проверяем если город=1(Москва) тогда добавляем в лист for it in list_users: try: if it[0][‘city’][‘id’]==1: list_data.append(it[0][‘id’]) except Exception: pass

Считываем json, проходим по всем пользователям из запроса и проверям поле город, можно заменить на любой другой город (1 — Москва, 2 — Питер и тд) и вытащить айдишники всех пользователей своего города. Тут https://vk.com/dev/database.getCities все айдишники городов.

Запускаем сборщик

# Запускаем сборщик for i in range(0,17): for id in range(i*500+1,(i+1)*500+1): print(id) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(run_zero(id)) # Сохраняем айдишники в файл на гугл диске и очищаем лист with open(f’/content/gdrive/My Drive/data_main.txt’, ‘w’) as f: for item in list_data: f.write(f’n’) print(len(list_data)) list_data.clear()

Вот тут уже начинается математика)

Два цикла, первый с 0 по 16 включительно, второй 500 итераций + эти 3200:

for id in range((id — 1) * 3200, id * 3200): task = asyncio.ensure_future(bound_fetch_zero(sem,id, session)) tasks.append(task)

Если у Вас не 1000 токенов, а 10 например, то значение 3200 нужно заменить на 40 максимум, этот цикл отвечает сколько сразу будет сделано асинхронных запросов, и если указать больше, то будет выскакивать то самое ограничение в 5 запросов в секунду.

В итоге 16 * 500 * 3200 * 25 (в 1 запросе 25 id)= 640 000 000 айдишников мы пройдем с id1 по конечный.

Зачем вы наверн подумаете столько циклов, а это нужно чтобы запустить обработку параллельно. Я запустил 5 сеансов в google colab с разным range(0,4), range(4,8) и тд в первом цикле. В итоге за полтора часа я смог обработать всех пользователей вк.

with open(f’/content/gdrive/My Drive/data_main.txt’, ‘w’) as f: for item in list_data: f.write(f’n’)

И на каждой итерации мы сохраняем полученные айдишники в файл, всего получится 16 файлов, которые потом нужно объединить в один.

Итоги

За полтора часа работы сборщика на 5 сеансах гугл колаб можно вытащить любые открытые данные пользователей Вк (У vk api есть и другие ограничения, так что к некоторым методам нужно будет придумывать новые законные обходы). Вот ссылка на код проекта в Google Colab:

Еще по теме:  Как отменить подписку Вконтакте на музыку на айфоне

И вот ссылка на датасет всех москвичей из всего вк, которые я вытащил, написав этого сборщика, можете себя найти там, если указывали москву в вк)

Из 650 млн. пользователей официальных москвичей 24 593 238.

Чтож надеюсь кому-то будет интересна данная статья и мои наработки будут полезны ^^

Меня в декабре забирают в армию, так что видимо это последняя статья. Хотел еще пару своих проектов описать на хабре, но видимо уже не успею. Всем позитива и удачи.

Источник: temofeev.ru

C# и ВКонтакте API

Сегодня будет короткая демонстрация работы с API Вконтакте на примере программы для скачивания музыки из контакта.

Создание приложения.

Идем на страницу http://vk.com/developers.php#devstep2, создаем приложение, запоминаем ИД приложения и защищенный ключ.

Авторизация пользователя и разрешение приложению определенного набора действий.

Авторизация подробно описана здесь. Делать ее будем с помощью контрола WebBrowser.

this.authWebBrowser.Navigate(String.Format(«https://oauth.vk.com/authorize?client_id=redirect_uri=response_type=token», VKSettings.AppId, VKSettings.Scope, VKSettings.RedirectUri));

  • VKSettings.AppId — ИД приложения, мы его узнали при создании приложения.
  • VKSettings.Scope — маска необходимых операций. Нам достаточно доступа к аудиозаписям, для этого передаем «8». Подробнее здесь.
  • VKSettings.RedirectUri — «http://oauth.vk.com/blank.html».

После того, как пользователь разрешит приложению нужные операции, браузер будет перенаправлен на страницу, в адресе которой будут данные, нужные для вызовов API.
На событие Navigated вешаем обработчик

var urlParams = System.Web.HttpUtility.ParseQueryString(e.Url.Fragment.Substring(1)); VKSettings.AccessToken = urlParams.Get(«access_token»); VKSettings.UserId = urlParams.Get(user_id);

Сначала программу я делал на WPF, но в WPF контроль с браузером терял часть ссылки начиная с «#» при редиректе, так что пришлось писать на WinForms.

Получение количества песен.

Для получения количества песен используется метод audio.getCount.
Для вызова метода формируем URL:

string.Format(«https://api.vk.com/method/audio.getCount.xml?oid=, UserId, AccessToken)

К названию метода приписана строка «.xml» — это сделано для получения результата в XML. Без этого был бы JSON.
Дальше получаем результат:

var xml = new XmlDocument(); xml.Load(countUrl);

Получение информации о треках.

Теперь используем метод audio.get. Формируем URL:

string.Format(«https://api.vk.com/method/audio.get.xml?uid=access_token=», UserId, count, AccessToken)

Аналогичным образом получаем ответ, начинаем парсить. Ответ содержит коллекцию элементов audio, каждый из которых соответствует одному треку. Нас интересуют следующие их узлы:

  • title — Название трека.
  • artist — Исполнитель.
  • album — ИД альбома. Причем я так и не нашел метода API для получения названия альбома.
  • url — Адрес для скачивания трека. Адреса привязаны к IP, так скачивать с них надо сразу же.

Дальше скачиваем файлы:

using (WebClient Client = new WebClient())

Все, задача решена.

Разобрался, как получить имена альбомов. Список альбомов возвращает метод audio.getAlbums. Странно, что этого метода нет в панели методов справа.

Источник: lsreg.ru

Рейтинг
( Пока оценок нет )
Загрузка ...