De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Beheine

D'r is sa'n beheining op LinkedIn - Limyt foar kommersjeel gebrûk. It is ekstreem wierskynlik dat jo, lykas ik oant koartlyn, noait tsjinkommen binne of derfan heard hawwe.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

De essinsje fan 'e limyt is dat as jo it sykjen nei minsken bûten jo kontakten te faak brûke (d'r binne gjin krekte metriken, it algoritme beslút basearre op jo aksjes - hoe faak en hoefolle jo socht hawwe, minsken tafoege), dan it sykresultaat wurdt beheind ta trije profilen, ynstee fan 1000 (standert 100 siden, 10 profilen per side). De limyt wurdt oan it begjin fan elke moanne weromset. Fansels, premium akkounts hawwe dizze beheining net.

Mar net lang lyn, foar in petprojekt, begon ik in protte te spyljen mei LinkedIn sykjen en ynienen krige dizze beheining. Fansels fûn ik dit net heul leuk, om't ik it net foar kommersjele doelen brûkte, dus myn earste gedachte wie om de beheining te bestudearjen en te besykjen om der hinne te kommen.

[In wichtige ferdúdliking: de materialen yn it artikel wurde presintearre allinnich foar ynformative en edukative doelen. De skriuwer stimulearret har gebrûk net foar kommersjele doelen.]

Wy studearje it probleem

Wy hawwe: yn stee fan tsien profilen mei paginaasje jout de sykopdracht mar trije werom, wêrnei't in blok mei in "oanbefelling" fan in premium akkount wurdt ynfoege en hjirûnder binne wazige en net-klikbere profilen.

Daliks rikt de hân út nei de ûntwikkelderskonsole om nei dizze ferburgen profilen te sjen - miskien kinne wy ​​wat wazige stilen fuortsmite, of ynformaasje ekstrahearje út in blok yn 'e markup. Mar, frij ferwachte, dizze profilen binne gewoan plakhâlder pictures en gjin ynformaasje wurdt opslein.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Okee, litte wy no nei it ljepblêd Netwurk sjen en kontrolearje oft de alternative sykresultaten dy't mar trije profilen werombringe, eins wurkje. Wy fine it fersyk wêryn wy ynteressearre binne foar "/api/search/blended" en sjogge nei it antwurd.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Profilen komme yn in `ynbegrepen` array, mar d'r binne al 15 entiteiten yn. Yn dit gefal binne de earste trije fan har objekten mei ekstra ynformaasje, elk objekt befettet ynformaasje oer in spesifyk profyl (bygelyks oft it profyl premium is ).

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

De folgjende 12 binne echte profilen - sykresultaten, wêrfan mar trije sille wurde toand oan ús. Sa't jo al riede kinne, toant it allinich dyjingen dy't ekstra ynformaasje krije (de earste trije objekten). Bygelyks, as jo it antwurd nimme fan in profyl sûnder limyt, krije jo 28 entiteiten - 10 objekten mei ekstra. ynformaasje en 18 profilen.

Antwurd foar profyl sûnder limytDe syklimyt fan LinkedIn omgean troch te boartsjen mei de API
De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Wêrom mear dan 10 profilen oankomme, hoewol krekt 10 wurde oanfrege, en se dogge op gjin inkelde manier mei oan it display, sels op 'e folgjende side sille se net wêze - ik wit it noch net. As jo ​​​​de fersyk-URL analysearje, kinne jo sjen dat count = 10 (hoefolle profilen dy't weromkomme yn it antwurd, maksimaal 49).

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Ik soe bliid wêze om alle opmerkingen oer dizze saak te ûntfangen.

Litte wy eksperimintearje

Okee, it wichtichste ding dat wy no wis witte is dat d'r mear profilen binne yn 'e reaksje dan se ús sjen litte. Dit betsjut dat wy mear gegevens kinne krije, nettsjinsteande de limyt. Litte wy besykje de API sels te lûken, direkt fan 'e konsole, mei help fan fetch.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Lykas ferwachte krije wy in flater, 403. Dit komt troch feiligens, hjir stjoere wy gjin CSRF token (CSRF op Wikipedia. Yn in nutshell wurdt in unyk token tafoege oan elk fersyk, dat wurdt kontrolearre op de tsjinner foar echtheid).

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

