Python Vk
Формулировка задачи:
Привет, помогите разобрать в чем ошибка, нашел интересный скрипт для работы с вк через python, данная программа, смотрит какие посты лайкнул пользователь ссылка на статью(https://proglib.io/p/python-vk-api-2/). Но выскочила ошибка и не могу понять в чем дело
Листинг программы
- import vk
- session = vk.AuthSession(app_id='...', user_login='...', user_password='...')
- vkapi = vk.API(session)
- 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)
- # 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
- user_id = input('Введите id пользователя или ссылку на страницу: ')
- user_id = getUserId(user_id)
- getLikes(user_id, 5, vkapi) # Сканируем 5 * 100 = 500 постов
Решение задачи: «Python Vk»
textual
Листинг программы
- # -*- 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 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)
- # count это количество запросов (и количество постов = 100 * count постов)
- def getLikes(user_id, cnt, api):
- import time
- # подписки пользователя
- subscriptions_list = api.users.getSubscriptions(user_id=user_id,extended=0)['groups']['items']
- # формируем список id, который нужно передать в следующий метод
- groups_list = ['-' + str(x) for x in subscriptions_list]
- posts = {}
- # формируем ленту новостей
- newsfeed = api.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['start_from']
- kwargs = {
- 'from': next_from,
- 'filters': 'post',
- 'source_ids': ', '.join(groups_list),
- 'count': 100,
- 'timeout': 10
- }
- newsfeed = api.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 = api.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(0.25)
- return liked_posts
- def main():
- access_token, _ = get_saved_auth_params()
- if not access_token or not _:
- access_token, _ = get_auth_params()
- print(access_token)
- api = get_api(access_token)
- user_id = input('Введите id пользователя или ссылку на страницу: ')
- user_id = getUserId(user_id)
- getLikes(user_id, 3, api) # Сканируем 5 * 100 = 500 постов
- main()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д