Omgå LinkedIns søgegrænse ved at lege med API

Begrænse

Der er en sådan begrænsning på LinkedIn - Grænse for kommerciel brug. Det er yderst sandsynligt, at du, ligesom jeg indtil for nylig, aldrig har stødt på eller hørt om det.

Omgå LinkedIns søgegrænse ved at lege med API

Essensen af ​​grænsen er, at hvis du bruger søgningen efter personer uden for dine kontakter for ofte (der er ingen nøjagtige målinger, algoritmen bestemmer ud fra dine handlinger - hvor ofte og hvor meget du søgte, tilføjede personer), så er søgeresultatet vil være begrænset til tre profiler i stedet for 1000 (standard 100 sider, 10 profiler pr. side). Grænsen nulstilles i begyndelsen af ​​hver måned. Naturligt, premium-konti har ikke denne begrænsning.

Men for ikke så længe siden begyndte jeg til et kæledyrsprojekt at lege meget med LinkedIn-søgning og fik pludselig denne begrænsning. Naturligvis kunne jeg ikke lide dette så meget, fordi jeg ikke brugte det til nogen kommercielle formål, så min første tanke var at studere begrænsningen og prøve at omgå den.

[En vigtig præcisering: materialerne i artiklen præsenteres udelukkende til informations- og uddannelsesformål. Forfatteren opfordrer ikke til at bruge dem til kommercielle formål.]

Vi studerer problemet

Vi har: i stedet for ti profiler med paginering, returnerer søgningen kun tre, hvorefter der indsættes en blok med en “anbefaling” af en premium-konto og nedenfor er der slørede og ikke-klikbare profiler.

Med det samme rækker hånden ud til udviklerkonsollen for at se på disse skjulte profiler - måske kan vi fjerne nogle slørende stilarter eller udtrække information fra en blok i markeringen. Men ganske forventet er disse profiler retfærdige pladsholder billeder og ingen oplysninger gemmes.

Omgå LinkedIns søgegrænse ved at lege med API

Okay, lad os nu se på fanen Netværk og kontrollere, om de alternative søgeresultater, der kun returnerer tre profiler, faktisk virker. Vi finder den anmodning, vi er interesseret i, til "/api/search/blended" og ser på svaret.

Omgå LinkedIns søgegrænse ved at lege med API

Profiler kommer i et "inkluderet" array, men der er allerede 15 entiteter i det. I dette tilfælde er de første tre af dem objekter med yderligere information, hvert objekt indeholder information om en specifik profil (f.eks. om profilen er premium. ).

Omgå LinkedIns søgegrænse ved at lege med API

De næste 12 er rigtige profiler - søgeresultater, hvoraf kun tre vil blive vist til os. Som du allerede kan gætte, viser den kun dem, der modtager yderligere information (de første tre objekter). Hvis du for eksempel tager svaret fra en profil uden begrænsning, vil du modtage 28 enheder - 10 objekter med yderligere. information og 18 profiler.

Svar for profil uden begrænsningOmgå LinkedIns søgegrænse ved at lege med API
Omgå LinkedIns søgegrænse ved at lege med API

Hvorfor der ankommer mere end 10 profiler, selvom der anmodes om præcis 10, og de ikke deltager i visningen på nogen måde, heller ikke på næste side - det ved jeg ikke endnu. Hvis du analyserer anmodningens URL, kan du se, at count=10 (hvor mange profiler der skal returneres i svaret, maksimalt 49).

Omgå LinkedIns søgegrænse ved at lege med API

Jeg vil meget gerne modtage kommentarer til denne sag.

Lad os eksperimentere

Okay, det vigtigste, vi nu ved med sikkerhed, er, at der er flere profiler i svaret, end de viser os. Det betyder, at vi kan få flere data, på trods af grænsen. Lad os prøve at trække API'et selv, direkte fra konsollen, ved hjælp af fetch.

Omgå LinkedIns søgegrænse ved at lege med API

Som forventet får vi en fejl, 403. Dette skyldes sikkerhed, her sender vi ikke et CSRF-token (CSRF på Wikipedia. I en nøddeskal tilføjes et unikt token til hver anmodning, som kontrolleres på serveren for ægthed).

