VK API execute

Lite

Client
Регистрация
17.10.2013
Сообщения
283
Благодарностей
89
Баллы
28
Я хочу получить через API поиск людей c определёнными параметрами (страна, город, пол, семейное положение, возраст, имеет фото)
Их 53000 человек, а мне выдаёт только 20 человек при таком коде.
Как мне их спарсить?
А зачем вам вообще execute? Миллион в один поток без проблем парсится за полчаса обычным запросом, а у вас всего 53к.
Возьмите штук 5 токенов, разбейте запросы по году и месяцу рождения, и всё быстро спарсится.
 
  • Спасибо
Реакции: Ribakov

rrroma

Client
Регистрация
03.12.2014
Сообщения
38
Благодарностей
5
Баллы
8
Подскажите, получаю токен GET-запросом:
Код:
https://oauth.vk.com/token?grant_type=password&client_id=2274003&client_secret=hHbZxrka2uZ6jB1inYsH&username={-Variable.username-}&password={-Variable.password-}
потом, подставляю его в POST-запрос:
Код:
https://api.vk.com/method/execute?access_token={-Variable.access_token-}&code=var+group+%3D+%5B%5D%3B%0D%0A%0D%0Avar+offset+%3D+0%3B%0D%0A%0D%0Awhile+%28offset+%3C+25000%29%7B%0D%0A%0D%0Avar+users+%3D+API.groups.getMembers%28%7B%22group_id%22%3A82962125%2C%22offset%22%3Aoffset%7D%29%3B%0D%0A%0D%0Agroup+%3D+group+%2B+%5Busers%5D%3B%0D%0A%0D%0Aoffset+%3D+offset+%2B+5000%3B%0D%0A%0D%0A%7D%3B%0D%0A%0D%0Areturn+group%3B
Получаю ответ:
HTTP/1.1 200 OK
Server: Apache
Date: Mon, 25 Apr 2016 19:56:02 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 376
Connection: keep-alive
X-Powered-By: PHP/3.23238
Set-Cookie: remixlang=3; expires=Tue, 25 Apr 2017 09:12:08 GMT; path=/; domain=.vk.com
Pragma: no-cache
Cache-control: no-store
Content-Encoding: gzip


