В данном разделе мы познакомимся с инструментарием разработчиков приложений вконтакте. Используя API, научимся делать запросы к базе данных Vk и доставать из них необходимые данные. Наша программа будет сканировать друзей пользователя вконтакте и искать их телефон, после чего будет записывать каждый найденный телефон и имя его владельца в отдельный файл. Таким образом, в результате выполнения нашей программы мы получим телефонную книгу, где будет указан сам телефон и имя, фамилия владельца данного номера.
Справочный материал используемый в статье
- руководство по библиотеке requests на русском
- страница разработчикам вконтакте
- список методов API вконтакте
- платформа IDE python
Первым делом предлагаю вам ознакомиться со страницей разработчиков, где вы найдёте всю необходимую информацию для работы с API Vk. Перейдите в раздел «Мои приложения» и нажмите кнопку создать.
при создании приложения выберите следующие настройки. Название можете дать абсолютно любое.
Жмём подключить приложение, у вас откроется окно с вашим номером телефона на который вам должны позвонить. Жмём кнопку позвонить и вводим последние четыре цифры номера с которого вам звонили. Если звонок не поступает, подождите 2 минуты и попросите отправить вам смс с кодом на ваш номер.
После создания приложения, вы увидите следующее окно. В нем вы можете отредактировать общую информацию о приложении. После того как закончите переходите в раздел настройки.
В настройках включаем состояние и Open API. В появившемся окне адрес сайта и базовый домен необходимо вписать адрес вашего repl проекта. Перейдите на repl.it и создайте новый проект. Необходимый адрес можно найти над окном терминала. Скопируйте его и вставьте в поле Адрес сайта вашего приложения ВК.
Не забудьте нажать Сохранить изменения в настройках приложения.
И так, у нас есть приложение посредством которого мы будем взаимодействовать с серверами ВК. Настало время приступить к написанию кода. В первой же строчке подключаем библиотеку requests. Именно с её помощью мы будем осуществлять GET запросы. Строкой ниже объявим переменную param типа данных словарь, сюда мы запишем все необходимые параметры для правильного выполнения запроса.
import requests
param = {
"client_id":"7634408", # укажите id вашего приложения
"redirect_uri": "https://APIVkPhoneBook.koddom.repl.run",
"display": "page",
"scope": "+2",
"response_type":"code",
"v":"5.124"
}
В ключе client_id необходимо указать id прописанный в настройках вашего приложения. redirect_uri так же должен совпадать с тем что указан в настройках.
Теперь выполним первый запрос, передав в качестве параметров наш словарь.
code_url = requests.get('https://oauth.vk.com/authorize', params = param)
print(code_url)
В результате выполнения кода, в окне терминала мы должны увидеть <response [200]>. Значит всё ОК. Если у вас число отличное от 200, значит что-то пошло не так, проверьте настройку приложения и параметры запроса ещё раз.
Теперь приступим к получения особого кода(последовательности символов), который нам потребуется для получения токена(особый ключ используя который, сервера контакта идентифицируют пользователя).
распечатайте ссылку которая сгенерировалась в результате выполнения нашего запроса.
print(code_url.url)
на экране вы увидите что-то вроде
https://oauth.vk.com/authorize?client_id=7634408&redirect_uri=https%3A%2F%2FAPIVkPhoneBook.koddom.repl.run&display=page&scope=%2B2&response_type=code&v=5.124
перейдите по полученной ссылке. При переходе вы увидите окно запрашивающее доступ к вашей странице. Нажимаем разрешить. Вы будете перенаправлены на страницу указанную в настройках приложения. Обратите внимание на адресную строку.
В дополнении к основному адресу добавилась строчка code=необходимый_код_для получения_токена. Данный код будет генерироваться каждый раз при переходе по ссылке.
Чтобы использовать данный код используйте функцию input().
print("перейдите по ссылке ниже и скопируйте code")
print(code_url.url)
code = input("введите code: \n")
После того как мы получили code, можно приступать к написанию второго запроса для получения токена. Так же объявим словарь param и впишем туда следующие значения.
param = {
"client_id":"7625578",
"client_secret":"3uPpqxdXPsv4LAHfmvbA",
"redirect_uri":"https://VkGetPost.koddom.repl.run",
"code":code
}
client_id — id вашего приложения из настроек. client_secret — это Защищённый ключ, который так же берётся из настроек вашего приложения. Ключ можно обновить нажав на соответствующую иконку в настройках.
Пишем ещё запрос для получения токена.
token = requests.get('https://oauth.vk.com/access_token', params = param)
dict_user = token.json()
print(dict_user)
В результате запроса, в переменной будет храниться объект типа JSON. Для его преобразования в словарь и извлечения из него данных, используем метод json() и сохраняем результат в dict_user. В окне терминала видим следующую картину.
Помимо самого токена, нам показывается время жизни токена в секундах, а так же идентификатор пользователя от чьего имени запускается приложение — это должен быть ваш id на сайте контакта. Сохраним его в переменной, он нам позже потребуется. Токен тоже сохраняем для дальнейших запросов к серверам вконтакте уже непосредственно от вашего имени.
user_id = dict_user['user_id']
token = dict_user['access_token']
Наконец, приступим к написанию запроса для получения данных о друзьях. Опять объявим словарь с параметрами запроса.
param = {
"user_id": user_id,
"order":"hints",
"count":50,
"fields":"has_mobile, contacts",
"access_token":token,
"v":"5.124"
}
В ключе fields указываем поля через запятую, которые хотим получить для каждого пользователя. В ключе count передаём количество друзей телефоны которых мы будем записывать. order говорит в какой последовательности будут отсортированы ваши друзья, hints — по популярности.
Выполним следующий запрос и преобразуем его результат в словарь, как мы это делали при получении токена.
friends = requests.get('https://api.vk.com/method/friends.get', params = param)
dict_friends = friends.json()
Теперь напишем цикл для перебора всех пользователей из нашего словаря.
for friend in dict_friends['response']['items']:
try:
if friend['mobile_phone'] == "":
continue
print(friend['mobile_phone'],friend['first_name'], friend['last_name'], "\n")
except:
print('телефон скрыт', friend['first_name'], friend['last_name'])
Внутри цикла мы проходимся по каждому пользователю и смотрим, указан ли у него телефон. Если оператор попытки отработал без ошибок, выводим на экран данные о пользователе и его имя, фамилию, если поле с телефоном отсутствует у пользователя, говорим, что телефон скрыт Результат должен выглядеть следующим образом.
Теперь осталось записать данные в файл. Для этого до входа в цикл в котором я вывожу имена на экран, я сформирую пустой словарь phonebook и на каждой итерации в цикле буду добавлять в него новые записи. В качестве ключа словаря будут выступать имя и фамилия пользователя, а в качестве значения словаря — номер телефона. Если телефон скрыт, то не будем добавлять данного пользователя в словарь. Видоизменённый цикл выглядит следующим образом.
phonebook = {} # объявляем пустой словарь
for friend in dict_friends['response']['items']:
try:
if friend['mobile_phone'] == "":
continue
print(friend['mobile_phone'],friend['first_name'], friend['last_name'], "\n")
phonebook.setdefault(friend['first_name']+" "+friend['last_name'], friend['mobile_phone']) # добавляем запись в словарь
except:
print('телефон скрыт', friend['first_name'], friend['last_name'])
Теперь пройдёмся циклом по всему словарю и запишем его элементы в файл phonebook.txt.
pb = open("phonebook.txt", "w")
for key in phonebook:
pb.write(key + " : " + phonebook[key] + "\n")
pb.close()
В окне слева вы увидите как программа создала файл и записала в него телефоны всех ваших друзей. Теперь вы можете изменить количество запрашиваемых друзей в запросе, изменив значение параметра count c 50 на 500, например. Не бойтесь указать большое число, всё-равно вам вернётся только то количество друзей, которое у вас есть.
Post Scriptum
Можно пойти ещё дальше и получать список не только своих друзей, но и научить программу заходить на страницы ваших друзей и мониторить список их друзей. Вообщем тут есть явно что-то рекурсивное. Успеха вам и лёгкого кодинга! Если у вас есть вопросы по проекту, вы всегда можете написать мне в discord — мой ник Егоридзе#2954