Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » JScript: Получение информации о постах со стены ВКонтакта

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется следующий код для метода execute, с помощью которого можно получать информацию по количеству лайков, репостов, комментариев, дат и айди (см. среди закомментированного) — к до двух тысячам пяти ста постам указанного сообщества или профиля. Есть ли возможность настроить код на получение инфы одновременно с двух стен (в частности, сообществ), чтобы в одном сообщении приходило два массива с сотней айди к двум разным сообществам? Подошло бы решение в том числе с дублированием кода.
 

Код:
// https://ru.stackoverflow.com/questions/479670/
var ITERS = 1;     // до 25 итераций
var COUNT = 100;   // до 100 постов за 1 итерацию
var posts = [];
var req_params = {
        "owner_id" : Args.id,
        "offset" : 0,
        "count"  : COUNT,
        "v" : "5.34"
};
var i = 0;
while(i < ITERS){
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;
    var items = API.wall.get(req_params).items;
 
    if (items.length == 0) {
        return posts;
    }
 
    var ids = items@.id;
    var tmp = {};
    //tmp.chunk_size = ids.length;
    tmp.ids = ids;
    //tmp.likes = items@.likes@.count;
    //tmp.reposts = items@.reposts@.count;
    //tmp.comments = items@.comments@.count;
    //tmp.dates = items@.date;
    posts.push(tmp);
 
    i = i + 1;
}
return posts;

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 12:23 13-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Подошло бы решение в том числе с дублированием кода

делаете в цикле два запроса к API, объединяете результаты.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 20:04 13-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Я уже пытался дублировать, в том числе заменяя имена переменных на другие — что-то не срослось. А какой командой объединяются результаты?

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 21:14 13-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
А какой командой объединяются результаты?

можете либо объединить массивы в один, либо сделать объект/массив с элементами-массивами внутри.
основной цикл по
Цитата:
Args.id,
, так как он основным является.
а далее, к примеру,

Код:
posts[req_params.owner_id].push(tmp);
 

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 21:20 13-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Как-то не вытанцовывается. Подскажите пожалуйста, как объединить массивы для указанных в owner_id сообществ?

Код:
 
// -29534144 -125004421
var ITERS = 1;        // до 25 итераций  
var COUNT = 100;   // до 100 постов за 1 итерацию  
var posts = [];  
var req_params = {  
        "owner_id" : "-29534144",  
        "owner_id" : "-125004421",  
        "offset" : 0,  
        "count"  : COUNT,  
        "v" : "5.34"  
};  
var i = 0;  
while(i < ITERS){  
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;  
    var items = API.wall.get(req_params).items;  
 
    if (items.length == 0) {  
        return posts;  
    }  
 
    var ids = items@.id;  
    var tmp = {};  
    tmp.ids = ids;  
    posts.push(tmp);  
 
    i = i + 1;  
}  
return posts;

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 11:14 14-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Как-то не вытанцовывается.

потому, что даже не читаете, что вам пишут.
 

Код:
var list = ['123', '321'];
var ITERS = 1;        // до 25 итераций  
var COUNT = 100;   // до 100 постов за 1 итерацию  
var posts = [];  
for(var j = 0; j < list.length; j++) {
var req_params = {  
        "owner_id" : list[j],    
        "offset" : 0,  
        "count"  : COUNT,  
        "v" : "5.34"  
};  
var i = 0;  
while(i < ITERS){  
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;  
    var items = API.wall.get(req_params).items;  
   
    if (items.length == 0) {  
        return posts;  
    }  
   
    var ids = items@.id;  
    var tmp = {};  
    tmp.ids = ids;  
    posts[list[j]].push(tmp);  
   
    i = i + 1;  
}  
}
return posts;

что то в таком роде, не проверял.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 20:57 14-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Так понимаю, в list надо указывать айди сообществ? К сожалению, выводит ошибку. Видимо из-за того, что принятый в их API jscript отличается от обычного.
 
Добавлено:
Ошибка записана красным: https://i.imgur.com/3G2n981.png

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 03:06 15-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
что принятый в их API jscript отличается от обычного

язык отличаться не может, тем более jscript и javascript - несколько разные вещи.
https://ru.wikipedia.org/wiki/JScript
 
