ищем хикке-тян. vk.api

для парсинга мы буим использовать node.js, а так-же некоторые фреймворки для него. для начала vksdk, node-crate, node-amqp, для вебморды используем jade. Ещё нам понадобится rabbitmq. И вообще, что-бы далеко не ходить я воспользуюсь стандартным шаблоном приложения InteLlij для node.js. Но! ..но по порядку. Сначала разберёмся с vk.api и получением данных для тянобазы. И определением важных для мапинга данных.

mudrec_61236385_orig_Мы ведь ищем хикке-тян. а хикке-тян не будет заполнять большую часть информации. она же хикке.
Вот ты анон, заполняешь графу ВУЗа, Школы, Адреса? Вооот. и хикке-тян не заполняет. А если заполняет, то не хикке она вовсе. Фоток у хикке-тян скорее всего не будет, а вот другие вещи могут быть очень даже полезны. те же паблики.

Думаю будет бесполезно искать хикке-тян по возрасту. Он наверняка будет скрыт, возможно будет скрыт и город.

У нас есть только один способ подобные случаи обойти. Мы должны проверить город, и вуз тех пользователей которые у тян, в друзяшках, и вывести на основании их обработки среднее значение по городу и вузу. Ты будешь удивлён, но этот метод довольно часто срабатывает. Ниже например города друзей случайного человека втентакле. И по ним, мы можем почти наверняка сказать что он живет где-то в Московии.

desu

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

Вот немного гавнокода, для разнообразия. Тут мы по ID подопытного получаем, его друзьяшек и оформляем их данные в виде жсон массива.

 //////////////FRIENDS
    friends = API.friends.get({"user_id":IDs[z],"count":friendscount,
    "fields":"[city, universities, education ]"});
    cityes=[]; universities=[]; graduation=[]; outFriends=[];
    fcount=friends.count;
    j=friends.length-1;
    while(j>= 0)
    {
        if(friends.items[j].city.title)
            cityes.push( friends.items[j].city.title);
        if(friends.items@.universities[j][0].name)
            universities.push(friends.items@.universities[j][0].name);
        if(friends.items@.universities[j][0].graduation)
            graduation.push(friends.items@.universities[j][0].graduation);
        j=j-1;
    }
    outFriends.push(cityes);
    outFriends.push(universities);
    outFriends.push(graduation);
    outFriends.push(friends.count);

то же самое с группами жертвы, её фотографиями, постами на стене и количеством подписчиков. Не хочу что-бы личности с овер 9000 подписчиков-друзяшек даже место занимали в моей базе.

Да, на счёт места. мы используем только часть данных пользователя, которые будут нам полезны для анализа.(я использую 5 фоток, 5 последних постов на стене, 50 друзей,  50 пабликов).  вк.апи не даст нам использовать слишком большие обьёмы данных, поэтому берём только то что необходимо и уходим.

Ещё одна плохая новость в том, что VK.api не ползоляет делать вызовы чаще 3 раза в секунду. И в одной хранимой процедуре втентакле мы можем использовать не более 25 апи вызовов. А значит, мы можем получить фотки, друзей, подписчиков, стену, юзеринфо и группы только для 4х человек за один вызов апи. И наша скорость обработки данных из втентакля будет не более 12 пользователей в секунду. Очень скромый результат по сравнению с обычным поиском, который может вернуть до 75000 пользователей в секунду. но обычный поиск для наших целей не очень то и подходит. нам нужен простор и данные для анализа, а не просто ссылки на профили.

Так же понадобятся параметры для дропа , максимальное количество друзей, пабликов и постов. Если их значение больше допустимого тян не считается хикке, и путь в нашу базу ей закрыт.

ну и на последок гавнокод хранимой процедуры для втентакле приложения, которое будет поставлять нам данные для эластика. (если кто предложит код получше и побыстрее буду рад. а пока-что придется довольствоваться этим). Последняя версия будет на гитхабе, если кому интересно.

//хранимая процедура для втентакле.апи
//couners for statistics
var wallposts=5;
var groupscount=20;
var friendscount=20;
var photos_count =5;

//drop variables
var min_group=0;
var max_group=1000;
var min_firneds=0;
var max_firneds=1000;
var min_wall=0;
var max_wall=100000;
var min_subscr=0;
var max_subscr=10001;
var min_photos=0;
var max_photos=1000;

