Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Limit

Постоји такво ограничење на ЛинкедИн-у - Ограничење комерцијалне употребе. Врло је вероватно да се ви, као и ја до недавно, никада нисте сусрели нити чули за то.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Суштина ограничења је да ако пречесто користите претрагу људи ван својих контаката (не постоје тачне метрике, алгоритам одлучује на основу ваших радњи – колико често и колико сте тражили, додавали људе), онда ће резултат претраге биће ограничено на три профила, уместо на 1000 (подразумевано 100 страница, 10 профила по страници). Ограничење се ресетује на почетку сваког месеца. наравно, премиум налози немају ово ограничење.

Али не тако давно, за пројекат кућног љубимца, почео сам много да се играм са ЛинкедИн претрагом и одједном сам добио ово ограничење. Наравно, ово ми се није много допало, јер га нисам користио ни у какве комерцијалне сврхе, па ми је прва мисао била да проучим ограничење и покушам да га заобиђем.

[Важно појашњење: материјали у чланку су представљени искључиво у информативне и образовне сврхе. Аутор не подстиче њихово коришћење у комерцијалне сврхе.]

Проучавамо проблем

Имамо: уместо десет профила са пагинацијом, претрага враћа само три, након чега се убацује блок са „препоруком“ премиум налога и испод су мутни профили на које се не може кликнути.

Одмах, рука допире до конзоле за програмере да погледа ове скривене профиле - можда можемо уклонити неке стилове замућења или извући информације из блока у маркупу. Али, сасвим очекивано, ови профили су праведни слике чувара места а информације се не чувају.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

У реду, сада погледајмо картицу Мрежа и проверимо да ли алтернативни резултати претраге који враћају само три профила заиста функционишу. Проналазимо захтев који нас занима за „/апи/сеарцх/бленд“ и гледамо одговор.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Профили долазе у `инцлудед` низу, али у њему већ има 15 ентитета. У овом случају, прва три од њих су објекти са додатним информацијама, сваки објекат садржи информације о одређеном профилу (на пример, да ли је профил премиум ).

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Следећих 12 су прави профили – резултати претраге, од којих ће нам бити приказана само три. Као што већ можете претпоставити, приказује само оне који примају додатне информације (прва три објекта). На пример, ако узмете одговор из профила без ограничења, добићете 28 ентитета - 10 објеката са додатним. информације и 18 профила.

Одговор за профил без ограничењаЗаобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем
Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Зашто стиже више од 10 профила, иако се тражи тачно 10, а ни на који начин не учествују у приказу, чак ни на следећој страници неће их бити - још не знам. Ако анализирате УРЛ захтева, можете видети да је цоунт=10 (колико профила треба да се врати у одговору, максимално 49).

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Било би ми драго да добијем било какве коментаре о овом питању.

Хајде да експериментишемо

У реду, најважнија ствар коју сада сигурно знамо је да у одговору има више профила него што нам показују. То значи да можемо добити више података, упркос ограничењу. Хајде да покушамо да сами извучемо АПИ, директно са конзоле, користећи дохват.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Као што се и очекивало, добијамо грешку, 403. Ово је због безбедности, овде не шаљемо ЦСРФ токен (ЦСРФ на Википедији. Укратко, сваком захтеву се додаје јединствени токен, који се проверава на серверу за аутентичност).

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Може се копирати из било ког другог успешног захтева или из колачића, где се чува у пољу 'ЈСЕССИОНИД'.

Где пронаћи жетонЗаглавље другог захтева:

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Или из колачића, директно преко конзоле:

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Покушајмо поново, овог пута проследимо подешавања за преузимање, у којима наводимо наш цсрф-токен као параметар у заглављу.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Успех, добијамо свих 10 профила. :тада:

Због разлике у заглављима, структура одговора се мало разликује од онога што је примљено у првобитном захтеву. Можете добити исту структуру ако додате „Прихвати: ’апплицатион/внд.линкедин.нормализед+јсон+2.1’ нашем објекту, поред цсрф токена.
Пример одговора са додатим заглављемЗаобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Више о заглављу Прихвати

Шта је следеће?

Затим можете уредити (ручно или аутоматизирано) параметар `старт`, указујући на индекс, почевши од којег ћемо добити 10 профила (подразумевано = 0) из целог резултата претраге. Другим речима, повећавајући га за 10 после сваког захтева, добијамо уобичајени излаз страницу по страницу, 10 профила одједном.

У овој фази сам имао довољно података и слободе да наставим да радим на пројекту кућног љубимца. Али био би грех да не покушамо да те податке прикажемо на лицу места, јер су већ били при руци. Нећемо улазити у Ембер, који се користи напред. јКуери је повезан са сајтом, и након што сте ископали знање основне синтаксе у меморији, можете креирати следеће за неколико минута.

