Архив метки: VK API

Исследуем НГУ на самый холостяцкий факультет с помощью VK API

В данном посту опишу пример использования API метода вконтакте users.search и, чтобы было интереснее, приложение будет определять самый холостяцкий факультет в Новосибирском государственном университете. Обычно считается, что обучение на определенном факультете откаладывает на поведении человека некоторый отпечаток. Попробуем выяснить влияет ли как-то факультет на семейное положение на примере данных из сайта «вконтакте». Для самых нетерпеливых сразу график. По оси X — возраст, по оси Y — процент холостяков. Подсказка: по легенде можно кликать, тем самым включая или выключая график для выбранного факультета.

Выборку по возрасту взял с 21 года до 32ух лет. Для каждого возраста-факультета выбиралось общее количество человек и количество тех, у кого в статусе указано «не женат». Используя эти 2 цифры можно получить число холостых в процентах, что собственно и отображено на графике.

Как видно из графика — тенденция на уменьшение холостяков с возрастом есть почти для всех факультетов, но не сильно заметная, как ожидал. Наиболее явно это прослеживается на самом многочисленном факультете — ММФ. Но например если взять юридический факультет, то тут неожиданно обратная картина. В данном случае экономический факультет выглядит определенным углоком стабильности, количество холостяков в любом возрасте примерно 20% .

Меня немного удивил пик на физическом факультете при возрасте в 27 лет. Сделал соответсвующий запрос для проверки и действительно 67 из 180 холостые. (картинка кликабельна)холостяки Физфака VK API

Ниже приведен прокомментированный код для получения данных, отображенных на графике. Из примечаний могу сказать, что сервера вконтакте обрабатывают не больше 3ёх запросов в секунду, поэтому задержка необходима (есть ещё вариант смотреть в сторону метода execute). Массив факультетов брал, используя стандартный поиск в вконтакте, подсмотрев данный параметр в url строке.

    //определяем массив факультетов
    var departments = [
     1640, // - MMF
     1641, // - FF
     1642, // - ГГФ
     1643, // - ФЕН
     1644, // - ГФ
     1645, // - ЖФ
     1646, // - филосовский
     1647, // - юридический
     1648, // - экономический
     1649, // - ФИТ
     1650, // - психологии
     1651, // - ИнЯз
     1652 // - медицинский
    ]
    //определяем массив возрастов(по году рождения)
    var ages = []
    for (var i=21; i<33; i++){         ages.push(i);     }     // массив статусов по семейному положению 1 — Не женат, 2 — Встречается, 3 — Помолвлен, 4 — Женат, 7 — Влюблён, 5 — Всё сложно, 6 — В активном поиске.     var statuses = [1/*,2,3,4,5,6,7*/]     // массив всех параметров запроса к API     var ALL_PARAMS = []     for (var yy in ages){         for (var ss in statuses){             for (var ff in departments){                 var pp = new Object();                 pp.university = '671' //              pp.has_photo = 1                 pp.university_faculty = departments[ff]                 pp.sex = 2//1-women, 2-men                 pp.status = statuses[ss]; //                pp.birth_year = ages[yy]                 pp.age_from = ages[yy]                 pp.age_to = ages[yy]                 pp.count = 0                 ALL_PARAMS.push(pp)             }         }     }     //now works without statuses     function makeChartData(num, sum){         var chartOut = []         var res_index = 0;         for (var yy in ages){             var lineOut = [ages[yy]]             for (var ff in departments){                 if (sum[res_index] == 0){                     var chartPercent = 0                 }else{                     var chartPercent = (num[res_index]*1.)/(sum[res_index]*1.)                 }                 lineOut.push(chartPercent)                 res_index++;             }             chartOut.push(lineOut)         }         return chartOut;     }     var finalResult = [];     var finalResultSum = [];     var chartData = null;     VK.init(function() {         // API initialization succeeded         // Your code here         var current_param = 0;         var repeatIt = setInterval(function(){             if (current_param>=ALL_PARAMS.length){
                //destroy interval if no more need
                clearInterval(repeatIt);
                $('#debug').text( finalResult.join(",") )
                $('#sum').text( finalResultSum.join(",") )
                chartData = makeChartData(finalResult, finalResultSum)
                $('#chartData').text( JSON.stringify(chartData) )
                console.log(chartData)
                return;
            }
            VK.api('users.search',ALL_PARAMS[current_param],function(data) {
                if (data.response){
                    finalResult.push(data.response.count);
                    console.log(finalResult)
                }else{
                    //выдаст ошибку, если что-то пошло не так
                    console.log(data)
                }
            })
            //подсчитываем общее количество
            var qNoStatus = JSON.parse( JSON.stringify( ALL_PARAMS[current_param] ) );
            qNoStatus.status = 0
            VK.api('users.search', qNoStatus, function(data) {
                if (data.response){
                    finalResultSum.push(data.response.count);
                    console.log(finalResultSum)
                }else{
                    console.log(data)
                }
            })
            current_param++;
            //небольшая задержка, чтобы не заблокировали за бомбежку запросами (Too many requests per second)
        }, 2500);

    }, function() {
        // API initialization failed
        // Can reload page here
    }, '5.28');

Кстати у меня такое чувство, что VK следит за статистикой запросов, во всяком случае меня заблокировали после того как в программе не углядел бесконечный цикл, так что будьте внимательнее.

Не следует сильно серьёзно относится к данному мини исследованию, оно лишь дает некоторое представление, так как основаны на данных, взятых из социальной сети. А она, как известно, полна ботами. Кому нужны официальные данные — добро пожаловать в росстат :)

Есть пожелания, комментарии, выводы по графику, идеи — пишите  vk.com/id12982

Как получить access_token для вконтакте на PHP

Некоторые серверные методы вконтакте не требуют никакой авторизации. Но для некоторых методов предварительно нужно получить access_token. Для этого напишем функцию для его получения. Так как запросы идут через https, то вам понадобится включить расширение extension=php_openssl.dll в php.ini . Далее зайти в настройки приложения и вытащить его ID и закрытый ключ. Этих данных достаточно для написания функции:

define('CLIENT_ID', 12345678);
define('CLIENT_SECRET', 'AbCdEfGhiqwerty');

function getVKToken(){
	$token_url = 'https://oauth.vk.com/access_token?client_id=' . CLIENT_ID . '&client_secret=' . CLIENT_SECRET . '&v=5.28&grant_type=client_credentials';
	$json = file_get_contents($token_url);
	$token = json_decode($json);
	return isset($token->access_token) ? $token->access_token : false;
}

echo getVKToken();