работа с vk api на python 3.x / сохабр

Описание задачи и пути решения

Мне потребовалось найти VK-группы в заданном городе по нескольким ключевым словам, чтобы запустить на них рекламу. Эти группы нужно было где-то сохранить, чтобы не искать каждый раз по новой.

По каждой группе мне важна следующая информация:

  • id — чтобы использовать в рекламе;
  • name — чтобы оценить подходит группа или нет (Например, для ключевого слова «ремонт» может быть ремонт квартир или ремонт машин);
  • members_count — чтобы оценить размер группы;
  • contacts — чтобы получить список id пользователей, на которых не следует давать рекламу;
  • группы должны быть отсортированы по отношению дневной посещаемости к количеству пользователей — чтобы не использовать группы, которые никто не посещает.

https://www.youtube.com/watch?v=K_4-1N4COHY

Сначала, я начал искать группы используя стандартный поиск. Но это оказалось очень не быстро. На пятой группе я призадумался о более быстром способе.

Getcity_vk.py

Пример обращения к базе данных ВК через VK API. Программа использует предыдущий пример auth_vk.py в качестве модуля для авторизации в ВК.

Программа просто выводит список городов в базе данных ВК по ключевому слову (keyword). Если ключевое слово не задано, то выдаётся список по ключевому слову “Балашиха”.

Запуск программы:
python3 getCity_vk.py “keyword”

Getmembers.py

Простой пример получения списка подписчиков группы ВК используя API.

Может использоваться в качестве модуля для других примеров. В этом случае доступно несколько методов.

  • def get_members(group_id, fil="") – возвращает первую 1000 подписчиков группы group_id.
  • def get_all_members(group_id) – возвращает всех подписчиков группы group_id.
  • def get_all_members_3(group_id) – возвращает всех подписчиков группы group_id с указанием их городов.
  • def get_all_members_from(group_id, city_id) – возвращает всех подписчиков группы group_id из города city_id.

Запуск программы:
python3 getMembers.py [group_id]
group_id – это group_id группы, для которого необходимо получить список подписчиков. По умолчанию group_id = ‘157262974’ # ID группы попечителей Школы Граня.

Main.py

Пример использования VK API для поиска групп в городе по ключевому запросу. Результат выводится в файлы csv.

ПАРАМЕТРЫ ДЛЯ ПРОГРАММЫ (задаются внутри кода):

  • access_token – нужно предварительно запросить. Ниже указан запрос, который нужно вставить в адресную строку браузера;
  • v – версия VK API;
  • keyword_city – ключевое слово для города, в котором требуется найти группы;
  • keywords_groups – ключевые слова, по которым требуется найти группы;

МЕТОДЫ VK API:

ПОЛУЧЕНИЕ КЛЮЧА ДОСТУПА ВРУЧНУЮ

Для получения ключа доступа access_token вы должны быть зарегистрированный на VK.

Python, авторизация на ?

Имеется скрипт, который получает данные с

vk.com/al_friends.php

. Опытным путём установлено, что необходимо только куки remixsid. Пытаюсь получить по инструкциям из интернета (используется requests):

auth_params = {'act': 'login', 'email': 'мыло', 'pass': 'пароль'}
r = requests.get('http://login.vk.com', params=auth_params)
# на данном этапе всё хорошо, возвращается страница пользователя, как будто авторизовались

# далее надо получить параметр __q_hash. Его (по мануалу) вытягиваем со страницы:
parse_hash = re.search('hash=([a-z0-9] )', r.text)
hash = parse_hash.group(1)
# единственное место, где встречается hash= в коде страницы — ссылка «выйти» (https://login.vk.com/?act=logout&hash=…)

# теперь нужно сделать запрос к vk.com/login.php, используя полученный хэш:
auth_params = {'act': 'slogin', 'role': 'fast', 'redirect': '1', 'to': '', 's': '1', '__q_hash': hash}
r = requests.get('http://vk.com/login.php', params=auth_params)
# а вот теперь облом, получаем страницу с формой авторизации. Хотя по мануалу мы должны получить из неё remixsid (опять же, регэкспом из кода страницы)

