Находим общих друзей людей с использованием VK API

от автора

image

0.Предыстория

Привет, хабраюзер.
Однажды у меня возникла необходимость найти человека, зная его внешний вид и зная о его членстве в определенном клубе. Также я владел адресами(вконтакте) страниц двух других членов клуба. Почти наверняка искомый человек был у каждого из них в друзьях. Решить эту проблему можно было разными путями. В статье я напишу о том, как мной было реализовано решение с использованием vk.com API.

1.Задача

Сделать сервис, который будет находить всех общих друзей двух отдельно взятых пользователей, не требуя верификации и аккаунта в социальной сети для пользователей сервиса. Получить данные об общих друзьях:

  • имя
  • фотография
  • ID

Реализовать задание на базе API вконтакте. Написать отельный класс для этого.

2.Решение

2.1.Определяем необходимые методы API

Заходим в список методов API. И поискав, находим то, что нам нужно.

Для получения друзей пользователя есть метод friends.get.
friends.getвозвращает список идентификаторов друзей пользователя или расширенную информацию о друзьях пользователя (при использовании параметра fields).

И, что важно, в рамках решения поставленной задачи это открытый метод, не требующий access_token.

Обязательный параметр только один:
image

Используя данный метод, можно получить информацию обо всех друзьях каждого из двух наших множеств, но такой подход не будет оптимальным. Пользователь А может иметь 2000 людей в друзьях, пересекаться с друзьями пользователя В будут только 3 человека. В таком случае информация о 1997 пользователях будет нам ненужной, и ресурсы, затраченные на её получение, будут потрачены впустую.
Мы будем запрашивать исключительно идентификаторы пользователей, и получив нужные нам номера(которые принадлежат множеству А и В), уже по ним выбирать информацию.

Для получения информации о пользователе есть метод users.get.
users.get Возвращает расширенную информацию о пользователях.

Данный метод также не нуждается в access_token, то есть идеально подходит для нашей задачи.
image
В user_ids мы передадим массив идентификаторов пользователей, которые встречаются в обоих множествах.
Мы хотим получить только аватар размером 100*100, для этого в параметре fields передадим значение photo_100.

2.2.Переходим к практической стороне

Я написал простой класс на php:

class VkFriends {      public function clean_var($var) {               $var = strip_tags($var);          $var = preg_replace('~\D+~', '', $var);                  $var = trim($var);                    return $var;     }          public function get_friends($u_id) {               $friends = file_get_contents('https://api.vk.com/method/friends.get?user_id='.$u_id);          $friends = json_decode($friends);                    if(!isset($friends->error)){              return $friends;          }else{              return '';          }               }              public function mutual_friends($friends) {               $mutual = array_intersect($friends[0]->response, $friends[1]->response);                    if(!empty($mutual)){              return $mutual;          }else{              return '';          }               }          public function get_users_info($users) {               $u_ids = implode(",",$users);              $u_info = file_get_contents('https://api.vk.com/method/users.get?user_ids='.$u_ids.'&fields=photo_100');          $u_info = json_decode($u_info);                    return $u_info;     }           public function view_user_info($u_info) {               $uid = $u_info->uid;          $first_name = $u_info->first_name;          $last_name = $u_info->last_name;           = $u_info->photo_100;                    print("          <a href='http://vk.com/id$uid' target='_blank'>          <div id='info'>                       <div id='ava'>                 <img src=''>             </div>                          <div id='name'>                 $first_name <br/>                 $last_name             </div>          </div>          </a>          ");              }              public function view_users_info($users_info) {              for($i=0;$i<sizeof($users_info->response);$i++){                      $this->view_user_info($users_info->response[$i]);                      }          }      } 

Теперь смотрим на наш класс в действии:

$vkf = new VkFriends;  $u_id[0] = $vkf->clean_var($_POST["u1"]);//clean variables from POST $u_id[1] = $vkf->clean_var($_POST["u2"]);  if(($u_id[0]!='')&&($u_id[1]!='')){          echo '<div id="block">';          $friends[0] = $vkf->get_friends($u_id[0]);//getting friends list from user with u_id     $friends[1] = $vkf->get_friends($u_id[1]);          if(($friends[0]!='')&&($friends[1]!='')){                  $mutual = $vkf->mutual_friends($friends);//create new array from intersect arrays                  if($mutual!=''){                      $users_info = $vkf->get_users_info($mutual);//getting info about users that are mutual             $vkf->view_users_info($users_info);//view information about selected users                      }else{                   print("<center><h2 class='error'>Общих друзей нет</h2></center>");         }      }else{           print("<center><h2 class='error'>Один из пользователей не доступен</h2></center>");      }          echo '</div>';   } 
3.Резюме

Рабочий пример можно увидеть на 13c.me.
Ссылка на репозиторий GitHub — vkfriends.

Спасибо, что читали,
искренне надеюсь, что вам было интересно.

ссылка на оригинал статьи http://habrahabr.ru/post/212405/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *