Программы

Телефонная книга Vk

Опубликовано

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

Справочный материал используемый в статье

Первым делом предлагаю вам ознакомиться со страницей разработчиков, где вы найдёте всю необходимую информацию для работы с 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

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

Ваш адрес email не будет опубликован.