@albertalexandrov

Как использовать execute (VK API)?

Всем привет!

Стоит задача спарсить всех участников группы. Вот код, который сейчас есть:

import requests

API = "https://api.vk.com/method"
ACCESS_TOKEN = "**********"
V = 5.80

response = requests.post(url=f"{API}/execute",
                         data={
                             "code": "var members = API.groups.getMembers({\"group_id\": \"tensor_company\"}).users;"
                                     "var count = members.count;"
                                     "var offset = 1000;" 
                                     "while (offset < count);"
                                         "{;"
                                            "members = members + \" , \" + API.groups.getMembers({\"group_id\": \"tensor_company\", \"offset\": offset}).users;"
                                            "offset = offset + 1000;"
                                         "};"
                                     "return members;",
                             "access_token": ACCESS_TOKEN,
                             "v": V,
                         })

print(response.json())


Сейчас возникает ошибка:

{'error': {'error_code': 13, 'error_msg': 'Runtime error occurred during code invocation: Too many operations', 'request_params': [{'key': 'group_id', 'value': 'tensor_company'}]}}


Как это исправить?

P.S. execute пока не очень понимаю.
  • Вопрос задан
  • 2210 просмотров
Пригласить эксперта
Ответы на вопрос 2
@ffosters
Обратите внимание!

Внутри code может содержаться не более 25 обращений к методам API.


https://vk.com/dev/execute

Вероятнее всего, Вы превышаете установленный лимит, оптимизируйте код так, чтобы внутри процедуры выполнялось не более 25 обращений к API.
Ответ написан
См. проект на github

Код процедуры для execute
var step=1000, R, offset = parseInt(Args.offset), loop=0,
out = { oid: parseInt(Args.oid), ids:[], mass: parseInt(Args.mass), overlap: parseInt(Args.overlap), offset: 0, next: 0 };

while( offset <= out.mass  &&  loop < 25) {
	R = API.groups.getMembers({ "group_id": out.oid, "sort": "id_asc", "offset": offset, "count": step});
	if( !!R.items  &&  R.items.length > 0) {
		out.ids.push( R.items);
		out.mass = R.count;

		out.loop = loop;

		out.offset = offset;
		offset = offset + step - out.overlap;
		out.next = offset;
		
		loop = loop + 1;
	} else {
		out.error = "Empty items";
		out.r = R;
		return out;
	}
}

return out;


В одном вызове execute не более 25 обращений к VK API, не слишком много итераций в циклах и масса других ограничений, которые можно только нащупывать по ошибкам. Кроме того, не более 3 вызовов в секунду с одним токеном. Т.е. 3 execute() в секунду, потом пауза, ждём.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы