Здраствуйте, Хабровчане!
В последнее время мне часто приходится сталкиваться с API Вконтакте, благо для работы с ней есть замечательная библиотека, доступная для установки через PyPl с наименованием там vk. Но у неё есть один относительный недостаток: она не может получить за вас токен доступа к api (acess_token), без этого токена (набор символов, который Вконтакте выдает пользователю, если разрешает приложению доступ к его странице) работать с API нельзя. Проблемы, связанные с VK API, авторизацией и получением прав на python 3.x, а также небольшая инструкция и мини-FAQ по работе с VK API вы найдёте ниже.
Про токен
Получить токен можно разными путями, наиболее удобный и практичный описан в публикации «Пишем модуль для авторизации в VK API», но и он несовершенен, так как его можно использовать для Python 2.x, а мы люди прогрессивные и хотим 3.x, не так ли? Не буду томить, вот мой порт этого модуля под Python 3.x (никакие сторонние модули не нужны):
Итак, простой код для теста всё ли правильно установлено:
import vk,vk_auth_port_by_bulates1
vkapi = vk.API(app_id,login,password)
vkapi.access_token=vk_auth_port_by_bulates1.auth(login,password,app_id,'wall')
vkapi.wall.post(message="Test from python 3.4")
Здесь:
- Login — ваш логин вконтакте, строка, например, e-mail или телефон;
- Password — ваш пароль от вконтакте, строка, например, 'qwerty123';
- App_id — идентификатор вашего приложения, как получить — читаем дальше;
- «wall» — запрос на управления стенкой VK, дальше объясню более подробно.
Про идентификатор приложения (app_id)
Получается он очень просто, заходите сюда и создаёте собственное Standalone приложение, название значения не имеет. Далее жмёте редактировать приложение, заходите во вкладку настройки и видите строку ID приложения. То, что напротив неё, и есть app_id, посылаем его в виде строки.
Про права
Необходимые нам права указаны в официальной документации VK здесь. Выбираете нужный метод и там сверху написано жирным шрифтом, какие права нужно иметь, выписываем все необходимые нам права и посылаем их в виде строки с разделителем '+', например, 'wall+friends+groups'.
Про использование методов API
Теперь наконец-то приступим к написанию первого самостоятельного приложения.
Для начала предлагаю написать простенький скрипт для скачивания фото на компьютер с использованием API.
import vk,vk_auth_port_by_bulates1,urllib.request
vkapi = vk.API(app_id,login,password)
vkapi.access_token=vk_auth_port_by_bulates1.auth(login,password,app_id,'photos')
albums=[x['id'] for x in vkapi.photos.getAlbums(owner_id=yid)['items']]
for album in albums:
photos=vkapi.photos.get(owner_id=yid,album_id=album)['items']
for photo in photos:
link=photo[sorted([x for x in photo.keys() if 'photo' in x],key=lambda x: int(x.split('_')[1]))[-1]]
urllib.request.urlretrieve(link,link.split('/')[-1])
Строка:
- Импорт необходимых модулей, urllib — для скачивания файлов;
- Создаём экземпляр класса VK API;
- Получаем токен и добавляем его VK API
- Получаем список альбомов (функция getAlbums возвращает словарь, с которым уже можно работать без сторонних модулей) и достаём из них id;
- Начинаем цикл по id альбомов;
- Получаем список всех фотографий (вот в таком виде);
- Начинаем цикл по фотографиям;
- Получаем ссылку на фото в максимальном доступном разрешении (если кто знает способ получить её проще, отпишите пожалуйста, в комменты);
- Скачиваем фото.
В данном случае yid — идентификатор того, чьи альбомы скачиваем, например ваш, разумеется у вас должен быть доступ к этим фото
Короче чем тут, не так ли? Правда, здесь без выбора альбома, но это неважно, главное, что через API быстрее, короче и удобнее.
Мини FAQ
- -Откуда брать список методов?
— Из официальной документации, вызываются просто: vkapi.то что написано в документации, например vkapi.photos.Get(); - — Какие аргументы для методов?
— Всё там же в документации, передавать в виде имя=значение, например owner_id='124214'; - — Как узнать какие нужны права?
— В информации о методе в документации VK сверху есть строка, в которой жирным шрифтом выделено, какие права нужны; если надо несколько, то посылаем их строкой с разделителем '+', например, 'photos+wall'. Порядок значения не имеет; - — Все ли методы реализованы?
— Да, все; - Если неправильный логин/пароль вернёт ли ошибку auth()?
— Да, «Excpected sucess here»; - — Насчёт кодировки…
— В основном возвращается строка utf-8.
P.S.
Надеюсь, вам понравилась данная статья.
Автор: python_coder