Пробовал с указанием юзер-агента (‘User-Agent’: ‘Mozilla/5.0’ — перекидывает на мобильную версию) и без (отдаёт полную версию).

Собственно, вопрос — что не так? Или я неправильно понял, или алгоритм авторизации изменили, и __q_hash теперь по-другому получать надо.

Также приветствуются предложения по альтернативному способу получения remixsid (скопировать самому из браузера не предлагать, хочется полной автономности 🙂

Авторизируемся

Подставляем в параметры запроса email и пароль пользователя и отправляем форму:

parser.params["email"] = email
parser.params["pass"] = password
response = opener.open(parser.url, urllib.urlencode(parser.params))

Библиотека vk для работы с vk api на python

image

Привет, Хабр! Данная статья предназначена для тех, кто хочет разобраться с основами VK API на Python, так как статей по этому поводу нет (на Хабре есть одна статья, но она уже не совсем актуальна, так как некоторые методы не работают), а на других ресурсах мне удалось найти только вопросы пользователей, но никаких гайдов и прочего.

Для работы с VK API в Python есть две популярные библиотеки: vk и vk_api. Какая из библиотек лучше я судить не возьмусь, но скажу одно: у vk документация слишком мала (поэтому разбирался практически методом тыка) и на английском языке, а у vk_api документация более развернута (поэтому писать о данной библиотеке смысла не вижу) и на русском. Для меня не главное на каком языке документация, но для некоторых пользователей это играет большое значение при выборе.

Как вы уже поняли, в данной статье рассматривается работа с библиотекой vk.

Устанавливается данная библиотека следующей стандартной командой:

pip install vk

После того, как модуль будет установлен, нам необходимо создать приложение на сайте соц.сети. Я думаю, что большинство пользователей умеет это делать, поэтому информацию по этому шагу пропускаю. Если кто не умеет, то гуглим, не стесняемся.

После регистрации приложения нам нужен будет только его ID.

Начнем с авторизации. В принципе, некоторую информацию можно получить и без ввода личных данных, что конечно же хорошо, например:

import vk
session = vk.Session()
vk_api = vk.API(session)
vk_api.users.get(user_id=1)

Таким образом мы получим фамилию, имя и id пользователя с user_id = 1. Если вам нужно получить еще какую-то информацию о пользователе, то в вызове метода нужно указать дополнительные поля, информация о которых должна быть возвращена:

vk_api.users.get(user_id=1, fields=’online, last_seen’)

Т.е. в данном случае мы получим не только информацию об имени и фамилии пользователя с id=1, но и информацию о том, находится ли пользователь сейчас на сайте (fields=’online’) и время последнего посещения, а также тип устройства (fields=’ last_seen’).

Действия без авторизации не предоставляют нам возможность использования VK API на полную мощь, поэтому рассмотрим авторизацию с вводом личных данных. Есть два способа: ввод логина и пароля, ввод токена. Чтобы авторизоваться с помощью токена нужно немного дополнить первый пример, а именно вот эту строку:

session = vk.Session(access_token='tocken')

Дальше все остается так же, как и было раньше, без каких-либо изменений.

Следующий способ авторизации – ввод логина и пароля. В данном случае тоже все довольно просто и понятно:

session = vk.AuthSession('id_app', 'login', 'pass')
vk_api = vk.API(session)

Как видите, ничего сложного и все настолько просто и понятно, что даже не нуждается в дополнительных комментариях.

При такой авторизации нужно указывать не только логин, пароль и ID приложения, но то, к чему мы хотим получить доступ.

Например, у нас сейчас не указан доступ к стене пользователя, поэтому при попытке добавить запись на стену мы получим ошибку:

vk_api.wall.post(message="hello")
<b>Ошибка: vk.exceptions.VkAPIError: 15.</b>

Для того чтобы данный код сработал корректно, при авторизации нужно указать дополнительно аргумент с названием scope и перечислить через запятую те методы, доступ к которым мы хотим получить.

session = vk.AuthSession('id_app', 'login', 'pass', scope=’wall, messages’)
vk_api = vk.API(session)
vk_api.wall.post(message="hello")

В данном примере я запрашиваю доступ к стене и сообщениям. Выполнение программы завершается корректно, а на стене появляется запись с текстом ‘hello’. Названия методов, к которым возможно получить доступ можно посмотреть

на этой странице документации

.

Вот и все. Вызов методов происходит по одному шаблону:

vk_api.метод.название(параметры=значения)
Например: vk_api.messages.send(users_id=0, messages=’hello’)

Таким образом мы отправляем сообщение hello пользователю с id = 0 (т.е. самому себе). Названия параметров, которые нужно передавать при вызове какого-либо метода можно найти в документации, в описании самого метода.

Для более наглядной работы библиотеки я реализовал небольшую программку, которая следит когда пользователь зашел в ВК, а когда из него вышел (слабо верится, но может будет кому интересна). Код программы ниже и на GitHub.

Пример программы с использованием библиотеки vk

import datetime
from time import sleep
import vk

def get_status(current_status, vk_api, id):
    profiles = vk_api.users.get(user_id=id, fields='online, last_seen')
    if (not current_status) and (profiles[0]['online']):  # если появился в сети, то выводим время
        now = datetime.datetime.now()
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        print('Появился в сети в: ', now.strftime("%d-%m-%Y %H:%M"))
        return True
    if (current_status) and (not profiles[0]['online']):  # если был онлайн, но уже вышел, то выводим время выхода
        print('Вышел из сети: ', datetime.datetime.fromtimestamp(profiles[0]['last_seen']['time']).strftime('%d-%m-%Y %H:%M'))
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        return False
    return current_status

if __name__ == '__main__':
    id = input("ID пользователя: ")
    session = vk.Session()
    vk_api = vk.API(session)
    current_status = False
    while(True):
        current_status = get_status(current_status, vk_api, id)
        sleep(60)

Данная статья предназначалась лишь для понимания основ работы с VK API на Python с использованием библиотеки VK.

Всем добра!

Графический или web интерфейс

Если будет такой запрос, то можно добавить графический или веб интерфейс и обработку ошибок. Для своих внутренних нужд, я вряд ли буду это делать. Но, если будет такой запрос, то почему бы и нет.

***

Пишите в комментариях, какое ещё развитие программы вы хотели бы видеть.

Как использовать vk api в python

Реализация описанного выше алгоритма на Python-е оказалась проще, чем я ожидал. От начала программирования до рабочей версии программы прошло около 40 минут. Получается, если бы я сразу начал программировать, то всё получилось бы быстрее часа на два.

Для реализации взял первую попавшуюся библиотеку для работы с VK в Python-е. Установил её следующей командой:

Как использовать vk api через браузер

Для работы с VK API через браузер, прежде всего, необходимо получить так называемый access_token.

Делается это очень просто. Нужно просто указанный ниже код вставить в адресную строку браузера.

Классическое консольное приложение

Задавать параметры в коде программы вполне приемлемый способ для программиста. Однако, для простого пользователя — это слишком. Не мудрено ненароком испортить программу. Поэтому лучше реализовать передачу параметров через командную строку, как в классическом консольном приложении.

Контакты в отдельный файл

Контакты групп часто нужны, чтобы не показывать на них рекламу. Для этого нужно собрать id всех пользователей из контактов в отдельный файл. В текущей реализации это придётся делать вручную. Между тем добавить такой функционал совсем несложно и займёт минут 15.

Метод groups.getbyid

Этот метод я использовал, чтобы получить список групп города соответствующих запросу со всеми необходимыми по условию данными. Пример запроса ниже.

Метод groups.search

Этот метод я использовал, чтобы получить id групп соответствующих запросу по ключевому слову. В нижеприведённом примере нужно будет заменить аргументы access_token, city_id и q на соответствующие ваши.

Парсим ответ

Посмотрим на код странички авторизации. Больше всего нас будет интересовать следующий участок:

Пример использования модуля


Собственно, ради чего все и затевалось – скрипт для загрузки альбома:

Примеры работы с vk api

Простые примеры использования VK API на языке программирования Python 3.5:

Про идентификатор приложения (app_id)

Получается он очень просто, заходите

и создаёте собственное

Standalone

приложение, название значения не имеет. Далее жмёте редактировать приложение, заходите во вкладку

настройки

и видите строку

ID приложения

. То, что напротив неё, и есть app_id, посылаем его в виде строки.

Про использование методов 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])

