GrÀns
Det finns en sĂ„dan begrĂ€nsning pĂ„ LinkedIn â . Det Ă€r mycket troligt att du, precis som jag fram till nyligen, aldrig har stött pĂ„ eller hört talas om det.

KĂ€rnan i begrĂ€nsningen Ă€r att om du anvĂ€nder sökfunktionen för att leta efter mĂ€nniskor utanför dina kontakter för ofta (exakta mĂ„tt finns inte, det avgör algoritmen baserat pĂ„ dina aktiviteter â hur ofta och mycket du har sökt, lagt till personer), sĂ„ kommer sökresultatet att begrĂ€nsas till tre profiler istĂ€llet för 1000 (standard Ă€r 100 sidor med 10 profiler per sida). BegrĂ€nsningen Ă„terstĂ€lls i början av varje mĂ„nad. SĂ„klart, .
Men nyligen, för ett pet-projekt, började jag experimentera mycket med sökningen pÄ LinkedIn och plötsligt fick jag denna begrÀnsning. Naturligtvis gillade jag inte det, eftersom jag inte anvÀnde det i nÄgot kommersiellt syfte, sÄ den första tanken var att studera begrÀnsningen och försöka kringgÄ den.
[Viktig anmĂ€rkning â materialet i artikeln presenteras enbart i informativa och utbildande syften. Författaren uppmuntrar inte deras anvĂ€ndning för kommersiella Ă€ndamĂ„l.]
Vi undersöker problemet
Vi ser: istÀllet för tio profiler med paginering, ger sökningen endast tre, efter vilka en ruta med "rekommendation" för premiummedlemskap dyker upp och nedan visas otydliga och icke-klickbara profiler.
HĂ€len dras direkt mot utvecklarkonsolen för att se dessa dolda profiler â kanske kan vi ta bort nĂ„gra stilar som sĂ€tter blur, eller extrahera information frĂ„n rutan i strukturen. Men, som förvĂ€ntat, dessa profiler Ă€r bara och lagrar ingen information.

Bra, nu kollar vi fliken NÀtverk och kontrollerar om det verkligen aktiverar en alternativ resultatlista för sökmotorn, som bara returnerar tre profiler. Vi hittar den intressanta begÀran till "/api/search/blended" och tittar pÄ svaret.

Profiler kommer i en array `included`, men det finns hela 15 enheter i den. I detta fall Àr de första tre av dem objekt med tillÀggsinformation, dÀr varje objekt innehÄller information om en specifik profil (till exempel om profilen Àr premium).

De följande 12 Ă€r verkliga profiler â sökresultat dĂ€r vi bara kommer att visa tre. Som man kan gissa visar det bara de som fĂ„r ytterligare information (de första tre posterna). Till exempel, med ett svar frĂ„n en profil utan grĂ€ns, kommer 28 enheter â 10 objekt med tillĂ€ggsinformation och 18 profiler.
Svar för profil utan grÀns

Varför kommer fler profiler Ă€n 10, nĂ€r det efterfrĂ„gas exakt 10, och de deltar inte i visningen, inte ens pĂ„ nĂ€sta sida kommer de att finnas â vet inte Ă€nnu. Om man analyserar URL:en för förfrĂ„gan kan man se att count=10 (hur mĂ„nga profiler som ska returneras i svaret, max 49).
Jag skulle uppskatta alla kommentarer om detta.
Vi experimenterar
Bra, det viktigaste Ă€r att vi nu vet sĂ€kert â det kommer fler profiler i svaret Ă€n vad vi ser. Det betyder att vi kan hĂ€mta mer data, trots grĂ€nsen. LĂ„t oss försöka hĂ€mta API:t sjĂ€lva, direkt frĂ„n konsolen, med hjĂ€lp av fetch.

Som förvĂ€ntat fĂ„r vi ett fel, 403. Det Ă€r relaterat till sĂ€kerheten, hĂ€r skickar vi inte CSRF-token (. För att sammanfatta â till varje begĂ€ran lĂ€ggs en unik token till, som kontrolleras pĂ„ servern för Ă€kthet).

Den kan kopieras frÄn en annan framgÄngsrik begÀran eller frÄn cookies, dÀr den lagras i fÀltet 'JSESSIONID'.
Var hittar man tokenRubriken för en annan förfrÄgan:

Eller frÄn cookies, direkt genom konsolen:

Vi försöker igen, den hÀr gÄngen skickar vi instÀllningar i fetch, dÀr vi anger vÄr csrf-token som en parameter i headern.

FramgÄng, vi fÄr alla 10 profiler. :tada:
PÄ grund av skillnader i rubrikerna skiljer sig svaret nÄgot frÄn vad som kommer i den ursprungliga förfrÄgan. Man kan fÄ samma struktur om man lÀgger till 'Accept: 'application/vnd.linkedin.normalized+json+2.1', till vÄrt objekt, bredvid csrf-token.
Exempel pÄ svar med tillagd header
Vad hÀnder hÀrnÀst?
DÀrefter kan man redigera (manuellt eller automatiskt) parametern `start`, som anger indexet frÄn vilket vi fÄr 10 profiler (standard = 0) frÄn hela sökresultatet. Med andra ord, genom att öka det med 10 efter varje begÀran fÄr vi en vanlig paginering, med 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 mitt pet-projekt. Men det skulle vara en synd att inte försöka visa dessa data direkt, nu nÀr jag hade dem. Vi kommer inte att gÄ in i Ember, som anvÀnds pÄ framsidan. jQuery var kopplat pÄ sidan, och genom att friska upp minnet av grundlÀggande syntax kan jag pÄ nÄgra minuter skapa följande.
Kod pÄ jQuery
/* ŃĐ”ĐœĐŽĐ”Ń Đ±Đ»ĐŸĐșа, ĐżŃĐžĐœĐžĐŒĐ°Đ”ĐŒ ĐŽĐ°ĐœĐœŃĐ” ĐżŃĐŸŃĐžĐ»Ń Đž ĐČŃŃаĐČĐ»ŃĐ”ĐŒ Đ±Đ»ĐŸĐș ĐČ ŃпОŃĐŸĐș ĐżŃĐŸŃОлДĐč ĐžŃĐżĐŸĐ»ŃĐ·ŃŃ ŃŃĐž ĐŽĐ°ĐœĐœŃĐ” */
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>`
);
};
// Hämtar API, får data och renderar profiler
const fetchProfiles = () => {
// token
const csrf = 'ajax:9082932176494192209';
// objekt med inställningar för förfrågan, skickar token
const settings = { headers: { 'csrf-token': csrf } }
// URL för förfrågan, med dynamiskt startindex i slutet
const url = `https://www.linkedin.com/voyager/api/search/blended?count=10&filters=List(geoRegion-jp0,network-S,resultType-PEOPLE)&origin=FACETED_SEARCH&q=all&queryContext=List(spellCorrectionEnabled-true,relatedSearchesEnabled-true)&start=${nextItemIndex}`;
/* Gör förfrågan, för varje profil i svaret kallar vi på renderingsblock och inkrementerar startindex med 10 */
fetch(url, settings).then(response => response.json()).then(data => {
data.elements[0].elements.forEach(createProfileBlock);
nextItemIndex += 10;
});
};
// Tar bort alla profiler från listan
$('.search-results__list').find('li').remove();
// Sätter in knapp för att ladda profiler
$('.search-results__list').after('<button id="load-more">Ladda fler</button>');
// lägger till funktionalitet för knappen
$('#load-more').addClass('artdeco-button').on('click', fetchProfiles);
// sätter som standard profilindex för förfrågan
window.nextItemIndex = 0;
Om du kör detta direkt i konsolen pÄ sö sidan, kommer det att lÀgga till en knapp som laddar 10 nya profiler varje gÄng den trycks och renderar dem som en lista. SjÀlvklart mÄste token och URL Àndras först. Profilsrutan kommer att innehÄlla namn, titel, plats, lÀnk till profil och en placeholder-bild.

Slutsats
PÄ sÄ sÀtt, med minimala insatser, lyckades vi hitta en sÄrbarhet och fÄ tillbaka en obegrÀnsad sökning. Det rÀckte med att analysera data och deras vÀg, och kolla sjÀlva förfrÄgan.
Jag kan inte sÀga att detta utgör ett allvarligt problem för LinkedIn, eftersom det inte innebÀr nÄgon hot. Som mest Àr det förlorad inkomst pÄ grund av sÄdana "arbetsomvÀgar" som möjliggör att man kan slippa betala för premium. Kanske behövs ett sÄdant serversvar för att andra delar av webbplatsen ska fungera korrekt, eller sÄ Àr det helt enkelt brist pÄ utvecklarnas resurser som förhindrar en bra lösning. (BegrÀnsningen introducerades i januari 2015, innan dess fanns det inga grÀnser).
P.S.
SjÀlvklart Àr koden pÄ jQuery ett ganska primitivt exempel pÄ möjligheterna. Just nu har jag skapat en extension för webblÀsaren för mina behov. Den lÀgger till kontrollknappar och renderar fullstÀndiga profiler med bilder, inbjudningsknapp och gemensamma kontakter. Dessutom samlar den dynamiskt filtren för platser, företag och mer, och hÀmtar token frÄn kakor. SÄ jag behöver inte hÄrdkoda nÄgot lÀngre. Den lÀgger ocksÄ till ytterligare instÀllningsfÀlt, som "hur mÄnga profiler man ska begÀra Ät gÄngen, upp till 49".

Jag arbetar fortfarande med detta tillÀgg och planerar att lÀgga upp det offentligt. Skriv om du Àr intresserad.
KĂ€lla: habr.com