//search
var search_q = Args.q;
var search_sort = Args.sort;// 1 - по дате регистрации, 0 - по популярности 
var count= Args.count;
var offset = Args.offset;
var city = Args.city;//code
var university = Args.university;
var university_year = Args.gradyear;
var sex =Args.sex; //пол, 1 — женщина, 2 — мужчина, 0 (по умолчанию) — любой. 
var sp = Args.sp; // семейное положение: 1 — Не женат, 2 — Встречается, 3 — Помолвлен, 4 — Женат, 7 — Влюблён, 5 — Всё сложно, 6 — В активном поиске. 
var age_from = Args.age_from;
var age_to = Args.age_to;
var online = Args.online;
var interests =Args.interests;
var group_id = Args.gid;

//wall local variables 
var i; var out_wallpic;var out_text;var rep_wallpic;var rep_text;
var outWall;var wall;var items; var wcount;
//group local variables
var groups;var outGroups; var gcount;
//friends local variables
var j; var friends; var outFriends;var cityes; var universities;
var graduation; var outFriends; var fcount;
//user local variables
var user; var subscr;
//photos
var photos;var pcount; var pitems; var f; var outPhotos;

//output
var OUTPUT=[]; var COunter; var OUTUser; 

//FILTER SECTION
var IDs= API.users.search({
    "q" : search_q, "sort":search_sort, "count" : count, 
    "offset" : offset, "city": city, "university": university, 
    "university_year" : university_year, "sex": sex, 
    "status" : sp, "age_from": age_from, "age_to":age_to, 
    "online":online, "interests":interests,
    "group_id": group_id
}).items@.id;
var z=IDs.length-1;

while(z>=0){
    ///////////WALL
    wall= API.wall.get({"owner_id":IDs[z],
    "count": wallposts, "filter":"owner", "extended" : 0});
    wcount=wall.count;
    items=wall.items;i=items.length-1;
    out_wallpic=[]; out_text=[]; rep_wallpic=[]; rep_text=[]; outWall=[];
    while (i>=0) 
    { 
        out_wallpic.push(items@.attachments[i][0].photo.photo_604);
        out_text.push(items@.text[i]);
        rep_wallpic.push(items[i].copy_history[0].attachments[0].photo.photo_604);
        rep_text.push(items[i].copy_history[0].text);
        i=i-1;
    };
    outWall.push(out_text);
    outWall.push(out_wallpic);
    outWall.push(rep_wallpic);
    outWall.push(rep_text);
    
    ///////////////GROUPS
    outGroups=[];
    groups = API.groups.get({"count":groupscount,"user_id": IDs[z] ,"extended":1});
    gcount=groups.count;
    outGroups= ([groups.items@.name,
                    groups.items@.screen_name,
                    groups.items@.is_admin,
                    groups.items@.photo_100 ]);
                    
    //////////////FRIENDS
    friends = API.friends.get({"user_id":IDs[z],"count":friendscount,
        "user_id":"1010103", "fields":"[city, universities, education ]"});
    cityes=[]; universities=[]; graduation=[]; outFriends=[];
    fcount=friends.count;
    j=friends.length-1;
    while(j>= 0)
    {
        if(friends.items[j].city.title)
            cityes.push( friends.items[j].city.title);
        if(friends.items@.universities[j][0].name)
            universities.push(friends.items@.universities[j][0].name);
        if(friends.items@.universities[j][0].graduation)
            graduation.push(friends.items@.universities[j][0].graduation);
        j=j-1;
    }
    outFriends.push(cityes);
    outFriends.push(universities);
    outFriends.push(graduation);
    outFriends.push(friends.count);
    
    subscr= API.subscriptions.getFollowers({"uid":IDs[z]}).count;
    
    photos = API.photos.getProfile({"uid":IDs[z],"limit":photos_count});
    pcount = photos.count;
    pitems = photos.items;
    
    f=photos_count; outPhotos=[];
    while(f>=0)
    {
        outPhotos.push([pitems[f].photo_604]);
        f=f-1;
    }

    ///////////////USER
    user = API.users.get({"user_ids" : IDs[z],"fields":"[sex,bdate,city,"+
    "photo_400,domain,site,education,status,relation,screen_name,"+
    "interests,music,movies,tv,books,games,about,personal]"});
    
    if(wcount > min_wall && wcount <max_wall)
    {
        if(gcount > min_group && gcount <max_group)
        {
            if(fcount > min_firneds && fcount < max_firneds)
            {
                if(subscr > min_subscr && subscr < max_subscr)
                {
                    if(pcount >min_photos && pcount < max_photos)
                    {
                        COunter = ([pcount, subscr, wcount, gcount, fcount]);
                        OUTUser=([COunter, user, outGroups, outFriends, 
                                outWall, outPhotos]);
                        OUTPUT.push(OUTUser);
                    }
                }
            }
        }
    }
    z=z-1;
}
return OUTPUT;

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