вполне возможно оно считает list ключевым зарезервированным словом, поэтому нужно заменить его на что то еще. дайте ссылку на то, где тестируете, я посмотрю. и в массиве, если id только числа, можно обойтись и без кавычек

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 03:28 15-07-2018 | Исправлено: Mavrikii, 03:46 15-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Это где-то на ru.stackoverflow.com я читал, что в их API возможности javascript немного урезаны и поэтому там иногда приходится искать решения другими путями.  
 
Для тестов нужен будет профиль, а затем Вам понадобится завести приложение для доступа к API. Создать его можно тут — https://vk.com/apps?act=manage — кнопка "Создать приложение". После создания зайдите в редактирование приложения, перейдите в раздел Хранимые процедуры и нажмите Добавить новую процедуру.

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 09:18 15-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
что в их API возможности javascript

потому что там не совсем js, раз выполняется на сервере. возможно используют node.js
или какой свой аналог. как и говорил - list является зарезервированным словом, поэтому нужно поменять. потом ему не нравится цикл for, возможно в их реализации скрипта его нет

Код:
var list2 = [123, 321];  
var ITERS = 1;        // до 25 итераций    
var COUNT = 100;   // до 100 постов за 1 итерацию    
var posts = [];    
var j = 0;
while(j < list2.length) {  
var req_params = {    
        "owner_id" : list2[j],      
        "offset" : 0,    
        "count"  : COUNT,    
        "v" : "5.34"    
};    
var i = 0;    
while(i < ITERS){    
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;    
    var items = API.wall.get(req_params).items;    
   
    if (items.length == 0) {    
        return posts;    
    }    
   
    var ids = items@.id;    
    var tmp = {};    
    tmp.ids = ids;    
    posts[list2[j]].push(tmp);    
   
    i = i + 1;    
}
j = j + 1;
}  
return posts;

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:31 15-07-2018 | Исправлено: Mavrikii, 09:33 15-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
На этот раз процедура сохраняется без уведомлений об ошибке, но по запуску выводит окно:
 

Код:
{
"error": {
"error_code": 13,
"error_msg": "Runtime error occurred during code invocation: Method push requires an array",
"request_params": [{
"key": "owner_id",
"value": "-29534144"
}, {
"key": "offset",
"value": "0"
}, {
"key": "count",
"value": "100"
}, {
"key": "v",
"value": "5.34"
}]
}
}

Может там вообще одновременная работа с двумя сообществами не поддерживается?
 
Добавлено:
Запускал так:  

Код:
var listz = [-29534144, -125004421];  
var ITERS = 1;        // до 25 итераций    
var COUNT = 100;   // до 100 постов за 1 итерацию    
var posts = [];    
var j = 0;  
while(j < listz.length) {  
var req_params = {    
        "owner_id" : listz[j],      
        "offset" : 0,    
        "count"  : COUNT,    
        "v" : "5.34"    
};    
var i = 0;    
while(i < ITERS){    
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;    
    var items = API.wall.get(req_params).items;    
     
    if (items.length == 0) {    
        return posts;    
    }    
     
    var ids = items@.id;    
    var tmp = {};    
    tmp.ids = ids;    
    posts[listz[j]].push(tmp);    
     
    i = i + 1;    
}  
j = j + 1;  
}  
return posts;

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 09:47 15-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Runtime error occurred during code invocation: Method push requires an array

нет, требуется просто предварительная инициализация массива для использования push
возможно что массив не поддерживает ассоциативные ключи (мануала по их языку нет)

