De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Begrenzing

Er is zo'n beperking op LinkedIn - Commercieel gebruikslimiet. De kans is groot dat je er, net als ik tot voor kort, nog nooit van gehoord of gezien hebt.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

De essentie van de limiet is dat als je de zoekopdracht naar mensen buiten je contacten te vaak gebruikt (er zijn geen exacte statistieken, het algoritme beslist op basis van je acties - hoe vaak en hoeveel je hebt gezocht, mensen hebt toegevoegd), het zoekresultaat zal beperkt zijn tot drie profielen, in plaats van 1000 (standaard 100 pagina's, 10 profielen per pagina). De limiet wordt aan het begin van elke maand opnieuw ingesteld. Van nature, premium-accounts hebben deze beperking niet.

Maar niet zo lang geleden begon ik voor een huisdierenproject veel te spelen met de zoekfunctie op LinkedIn en kreeg plotseling deze beperking. Uiteraard vond ik dit niet zo leuk, omdat ik het niet voor commerciële doeleinden gebruikte, dus mijn eerste gedachte was om de beperking te bestuderen en te proberen deze te omzeilen.

[Een belangrijke verduidelijking: de materialen in het artikel worden uitsluitend voor informatieve en educatieve doeleinden gepresenteerd. De auteur moedigt het gebruik ervan voor commerciële doeleinden niet aan.]

We bestuderen het probleem

Wij hebben: in plaats van tien profielen met paginering levert de zoekopdracht er slechts drie op, waarna een blok met een “aanbeveling” van een premium account wordt ingevoegd en daaronder wazige en niet-klikbare profielen.

Onmiddellijk strekt de hand zich uit naar de ontwikkelaarsconsole om naar deze verborgen profielen te kijken - misschien kunnen we enkele vervagingsstijlen verwijderen of informatie uit een blok in de markup halen. Maar, zoals verwacht, zijn deze profielen gewoon tijdelijke afbeeldingen en er wordt geen informatie opgeslagen.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Oké, laten we nu naar het tabblad Netwerk kijken en controleren of de alternatieve zoekresultaten die slechts drie profielen opleveren, daadwerkelijk werken. We vinden het verzoek waarin we geïnteresseerd zijn voor “/api/search/blended” en bekijken het antwoord.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Profielen worden geleverd in een 'included' array, maar er zitten al 15 entiteiten in. In dit geval zijn de eerste drie objecten met aanvullende informatie, elk object bevat informatie over een specifiek profiel (bijvoorbeeld of het profiel premium is ).

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

De volgende 12 zijn echte profielen - zoekresultaten, waarvan er slechts drie aan ons worden getoond. Zoals je al kunt raden, worden alleen degenen weergegeven die aanvullende informatie ontvangen (de eerste drie objecten). Als u bijvoorbeeld het antwoord zonder limiet uit een profiel haalt, ontvangt u 28 entiteiten - 10 objecten met extra. informatie en 18 profielen.

Antwoord voor profiel zonder limietDe zoeklimiet van LinkedIn omzeilen door te spelen met de API
De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Waarom er meer dan 10 profielen binnenkomen, hoewel er precies 10 worden gevraagd, en ze op geen enkele manier deelnemen aan de weergave, zelfs niet op de volgende pagina zullen ze dat niet zijn - ik weet het nog niet. Als u de verzoek-URL analyseert, ziet u dat aantal = 10 (hoeveel profielen u in het antwoord moet retourneren, maximaal 49).

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Ik zou graag eventuele opmerkingen over deze kwestie ontvangen.

Laten we experimenteren

Oké, het belangrijkste dat we nu zeker weten is dat er meer profielen in de reactie staan ​​dan ze ons laten zien. Dit betekent dat we ondanks de limiet meer gegevens kunnen krijgen. Laten we proberen de API zelf rechtstreeks van de console op te halen met behulp van fetch.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Zoals verwacht krijgen we een foutmelding, 403. Dit komt door beveiliging, hier sturen we geen CSRF-token (CSRF op Wikipedia. Kort gezegd wordt aan elk verzoek een uniek token toegevoegd, dat op de server wordt gecontroleerd op authenticiteit.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Het kan worden gekopieerd van elk ander succesvol verzoek of van cookies, waar het wordt opgeslagen in het veld 'JSESSIONID'.

Waar u het token kunt vindenKop van een ander verzoek:

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Of vanuit cookies, rechtstreeks via de console:

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Laten we het opnieuw proberen, deze keer geven we de instellingen door om op te halen, waarin we ons csrf-token specificeren als een parameter in de header.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Succes, we ontvangen alle 10 profielen. :tadaa:

Vanwege het verschil in headers wijkt de structuur van het antwoord enigszins af van wat in het oorspronkelijke verzoek wordt ontvangen. Je kunt dezelfde structuur krijgen als je ‘Accept: ‘application/vnd.linkedin.normalized+json+2.1’ aan ons object toevoegt, naast het csrf-token.
Voorbeeldantwoord met toegevoegde headerDe zoeklimiet van LinkedIn omzeilen door te spelen met de API

Meer over de Accept-header

Wat is het volgende?

Vervolgens kunt u de parameter `start` bewerken (handmatig of geautomatiseerd), verwijzend naar de index, van waaruit we 10 profielen (standaard = 0) uit het volledige zoekresultaat krijgen. Met andere woorden: door het na elk verzoek met 10 te verhogen, krijgen we de gebruikelijke uitvoer per pagina, met 10 profielen tegelijk.

In dit stadium had ik voldoende gegevens en vrijheid om verder te werken aan het huisdierenproject. Maar het zou zonde zijn geweest om deze gegevens niet ter plekke weer te geven, aangezien deze al voorhanden waren. We gaan niet in op Ember, die aan de voorkant wordt gebruikt. jQuery was verbonden met de site en nadat u de kennis van de basissyntaxis in het geheugen had opgediept, kunt u binnen een paar minuten het volgende creëren.

jQuery-code

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

Als u dit rechtstreeks in de console op de zoekpagina doet, wordt er een knop toegevoegd die bij elke klik 10 nieuwe profielen laadt en deze in een lijst weergeeft. Wijzig uiteraard eerst het token en de URL naar de vereiste versie voordat u dit doet. Het profielblok bevat de naam, functie, locatie, link naar het profiel en een tijdelijke afbeelding.

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Conclusie

Zo konden we met een minimum aan inspanning de zwakke plek vinden en onze zoektocht zonder beperkingen voortzetten. Het was voldoende om de gegevens en het pad ervan te analyseren en het verzoek zelf te onderzoeken.

Ik kan niet zeggen dat dit een serieus probleem is voor LinkedIn, omdat het geen enkele bedreiging vormt. Het maximum is de gederfde winst als gevolg van dergelijke ‘workarounds’, waardoor u kunt voorkomen dat u voor premie hoeft te betalen. Misschien is zo'n serverreactie nodig voor de juiste werking van andere delen van de site, of is het gewoon luiheid van de ontwikkelaars en een gebrek aan middelen waardoor het niet goed kan worden gedaan. (De beperking verscheen in januari 2015; daarvoor was er geen limiet).

PS

Uiteraard is de jQuery-code een nogal primitief voorbeeld van de mogelijkheden. Op dit moment heb ik een browserextensie gemaakt die aan mijn behoeften voldoet. Het voegt bedieningsknoppen toe en geeft volledige profielen weer met afbeeldingen, een uitnodigingsknop en algemene verbindingen. Bovendien verzamelt het op dynamische wijze filters voor locaties, bedrijven en andere zaken, en haalt het een token uit cookies op. Er hoeft dus niets meer hardgecodeerd te worden. Welnu, het voegt extra instellingenvelden toe, zoals “hoeveel profielen tegelijk opvragen, maximaal 49.”

De zoeklimiet van LinkedIn omzeilen door te spelen met de API

Ik werk nog steeds aan deze toevoeging en ben van plan deze vrij te geven aan het publiek. Schrijf als je geïnteresseerd bent.

Bron: www.habr.com

Voeg een reactie