It kin kopieare wurde fan elke oare suksesfolle oanfraach of fan cookies, wêr't it wurdt opslein yn it fjild 'JSESSIONID'.

Wêr te finen de tokenKoptekst fan in oar fersyk:

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Of fan cookies, direkt fia de konsole:

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Litte wy it nochris besykje, dizze kear passe wy de ynstellings troch om te heljen, wêryn wy ús csrf-token spesifisearje as in parameter yn 'e koptekst.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Sukses, wy ûntfange alle 10 profilen. :tada:

Troch it ferskil yn kopteksten is de struktuer fan it antwurd wat oars as wat wurdt ûntfongen yn it orizjinele fersyk. Jo kinne deselde struktuer krije as jo 'Akseptearje: 'application/vnd.linkedin.normalized+json+2.1' tafoegje oan ús objekt, neist it csrf-token.
Foarbyld antwurd mei tafoege headerDe syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Mear oer de koptekst Akseptearje

Wat is folgjende?

Dan kinne jo de parameter `start` bewurkje (hânmjittich of automatisearje), ferwizend nei de yndeks, fanôf wêrfan wy 10 profilen (standert = 0) krije fan it folsleine sykresultaat. Mei oare wurden, troch it nei elk fersyk mei 10 te ferheegjen, krije wy de gewoane side-by-side-útfier, 10 profilen tagelyk.

Op dit stadium hie ik genôch gegevens en frijheid om troch te wurkjen oan it petprojekt. Mar it soe spitich west hawwe om net te besykjen dizze gegevens direkt op it plak wer te jaan, om't se al by de hân wiene. Wy sille net gean yn Ember, dat wurdt brûkt oan de foarkant. jQuery wie ferbûn mei de side, en nei't jo de kennis fan 'e basissyntaksis yn' e ûnthâld útgroeven hawwe, kinne jo de folgjende yn in pear minuten oanmeitsje.

jQuery koade

/* рендер блока, принимаем данные профиля и вставляем блок в список профилей используя эти данные */
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="/fy/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="/fy/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;

As jo ​​​​dit direkt yn 'e konsole op' e sykside dogge, sil it in knop tafoegje dy't 10 nije profilen mei elke klik lade en se yn in list werjaan. Feroarje fansels de token en URL nei de fereaske foardat jo dit dogge. It profylblok sil de namme, posysje, lokaasje, keppeling nei it profyl en in plakhâlderôfbylding befetsje.

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

konklúzje

Sa, mei in minimum fan ynspanning, wy wienen by steat om te finen it swakke plak en wer werom ús sykjen sûnder beheinings. It wie genôch om de gegevens en har paad te analysearjen, sjoch nei it fersyk sels.

Ik kin net sizze dat dit in serieus probleem is foar LinkedIn, om't it gjin bedriging foarmet. It maksimum is ferlern winst fanwege sokke "workarounds", wêrmei jo foar te kommen beteljen foar premium. Miskien is sa'n serverantwurd nedich foar de juste wurking fan oare dielen fan 'e side, of it is gewoan luiheid fan' e ûntwikkelders en in gebrek oan boarnen dy't it net goed kinne dwaan. (De beheining ferskynde yn jannewaris 2015; dêrfoar wie der gjin limyt).

PS

Natuerlik is de jQuery-koade in frij primityf foarbyld fan 'e mooglikheden. Op it stuit haw ik in browser-útwreiding makke om oan myn behoeften te passen. It foeget kontrôleknoppen ta en jout folsleine profilen mei foto's, in útnoegingsknop en algemiene ferbiningen. Plus, it sammelet dynamysk filters foar lokaasjes, bedriuwen en oare dingen, en hellet in token fan cookies. Dat d'r is gjin need mear om wat te hardcoden. No, it foeget ekstra ynstellingsfjilden ta, a la "hoefolle profilen tagelyk oanfreegje, oant 49."

De syklimyt fan LinkedIn omgean troch te boartsjen mei de API

Ik wurkje noch oan dizze tafoeging en plan om it oan it publyk frij te litten. Skriuw as jo ynteressearre binne.

Boarne: www.habr.com

Add a comment