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