def fetch_voters_by_api(self, offset=0): ''' Update and save fields: * votes_count - count of likes Update relations: * voters - users, who vote for this answer ''' number_on_page = 100 params = { 'owner_id': self.poll.post.remote_id.split('_')[0], 'poll_id': self.poll.pk, 'answer_ids': self.pk, 'offset': offset, 'count': number_on_page, 'fields': USER_FIELDS, } result = api_call('polls.getVoters', used_access_tokens=ACCESS_TOKEN, **params)[0] if offset == 0: try: self.votes_count = int(result['users'][0]) pp = Poll.remote.fetch(self.poll.pk, self.poll.post) if pp and pp.votes_count: self.rate = (float(self.votes_count) / pp.votes_count) * 100 else: self.rate = 0 self.save() except Exception, err: log.warning('Answer fetching error with message: %s' % err) self.voters.clear()
def fetch_repost_items(self, offset=0, count=1000, *args, **kwargs): if count > 1000: raise ValueError("Parameter 'count' can not be more than 1000") # owner_id # идентификатор пользователя или сообщества, на стене которого находится запись. Если параметр не задан, то он считается равным идентификатору текущего пользователя. # Обратите внимание, идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-" — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1) kwargs['owner_id'] = self.wall_owner.remote_id if isinstance(self.wall_owner, Group): kwargs['owner_id'] *= -1 # post_id # идентификатор записи на стене. kwargs['post_id'] = self.remote_id.split('_')[1] # offset # смещение, необходимое для выборки определенного подмножества записей. kwargs['offset'] = int(offset) # count # количество записей, которое необходимо получить. # положительное число, по умолчанию 20, максимальное значение 100 kwargs['count'] = int(count) log.debug('Fetching repost users ids of post %s, offset %d' % (self.remote_id, offset)) response = api_call('wall.getReposts', **kwargs) return response['items']
def update_users(self, offset=0): ''' Fetch all users for this group, save them as IDs and after make m2m relations ''' try: stat = GroupStatMembers.objects.get_or_create(group=self, time=None)[0] except MultipleObjectsReturned: GroupStatMembers.objects.filter(group=self, time=None).delete() stat = GroupStatMembers.objects.create(group=self) offset = 0 offset = offset or stat.offset while True: response = api_call('groups.getMembers', gid=self.remote_id, offset=offset) ids = response['users'] if len(ids) == 0: break # add new ids to group stat members stat.add_members(ids) stat.offset = offset stat.save() offset += 1000 # save stat with time and other fields stat.save_final() signals.group_users_updated.send(sender=Group, instance=self)
def get_by_slug(self, slug): ''' Return existed User, Group, Application by slug or new intance with empty pk ''' try: assert self.model.slug_prefix and slug.startswith(self.model.slug_prefix) remote_id = int(re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0]) except (AssertionError, ValueError, IndexError): try: return self.model.objects.get(screen_name=slug) except self.model.DoesNotExist: try: response = api_call('resolveScreenName', **{'screen_name': slug}) except VkontakteError, e: log.error("Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s" % (slug, e)) return None try: assert self.model._meta.module_name == response['type'] remote_id = int(response['object_id']) except TypeError: log.error("Method get_by_slug returned response in strange format: %s. Slug is '%s'" % (response, slug)) return None except ValueError: return None except AssertionError: log.error("Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'" % (response['type'], self.model._meta.module_name, slug)) return None
def get_by_slug(self, slug): ''' Return existed User, Group, Application by slug or new intance with empty pk ''' try: assert self.model.slug_prefix and slug.startswith( self.model.slug_prefix) remote_id = int( re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0]) except (AssertionError, ValueError, IndexError): try: response = api_call('resolveScreenName', **{'screen_name': slug}) except VkontakteError, e: log.error( "Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s" % (slug, e)) return None if response['type'] not in self.model.resolve_screen_name_types: raise WrongResponseType( "Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'" % (response['type'], self.model.resolve_screen_name_types, slug)) try: remote_id = int(response['object_id']) except (KeyError, TypeError, ValueError), e: # TODO: raise error log.error( "Method get_by_slug returned response in strange format: %s. Slug is '%s'" % (response, slug)) return None
def api_call(self, method='get', **kwargs): if self.model.methods_access_tag: kwargs['methods_access_tag'] = self.model.methods_access_tag method = self.methods[method] if self.model.methods_namespace: method = self.model.methods_namespace + '.' + method return api_call(method, **kwargs)
def fetch_reposts_api(self, offset=0, count=1000, *args, **kwargs): if count > 1000: raise ValueError("Parameter 'count' can not be more than 1000") # owner_id # идентификатор пользователя или сообщества, на стене которого находится запись. Если параметр не задан, то он считается равным идентификатору текущего пользователя. # Обратите внимание, идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-" — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1) kwargs['owner_id'] = self.wall_owner.remote_id if isinstance(self.wall_owner, Group): kwargs['owner_id'] *= -1 # post_id # идентификатор записи на стене. kwargs['post_id'] = self.remote_id.split('_')[1] # offset # смещение, необходимое для выборки определенного подмножества записей. kwargs['offset'] = int(offset) # count # количество записей, которое необходимо получить. # положительное число, по умолчанию 20, максимальное значение 100 kwargs['count'] = int(count) if offset == 0: self.repost_users.clear() log.debug('Fetching reposts of post ID=%s of owner "%s", offset %d' % (self.remote_id, self.wall_owner, offset)) response = api_call('wall.getReposts', **kwargs) new_users_ids = [] profiles = dict([(profile['uid'], profile) for profile in response['profiles']]) for post in response['items']: user_id = post.get('from_id') # TODO: implement schema for group reposting support with links to texts via though model if user_id and user_id > 0: try: user_instance = User.objects.get(remote_id=user_id) except User.DoesNotExist: user_instance = User.objects.create(remote_id=user_id) if user_id in profiles: user_instance.parse(profiles[user_id]) user_instance.save() else: new_users_ids += [user_id] self.repost_users.add(user_instance) # update info of new users, that was not found in 'profiles' dict if new_users_ids: User.remote.fetch(ids=new_users_ids) return self.repost_users.all()
def fetch_likes(self, owner_id, item_id, offset=0, count=1000, filter='likes', *args, **kwargs): if count > 1000: raise ValueError("Parameter 'count' can not be more than 1000") if filter not in ['likes', 'copies']: raise ValueError("Parameter 'filter' should be equal to 'likes' or 'copies'") if self.likes_type is None: raise ImproperlyConfigured("'likes_type' attribute should be specified") # type # тип Like-объекта. Подробнее о типах объектов можно узнать на странице Список типов Like-объектов. kwargs['type'] = self.likes_type # owner_id # идентификатор владельца Like-объекта (id пользователя или id приложения). Если параметр type равен sitepage, то в качестве owner_id необходимо передавать id приложения. Если параметр не задан, то считается, что он равен либо идентификатору текущего пользователя, либо идентификатору текущего приложения (если type равен sitepage). kwargs['owner_id'] = owner_id # item_id # идентификатор Like-объекта. Если type равен sitepage, то параметр item_id может содержать значение параметра page_id, используемый при инициализации виджета «Мне нравится». kwargs['item_id'] = item_id # page_url # url страницы, на которой установлен виджет «Мне нравится». Используется вместо параметра item_id. # filter # указывает, следует ли вернуть всех пользователей, добавивших объект в список "Мне нравится" или только тех, которые рассказали о нем друзьям. Параметр может принимать следующие значения: # likes – возвращать всех пользователей # copies – возвращать только пользователей, рассказавших об объекте друзьям # По умолчанию возвращаются все пользователи. kwargs['filter'] = filter # friends_only # указывает, необходимо ли возвращать только пользователей, которые являются друзьями текущего пользователя. Параметр может принимать следующие значения: # 0 – возвращать всех пользователей в порядке убывания времени добавления объекта # 1 – возвращать только друзей текущего пользователя в порядке убывания времени добавления объекта # Если метод был вызван без авторизации или параметр не был задан, то считается, что он равен 0. kwargs['friends_only'] = 0 # offset # смещение, относительно начала списка, для выборки определенного подмножества. Если параметр не задан, то считается, что он равен 0. kwargs['offset'] = int(offset) # count # количество возвращаемых идентификаторов пользователей. # Если параметр не задан, то считается, что он равен 100, если не задан параметр friends_only, в противном случае 10. # Максимальное значение параметра 1000, если не задан параметр friends_only, в противном случае 100. kwargs['count'] = int(count) response = api_call('likes.getList', **kwargs) return response['users']
def get_by_slug(self, slug): ''' Return existed User, Group, Application by slug or new intance with empty pk ''' try: assert self.model.slug_prefix and slug.startswith(self.model.slug_prefix) remote_id = int(re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0]) except (AssertionError, ValueError, IndexError): try: response = api_call('resolveScreenName', **{'screen_name': slug}) except VkontakteError, e: log.error("Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s" % (slug, e)) return None if response['type'] not in self.model.resolve_screen_name_types: raise WrongResponseType("Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'" % (response['type'], self.model.resolve_screen_name_types, slug)) try: remote_id = int(response['object_id']) except (KeyError, TypeError, ValueError), e: # TODO: raise error log.error("Method get_by_slug returned response in strange format: %s. Slug is '%s'" % (response, slug)) return None
def get_query(self, q, request): response = api_call('ads.getSuggestions', **{'section': self.section, 'q': q}) # print response return response
def get_objects(self, ids): response = api_call('ads.getSuggestions', **{'section': self.section, 'cities': '1'}) return [item['name'] for item in response if item['id'] in ids]
def get_objects(self, ids): if ids: response = api_call('ads.getSuggestions', **{'section': self.section}) return [item['name'] for item in response if item['id'] in ids] else: return []
# -*- coding: utf-8 -*- from vkontakte_api.utils import api_call friends_ids = api_call('friends.get', **{'fields': 'nickname', 'count': 1})#,domain,sex,bdate,city,country,timezone,photo_50,photo_100,photo_200_orig,has_mobile,contacts,education,online,relation,last_seen,status,can_write_private_message,can_see_all_posts,can_post,universities'}) for friend in friends_ids: print friend #break