Omgå LinkedIns søgegrænse ved at lege med API

Den kan kopieres fra enhver anden vellykket anmodning eller fra cookies, hvor den er gemt i feltet 'JSESSIONID'.

Hvor finder man tokenetOverskrift på en anden anmodning:

Omgå LinkedIns søgegrænse ved at lege med API

Eller fra cookies, direkte gennem konsollen:

Omgå LinkedIns søgegrænse ved at lege med API

Lad os prøve igen, denne gang videregiver vi indstillingerne for at hente, hvor vi angiver vores csrf-token som en parameter i headeren.

Omgå LinkedIns søgegrænse ved at lege med API

Succes, vi modtager alle 10 profiler. :tada:

På grund af forskellen i overskrifter er strukturen af ​​svaret en smule anderledes end den, der modtages i den oprindelige anmodning. Du kan få den samme struktur, hvis du tilføjer 'Accepter: 'application/vnd.linkedin.normalized+json+2.1' til vores objekt ved siden af ​​csrf-tokenet.
Eksempelsvar med tilføjet overskriftOmgå LinkedIns søgegrænse ved at lege med API

Mere om Accepter-headeren

Hvad er det næste?

Derefter kan du redigere (manuelt eller automatisere) `start`-parameteren, der peger på indekset, hvorfra vi vil få 10 profiler (standard = 0) fra hele søgeresultatet. Med andre ord, ved at øge den med 10 efter hver anmodning, får vi det sædvanlige side-for-side-output, 10 profiler ad gangen.

På dette tidspunkt havde jeg nok data og frihed til at fortsætte arbejdet med kæledyrsprojektet. Men det ville have været synd ikke at forsøge at vise disse data lige på stedet, da de allerede var ved hånden. Vi vil ikke gå ind på Ember, som bruges foran. jQuery var forbundet til webstedet, og efter at have gravet viden om grundlæggende syntaks frem i hukommelsen, kan du oprette følgende på et par minutter.

jQuery kode

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

Hvis du gør dette direkte i konsollen på søgesiden, tilføjer den en knap, der indlæser 10 nye profiler med hvert klik og gengiver dem på en liste. Skift selvfølgelig token og URL til den påkrævede, før du gør dette. Profilblokken vil indeholde navn, position, placering, link til profilen og et pladsholderbillede.

Omgå LinkedIns søgegrænse ved at lege med API

Konklusion

Således kunne vi med et minimum af indsats finde det svage punkt og genvinde vores søgning uden begrænsninger. Det var nok at analysere dataene og deres vej, se på selve anmodningen.

Jeg kan ikke sige, at dette er et alvorligt problem for LinkedIn, fordi det ikke udgør nogen trussel. Det maksimale er tabt fortjeneste på grund af sådanne "løsninger", som giver dig mulighed for at undgå at betale for præmie. Måske er et sådant serversvar nødvendigt for den korrekte drift af andre dele af webstedet, eller det er simpelthen dovenskab hos udviklerne og mangel på ressourcer, der ikke tillader det at blive gjort godt. (Begrænsningen dukkede op i januar 2015; før dette var der ingen grænse).

PS

Naturligvis er jQuery-koden et ret primitivt eksempel på mulighederne. I øjeblikket har jeg lavet en browserudvidelse, der passer til mine behov. Den tilføjer kontrolknapper og gengiver hele profiler med billeder, en invitationsknap og generelle forbindelser. Derudover indsamler den dynamisk filtre til lokationer, virksomheder og andre ting og henter et token fra cookies. Så der er ingen grund til at hardkode noget længere. Nå, det tilføjer yderligere indstillingsfelter, a la "hvor mange profiler der skal anmodes om ad gangen, op til 49."

Omgå LinkedIns søgegrænse ved at lege med API

Jeg arbejder stadig på denne tilføjelse og planlægger at frigive den til offentligheden. Skriv hvis du er interesseret.

Kilde: www.habr.com

Tilføj en kommentar