LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Muga

LinkedIn-en halako muga bat dago - Erabilera komertzialaren muga. Izugarri litekeena da zuk, ni bezala duela gutxi arte, inoiz topatu edo entzun ez izana.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Mugaren funtsa zera da: zure kontaktuetatik kanpo dauden pertsonen bilaketa sarriegi erabiltzen baduzu (ez dago neurketa zehatzik, algoritmoak zure ekintzen arabera erabakitzen du - zenbat eta zenbat bilatu duzun, jendea gehitu), orduan bilaketaren emaitza. hiru profiletara mugatuko da, 1000 izan beharrean (lehenetsita 100 orrialde, 10 profil orrialde bakoitzeko). Muga hilabete bakoitzaren hasieran berrezartzen da. Berez, premium kontuek ez dute muga hori.

Baina duela ez asko, maskota proiektu baterako, asko jolasten hasi nintzen LinkedIn bilaketarekin eta bat-batean muga hori lortu nuen. Berez, hau ez zitzaidan asko gustatu, ez bainuen helburu komertzialetarako erabiltzen, beraz, nire lehen pentsamendua izan zen muga aztertzea eta inguratzen saiatzea.

[Argibide garrantzitsu bat: artikuluko materialak informazio- eta hezkuntza-helburuetarako soilik aurkezten dira. Egileak ez du helburu komertzialetarako erabiltzea bultzatzen.]

Arazoa aztertzen ari gara

Hona hemen: orrialdea duten hamar profilen ordez, bilaketak hiru baino ez ditu itzultzen, eta ondoren premium kontu baten β€œgomendioa” duen bloke bat txertatzen da eta azpian profil lausoak eta klik ezin daitezkeenak daude.

Berehala, eskua garatzaileen kontsolara heltzen da ezkutuko profil hauek ikusteko - agian lausotze-estilo batzuk kendu ditzakegu, edo markako bloke batetik informazioa atera dezakegu. Baina, nahiko espero da, profil hauek besterik ez dira leku-markaren irudiak eta ez da informaziorik gordetzen.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Ados, ikus dezagun Sarea fitxan eta egiaztatu dezagun hiru profil soilik itzultzen dituzten bilaketa-emaitz alternatiboek benetan funtzionatzen duten. β€œ/api/search/blended”-rako interesatzen zaigun eskaera aurkitzen dugu eta erantzuna ikusten dugu.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Profilak `included` array batean datoz, baina dagoeneko 15 entitate daude bertan. Kasu honetan, lehenengo hirurak informazio gehigarria duten objektuak dira, objektu bakoitzak profil zehatz bati buruzko informazioa dauka (adibidez, profila premium den ala ez). ).

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Hurrengo 12ak benetako profilak dira - bilaketa-emaitzak, horietatik hiru bakarrik erakutsiko zaizkigu. Dagoeneko igarri dezakezun bezala, informazio gehigarria jasotzen dutenak (lehen hiru objektuak) bakarrik erakusten ditu. Esate baterako, erantzuna mugarik gabeko profil batetik hartzen baduzu, 28 entitate jasoko dituzu - 10 objektu osagarriekin. informazioa eta 18 profil.

Profilaren erantzuna mugarik gabeLinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz
LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Zergatik iristen diren 10 profil baino gehiago, nahiz eta zehazki 10 eskatzen diren, eta ez dute inola ere pantailan parte hartzen, hurrengo orrian ere ez dira egongo - oraindik ez dakit. Eskaeraren URLa aztertzen baduzu, zenbatzea=10 ikus dezakezu (erantzunean zenbat profil itzuli behar diren, 49 gehienez).

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Pozik jasoko nuke gai honi buruzko iruzkinak.

Egin dezagun esperimentua

Ados, orain ziur dakigun gauzarik garrantzitsuena da erantzunean erakusten diguten baino profil gehiago daudela. Horrek esan nahi du datu gehiago lor ditzakegula, muga izan arren. Saia gaitezen APIa geuk ateratzen, zuzenean kontsolatik, fetch erabiliz.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Espero bezala, errore bat jasoko dugu, 403. Hau segurtasunagatik da, hemen ez dugu CSRF token bat bidaltzen (CSRF Wikipedian. Laburbilduz, eskaera bakoitzari token bakarra gehitzen zaio, zerbitzarian egiazkotasuna egiaztatzen dena).

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Beste edozein eskaera arrakastatsutik edo cookieetatik kopia daiteke, non 'JSESSIONID' eremuan gordetzen den.

