Как сгенерировать несколько токенов vk api python
Перейти к содержимому

Как сгенерировать несколько токенов vk api python

Генерация токенов модулем secrets в Python.

Модуль secrets предоставляет функции для генерации безопасных токенов, которые подходят для таких приложений, как сброс пароля, трудно угадываемые URL-адреса и т. п.

Содержание:

    secrets.token_bytes() , secrets.token_hex() , secrets.token_urlsafe() . secrets.compare_digest() .
secrets.token_bytes([nbytes=None]) :

Функция secrets.token_bytes() возвращает случайную строку байтов, содержащую количество nbytes байтов.

Если аргумент nbytes=None или не указан, то по умолчанию используется разумное значение.

secrets.token_hex([nbytes=None]) :

Функция secrets.token_hex() возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит nbytes случайных байтов, каждый байт преобразуется в две шестнадцатеричные цифры.

Если аргумент nbytes=None или не указан, то по умолчанию используется разумное значение.

secrets.token_urlsafe([nbytes=None]) :

Функция secrets.token_urlsafe() возвращает случайную URL-безопасную текстовую строку, содержащую nbytes случайных байтов. Текст в кодировке Base64 , поэтому в среднем каждый байт дает примерно 1,3 символа.

Если аргумент nbytes=None или не указан, то по умолчанию используется разумное значение.

secrets.compare_digest(a, b) :

Функция secrets.token_urlsafe() возвращает True , если строки a и b равны, в противном случае False , чтобы уменьшить риск "Атаки по времени".

Эта функция использует подход, разработанный для предотвращения анализа синхронизации путем исключения поведения короткого замыкания на основе содержимого, что делает её подходящим для криптографии. Аргументы a и b должны быть одного и того же типа, либо текстовыми строками, либо байтовыми строками.

Работа с API ВКонтакте

Эта работа посвящена основам анализа социальных сетей на примере взаимодействия с API ВКонтакте.

Если вы не знакомы с термином «API», то рекомендую прочитать статью «What is an API? In English, please».

Регистрация приложения и получение токена доступа

Чтобы начать работать с API от вас требуется зарегистрировать новое приложение. Для этого зайдите на форму создания нового Standalone приложения https://vk.com/editapp?act=create и следуйте инструкциям. Вашему приложению будет назначен идентификатор, который потребуется для выполнения работы.

Запросы к API ВКонтакте имеют следующий формат (из документации):

  • METHOD_NAME — это название метода API, к которому Вы хотите обратиться (например, получить список друзей).
  • PARAMETERS — входные параметры соответствующего метода API, последовательность пар name=value , объединенных амперсандом & (например, количество друзей).
  • ACCESSS_TOKEN — ключ доступа.
  • V — используемая версия API.

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

Так как токен доступа ( access_token ) ненастоящий, то этот запрос работать не будет. Чтобы получить токен доступа вы можете воспользоваться написанным для вас скриптом access_token.py следующим образом:

где вместо YOUR_CLIENT_ID необходимо подставить идентификатор вашего приложения.

После выполнения команды откроется новая вкладка браузера, из адресной строки которого вам необходимо скопировать токен доступа.

На этом этапе вы можете повторить ранее представленный пример запроса, чтобы убедиться, что вы делаете все верно.

Далее приведено содержимое файла access_token.py :

Полученный токен доступа вставьте в поле access_token файле vkapi/config.py :

Прогнозирования возраста

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

Для выполнения запросов к API мы будем использовать библиотеку requests (для выполнения запросов в асинхронном режиме можно использовать библиотеку httpx):

Список пользователей можно получить с помощью метода friends.get . Ниже приведен пример обращения к этому методу для получения списка всех друзей указанного пользователя:

Функция requests.get выполняет GET запрос и возвращает объект Response , который представляет собой ответ сервера на посланный нами запрос.

Объект Response имеет множество атрибутов:

Нас будет интересовать только метод response.json , который возвращает JSON объект:

Поле count содержит число записей, а items список словарей с информацией по каждому пользователю.

Выполняя запросы мы не можем быть уверены, что не возникнет ошибок. Возможны различные ситуации, например:

  • есть неполадки в сети;
  • удаленный сервер по какой-то причине не может обработать запрос;
  • мы слишком долго ждем ответ от сервера.

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

Описание алгоритма с примерами можно найти в статье Exponential Backoff или как «не завалить сервер». Почитать про обработку исключений при работе с библиотекой requests можно тут.

Ваша задача реализовать класс сесии, который позволит выполнять GET и POST-запросы к указанному адресу, а при необходимости повторять запрос указанное число раз по алгоритму экспоненциальной задержки:

Описание лучших практик при использовании модуля requests можно найти тут.

