Förbi LinkedIns sökgräns genom att spela med API:t

Begränsa

Det finns en sådan begränsning på LinkedIn - Kommersiell användningsgräns. Det är extremt troligt att du, som jag tills nyligen, aldrig har stött på eller hört talas om det.

Förbi LinkedIns sökgräns genom att spela med API:t

Kärnan i gränsen är att om du använder sökningen efter personer utanför dina kontakter för ofta (det finns inga exakta mätvärden, algoritmen avgör baserat på dina handlingar - hur ofta och hur mycket du sökte, la till personer), så bestämmer sökresultatet kommer att begränsas till tre profiler, istället för 1000 (standard 100 sidor, 10 profiler per sida). Gränsen återställs i början av varje månad. Naturligtvis, premiumkonton har inte denna begränsning.

Men för inte så länge sedan, för ett husdjursprojekt, började jag leka mycket med LinkedIn-sökning och fick plötsligt den här begränsningen. Naturligtvis gillade jag inte detta särskilt mycket, eftersom jag inte använde det i några kommersiella syften, så min första tanke var att studera begränsningen och försöka komma runt den.

[Ett viktigt förtydligande: materialet i artikeln presenteras endast i informations- och utbildningssyfte. Författaren uppmuntrar inte att de används för kommersiella ändamål.]

Vi studerar problemet

Vi har: istället för tio profiler med paginering returnerar sökningen endast tre, varefter ett block med en "rekommendation" av ett premiumkonto infogas och nedan finns suddiga och icke-klickbara profiler.

Handen sträcker sig omedelbart ut till utvecklarkonsolen för att titta på dessa dolda profiler – kanske kan vi ta bort några suddiga stilar, eller extrahera information från ett block i markeringen. Men, helt förväntat, är dessa profiler bara platshållarbilder och ingen information lagras.

Förbi LinkedIns sökgräns genom att spela med API:t

Okej, låt oss nu titta på fliken Nätverk och kontrollera om de alternativa sökresultaten som bara returnerar tre profiler faktiskt fungerar. Vi hittar förfrågan vi är intresserade av för "/api/search/blended" och tittar på svaret.

Förbi LinkedIns sökgräns genom att spela med API:t

Profiler kommer i en "inkluderad" array, men det finns redan 15 enheter i den. I det här fallet är de första tre av dem objekt med ytterligare information, varje objekt innehåller information om en specifik profil (till exempel om profilen är premium ).

Förbi LinkedIns sökgräns genom att spela med API:t

De nästa 12 är riktiga profiler - sökresultat, varav endast tre kommer att visas för oss. Som du redan kan gissa visar den bara de som får ytterligare information (de tre första objekten). Om du till exempel tar svaret från en profil utan gräns kommer du att få 28 enheter - 10 objekt med ytterligare. information och 18 profiler.

Svar för profil utan begränsningFörbi LinkedIns sökgräns genom att spela med API:t
Förbi LinkedIns sökgräns genom att spela med API:t

Varför fler än 10 profiler anländer, även om exakt 10 efterfrågas, och de inte deltar i visningen på något sätt, även på nästa sida kommer de inte att vara - jag vet inte än. Om du analyserar webbadressen för begäran kan du se att count=10 (hur många profiler som ska returneras i svaret, max 49).

Förbi LinkedIns sökgräns genom att spela med API:t

Jag tar gärna emot kommentarer i denna fråga.

Låt oss experimentera

Okej, det viktigaste vi nu vet säkert är att det finns fler profiler i svaret än de visar oss. Det betyder att vi kan få mer data, trots gränsen. Låt oss försöka hämta API själva, direkt från konsolen, med hjälp av hämta.

Förbi LinkedIns sökgräns genom att spela med API:t

Som väntat får vi ett fel, 403. Detta beror på säkerheten, här skickar vi inte en CSRF-token (CSRF på Wikipedia. I ett nötskal läggs en unik token till varje begäran, som kontrolleras på servern för äkthet).

