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

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в IFrame-приложениях (JavaScript, PHP и т.д)

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

Сообщение nvl » 22 июн 2011, 14:41

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

Использую такой код на основе приведенного выше:
  1. <html>
  2. <head>
  3. <script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
  4. <script type="text/javascript" charset="cp1251" >
  5. window.onload = (function() {
  6.     VK.init(function() {
  7.     // выполняем запрос получения списка друзей
  8.     VK.api("friends.get", {fields:"uid"}, function(data) {
  9.         // узнаем количество друзей
  10.         var fr = data.response.length;
  11.         // сортируем друзей по имени (функция sFirstName описана ниже)
  12.         var friends_data = data.response;
  13.      
  14.         // записываем отсортированный список друзей в переменную, вытаскивая из массива
  15.         var frListHtml = '';
  16.  
  17.           for(var i=0;i<fr;i++){
  18.             VK.api('friends.getMutual',{target_uid:friends_data[i].uid},function(data) {
  19.     if (data.response) {
  20.   // data.response is object
  21.     var mList=data.response.length;
  22.         document.getElementById('m_list').innerHTML += friends_data[i].uid + '  ' + mList + '<br />';
  23.     }
  24.     });
  25.  
  26.            frListHtml += friends_data[i].first_name + ' ' + friends_data[i].last_name + ' ' + friends_data[i].uid + ' '  +  '<br />';
  27.    
  28.  
  29.         }
  30.        
  31.         // выводим отсортированный список друзей
  32.         document.getElementById('friends_list').innerHTML = frListHtml;
  33.     });
  34.    
  35.     });
  36. });
  37.  
  38. // функции сортировки
  39. </script>
  40. </head>
  41. <body>
  42. <div id="m_list"></div>
  43. <div id="friends_list"></div>
  44. </body>
  45. </html>


Вероятно, возникает ошибка на юзерах, которые не открыли друзей.
Есть ли в js, что-то типа обработчика подобной ошибки.
И второй вопрос, как передать во внутреннюю функцию id друга для которого считается число общих друзей. Параметр friends_data[i].uid внутри getMutual использовать не удаётся.

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

Буду благодарен за помощь!
nvl

 
Автор темы
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение Александр » 22 июн 2011, 21:15

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

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

nvl писал(а):Есть ли в js, что-то типа обработчика подобной ошибки.

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

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

А

чем не проверка?

Ты вслепую пытаешься работать с ответами от сервера... Используй Charles, о котором я писал выше.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение nvl » 23 июн 2011, 08:41

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

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

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

Подскажи, пожалуйста, какую можно применить на твой опытный взгляд для получения подобного массива (с учётом ограничений контакта)?
nvl

 
Автор темы
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Александр » 23 июн 2011, 20:19

nvl
Попробуй придумать что-нибудь с методом execute. Если только для себя, то можешь и по таймеру делать - 3 запроса в секунду.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение nvl » 24 июн 2011, 10:50

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

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

У меня ещё вопрос, как внутрь процедуры getMutual ввести id пользователя. чтобы можно было напечатать что-то типа id: число общих друзей?
nvl

 
Автор темы
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Александр » 24 июн 2011, 20:42

nvl
Поищи setTimeout и setInterval.

nvl писал(а):У меня ещё вопрос, как внутрь процедуры getMutual ввести id пользователя. чтобы можно было напечатать что-то типа id: число общих друзей?

Логически из созданных тобой переменных. Начни писать код, тогда можно будет подсказать тебе чем-то на деле.
У меня не было необходимости в подобной задаче, готового кода не подкину.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение nvl » 26 июн 2011, 15:03

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