На текущий момент вы должны заполнить тело функции get_friends так, чтобы она возвращала список друзей для указанного пользователя:

Теперь мы можем написать функцию age_predict для «наивного» прогнозирования возраста пользователя с идентификатором user_id (под «наивным» прогнозированием подразумевается вычисление среднего арифметического или медианы):

Так как дата рождения пользователя может быть не указана или указаны только день и месяц, то для обработки таких ситуаций вы можете использовать конструкцию try. except , где except будет содержать только pass .

Построение социального графа

Одной из задач при анализе социальных сетей является построение и анализ социального графа, то есть графа, «узлы которого представлены социальными объектами, такими как пользовательские профили с различными атрибутами, сообщества, медиаконтента и так далее, а рёбра — социальными связями между ними». Мы построим одну из разновидностей социального графа — эгоцентричный граф или граф друзей. Обычно под эгоцентричным графом понимают граф, в котором устанавливаются связи между друзьями некоторого пользователя. Для этого вам потребуется делать запросы к методу friends.getMutual , который позволяет получить список общих друзей между парой пользователей:

Одним из ограничений метода friends.getMutual является ограничение на максимальное количество идентификаторов пользователей, с которыми необходимо искать общих друзей, то есть target_uids должен содержать не более 100 идентификаторов. Ваша реализация не должна ограничивать размер этого списка, но учитывать, что к методам API ВК с ключом доступа пользователя или сервисным ключом доступа можно обращаться не чаще 3-х раз в секунду:

В приведенном примере мы оставляем только активных пользователей, фильтруя их по полю deactivated , чтобы не получить ошибку User was deleted or banned , а затем получаем список общих пользователей за два запроса.

Теперь вашей задачей является реализация функции ego_network() , которая позволяет построить эгоцентричный граф друзей для указанного пользователя (по умолчанию текущего) и заданного множества его друзей (по умолчанию всех друзей). Граф должен быть представлен в виде списка ребер:

Очевидно, что в полученном графе есть сообщества (в качестве примеров сообществ можно привести: школьных и университетских друзей, коллег по работе, членов семьи и т.д.). Поиск сообществ на графе (community detection) является хорошо изученной задачей, а ряд наиболее известных алгоритмов реализован в библиотеке community :

Вы можете воспользоваться готовыми фукциями для просмотра информации о пользователях в сообществах:

Тематическое моделирование

Тематическое моделирование (topic modeling) одно из современных приложений машинного обучения к анализу текстов, активно развивающееся с конца 90-х годов. Тематическая модель (topic model) коллекции текстовых документов определяет, к каким темам относится каждый документ и какие слова (термины) образуют каждую тему.

Данные для построения тематической модели мы будем собирать со стен различных групп, используя метод wall.get . Аналогично методу friends.getMutual он не позволяет получить более 100 записей за один запрос, таким образом, мы имеем ограничение в 300 постов за секунду. Поэтому для более эффективного сбора сообщений со стен групп мы будем использовать метод execute — «универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты». Параметром в метод execute является код алгоритма в VKScript, который позволяет выполнить до 25 обращений к методам API. Таким образом, мы получим возможность выполнять до 75 обращений в секунду, то есть, 7500 постов. К сожалению есть ограничения на размер тела ответа и если посты слишком большие, то высока вероятность получить ошибку Runtime error occurred during code invocation: response size is too big .

Ниже приведен пример всех необходимых конструкций (дополнительно про VKScript можно почитать тут):

Пример запроса с использованием execute :

Напишите функцию get_wall_execute , которая собирает записи со стены указанного сообщества:

Текст необходимо подготовить к построению тематической модели, а именно, удалить знаки пунктуации, ссылки, эмодзи, стоп-слова, провести нормализацию.

Для нормализации слов мы будем использовать морфологический анализатор pymorphy2:

В качестве тематической модели мы будем использовать модель латентного размещения Дирихле (LDA, Latent Dirichlet Allocation), реализацию которой можно найти в библиотеке gensim.

1000 друзей Павла Дурова: как выкачивать данные ВКонтакте