Förbi LinkedIns sökgräns genom att spela med API:t

Det kan kopieras från vilken annan lyckad begäran som helst eller från cookies, där den lagras i fältet 'JSESSIONID'.

Var man hittar tokenRubrik på en annan begäran:

Förbi LinkedIns sökgräns genom att spela med API:t

Eller från cookies, direkt via konsolen:

Förbi LinkedIns sökgräns genom att spela med API:t

Låt oss försöka igen, den här gången skickar vi inställningarna för att hämta, där vi anger vår csrf-token som en parameter i rubriken.

Förbi LinkedIns sökgräns genom att spela med API:t

Framgång, vi tar emot alla 10 profiler. :tada:

På grund av skillnaden i rubriker skiljer sig strukturen på svaret något från vad som tas emot i den ursprungliga begäran. Du kan få samma struktur om du lägger till 'Acceptera: 'application/vnd.linkedin.normalized+json+2.1' till vårt objekt, bredvid csrf-token.
Exempelsvar med tillagd rubrikFörbi LinkedIns sökgräns genom att spela med API:t

Mer om Accept-huvudet

Vad händer nu?

Sedan kan du redigera (manuellt eller automatisera) `start`-parametern, peka på indexet, från vilket vi kommer att få 10 profiler (standard = 0) från hela sökresultatet. Med andra ord, genom att öka den med 10 efter varje begäran får vi den vanliga utmatningen sida för sida, 10 profiler åt gången.

I det här skedet hade jag tillräckligt med data och frihet för att fortsätta arbeta med husdjursprojektet. Men det skulle ha varit synd att inte försöka visa dessa uppgifter direkt på plats, eftersom de redan fanns till hands. Vi går inte in på Ember, som används längst fram. jQuery var kopplad till sajten, och efter att ha grävt fram kunskapen om grundläggande syntax i minnet kan du skapa följande på ett par minuter.

jQuery-kod

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

Om du gör detta direkt i konsolen på söksidan kommer den att lägga till en knapp som laddar 10 nya profiler med varje klick och renderar dem i en lista. Ändra såklart token och URL till den som krävs innan du gör detta. Profilblocket kommer att innehålla namn, position, plats, länk till profilen och en platshållarbild.

Förbi LinkedIns sökgräns genom att spela med API:t

Slutsats

Således kunde vi, med ett minimum av ansträngning, hitta den svaga punkten och återta vårt sökande utan begränsningar. Det räckte med att analysera data och dess väg, titta på själva förfrågan.

Jag kan inte säga att detta är ett allvarligt problem för LinkedIn, eftersom det inte utgör något hot. Det maximala är förlorad vinst på grund av sådana "lösningar", vilket gör att du kan undvika att betala för premium. Kanske är ett sådant serversvar nödvändigt för att andra delar av webbplatsen ska fungera korrekt, eller så är det helt enkelt lathet hos utvecklarna och en brist på resurser som inte tillåter det att göras bra. (Begränsningen dök upp i januari 2015; innan detta fanns ingen gräns).

PS

Naturligtvis är jQuery-koden ett ganska primitivt exempel på funktionerna. För tillfället har jag skapat ett webbläsartillägg som passar mina behov. Den lägger till kontrollknappar och renderar fullständiga profiler med bilder, en inbjudningsknapp och allmänna anslutningar. Dessutom samlar den dynamiskt in filter för platser, företag och andra saker, och hämtar en token från cookies. Så det finns inget behov av att hårdkoda något längre. Tja, det lägger till ytterligare inställningsfält, a la "hur många profiler att begära åt gången, upp till 49."

Förbi LinkedIns sökgräns genom att spela med API:t

Jag arbetar fortfarande med det här tillägget och planerar att släppa det till allmänheten. Skriv om du är intresserad.

Källa: will.com

Lägg en kommentar