Строка:

  1. Импорт необходимых модулей, urllib — для скачивания файлов;
  2. Создаём экземпляр класса VK API;
  3. Получаем токен и добавляем его VK API
  4. Получаем список альбомов (функция getAlbums возвращает словарь, с которым уже можно работать без сторонних модулей) и достаём из них id;
  5. Начинаем цикл по id альбомов;
  6. Получаем список всех фотографий (вот в таком виде);
  7. Начинаем цикл по фотографиям;
  8. Получаем ссылку на фото в максимальном доступном разрешении (если кто знает способ получить её проще, отпишите пожалуйста, в комменты);
  9. Скачиваем фото.

В данном случае yid — идентификатор того, чьи альбомы скачиваем, например ваш, разумеется у вас должен быть доступ к этим фото

Короче чем

, не так ли? Правда, здесь без выбора альбома, но это неважно, главное, что через API быстрее, короче и удобнее.

Про права


Необходимые нам права указаны в официальной документации VK

. Выбираете нужный метод и там сверху написано жирным шрифтом, какие права нужно иметь, выписываем все необходимые нам права и посылаем их в виде строки с разделителем ‘ ‘, например, ‘wall friends groups’.

Про токен

Получить токен можно разными путями, наиболее удобный и практичный описан в публикации

, но и он несовершенен, так как его можно использовать для 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")