Практически всем, кто занимается количественными исследованиями, знакома следующая проблема: идея есть, а данных для её реализации нет. И хотя сейчас существует немало сайтов с данными (например, Kaggle.com (https://www.kaggle.com/), где можно найти как корпус обзоров на вино, так и классификатор древнеяпонских иероглифов или метаданные по коллекциям Metropolitan Museum of Art), все равно найти что-то готовое, что соответствовало бы индивидуальным нуждам конкретного исследования, довольно сложно. В таких случаях остается одно: выкачивать данные самостоятельно.
ВКонтакте — ценный источник данных, который может помочь в лингвистических, социологических и других исследованиях. Хочется исследовать корпус авторских стихотворных сочинений подростков? Пожалуйста, практически готовый корпус уже ожидает тебя в группе, посвященной поэзии! Хочется понять, как в реальности работает теория шести рукопожатий? Выкачай случайных пользователей и построй граф!
На самом деле, это совсем не сложно, и сегодня мы покажем, как скачать заветные данные.

Что понадобится?

  1. Аккаунт ВКонтакте
  2. Среда для работы с Python* (уметь программировать почти не надо)
  3. Желание и немного времени

*Например, любые IDE: PyCharm, Sublime Text или любой другой, какой душе угодно. Мы в данном руководстве будем использовать оболочку Jupyter, функционал которой удобен для аналитики: можно писать и редактировать код на каждом этапе, не прогоняя всю программу целиком, строить красивые визуализации и делать ещё кучу всего интересного. Подробнее об установке и возможностях Jupyter можно посмотреть тут.

Примите во внимание, что код для туториала написан с целью помочь понять, что происходит и как все работает, поэтому не является образцом великолепия.

Этап 1. Получение ключа к ВК API

Первый шаг на пути к данным состоит в том, чтобы получить доступ к ВKонтакте API (Application Programming Interface), с помощью которого мы и будем дальше взаимодействовать с ВКонтакте. API содержит в себе множество методов, которые позволяют быстро доставать из базы ВК нужную информацию, например, со страниц пользователей, групп и т.д. (вернее, только ту информацию, которая не скрыта).
Чтобы иметь возможность их использовать, надо авторизоваться в ВК и создать Standalone приложение на странице API. Для этого надо во вкладке Мои приложения нажать Создать приложение.
Дальше надо выбрать Standalone-приложение, назвать его и подключить.
Как только вы его подключите, вы окажетесь во вкладке Информация, где находятся описание, название и т.д. Здесь трогать ничего не нужно, и можно сразу перейти на вкладку Настройки слева. Здесь мы смотрим на Сервисный ключ доступа, который надо скопировать или запомнить, потому что он нам понадобится дальше.
Страничку API пока оставляем открытой, мы к ней ещё вернемся чуть позже.

Этап 2. Пишем код

Часть 1. Пользователи

Шаг 1

Теперь, когда у нас есть ключ доступа к API, можно смело переходить к самой интересной части — написанию кода. Для начала устанавливаем библиотеки и подгружаем нужные модули оттуда. В туториале мы будем использовать библиотеку requests — пакет, который позволяет посылать http-запросы на сервер и отдавать ответы на эти запросы в различных форматах*.

** Если не знаете как устанавливать библиотеки в Python, не пугайтесь, Интернет полон различных гайдов о том, как это делать. Например, вот.
***На самом деле, это только один из способов добычи данных ВКонтакте через Python. Существует ещё некоторое количество библиотек, которые позволяют получать ответы от ВКонтакте API другими способами. Они очень хорошо гуглятся, так что при желании можно освоить и альтернативные техники. Или если кто-то уже знаком с другими методами, будет здорово услышать о них в комментариях).

Шаг 2

Теперь разберемся в том, как, собственно, делать запросы к ВКонтакте API. По сути, все это нам уже рассказали разработчики: мы формируем http-запрос о нужной нам информации, который мы отправляем в базу ВК. При этом разработчики ВК даже предлагают шаблон запроса:
Часть, которая нам интересна, выделена жирным шрифтом:
METHOD_NAME — обязательный параметр — метод, который мы хотим применить. Выбирается в зависимости от того, какую информацию мы хотим достать из базы. Полный список методов ВКонтакте API доступен по ссылке. Метод отделяется от последующих частей запроса символом ?.
PARAMETERS — это уже опциональный параметр, для каждого метода свой набор. Каждый метод по умолчанию отдает некоторую изначальную информацию, которую можно расширить с помощью этого параметра. Если параметров несколько, то они разделяются между собой символом &.
ACCESS_TOKEN — помните тот сервисный ключ доступа со странички разработчиков, который мы запомнили ранее? Это он и есть. Ключ обязателен при составлении запроса.
V — версия ВК API, без которой также нельзя сформировать запрос. На момент написания статьи версия API — 5.92.

Шаг 3

Рассмотрим процесс формирования и отправления запроса. Для начала определимся, что именно мы хотим достать. Допустим, что-то связанное с данными пользователей. Посмотрим список доступных методов и что они могут нам предложить. Для этого в списке методов выберем вкладку Users.

Появился список методов для работы с данными пользователей.

Шаг 4

Итак, попробуем вытащить расширенную информацию о пользователе. Откроем страницу метода get и внимательно читаем параметры. Допустим, мы хотим получить информацию о пользователе с идентификатором 1 (user_ids=1).
Для начала запишем ключ доступа и версию ВК API в отдельные переменные формата «строка», чтобы мы могли их использовать потом****.

* Заметьте, что так как мы используем Jupyter Notebook, нам не требуется создавать отдельный файлик на компьютере, хотя такой вариант и возможен. Но мы просто зададим ключи как переменные в отдельной ячейке скрипта. Теперь сформируем запрос к API. Для обращения к методу надо перед его названием написать, к какой группе он относится (так как названия методов пересекаются в различных группах). Мы записываем запрос как форматируемую строку, где значения в <> будут принимать значения переменных, которые там записаны**.

И посмотрим на результат

По умолчанию (без заданных параметров) мы получили просто имя, фамилию и статус страницы.

***** Если вы хотите получить информацию больше, чем об одном человеке, вы можете записать их идентификаторы через запятую. Если пользователей много, то можно задать их id в отдельной переменной (допустим, загрузить из файла), и записать её также в <>. Важно, чтобы они были разделены через запятую. Подробнее о форматировании строк в Python.

Шаг 5.

Теперь добавим конкретики. Допустим, мы хотим получить ещё даты рождения, страну и город. Эти поля находятся в параметре fields, как говорит нам документация.

Шаг 6.

Пойдем дальше: скачаем 200 друзей Павла Дурова и запишем их в отдельный список. Для этого нам потребуется функция из той же вкладки Users — getFollowers.
Сначала оформим запрос в виде строки, в которой мы будем потом форматировать части, находящиеся в <>.

Тут у нас появляется новые параметры — count и offset. Сount показывает, сколько друзей за один запрос мы будем выкачивать, а offset — на сколько значений мы будем сдвигаться каждый раз, когда отправляем новый запрос. То есть если бы параметра offset не было, мы бы каждый раз скачивали только 100 первых друзей, а с ним мы по очереди (итеративно) выбираем каждую следующую сотню.
Итак, сначала мы создаем пустой список friends, в который мы потом запишем выгруженных пользователей. Потом мы определяем, какие отступы (offset) у нас будут каждый раз и с каким шагом. За это отвечает функция range: условно говоря, у нас будет 3 шага от 0 до 300, каждый из которых будет равен 100. После чего мы циклом выкачиваем по 100 подписчиков за каждую итерацию. И в конечном итоге записываем фамилии пользователей в список.

И вуаля! Список подписчиков готов!

Часть 2. Сообщества

А теперь предположим, что для наших исследовательских целей мы хотим получить корпус каких-нибудь текстов. Для этого мы можем, например, скачать стену какого-то сообщества или пользователя.
Принцип тут тот же, что и при работе с юзерами: выбираем метод, формируем запрос, наслаждаемся.
Список методов для работы со стенами находится в соответствующей вкладке Wall в документации. Если мы хотим выкачать посты на стене, то нам нужен метод wall.get.
Давайте попробуем скачать посты сообщества Вышкинские хокку. Для начала попробуем выкачать первые 100 публикаций.

По сути, ничего особо не изменилось, кроме метода и его параметра: domain содержит короткий адрес сообщества, с которого мы выкачиваем данные.
Посмотрим на выдачу по первому посту: мы получили не только сам текст публикации, но и метаинформацию к нему, которую также при желании можно вытащить из списка и использовать.

Но мы в учебных целях сосредоточимся только на текстах публикаций. Теперь давайте соберем первые 400 постов со стены и запишем их в файлик на компьютере, чтобы можно было использовать потом.

Шаг 1

Пишем строку запроса, в который добавляем параметр offset, который отвечает за отступы.

Шаг 2

Создаем пустой список texts, в который будем записывать тексты. Потом пишем цикл, который будет выкачивать по 100 постов за каждую из 4-ех итераций, и записывать каждый пост в созданный список.

Посмотрим на то, как это выглядит в списке:
Ага, в тексте есть лишние символы, а точнее \n. Это всего лишь разделитель: он показывает, что текст в данном месте в оригинале начинается с новой строки.

Шаг 3

Создаем в корневой папке на компьютере файл texts.txt, в который мы и запишем итоговый результат.

Шаг 4

Записываем посты из списка texts в файл texts.txt. И заменим символы \n в тексте на нормальные разделители строки.

Поздравляем, вы стали счастливым обладателем сборника страдальческих студенческих хокку!
В туториале показаны основы работы в ВКонтакте API с помощью Python. На деле ВК может предоставить намного больше: можно искать пользователей по заданным критериям, скачивать фотографии и ещё кучу всего интересного. Главное теперь — не бояться обилия методов в документации и искать то самое, что нужно именно вам.

Добавить комментарий

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