Создать массив числа общих друзей по каждому френду

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в IFrame-приложениях (JavaScript, PHP и т.д)
Ответить
nvl
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38

Создать массив числа общих друзей по каждому френду

Сообщение nvl »

Друзья, подскажите, пожалуйста.
Хочу получить массив числа общих друзей.

Использую такой код на основе приведенного выше:

Код: Выделить всё

<html><head><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script><script type="text/javascript" charset="cp1251" >window.onload = (function() {    VK.init(function() {    // выполняем запрос получения списка друзей    VK.api("friends.get", {fields:"uid"}, function(data) {        // узнаем количество друзей        var fr = data.response.length;        // сортируем друзей по имени (функция sFirstName описана ниже)        var friends_data = data.response;              // записываем отсортированный список друзей в переменную, вытаскивая из массива        var frListHtml = '';           for(var i=0;i<fr;i++){            VK.api('friends.getMutual',{target_uid:friends_data[i].uid},function(data) {     if (data.response) {   // data.response is object     var mList=data.response.length;         document.getElementById('m_list').innerHTML += friends_data[i].uid + '  ' + mList + '<br />';    }     });            frListHtml += friends_data[i].first_name + ' ' + friends_data[i].last_name + ' ' + friends_data[i].uid + ' '  +  '<br />';             }                // выводим отсортированный список друзей        document.getElementById('friends_list').innerHTML = frListHtml;    });       });}); // функции сортировки</script></head><body><div id="m_list"></div><div id="friends_list"></div></body></html>
Вероятно, возникает ошибка на юзерах, которые не открыли друзей.
Есть ли в js, что-то типа обработчика подобной ошибки.
И второй вопрос, как передать во внутреннюю функцию id друга для которого считается число общих друзей. Параметр friends_data.uid внутри getMutual использовать не удаётся.

Если использовать просто document.getElementById('m_list').innerHTML += mList + '<br />'; то френды парсятся.

Буду благодарен за помощь!
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Сортировка списка друзей (friends.get)

Сообщение Александр »

nvl
Если количество друзей больше 3х, то твой код точно не будет корректно работать. Вконтакте ограничение на количество обращений к серверу api в секунду. У тебя цикл проводит много запросов friends.getMutual. Меняй логику уже на этом этапе.

Делай alert(friends_data.uid) и других значений. Используй Charles, чтобы видеть отправляются ли запросы к серверу api и какие ответы получаешь.
nvl писал(а):Есть ли в js, что-то типа обработчика подобной ошибки.

Можно в настройках приложения выбрать:
Установка приложения: Требуется.
Права доступа: Запрашивать доступ к: доступ к друзьям

Если этот способ не подходит, то есть метод getUserSettings – возвращает настройки приложения текущего пользователя.

А

Код: Выделить всё

if (data.response)
чем не проверка?

Ты вслепую пытаешься работать с ответами от сервера... Используй Charles, о котором я писал выше.
nvl
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38

Re: Сортировка списка друзей (friends.get)

Сообщение nvl »

Александр, большое спасибо!

Попробую использовать отладчик.

Дело в том, что мне для задачи анализа статистики по себе нужно получить массив числа общих друзей по каждому френду. Это не для массового пользования, а в исследовательских целях :)

Подскажи, пожалуйста, какую можно применить на твой опытный взгляд для получения подобного массива (с учётом ограничений контакта)?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Сортировка списка друзей (friends.get)

Сообщение Александр »

nvl
Попробуй придумать что-нибудь с методом execute. Если только для себя, то можешь и по таймеру делать - 3 запроса в секунду.
nvl
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38

Re: Сортировка списка друзей (friends.get)

Сообщение nvl »

Александр, спасибо!

А подскажи, пжл, примерный синтаксис - по таймеру?

У меня ещё вопрос, как внутрь процедуры getMutual ввести id пользователя. чтобы можно было напечатать что-то типа id: число общих друзей?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Сортировка списка друзей (friends.get)

Сообщение Александр »

nvl
Поищи setTimeout и setInterval.
nvl писал(а):У меня ещё вопрос, как внутрь процедуры getMutual ввести id пользователя. чтобы можно было напечатать что-то типа id: число общих друзей?
Логически из созданных тобой переменных. Начни писать код, тогда можно будет подсказать тебе чем-то на деле.
У меня не было необходимости в подобной задаче, готового кода не подкину.
nvl
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38

Re: Сортировка списка друзей (friends.get)

Сообщение nvl »

Александр, большое спасибо!

Друзья, выполняю такой код:

Код: Выделить всё

<html><head><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script><script type="text/javascript" charset="cp1251" >window.onload = (function() {    VK.init(function() {          // выполняем запрос получения списка друзей    VK.api("friends.get", {fields:"uid"}, function(data) {        // узнаем количество друзей        var fr = data.response.length;        // сортируем друзей по имени (функция sFirstName описана ниже)        var friends_data = data.response;              // записываем отсортированный список друзей в переменную, вытаскивая из массива        var frListHtml = '';function getMut(friendid){    VK.api('friends.getMutual',{target_uid:friendid},function(data) {     if (data.response) {   // data.response is object     var mList=data.response.length;         document.getElementById('m_list').innerHTML += mList + '<br />';    }     });}           for(var i=0;i<fr;i++){            setInterval(getMut(friends_data[i].uid), 3000);         //  frListHtml += friends_data[i].first_name + ' ' + friends_data[i].last_name + ' ' + friends_data[i].uid + ' '  +  '<br />';        }                // выводим отсортированный список друзей        document.getElementById('friends_list').innerHTML = frListHtml;    });       });}); // функции сортировки</script></head><body><div id="m_list"></div><div id="friends_list"></div></body></html>
Может кто-нибудь из вас знает как сделать его работоспособным? Сетинтервал не помогает, и айди друга никак не передать вовнутрь.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Создать массив числа общих друзей по каждому френду

Сообщение Александр »

nvl
Твой вопрос изначально переводил тему с «Сортировка списка друзей» на использование friends.getMutual. Не следует менять тему урока на другую. Логичнее было бы создать отдельную тему, чтобы те люди, которым интересна именно сортировка списка друзей, не читали про getMutual.
Разделил тему.

У тебя циклом создаётся несколько setInterval, которые запустятся примерно одновременно через 3 секунды. Логику не понимаешь?
Нужно вызывать метод friends.getMutual 3 раза для разных id через промежуток времени (1 секунду).
Вызвал, подождал, снова вызвал, опять подождал и т.д.

Код: Выделить всё

count = 0; function next_three() {  getMutual(friends_data[count].uid);  getMutual(friends_data[count+1].uid);  getMutual(friends_data[count+2].uid);  count += 3;  setTimeout(next_three, 1000);}setTimeout(next_three, 1000);
Это логика, а не готовый код.
getMutual - отдельная функция в которой нужно обратитсья к api и обработать результат.
nvl
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38

Re: Создать массив числа общих друзей по каждому френду

Сообщение nvl »

Александр, прошу прощения!
Про тему действительно не подумал.

Что касается кода, выражаю огромную благодарность! Теперь всё ясно и моя задача выполнена. Привожу свой код:

Код: Выделить всё

<html><head><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script><script type="text/javascript" charset="cp1251" >window.onload = (function() {    VK.init(function() {          // выполняем запрос получения списка друзей    VK.api("friends.get", {fields:"uid,first_name,last_name,photo"}, function(data) {        // узнаем количество друзей        var fr = data.response.length;        // сортируем друзей по имени (функция sFirstName описана ниже)        var friends_data = data.response;              // записываем отсортированный список друзей в переменную, вытаскивая из массива        var frListHtml = '';      var result = [];function getMutual(friendid,fname,lname,photo){    VK.api('friends.getMutual',{target_uid:friendid},function(data) {     if (data.response) {   // data.response is object     var mList=data.response.length;         document.getElementById('m_list').innerHTML += '<tr><td>'+friendid+'</td><td><a href=\"http://vk.com/id'+friendid+'\"><img src=\"'+photo+'\"></td><td>'+fname+' '+lname+'</a></td><td>' + mList + '</td></tr><br />';         result.push([friendid, mList]);    }     });    } count = 0;function next_three() {  getMutual(friends_data[count].uid,friends_data[count].first_name,friends_data[count].last_name,friends_data[count].photo);  getMutual(friends_data[count+1].uid,friends_data[count+1].first_name,friends_data[count+1].last_name,friends_data[count+1].photo);  getMutual(friends_data[count+2].uid,friends_data[count+2].first_name,friends_data[count+2].last_name,friends_data[count+2].photo);  count += 3;  setTimeout(next_three, 1000);}setTimeout(next_three, 1000);    });       });}); // функции сортировки</script></head><body><div id="m_list"></div></body></html>
Ответить