Код:
while(j < list2.length) {
posts[list2[j]] = [];

 
тогда лучше писать

Код:
var listz = ["-29534144", "-125004421"];

иначе могут быть проблемы с отрицательными индексами массива.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:52 15-07-2018 | Исправлено: Mavrikii, 09:53 15-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Тоже не сработало.

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 09:55 16-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Тоже не сработало.

о сообщении об ошибке я сам догадаюсь?

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:05 16-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Результат выполнения:

Код:
{
"error": {
"error_code": 13,
"error_msg": "Runtime error occurred during code invocation: Method push requires an array",
"request_params": [{
"key": "owner_id",
"value": "-29534144"
}, {
"key": "offset",
"value": "0"
}, {
"key": "count",
"value": "100"
}, {
"key": "v",
"value": "5.34"
}]
}
}

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 20:41 16-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Runtime error occurred during code invocation: Method push requires an array

попробуйте еще так.. у меня нет желания и времени разбираться с особенностями работы их API

Код:
var listz = ["-29534144", "-125004421"];    
var ITERS = 1;        // до 25 итераций      
var COUNT = 100;   // до 100 постов за 1 итерацию      
var posts = [];
var j = 0;  
while(j < listz.length) {    
var posts2 = [];
var req_params = {      
        "owner_id" : listz[j],        
        "offset" : 0,      
        "count"  : COUNT,      
        "v" : "5.34"      
};      
var i = 0;
while(i < ITERS){      
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;      
    var items = API.wall.get(req_params).items;      
     
    if (items.length == 0) {      
        return posts;      
    }      
     
    var ids = items@.id;      
    var tmp = {};      
    tmp.ids = ids;      
    posts2.push(tmp);      
     
    i = i + 1;      
}  
j = j + 1;
posts.push(posts2);
}    
return posts;

 
если вам все равно, разделены полученные посты по id из listz или нет, то
Код:
var listz = ["-29534144", "-125004421"];    
var ITERS = 1;        // до 25 итераций      
var COUNT = 100;   // до 100 постов за 1 итерацию      
var posts = [];
var j = 0;  
while(j < listz.length) {    
var req_params = {      
        "owner_id" : listz[j],        
        "offset" : 0,      
        "count"  : COUNT,      
        "v" : "5.34"      
};      
var i = 0;
while(i < ITERS){      
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;      
    var items = API.wall.get(req_params).items;      
     
    if (items.length == 0) {      
        return posts;      
    }      
     
    var ids = items@.id;      
    var tmp = {};      
    tmp.ids = ids;      
    posts.push(tmp);      
     
    i = i + 1;      
}  
j = j + 1;
}    
return posts;

они просто придут всем скопом

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 20:58 16-07-2018 | Исправлено: Mavrikii, 21:18 16-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Вот так спасибо, уважаемый! Как посмотрел: там и ещё можно другие айди сообществ в listz добавлять, два — не предел))
 
Всё работает, оба кода выводят результат в следующем формате:

Код:
 
{
"response": [[{
"ids": [9317105, 9316842, 9316737, .......]
}], [{
"ids": [1962005, 1961898, 1961800, .......]
}]]
}

 
А вот насчёт прихода всего скопом — нет ли у Вас случайно решения, как сделать, чтобы при выводе, помимо айди постов — также ещё и количества комментариев (то, что выше было закомментировано: "tmp.comments = items@.comments@.count;"), чтобы они приходили не в таком:
 
"ids": [380061, 409316, 409280, ...],
"comments": [0, 132, 33,  ...]

 
а в таком виде? —
 
"ids": [380061, 0, 409316, 132, 409280, 33, ...]

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 22:56 16-07-2018 | Исправлено: D1D1D1D, 22:57 16-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
сообществ в listz добавлять, два — не предел

может быть ограничение на количество запросов к API
 

Цитата:
а в таком виде?  

эту обработку можно же сделать и в конечном скрипте, что использует API.
потому что если это делать на сервере у них, то снова столкнешься с ограничениями реализации скриптового языка.
 
фактически просто нужен еще один цикл, в котором формируется массив, который берет сначала элемент из ids, потом из комментариев.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 23:12 16-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Ясно, спасибо большое!

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 01:00 17-07-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возник вопрос. Как сделать, чтобы айди групп (из массива listz), прибавлялись к айди постов, к которым они относятся? То есть, чтобы первый, второй и т.д. ID группы отсюда:
 
var listz = ["-29534144", "-125004421"];
 
дублировался в каждом ID поста соответственно, по такому принципу:
 
"ids": [-29534144_380061, -29534144_409316, -29534144_409280, ...],
"comments": [0, 132, 33,  ...]
"ids": [-125004421_380061, -125004421_409316, -125004421_409280, ...],
"comments": [0, 132, 33,  ...]

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 19:53 12-08-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » JScript: Получение информации о постах со стены ВКонтакта


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru