LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Piir

LinkedInil on selline piirang - Kommertskasutuse piirang. On äärmiselt tõenäoline, et teie, nagu mina kuni viimase ajani, pole kunagi sellega kokku puutunud ega sellest kuulnud.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Limiidi olemus seisneb selles, et kui kasutad liiga sageli otsingut väljaspool oma kontakte olevaid inimesi (täpsed mõõdikud puuduvad, algoritm otsustab sinu tegude järgi – kui tihti ja kui palju otsisid, inimesi lisasid), siis otsingutulemus piiratakse kolme profiiliga 1000 asemel (vaikimisi 100 lehekülge, 10 profiili lehel). Limiit lähtestatakse iga kuu alguses. Loomulikult lisatasu kontodel seda piirangut ei ole.

Kuid mitte kaua aega tagasi hakkasin lemmikloomaprojekti jaoks LinkedIn otsinguga palju mängima ja sain ootamatult selle piirangu. See mulle loomulikult väga ei meeldinud, kuna ma ei kasutanud seda mingil ärilisel eesmärgil, seega oli esimene mõte uurida piirangut ja proovida sellest mööda hiilida.

[Oluline selgitus: artiklis olevad materjalid on esitatud ainult informatiivsel ja hariduslikul eesmärgil. Autor ei soovita nende kasutamist ärilistel eesmärkidel.]

Me uurime probleemi

Meil on: kümne lehekülgedega profiili asemel tagastab otsing vaid kolm, mille järel sisestatakse premium-konto “soovitusega” plokk ja allpool on udused ja mitteklõpsatavad profiilid.

Vahetult sirutab käsi arendajakonsooli poole, et neid peidetud profiile vaadata – ehk saame eemaldada mõned hägustavad stiilid või eraldada märgistuse plokist teavet. Kuid ootuspäraselt on need profiilid õiglased kohatäite pildid ja teavet ei salvestata.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Olgu, vaatame nüüd vahekaarti Võrk ja kontrollime, kas alternatiivsed otsingutulemused, mis tagastavad ainult kolm profiili, ka tegelikult töötavad. Leiame meid huvitava päringu „/api/search/blended” ja vaatame vastust.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Profiilid tulevad `kaasatud` massiivi, ent olemeid on selles juba 15. Sel juhul on neist esimesed kolm lisainfoga objektid, iga objekt sisaldab infot konkreetse profiili kohta (näiteks kas profiil on esmaklassiline ).

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Järgmised 12 on pärisprofiilid – otsingutulemused, millest meile näidatakse vaid kolme. Nagu juba aimata, näitab see ainult neid, kes saavad lisainfot (esimesed kolm objekti). Näiteks kui võtate profiililt vastuse piiranguteta, saate 28 olemit - 10 objekti koos lisaga. teave ja 18 profiili.

Vastus profiilile piirangutetaLinkedIni otsingupiirangust möödahiilimine API-ga mängides
LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Miks saabub üle 10 profiili, kuigi taotletakse täpselt 10 ja need ei osale mingil moel kuvamisel, isegi järgmisel lehel neid ei ole - ma veel ei tea. Kui analüüsite päringu URL-i, näete, et count=10 (mitu profiile vastuses tagastada, maksimaalselt 49).

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Mul oleks hea meel saada selle teema kohta kommentaare.

Eksperimenteerime

Olgu, kõige olulisem asi, mida me nüüd kindlalt teame, on see, et vastuses on rohkem profiile, kui nad meile näitavad. See tähendab, et vaatamata piirangule saame rohkem andmeid. Proovime tõmmata API ise, otse konsoolist, kasutades tõmbamist.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Nagu oodatud, saame vea 403. See on tingitud turvalisusest, siin me ei saada CSRF-i luba (CSRF Wikipedias. Lühidalt, igale päringule lisatakse kordumatu tunnus, mille autentsust kontrollitakse serveris).

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Seda saab kopeerida mis tahes muust edukast päringust või küpsistest, kus see salvestatakse väljale „JSESSIONID”.

Kust leida märgiTeise päringu päis:

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Või küpsistest otse konsooli kaudu:

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Proovime uuesti, seekord edastame toomisele seadistused, milles määrame päises parameetrina meie csrf-tokeni.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Edu, saame kõik 10 profiili. :tada:

Päiste erinevuse tõttu on vastuse struktuur veidi erinev algses päringus saadust. Sama struktuuri saate, kui lisate meie objektile csrf-märgi kõrvale 'Accept: 'application/vnd.linkedin.normalized+json+2.1'.
Lisatud päisega vastuse näideLinkedIni otsingupiirangust möödahiilimine API-ga mängides

Lisateavet päise Nõustu kohta

Mis edasi?

Seejärel saate redigeerida (käsitsi või automatiseerida) parameetrit "start", osutades indeksile, millest alates antakse meile kogu otsingutulemusest 10 profiili (vaikimisi = 0). Teisisõnu, suurendades seda pärast iga päringut 10 võrra, saame tavapärase lehekülgede kaupa väljundi, korraga 10 profiili.

Selles etapis oli mul piisavalt andmeid ja vabadust, et lemmikloomaprojektiga edasi töötada. Kuid patt oleks olnud mitte proovida neid andmeid kohe kohapeal kuvada, kuna need olid juba käes. Me ei käsitle Emberit, mida kasutatakse esiküljel. jQuery oli saidiga ühendatud ja olles mälust süntaksi põhiteadmised välja kaevanud, saate paari minutiga luua järgmise.

jQuery kood

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

Kui teete seda otse otsingulehe konsoolis, lisab see nupu, mis laadib iga klõpsuga 10 uut profiili ja renderdab need loendina. Loomulikult muutke enne seda luba ja URL vajalikuks. Profiiliplokk sisaldab nime, ametikohta, asukohta, linki profiilile ja kohatäite pilti.

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Järeldus

Seega suutsime minimaalse pingutusega leida nõrga koha ja taastada oma otsingud ilma piiranguteta. Piisas andmete ja nende tee analüüsimisest, päringu enda uurimisest.

Ma ei saa öelda, et see on LinkedIni jaoks tõsine probleem, sest see ei kujuta endast mingit ohtu. Maksimaalne on selliste "ülesannete" tõttu saamata jäänud kasum, mis võimaldab teil vältida lisatasu maksmist. Võib-olla on selline serveri vastus vajalik saidi muude osade korrektseks tööks või on see lihtsalt arendajate laiskus ja ressursside nappus, mis ei võimalda seda hästi teha. (Piirang tekkis jaanuaris 2015; enne seda piirangut ei olnud).

PS

Loomulikult on jQuery kood võimalustest üsna primitiivne näide. Hetkel olen loonud oma vajadustele vastava brauseri laienduse. See lisab juhtnupud ja renderdab täisprofiile koos piltide, kutsenupu ja üldiste ühendustega. Lisaks kogub see dünaamiliselt asukohtade, ettevõtete ja muude asjade filtreid ning hangib küpsistest loa. Seega pole enam vaja midagi kõvasti kodeerida. Noh, see lisab täiendavaid seadete välju, a la "mitu profiile korraga taotleda, kuni 49".

LinkedIni otsingupiirangust möödahiilimine API-ga mängides

Töötan selle täienduse kallal endiselt ja kavatsen selle avalikkusele avaldada. Huvi korral kirjuta.

Allikas: www.habr.com

Lisa kommentaar