Python Vk
Формулировка задачи:
Привет, помогите разобрать в чем ошибка, нашел интересный скрипт для работы с вк через python, данная программа, смотрит какие посты лайкнул пользователь ссылка на статью(https://proglib.io/p/python-vk-api-2/). Но выскочила ошибка и не могу понять в чем дело
Решение задачи: «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()