{"error":{"error_code":5,"error_msg":"User authorization failed: no access_token passed.","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"execute"},{"key":"https:\/\/api.vk.com\/method\/execute?access_token","value":"c3f78473f526bc38808b15addcfee2d5ae8fe3cafa339a398eb62d18754cef62ff41445f16758a86f33f8"},{"key":"code","value":"var group = [];\r\n\r\nvar offset = 0;\r\n\r\nwhile (offset < 25000){\r\n\r\nvar users = API.groups.getMembers({\"group_id\":82962125,\"offset\":offset});\r\n\r\ngroup = group + [users];\r\n\r\noffset = offset + 5000;\r\n\r\n};\r\n\r\nreturn group;"}]}}

Я так понимаю - это ошибка авторизации, почему только что полученый токен не прокатывает?
 
Последнее редактирование:

Lite

Client
Регистрация
17.10.2013
Сообщения
283
Благодарностей
89
Баллы
28
Хз, у меня твой токен на execute работает, мб ты параметры не указал в поле:
 

rrroma

Client
Регистрация
03.12.2014
Сообщения
38
Благодарностей
5
Баллы
8
Добавил &v=5.27
Вот ответ:

Код:
<?xml version="1.0" encoding="utf-8"?>
<error>
<error_code>5</error_code>
<error_msg>User authorization failed: no access_token passed.</error_msg>
<request_params list="true">
  <param>
   <key>oauth</key>
   <value>1</value>
  </param>
  <param>
   <key>method</key>
   <value>execute.xml</value>
  </param>
  <param>
   <key>https://api.vk.com/method/execute?access_token</key>
   <value/>
  </param>
  <param>
   <key>v</key>
   <value>5.27</value>
  </param>
  <param>
   <key>code</key>
   <value>var a=API.users.get({&quot;user_ids&quot;:&quot;7785521,197618501,23242830,124183392,4344,106908,34192,69266&quot;,&quot;fields&quot;:&quot;online&quot;});
var i=0;
var b=[];
while(i&amp;lt;a.length){
if(a[i].online == 0){ b.push(a[i]);};
i=i+1;
};
return b;</value>
  </param>
</request_params>
</error>
Если не сложно, пожалуйста выложите кубик POST-запроса в формате xmlz
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Добавил &v=5.27
Если не сложно, пожалуйста выложите кубик POST-запроса в формате xmlz
Попробуйте GET запросом, если не получится - вставьте ссылку с запросом в любой браузер вне ZP. Если ошибка останется, попробуйте совершить запрос с другого IP.
 
Последнее редактирование:
  • Спасибо
Реакции: rrroma

rrroma

Client
Регистрация
03.12.2014
Сообщения
38
Благодарностей
5
Баллы
8
Попробуйте GET запросом, если не получится - вставьте ссылку с запросом в любой браузер вне ZP. Если ошибка останется, попробуйте совершить запрос с другого IP.
Спасибо, получилось, вот ответ:
Код:
return group;</value>
  </param>
</request_params>
</error>

{"response":[{"count":4390,"users":[6229,122888,180887,288398,1334675....
а POST-запрос не работает:(
 

Extazy1

Новичок
Регистрация
16.05.2016
Сообщения
1
Благодарностей
0
Баллы
1
Помогите, пожалуйста, составить запрос для execute.. я совсем не понимаю, как((

Вот мой рабочий код без execute:
Я открываю страницу своего сайта и передаю GET параметр, содержащий uid нужного мне пользователя контакта. Первый цикл for выполняется столько раз, сколько у человека друзей - получается иногда около 500 запросов, что очень долго.
В итоге мне надо получить $friends, который содержит список всех ID "друзей друзей".

Код:
$resp = file_get_contents('https://api.vkontakte.ru/method/friends.get?user_id='.$_GET["userid"].'');
    $data = json_decode($resp, true);
    print count($data[response]);
    for($i=0;$i<count($data[response]);$i++){
        $resp2 = file_get_contents('https://api.vkontakte.ru/method/friends.get?user_id='.$data[response][$i].'');
        $data2 = json_decode($resp2, true);
        $friends .= implode(",", $data2[response]).",";
    }
    print $friends;
Чтобы сделать execute запрос, надо его записать вот так:
Код:
https://api.vk.com/method/execute?access_token=".$vk_access_token."&code=
А в параметре code указать весь мой код... но как мне его переделать под нужный формат я соввсем не понимаю((((((((((( помогите, пожалуйста
 

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43
решено. удалить
 
Последнее редактирование:

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43
Переделал немного для сбора тех, у кого в профиле указан сайт:

Код:
var a=API.users.get({"user_ids":"7785521,197618501,23242830,124183392,4344,106908,34192,69266","fields":"site"});
var i=0;
var k = a.length;
var b = {};
while(i < k) {
if(a[i].site){b.push(a[i]);}
i = i+1;
}
return b;
Некоторые ещё в статусе и в описании сайт указывают, как бы собрать по-умному?
а сколько за 1 раз можно собрать пользователей?
у меня больше 300 не берет
 

NoN

Пользователь
Регистрация
04.01.2015
Сообщения
183
Благодарностей
22
Баллы
18
Помогите пожалуйста.
Все сделал а вот элементарно access_token получить не могу, точнее не пойму как.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
а сколько за 1 раз можно собрать пользователей?
у меня больше 300 не берет
В URL их прописываете?
Помогите пожалуйста.
Все сделал а вот элементарно access_token получить не могу, точнее не пойму как.
http://zennolab.com/discussion/threads/kak-bystro-sparsit-gruppy-10-000-polzovatelej-vkontakte.26105/#post-200075
 
  • Спасибо
Реакции: NoN

NoN

Пользователь
Регистрация
04.01.2015
Сообщения
183
Благодарностей
22
Баллы
18

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Да
Если больше то 404 вроде ошибка
По принципу работы API метода users.get, это 1000 пользователей.
А на практике мы сталкиваемся с ограничением (каким именно не знаю, не вдавался в технические подробности), сначала я думал, что это длина URL строки, но почитав статьи на эту тему в и-нете, пришел к тому, что это больше тянет на миф. У меня где-то ~350 влетало, попробуйте.
 
  • Спасибо
Реакции: deopl

BenLinus

Client
Регистрация
29.04.2016
Сообщения
39
Благодарностей
6
Баллы
8
@ibred @codeby Камрады подскажите пожалуйста а как сдвиг offset делать для этого кода? В каком месте нужно прописать Args.offset? Правильно ли я понимаю следующий цикл нужно с 26000 начинать? Все перепробовал, либо дубли по 1К приходят либо ошибки.
Код:
var group = [];
var offset = 0;
while (offset < 25000){
var users = API.groups.getMembers({"group_id":Args.group,"offset":offset});
group = group + [users];
offset = offset + 1000;
};
return group;
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
@ibred @codeby Камрады подскажите пожалуйста а как сдвиг offset делать для этого кода? В каком месте нужно прописать Args.offset? Правильно ли я понимаю следующий цикл нужно с 26000 начинать? Все перепробовал, либо дубли по 1К приходят либо ошибки.
Если мы собрали первые 25000 пользователей (с 0 до 25000), то следующий запрос делаем на цикл с 25000 до 50000.
Привожу пример кода с учетом изменений:
Код:
var group = [];
var offset= parseInt(Args.offsetStart);
var max= parseInt(Args.offsetMax);

while (offset < max){
var users=API.groups.getMembers({"group_id":Args.group,"offset":offset,"count":1000}).items;
group = group + users;
offset=offset+1000;
}
return group;
То есть выполняем запрос, подавая на Args.offset = 0, Args.offsetMax = 25000. Парсим данные.
На следующий запрос: Args.offset = 25000, Args.offsetMax = 50000. И так до тех пор, пока не получим всех участников сообщества.

P.S. С Вконтакте давно не работал, вытащил метод из хранимых процедур, которым пользовался ранее. Если не будет работать, попробуйте убрать .items и заключить users в квадратные скобки, как это сделано в процитированном Вами коде.
 
  • Спасибо
Реакции: BenLinus и Ribakov

stanar

Client
Регистрация
19.12.2015
Сообщения
315
Благодарностей
157
Баллы
43
Где бы посмотреть описание языка, который используется в этом коде?
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

stanar

Client
Регистрация
19.12.2015
Сообщения
315
Благодарностей
157
Баллы
43

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
stanar, да, не сахар, но все необходимое для работы есть - указаны все работающие методы и пример обращения к API из VkScript, который по-сути имеет тот же синтаксис, что и JavaScript.
То ли дело ZennoLab :-) В далеком 2015 году мне приходилось обучаться всем премудростям методом тыка.
 

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
Всем привет. Пытаюсь запустить цикл в коде execute, но что-то ошибка появляется. Подскажите что не так делаю:
Код:
code=var group = [];
var offset = 0;
while (offset < 25000){
var users = API.groups.getMembers({"group_id":"41944724","count":"100","offset":offset});
group = group + [users];
offset = offset + 1000;
};
return group;
Ошибка следующая:
Код:
{"error":{"error_code":12,"error_msg":"Unable to compile code:  ';' expected, '1000' found in line 6","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"execute"},{"key":"","value":""},{"key":"code","value":"var group = [];\r\nvar offset = 0;\r\nwhile (offset &lt; 25000){\r\nvar users = API.groups.getMembers({\"group_id\":\"41944724\",\"count\":\"1000\",\"offset\":offset});\r\ngroup = group   [users];\r\noffset = offset   1000;\r\n};\r\nreturn group;"}]}}
Причем если добавляю этот же код на сайте Вконтакте в поле проверки кода - код благополучно срабатывает. Что не так? Может какую то библиотеку нужно подключить в зенке?
Скрин прилагаю:
 
Последнее редактирование:

IvanS

Новичок
Регистрация
27.01.2018
Сообщения
2
Благодарностей
0
Баллы
1
Ребят помогите !!! Как мне вставить значение переменной ID_group в этот код вместо id группы ???
Код:
var group = [];
var offset = 0;
while (offset < 25000){
var users = API.groups.getMembers({"group_id":26725231,"offset":offset});
group = group + [users];
offset = offset + 1000;
};
return group;
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
var group = [];
var offset = 0;
while (offset < 25000){
var users = API.groups.getMembers({"group_id":{-Value.ID_group-},"offset":offset});
group = group + [users];
offset = offset + 1000;
};
return group;
 
  • Спасибо
Реакции: TIIGR и Gulid

IvanS

Новичок
Регистрация
27.01.2018
Сообщения
2
Благодарностей
0
Баллы
1
Не сработает так к сожалению(
 

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Если мы собрали первые 25000 пользователей (с 0 до 25000), то следующий запрос делаем на цикл с 25000 до 50000.
Привожу пример кода с учетом изменений:
Код:
var group = [];
var offset= parseInt(Args.offsetStart);
var max= parseInt(Args.offsetMax);

while (offset < max){
var users=API.groups.getMembers({"group_id":Args.group,"offset":offset,"count":1000}).items;
group = group + users;
offset=offset+1000;
}
return group;
То есть выполняем запрос, подавая на Args.offset = 0, Args.offsetMax = 25000. Парсим данные.
На следующий запрос: Args.offset = 25000, Args.offsetMax = 50000. И так до тех пор, пока не получим всех участников сообщества.

P.S. С Вконтакте давно не работал, вытащил метод из хранимых процедур, которым пользовался ранее. Если не будет работать, попробуйте убрать .items и заключить users в квадратные скобки, как это сделано в процитированном Вами коде.
а откуда берется параметр
Args.group?
 

Lite

Client
Регистрация
17.10.2013
Сообщения
283
Благодарностей
89
Баллы
28
а откуда берется параметр
Args.group?
Конкретно что это за запись не знаю(возможно массив в с#), но по сути это передача внешних переменных в код, т.е. вместо Args.group(и остальных) можно передать значение переменной из zp.
 
  • Спасибо
Реакции: elakeri

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
а откуда берется параметр Args.group?
Данный код добавляется в хранимые процедуры, чтобы каждый раз не передавать его в параметре code.
Все, что отмечено как Args - это переменные, которые передаются в запросе.

Например:

Где 1 - это ID сообщества, участников которого нужно спарсить.
getMembersGroup - ваше название хранимой процедуры.
 
  • Спасибо
Реакции: elakeri

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Данный код добавляется в хранимые процедуры, чтобы каждый раз не передавать его в параметре code.
Все, что отмечено как Args - это переменные, которые передаются в запросе.

Например:

Где 1 - это ID сообщества, участников которого нужно спарсить.
getMembersGroup - ваше название хранимой процедуры.
т.е. ее в общем коде как клас описывать?, и код передается ж как string, через string.format его туда пихать?.. сорри не сиден в с#
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
т.е. ее в общем коде как клас описывать?, и код передается ж как string, через string.format его туда пихать?.. сорри не сиден в с#
Код выше - это не С#, в VKScript. Он добавляется в хранимые процедуры, в самой соц. сети ВК.
 
  • Спасибо
Реакции: Lite и elakeri

Viktblrbl4

Client
Регистрация
19.09.2023
Сообщения
16
Благодарностей
3
Баллы
3
Он добавляется в хранимые процедуры, в самой соц. сети ВК.
Расскажи, пожалуйста, где теперь добавляются процедуры, на странице https://vk.com/apps?act=manage не отображает приложения.
117384
Они теперь находятся здесь https://id.vk.com/about/business/go 117385


Всё пощелкал, не нашел где добавить процедуры
 

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)