Non aurkitu tokenaBeste eskaera baten goiburua:

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Edo cookieetatik, zuzenean kontsolaren bidez:

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Saia gaitezen berriro, oraingoan eskuratzeko ezarpenak pasatzen ditugu, eta bertan gure csrf-tokena parametro gisa zehazten dugu goiburuan.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Arrakasta, 10 profil guztiak jasotzen ditugu. :tada:

Goiburuen desberdintasuna dela eta, erantzunaren egitura apur bat desberdina da jatorrizko eskaeran jasotakoaren aldean. Egitura bera lor dezakezu 'Onartu: 'application/vnd.linkedin.normalized+json+2.1' gehitzen baduzu gure objektuari, csrf tokenaren ondoan.
Erantzun adibidea goiburua gehitutaLinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Onartu goiburuari buruzko informazio gehiago

Zer da hurrengoa?

Ondoren, `hasi` parametroa editatu dezakezu (eskuz edo automatizatu), indizea seinalatuz, eta bertatik 10 profil (lehenetsia = 0) emango zaizkigu bilaketaren emaitza osotik. Beste era batera esanda, eskaera bakoitzaren ondoren 10 handituz gero, orrialdez orrialdeko ohiko irteera lortzen dugu, aldi berean 10 profil.

Fase honetan datu eta askatasun nahikoa nuen maskota proiektuan lanean jarraitzeko. Baina bekatua izango zen datu hauek lekuan bertan bistaratzen ez saiatzea, jada eskura baitzegoen. Ez gara sartuko frontoian erabiltzen den Emberra. jQuery gunera konektatuta zegoen, eta oinarrizko sintaxiaren ezagutza memorian zulatu ondoren, minutu pare batean honako hau sor dezakezu.

jQuery kodea

/* Ρ€Π΅Π½Π΄Π΅Ρ€ Π±Π»ΠΎΠΊΠ°, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ профиля ΠΈ вставляСм Π±Π»ΠΎΠΊ Π² список ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти Π΄Π°Π½Π½Ρ‹Π΅ */
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="/eu/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="/eu/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;

Bilaketa-orriko kontsolan zuzenean egiten baduzu, klik bakoitzean 10 profil berri kargatzen dituen botoi bat gehituko du eta zerrenda batean errendatzen ditu. Jakina, aldatu tokena eta URLa behar denaren arabera hau egin aurretik. Profil-blokeak izena, posizioa, kokapena, profilaren esteka eta leku-markaren irudia izango ditu.

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Ondorioa

Horrela, gutxieneko esfortzuarekin, puntu ahula aurkitu eta mugarik gabe bilaketa berreskuratu ahal izan genuen. Nahikoa izan zen datuak eta bere bidea aztertzea, eskaera bera aztertzea.

Ezin dut esan LinkedInrentzat arazo larria denik, ez duelako mehatxurik sortzen. Gehienezko irabazia galtzen da "konponbideen" ondorioz, eta horrek prima ordaintzea saihesteko aukera ematen du. Beharbada, zerbitzariaren erantzuna beharrezkoa da gunearen beste atalen funtzionamendu zuzena izateko, edo garatzaileen alferkeria eta baliabide eza da ondo egiten uzten ez duena. (Muga 2015eko urtarrilean agertu zen; honen aurretik ez zegoen mugarik).

PS

Jakina, jQuery kodea gaitasunen adibide primitiboa da. Momentuz arakatzaile-luzapena sortu dut nire beharretara egokitzeko. Kontrol-botoiak gehitzen ditu eta profil osoak errendatzen ditu argazkiekin, gonbidapen-botoi batekin eta konexio orokorrekin. Gainera, kokapen, enpresen eta beste gauza batzuen iragazkiak modu dinamikoan biltzen ditu eta cookieetatik token bat lortzen du. Beraz, ez dago ezer gogor kodetu beharrik. Beno, ezarpen-eremu gehigarriak gehitzen ditu, adibidez, "zenbat profil eskatu aldi berean, 49 arte".

LinkedIn-en bilaketa-muga gainditzea APIarekin jolastuz

Gehigarri honetan lanean nabil oraindik eta jendaurrera kaleratzeko asmoa dut. Interesatzen bazaizu idatzi.

Iturria: www.habr.com

Gehitu iruzkin berria