Здесь:

Пути развития программы

Программа полностью выполняет свою задачу. Но это не значить, что её нельзя сделать лучше. Я здесь вижу несколько направлений развития.

Разрешаем доступ

Следующим этапом, если пользователь этого еще не делал, нам надо дать приложению те права, которые мы запрашивали в параметре scope. Для этого нам будет предложена страничка с формой, на которой будут кнопки Allow и Deny. Парсим и отправляем форму методом, описаным выше.

Расширение функционала

По мере необходимости можно расширять функционал программы. Например, добавить возможность извлекать пользователей — членов групп и делать их пересечение. Строить списки пользователей, которые состоят в 2-х группах и тому подобное. Пока такой необходимости не было, но если понадобится, то дописать код будет гораздо быстрее, чем делать всё вручную.

Создаем opener

Для того, чтобы прикинутся настоящим браузером, просто загружать нужные страницы недостаточно. Как минимум, нужно корректно обрабатывать cookies и редиректы. Для этого создаем opener, который будет делать всю работу за нас:

Makelisttosend2.py

Пример построения списка в формате csv-файла для отправки сообщений друзьям.

Требуется отправить сообщения тем друзьям, которые не состоят в клубе попечителей.
Программа формирует список таких друзей и ссылки для отправки сообщений.

Запуск программы:
python3 MakeListToSend 2.py > result.csv

Makelisttosend.py

Пример построения списка в формате html-файла для отправки сообщений друзьям.

Требуется отправить сообщения тем друзьям, которые не состоят в клубе попечителей.
Программа формирует список таких друзей и ссылки для отправки сообщений.

Запуск программы:
python3 MakeListToSend.py > result.html

Getfriends.py

Это простой пример получения списка друзей из ВК используя API.

Этот файл можно использовать в качестве модуля. В этом случае становятся доступными два медода:

Заключение

Конечно этот модуль не подходит для использования в серьезных проектах, но для личных целей – вполне.

Похожее:  Авторизация через ВКонтакте, и другие для самых начинающих — 1 / Хабр

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *