11# encoding: utf-8
2+ import json
23
34
45class VkTools (object ):
@@ -8,10 +9,47 @@ def __init__(self, vk):
89 def get_all_items (self , method , values = None , max_count = 200 ):
910 ''' Получить все элементы
1011 Работает в методах, где в ответе есть count и items
12+ За один запрос получает max_count * 25 элементов
1113
1214 :param method: метод
1315 :param values: параметры
14- :param max_count: максимальное количество,
16+ :param max_count: максимальное количество элементов,
17+ которое можно получить за один раз
18+ '''
19+
20+ if values :
21+ values = values .copy ()
22+ else :
23+ values = {}
24+
25+ items = []
26+ offset = 0
27+
28+ while True :
29+ run_code = code_get_all_items % (max_count , offset , json .dumps (values ), method , method )
30+
31+ try :
32+ response = self .vk .method ('execute' , {'code' : run_code })
33+ except Exception as e :
34+ print run_code
35+ print e
36+
37+ items += response ['items' ]
38+
39+ if response ['end' ]:
40+ break
41+
42+ offset = response ['offset' ]
43+
44+ return {'count' : len (items ), 'items' : items }
45+
46+ def get_all_items_slow (self , method , values = None , max_count = 200 ):
47+ ''' Получить все элементы
48+ Работает в методах, где в ответе есть count и items
49+
50+ :param method: метод
51+ :param values: параметры
52+ :param max_count: максимальное количество элементов,
1553 которое можно получить за один раз
1654 '''
1755
@@ -35,3 +73,6 @@ def get_all_items(self, method, values=None, max_count=200):
3573 items += response ['items' ]
3674
3775 return {'count' : len (items ), 'items' : items }
76+
77+ # Полный код в файле vk_procedures
78+ code_get_all_items = 'var z=%s,x=%s,y=%s,p={"count":z}+y,r=API.%s(p),c=r["count"],j=r["items"],o=z,i=1;while(i<25&&o+z<c){o=i*z+x;p={"count":z,"offset":o}+y;r=API.%s(p);j=j+r["items"];i=i+1;};return{"count":c,"items":j,"offset":o,"end":o+z>=c};'
0 commit comments