јКуери код

/* рендер блока, принимаем данные профиля и вставляем блок в список профилей используя эти данные */
const  createProfileBlock = ({ headline, publicIdentifier, subline, title }) => {
    $('.search-results__list').append(
        `<li class="search-result search-result__occluded-item ember-view">
            <div class="search-entity search-result search-result--person search-result--occlusion-enabled ember-view">
                <div class="search-result__wrapper">
                    <div class="search-result__image-wrapper">
                        <a class="search-result__result-link ember-view" href="/sr/in/${publicIdentifier}/">
                            <figure class="search-result__image">
                                <div class="ivm-image-view-model ember-view">
                                    <img class="lazy-image ivm-view-attr__img--centered EntityPhoto-circle-4  presence-entity__image EntityPhoto-circle-4 loaded" src="http://www.userlogos.org/files/logos/give/Habrahabr3.png" />
                                </div>
                            </figure>
                        </a>
                    </div>
                    
                    <div class="search-result__info pt3 pb4 ph0">
                        <a class="search-result__result-link ember-view" href="/sr/in/${publicIdentifier}/">
                            <h3 class="actor-name-with-distance search-result__title single-line-truncate ember-view">
                                ${title.text}
                            </h3>
                        </a>

                        <p class="subline-level-1 t-14 t-black t-normal search-result__truncate">${headline.text}</p>

                        <p class="subline-level-2 t-12 t-black--light t-normal search-result__truncate">${subline.text}</p>
                    </div>
                </div>
            </div>
        <li>`
    );
};

// дергаем апи, получаем данные и рендерим профили
const fetchProfiles = () => {
    // токен
   const csrf = 'ajax:9082932176494192209';
    
   // объект с настройками запроса, передаем токен
   const settings = { headers: { 'csrf-token': csrf } }

    // урл запроса, с динамическим индексом старта в конце
   const url = `https://www.linkedin.com/voyager/api/search/blended?count=10&filters=List(geoRegion-%3Ejp%3A0,network-%3ES,resultType-%3EPEOPLE)&origin=FACETED_SEARCH&q=all&queryContext=List(spellCorrectionEnabled-%3Etrue,relatedSearchesEnabled-%3Etrue)&start=${nextItemIndex}`; 
    /* делаем запрос, для каждого профиля в ответе вызываем рендер блока, и после инкрементируем стартовый индекс на 10 */
    fetch(url, settings).then(response => response.json()).then(data => {
        data.elements[0].elements.forEach(createProfileBlock);
        nextItemIndex += 10;
});
};


// удаляем все профили из списка
$('.search-results__list').find('li').remove();
// вставляем кнопку загрузки профилей
$('.search-results__list').after('<button id="load-more">Load More</button>');
// добавляем функционал на кнопку
$('#load-more').addClass('artdeco-button').on('click', fetchProfiles);

// ставим по умолчания индекс профиля для запроса
window.nextItemIndex = 0;

Ако ово урадите директно у конзоли на страници за претрагу, додаће се дугме које учитава 10 нових профила сваким кликом и приказује их на листи. Наравно, промените токен и УРЛ у потребну пре него што то урадите. Блок профила ће садржати име, позицију, локацију, везу до профила и слику чувара места.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Закључак

Тако смо уз минимум напора успели да пронађемо слабу тачку и повратимо потрагу без ограничења. Било је довољно анализирати податке и њихов пут, погледати у сам захтев.

Не могу рећи да је ово озбиљан проблем за ЛинкедИн, јер не представља никакву претњу. Максимум је изгубљени профит због таквих „заобилазних решења“, што вам омогућава да избегнете плаћање премије. Можда је такав одговор сервера неопходан за исправан рад других делова сајта или је једноставно лењост програмера и недостатак ресурса који не дозвољавају да се то добро уради. (Ограничење се појавило у јануару 2015; раније није било ограничења).

ПС

Наравно, јКуери код је прилично примитиван пример могућности. Тренутно сам направио проширење претраживача које одговара мојим потребама. Додаје контролна дугмад и приказује пуне профиле са сликама, дугметом за позив и општим везама. Осим тога, он динамички прикупља филтере за локације, компаније и друге ствари и преузима токен из колачића. Дакле, више нема потребе да било шта тврдите. Па, додаје додатна поља за подешавања, а ла „колико профила треба захтевати истовремено, до 49“.

Заобилазећи ограничење претраге ЛинкедИн-а играјући се са АПИ-јем

Још увек радим на овом додатку и планирам да га објавим у јавности. Пишите ако сте заинтересовани.

Извор: ввв.хабр.цом

Додај коментар