Страница начала работы с API VKontakte: https://vk.com/dev/first_guide.
Страница полной документации https://vk.com/dev/manuals.
Чтобы точно разобраться и понять данную тему, рассмотрим Hello, World.
Для того чтобы начать делать запросы в API необходимо получить APP_ID и SECRET_KEY. Для этого идем на страницу https://vk.com/apps?act=manage. Видим следующее.
Создаем свое приложение:
Выбираем "Standalone-приложение". В итоге получаем приложение:
На странице "Настройки" видим ID приложения и Защищенный ключ:
Запишите их, они нам понадобятся. А также не забудьте включить приложение. А еще в Права доступа укажите необходимые доступы - можно указать все, пока не разобрались что к чему.
В результате мы получили ID приложения и Защищенный ключ, которые называются часто APP_ID и SECRET_KEY.
Получаем ACCESS_TOKEN
Получили какие-то APP_ID и SECRET_KEY, а везде в документации просят ACCESS_TOKEN. Давай-те научимся его получать.
В качестве обертки над API возьмем vk, установим:
pip install --upgrade vk
А затем возьмем готовый код. Для примера возьмем возьмем готовый кусок кода и немного преобразуем по Python3:
# -*- encoding: utf-8 -*- from __future__ import unicode_literals import pprint from urllib.parse import parse_qs import webbrowser import pickle from datetime import datetime, timedelta import vk import time # id of vk.com application APP_ID = <ВСТАВИТЬ ТВОЙ APP_ID> # file, where auth data is saved AUTH_FILE = '.auth_data' # chars to exclude from filename FORBIDDEN_CHARS = '/\\\?%*:|"<>!' def get_saved_auth_params(): access_token = None user_id = None try: with open(AUTH_FILE, 'rb') as pkl_file: token = pickle.load(pkl_file) expires = pickle.load(pkl_file) uid = pickle.load(pkl_file) if datetime.now() < expires: access_token = token user_id = uid except IOError: pass return access_token, user_id def save_auth_params(access_token, expires_in, user_id): expires = datetime.now() + timedelta(seconds=int(expires_in)) with open(AUTH_FILE, 'wb') as output: pickle.dump(access_token, output) pickle.dump(expires, output) pickle.dump(user_id, output) def get_auth_params(): auth_url = ("https://oauth.vk.com/authorize?client_id={app_id}" "&scope=wall,messages&redirect_uri=http://oauth.vk.com/blank.html" "&display=page&response_type=token".format(app_id=APP_ID)) webbrowser.open_new_tab(auth_url) redirected_url = input("Paste here url you were redirected:\n") aup = parse_qs(redirected_url) aup['access_token'] = aup.pop( 'https://oauth.vk.com/blank.html#access_token') save_auth_params(aup['access_token'][0], aup['expires_in'][0], aup['user_id'][0]) return aup['access_token'][0], aup['user_id'][0] def get_api(access_token): session = vk.Session(access_token=access_token) return vk.API(session) def main(): access_token, _ = get_saved_auth_params() if not access_token or not _: access_token, _ = get_auth_params() api = get_api(access_token) main()
Что же делает этот код? Сначала мы читаем файл AUTH_FILE (если он есть), достаем оттуда токен и проверяем действителен ли он.
Если же токена нет или не актуален, то скрипт генерирует ссылку для авторизации и открывает ее в браузере. Браузер откроется, vk api попросит доступ к вашим данным.
После авторизации необходимо скопировать ссылку страницы в консоль и нажать Enter - скрипт сам достанет нужные параметры и сохранит в файл.
Ссылка, которая будет в браузере примерно такая:
https://oauth.vk.com/blank.html#access_token= 147a6effsfsd342452345ea8b59e03ef0538f20e0a474887bb46299fc99aed4bfsda11c0be900&expires_in= 86400&user_id=ХХХХХХ
Теперь у нас есть ACCESS_TOKEN, осталось написать другу сообщение.
Модифицируем функцию main, а также добавим функцию send_message.
def send_message(api, user_id, message, **kwargs): data_dict = { 'user_id': user_id, 'message': message, } data_dict.update(**kwargs) return api.messages.send(**data_dict) def main(): access_token, _ = get_saved_auth_params() if not access_token or not _: access_token, _ = get_auth_params() api = get_api(access_token) users = [<СПИСОК ID'шников пользователей>] user_text = "Привет. Я научился с помощью API писать сообщение" for user_id in users: print("User ", user_id) res = send_message(api, user_id=user_id, message=user_text) time.sleep(1) print(res)
Объедините эти два исходника и сможете отправить другу сообщение с помощью VK API.
ПРИМЕР №2
В даном примере рассмотрим способ поиска изображений по географической информации и времени съемки.
Vkontakte API Request:
url = "https://api.vk.com/method/photos.search?"
+ "lat=" + location_latitude
+ "&long=" + location_longitude
+ "&count=" + 100
+ "&radius=" + distance
+ "&start_time=" + timestamp
+ "&end_time=" + (timestamp + date_increment)
Здесь используемые переменные:
- location_latitude — географическая широта;
- location_longitude — географическая долгота;
- distance — радиус поиска;
- timestamp — начальная граница интервала времени;
- date_increment — количество секунд от начальной до конечной границы интервала времени;
- access_token — токен разработчика.
Автоматизируем процесс
Итак, мы научились составлять нужные запросы, но вручную разбирать ответ сервера (в виде JSON/XML) — не самое крутое занятие. Гораздо удобнее сделать небольшой скрипт, который будет делать это за нас. Используйте Python. Логика следующая: мы ищем все фото, которые попадают в заданный радиус относительно заданных координат в заданный промежуток времени. Но учитывай один очень важный момент — выводится ограниченное количество фотографий. Поэтому для большого промежутка времени придется делать несколько запросов с промежуточными интервалами времени (date_increment).
Начинаем кодить. Для начала подключим все необходимые нам библиотеки:
import httplib
import urllib
import json
import datetime
Пишем функции для получения данных с API через HTTPS. С помощью переданных аргументов функции мы составляем GET-запрос и возвращаем ответ сервера строкой.
def get_instagram(latitude, longitude, distance, min_timestamp, max_timestamp, access_token):
get_request = '/v1/media/search?lat=' + latitude
get_request+= '&lng=' + longitude
get_request += '&distance=' + distance
get_request += '&min_timestamp=' + str(min_timestamp)
get_request += '&max_timestamp=' + str(max_timestamp)
get_request += '&access_token=' + access_token
local_connect = httplib.HTTPSConnection('api.instagram.com', 443)
local_connect.request('GET', get_request)
return local_connect.getresponse().read()
def get_vk(latitude, longitude, distance, min_timestamp, max_timestamp):
get_request = '/method/photos.search?lat=' + location_latitude
get_request+= '&long=' + location_longitude
get_request+= '&count=100'
get_request+= '&radius=' + distance
get_request+= '&start_time=' + str(min_timestamp)
get_request+= '&end_time=' + str(max_timestamp)
local_connect = httplib.HTTPSConnection('api.vk.com', 443)
local_connect.request('GET', get_request)
return local_connect.getresponse().read()
Еще накодим небольшую функцию конвертации timestamp в человеческий вид:
def timestamptodate(timestamp):
return datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')+' UTC'
Теперь пишем основную логику поиска картинок, предварительно разбив временной отрезок на части, результаты сохраняем в HTML-файл. Функция выглядит громоздко, но основную сложность в ней составляет разбиение временного интервала на блоки. В остальном это обычный парсинг JSON и сохранение нужных данных в HTML.
HTML-формат выбран не просто так. Он позволяет нам не сохранять картинки отдельно, а лишь указать ссылки на них. При запуске страницы результаты в браузере картинки автоматически подгрузятся.
def parse_vk (location_latitude, location_longitude, distance, min_timestamp, max_timestamp, date_increment)
print 'Starting parse vkontakte..'
print 'GEO:',location_latitude,location_longitude
print 'TIME: from',timestamptodate(min_timestamp), 'to',timestamptodate(max_timestamp)
file_inst = open('vk_'+location_latitude+location_longitude+'.html','w')
file_inst.write('<html>')
local_min_timestamp = min_timestamp
while (1):
if ( local_min_timestamp >= max_timestamp ):
break
local_max_timestamp = local_min_timestamp + date_increment
if ( local_max_timestamp > max_timestamp ):
local_max_timestamp = max_timestamp
print timestamptodate(local_min_timestamp),'-',timestamptodate(local_max_timestamp)
vk_json = json.loads(get_vk(location_latitude, location_longitude, distance, local_min_timestamp, local_max_timestamp))
for local_i in vk_json['response']:
if type(local_i) is int:
continue
file_inst.write('<br>')
file_inst.write('<img src='+local_i['src_big']+'><br>')
file_inst.write(timestamptodate(int(local_i['created']))+'<br>')
file_inst.write('http://vk.com/id'+str(local_i['owner_id'])+'<br>')
file_inst.write('<br>')
local_min_timestamp = local_max_timestamp
file_inst.write('</html>')
file_inst.close()
И конечно же, сам вызов функции:
parse_vk(location_latitude, location_longitude, distance, min_timestamp, max_timestamp, date_increment)
Результат работы нашего скрипта в консоли
Результат парсинга «Контакта»
СОДЕРЖАНИЕ | Следующий урок |