VK API на Python: часть 2, узнаем, что лайкал пользователь

В этой части туториала по VK API мы рассмотрим возможность следить за пользователем, а точнее, узнаем как определить что лайкал владелец профиля вконтакте.

Первая часть

Логинимся

Для работы нам потребуется все тот же набор из первой части.

# нужно создать приложение ВКонтакте, узнать его ID, в redirect_uri указать https://oauth.vk.com/blank.html
# https://oauth.vk.com/authorize?client_id=ID_ВАШЕГО_ПРИЛОЖЕНИЯ&redirect_uri=https://oauth.vk.com/blank.html
# &response_type=token&scope=8194
access_token = "ВАШ_ТОКЕН_КОТОРЫЙ_ПОЛУЧИЛСЯ_ПОСЛЕ_ПЕРЕХОДА_ПО_ССЫЛКЕ"
session = vk.Session(access_token=access_token)
vkapi = vk.API(session)

Получаем ленту пользователя

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

def getUserId(link):
    id = link
    if 'vk.com/' in link: #  проверяем эту ссылку
        id = link.split('/')[-1]  # если да, то получаем его последнюю часть
    if not id.replace('id', '').isdigit(): # если в нем после отсечения 'id' сами цифры - это и есть id 
        id = vkapi.utils.resolveScreenName(screen_name=id)['object_id'] # если нет, получаем id с помощью метода API
    else:
        id = id.replace('id', '')
    return int(id)

Для начала получим список подписок пользователя с помощью метода users.getSubscriptions. С использованием этого списка формируем его ленту новостей методом newsfeed.get Затем, проходим по каждому посту и проверяем лайкал ли его наш пользователь с помощью метода likes.isLiked.

Смотрим, что пользователь полайкал

Так как за один запрос можно получить только до 100 постов, мы будем делать несколько запросов:

# count это количество запросов (и количество постов = 100 * count постов)
def getLikes(user_id, cnt, vkapi):
    import time
    # подписки пользователя
    subscriptions_list = vkapi.users.getSubscriptions(user_id=user_id,extended=0)['groups']['items']
    # формируем список id, который нужно передать в следующий метод
    groups_list = ['-' + str(x) for x in subscriptions_list]
    posts = {}
    # формируем ленту новостей
    newsfeed = vkapi.newsfeed.get(
        filters='post',
        source_ids=', '.join(groups_list),
        count=100, timeout=10)
    # добавляем посты в словарь в формате id_поста: id_группы
    posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
    # нужно для получения следующей партии
    # если требуется более одного запроса — делаем остаток в цикле
    if cnt != 1:
        for c in range(cnt - 1):
            next_from = newsfeed['new_from']
            kwargs = {
                'from': next_from,
                'filters': 'post',
                'source_ids': ', '.join(groups_list),
                'count': 100,
                'timeout': 10
            }
            newsfeed = vkapi.newsfeed.get(**kwargs)

            posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
            time.sleep(1)
    liked_posts = []

    print('Лайкнутые посты:')
    for post in posts.items():
        try:
            itemID = post[0]
            ownerID = post[1]
            timeOut = 5
            isLiked = vkapi.likes.isLiked(
                user_id=user_id,
                item_id=itemID,
                type='post',
                owner_id=ownerID,
                timeout=timeOut)
        except Exception:
#             print('ERROR! ' + 'vk.com/wall{0}_{1}'.format(post[1], post[0]))
            isLiked = 0

        if isLiked:
            liked_posts.append('vk.com/wall{0}_{1}'.format(post[1], post[0]))
            print('vk.com/wall{}_{}'.format(post[1], post[0]))
            time.sleep(1)
    return liked_posts

Здесь должно быть просто. Если вас интересует зачем мы приостанавливали выполнение на 1 секунду каждую итерацию, так это потому, что likes.isLiked выполняется довольно быстро и чтобы не делать слишком много запросов (VK такое не любит) приостанавливаем выполнение.

Ну и, наверное, самое интересное: давайте испытаем скрипт. Выбирайте самого интересного знакомого (или незнакомца) и в разведку.

user_id = input('Введите id пользователя или ссылку на страницу: ')
user_id = getUserId(user_id)
getLikes(user_id, 5, vkapi) # Сканируем 5 * 100 = 500 постов

Запускаем скрипт

➜ python3 main.py
Введите id пользователя или ссылку на страницу: http://vk.com/id***
Лайкнуты посты:
vk.com/wall-20629724_803918
vk.com/wall-30598666_692030
vk.com/wall-20629724_803740
vk.com/wall-30598666_691833
vk.com/wall-20629724_803582

На этом вторая часть подошла к концу. В следующей рассмотрим варианты автоматизации общения вконтакте путем создания простого чат-бота.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
11 декабря 2018

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе...
admin
13 февраля 2017

Программирование на Python: от новичка до профессионала

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