Друзья, выполняю такой код:
  1. <html>
  2. <head>
  3. <script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
  4. <script type="text/javascript" charset="cp1251" >
  5. window.onload = (function() {
  6.     VK.init(function() {
  7.  
  8.    
  9.  
  10.     // выполняем запрос получения списка друзей
  11.     VK.api("friends.get", {fields:"uid"}, function(data) {
  12.         // узнаем количество друзей
  13.         var fr = data.response.length;
  14.         // сортируем друзей по имени (функция sFirstName описана ниже)
  15.         var friends_data = data.response;
  16.      
  17.         // записываем отсортированный список друзей в переменную, вытаскивая из массива
  18.         var frListHtml = '';
  19. function getMut(friendid){
  20.     VK.api('friends.getMutual',{target_uid:friendid},function(data) {
  21.     if (data.response) {
  22.   // data.response is object
  23.     var mList=data.response.length;
  24.         document.getElementById('m_list').innerHTML += mList + '<br />';
  25.     }
  26.     });}
  27.  
  28.           for(var i=0;i<fr;i++){
  29.             setInterval(getMut(friends_data[i].uid), 3000);
  30.          //  frListHtml += friends_data[i].first_name + ' ' + friends_data[i].last_name + ' ' + friends_data[i].uid + ' '  +  '<br />';
  31.         }
  32.        
  33.         // выводим отсортированный список друзей
  34.         document.getElementById('friends_list').innerHTML = frListHtml;
  35.     });
  36.    
  37.     });
  38. });
  39.  
  40. // функции сортировки
  41. </script>
  42. </head>
  43. <body>
  44. <div id="m_list"></div>
  45. <div id="friends_list"></div>
  46. </body>
  47. </html>


Может кто-нибудь из вас знает как сделать его работоспособным? Сетинтервал не помогает, и айди друга никак не передать вовнутрь.
nvl

 
Автор темы
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Александр » 26 июн 2011, 22:05

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

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

  1. count = 0;
  2.  
  3. function next_three() {
  4.   getMutual(friends_data[count].uid);
  5.   getMutual(friends_data[count+1].uid);
  6.   getMutual(friends_data[count+2].uid);
  7.   count += 3;
  8.   setTimeout(next_three, 1000);
  9. }
  10. setTimeout(next_three, 1000);

Это логика, а не готовый код.
getMutual - отдельная функция в которой нужно обратитсья к api и обработать результат.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение nvl » 26 июн 2011, 23:19

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

Что касается кода, выражаю огромную благодарность! Теперь всё ясно и моя задача выполнена. Привожу свой код:
  1. <html>
  2. <head>
  3. <script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
  4. <script type="text/javascript" charset="cp1251" >
  5. window.onload = (function() {
  6.     VK.init(function() {
  7.  
  8.    
  9.  
  10.     // выполняем запрос получения списка друзей
  11.     VK.api("friends.get", {fields:"uid,first_name,last_name,photo"}, function(data) {
  12.         // узнаем количество друзей
  13.         var fr = data.response.length;
  14.         // сортируем друзей по имени (функция sFirstName описана ниже)
  15.         var friends_data = data.response;
  16.      
  17.         // записываем отсортированный список друзей в переменную, вытаскивая из массива
  18.         var frListHtml = '';
  19.  
  20.      var result = [];
  21. function getMutual(friendid,fname,lname,photo){
  22.     VK.api('friends.getMutual',{target_uid:friendid},function(data) {
  23.     if (data.response) {
  24.   // data.response is object
  25.     var mList=data.response.length;
  26.         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 />';
  27.          result.push([friendid, mList]);
  28.     }
  29.     });
  30.     }
  31.  
  32. count = 0;
  33. function next_three() {
  34.   getMutual(friends_data[count].uid,friends_data[count].first_name,friends_data[count].last_name,friends_data[count].photo);
  35.   getMutual(friends_data[count+1].uid,friends_data[count+1].first_name,friends_data[count+1].last_name,friends_data[count+1].photo);
  36.   getMutual(friends_data[count+2].uid,friends_data[count+2].first_name,friends_data[count+2].last_name,friends_data[count+2].photo);
  37.   count += 3;
  38.   setTimeout(next_three, 1000);
  39. }
  40. setTimeout(next_three, 1000);
  41.     });
  42.    
  43.     });
  44. });
  45.  
  46. // функции сортировки
  47. </script>
  48. </head>
  49. <body>
  50. <div id="m_list"></div>
  51. </body>
  52. </html>
nvl

 
Автор темы
Сообщения: 5
Зарегистрирован: 22 июн 2011, 14:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.


Вернуться в Создание IFrame-приложений ВКонтакте



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0