Python Vk

Узнай цену своей работы

Формулировка задачи:

Привет, помогите разобрать в чем ошибка, нашел интересный скрипт для работы с вк через python, данная программа, смотрит какие посты лайкнул пользователь ссылка на статью(https://proglib.io/p/python-vk-api-2/). Но выскочила ошибка и не могу понять в чем дело
Листинг программы
  1. import vk
  2. session = vk.AuthSession(app_id='...', user_login='...', user_password='...')
  3. vkapi = vk.API(session)
  4. def getUserId(link):
  5. id = link
  6. if 'vk.com/' in link: # проверяем эту ссылку
  7. id = link.split('/')[-1] # если да, то получаем его последнюю часть
  8. if not id.replace('id', '').isdigit(): # если в нем после отсечения 'id' сами цифры - это и есть id
  9. id = vkapi.utils.resolveScreenName(screen_name=id)['object_id'] # если нет, получаем id с помощью метода API
  10. else:
  11. id = id.replace('id', '')
  12. return int(id)
  13. # count это количество запросов (и количество постов = 100 * count постов)
  14. def getLikes(user_id, cnt, vkapi):
  15. import time
  16. # подписки пользователя
  17. subscriptions_list = vkapi.users.getSubscriptions(user_id=user_id,extended=0)['groups']['items']
  18. # формируем список id, который нужно передать в следующий метод
  19. groups_list = ['-' + str(x) for x in subscriptions_list]
  20. posts = {}
  21. # формируем ленту новостей
  22. newsfeed = vkapi.newsfeed.get(
  23. filters='post',
  24. source_ids=', '.join(groups_list),
  25. count=100, timeout=10)
  26. # добавляем посты в словарь в формате id_поста: id_группы
  27. posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
  28. # нужно для получения следующей партии
  29. # если требуется более одного запроса — делаем остаток в цикле
  30. if cnt != 1:
  31. for c in range(cnt - 1):
  32. next_from = newsfeed['new_from']
  33. kwargs = {
  34. 'from': next_from,
  35. 'filters': 'post',
  36. 'source_ids': ', '.join(groups_list),
  37. 'count': 100,
  38. 'timeout': 10
  39. }
  40. newsfeed = vkapi.newsfeed.get(**kwargs)
  41. posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
  42. time.sleep(1)
  43. liked_posts = []
  44. print('Лайкнутые посты:')
  45. for post in posts.items():
  46. try:
  47. itemID = post[0]
  48. ownerID = post[1]
  49. timeOut = 5
  50. isLiked = vkapi.likes.isLiked(
  51. user_id=user_id,
  52. item_id=itemID,
  53. type='post',
  54. owner_id=ownerID,
  55. timeout=timeOut)
  56. except Exception:
  57. # print('ERROR! ' + 'vk.com/wall{0}_{1}'.format(post[1], post[0]))
  58. isLiked = 0
  59. if isLiked:
  60. liked_posts.append('vk.com/wall{0}_{1}'.format(post[1], post[0]))
  61. print('vk.com/wall{}_{}'.format(post[1], post[0]))
  62. time.sleep(1)
  63. return liked_posts
  64.  
  65. user_id = input('Введите id пользователя или ссылку на страницу: ')
  66. user_id = getUserId(user_id)
  67. getLikes(user_id, 5, vkapi) # Сканируем 5 * 100 = 500 постов

Решение задачи: «Python Vk»

textual
Листинг программы
  1. # -*- encoding: utf-8 -*-
  2.  
  3. from __future__ import unicode_literals
  4. import pprint
  5. from urllib.parse import parse_qs
  6. import webbrowser
  7. import pickle
  8. from datetime import datetime, timedelta
  9. import vk
  10. import time
  11.  
  12. # id of vk.com application
  13. APP_ID = 'app_id'
  14. # file, where auth data is saved
  15. AUTH_FILE = '.auth_data'
  16. # chars to exclude from filename
  17. FORBIDDEN_CHARS = '/\\\?%*:|"<>!'
  18.  
  19. def get_saved_auth_params():
  20.     access_token = None
  21.     user_id = None
  22.     try:
  23.         with open(AUTH_FILE, 'rb') as pkl_file:
  24.             token = pickle.load(pkl_file)
  25.             expires = pickle.load(pkl_file)
  26.             uid = pickle.load(pkl_file)
  27.         if datetime.now() < expires:
  28.             access_token = token
  29.             user_id = uid
  30.     except IOError:
  31.         pass
  32.     return access_token, user_id
  33.  
  34.  
  35. def save_auth_params(access_token, expires_in, user_id):
  36.     expires = datetime.now() + timedelta(seconds=int(expires_in))
  37.     with open(AUTH_FILE, 'wb') as output:
  38.         pickle.dump(access_token, output)
  39.         pickle.dump(expires, output)
  40.         pickle.dump(user_id, output)
  41.  
  42.  
  43. def get_auth_params():
  44.     auth_url = ("https://oauth.vk.com/authorize?client_id={app_id}"
  45.                 "&scope=wall,messages&redirect_uri=http://oauth.vk.com/blank.html"
  46.                 "&display=page&response_type=token".format(app_id=APP_ID))
  47.     webbrowser.open_new_tab(auth_url)
  48.     redirected_url = input("Paste here url you were redirected:\n")
  49.     aup = parse_qs(redirected_url)
  50.     aup['access_token'] = aup.pop(
  51.         'https://oauth.vk.com/blank.html#access_token')
  52.     save_auth_params(aup['access_token'][0], aup['expires_in'][0],
  53.                      aup['user_id'][0])
  54.     return aup['access_token'][0], aup['user_id'][0]
  55.  
  56.  
  57. def get_api(access_token):
  58.     session = vk.Session(access_token=access_token)
  59.     return vk.API(session)
  60.  
  61. def getUserId(link):
  62.     id = link
  63.     if 'vk.com/' in link: #  проверяем эту ссылку
  64.         id = link.split('/')[-1]  # если да, то получаем его последнюю часть
  65.     if not id.replace('id', '').isdigit(): # если в нем после отсечения 'id' сами цифры - это и есть id
  66.         id = vkapi.utils.resolveScreenName(screen_name=id)['object_id'] # если нет, получаем id с помощью метода API
  67.     else:
  68.         id = id.replace('id', '')
  69.     return int(id)
  70.  
  71. # count это количество запросов (и количество постов = 100 * count постов)
  72. def getLikes(user_id, cnt, api):
  73.     import time
  74.     # подписки пользователя
  75.     subscriptions_list = api.users.getSubscriptions(user_id=user_id,extended=0)['groups']['items']
  76.     # формируем список id, который нужно передать в следующий метод
  77.     groups_list = ['-' + str(x) for x in subscriptions_list]
  78.     posts = {}
  79.     # формируем ленту новостей
  80.     newsfeed = api.newsfeed.get(
  81.         filters='post',
  82.         source_ids=', '.join(groups_list),
  83.         count=100, timeout=10)
  84.     # добавляем посты в словарь в формате id_поста: id_группы
  85.     posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
  86.     # нужно для получения следующей партии
  87.     # если требуется более одного запроса — делаем остаток в цикле
  88.     if cnt != 1:
  89.         for c in range(cnt - 1):
  90.             next_from = newsfeed['start_from']
  91.             kwargs = {
  92.                 'from': next_from,
  93.                 'filters': 'post',
  94.                 'source_ids': ', '.join(groups_list),
  95.                 'count': 100,
  96.                 'timeout': 10
  97.             }
  98.             newsfeed = api.newsfeed.get(**kwargs)
  99.  
  100.             posts.update({x['post_id']: x['source_id'] for x in newsfeed['items']})
  101.             time.sleep(1)
  102.     liked_posts = []
  103.  
  104.     print('Лайкнутые посты:')
  105.     for post in posts.items():
  106.         try:
  107.             itemID = post[0]
  108.             ownerID = post[1]
  109.             timeOut = 5
  110.             isLiked = api.likes.isLiked(
  111.                 user_id=user_id,
  112.                 item_id=itemID,
  113.                 type='post',
  114.                 owner_id=ownerID,
  115.                 timeout=timeOut)
  116.         except Exception:
  117. #             print('ERROR! ' + 'vk.com/wall{0}_{1}'.format(post[1], post[0]))
  118.             isLiked = 0
  119.  
  120.         if isLiked:
  121.             liked_posts.append('vk.com/wall{0}_{1}'.format(post[1], post[0]))
  122.             print('vk.com/wall{}_{}'.format(post[1], post[0]))
  123.             time.sleep(0.25)
  124.     return liked_posts
  125.  
  126.  
  127. def main():
  128.     access_token, _ = get_saved_auth_params()
  129.     if not access_token or not _:
  130.         access_token, _ = get_auth_params()
  131.     print(access_token)
  132.     api = get_api(access_token)
  133.    
  134.     user_id = input('Введите id пользователя или ссылку на страницу: ')
  135.     user_id = getUserId(user_id)
  136.     getLikes(user_id, 3, api) # Сканируем 5 * 100 = 500 постов
  137.    
  138. main()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут