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.
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.
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.
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 ).
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 piiranguteta
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).
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.
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).
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:
Või küpsistest otse konsooli kaudu:
Proovime uuesti, seekord edastame toomisele seadistused, milles määrame päises parameetrina meie csrf-tokeni.
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äide
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.
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".
Töötan selle täienduse kallal endiselt ja kavatsen selle avalikkusele avaldada. Huvi korral kirjuta.