Страница начала работы с 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)

Результат работы нашего скрипта в консоли

Результат парсинга «Контакта»

СОДЕРЖАНИЕ Следующий урок

Виктория Пряжникова


2016-12-06 • Просмотров [ 166 ]