Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Kufiri

Ka një kufi të tillë në LinkedIn — Kufiri për përdorim komercial. Shumë mundësi është që ju, siç isha edhe unë deri për një kohë të fundit, kurrë nuk keni hasur dhe as dëgjuar për të.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Thelbësia e kufirit është se nëse përdorni kërkimin e njerëzve jashtë kontakteve tuaja shumë shpesh (nuk ka metrikash të sakta, algoritmi vendos në bazë të veprimeve tuaja — sa shpesh dhe shumë keni kërkuar, shtuar njerëz), atëherë rezultati i kërkimit do të kufizohet në tri profile, në vend të 1000 (siç është në parazgjedhje 100 faqe, me nga 10 profile në faqe). Kufiri rikthehet në fillim të çdo muaji. Natyrisht, llogaritë premium nuk kanë një kufi të tillë.

Por jo shumë kohë më parë, për një projekt të vogël, fillova të luaj shumë me kërkimin në LinkedIn dhe papritur mora këtë kufi. Natyrisht, kjo nuk më pëlqeu, pasi nuk e kisha përdorur për qëllime komerciale, kështu që mendimi i parë ishte të studionja kufirin dhe të përpiqesha ta kaloja atë.

[Sqarim i rëndësishëm — materialet në këtë artikull janë ofruar ekskluzivisht për qëllime informuese dhe edukative. Autori nuk inkurajon përdorimin e tyre për qëllime komerciale.]

Hulumtojmë problemin

Kemi: në vend të dhjetë profileve me pagination, kërkimi jep vetëm tri, pas të cilave paraqitet një bllok me “rekomandim” për llogarinë premium dhe më poshtë shfaqen profile të paqarta dhe të pa klikueshme.

Menjëherë dora shkon në konsolën e zhvilluesit për të parë këto profile të fshehura — ndoshta mund të heqim disa stile që shkaktojnë blur, ose të nxjerrim informacione nga blloku në markup. Por, siç pritej, këto profile janë thjesht imazhe-dikuptuese dhe nuk mbajnë asnjë informacion.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Mirë, tani le të shikojmë në skedën Network dhe të kontrollojmë nëse vërtet funksionon alternativa për tregimin e rezultateve të kërkimit, e cila kthen vetëm tri profile. Gjejmë kërkesën që na intereson tek “/api/search/blended” dhe shikojmë përgjigjen.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Profilet vijnë në një array `included`, por ka 15 entitete në të. Në këtë rast, tri të parat prej tyre janë objekte me informacione shtesë, çdo objekt përmban informacion për një profil konkret (për shembull, nëse profili është premium).

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Të dhënat e mëposhtme janë profile reale — rezultatet e kërkimit, nga të cilat do të na tregohen vetëm tri. Siç mund të kuptohet, tregon vetëm ata për të cilët vjen informacion shtesë (objektet e para tre). Për shembull, nëse marrim përgjigjen nga profili pa kufizim, do të vijnë 28 entitete — 10 objekte me informacion shtesë dhe 18 profile.

Përgjigjja për profilin pa kufizimShkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API
Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Pse po vijnë më shumë se 10 profile, ndonëse kërkohen pikërisht 10, dhe ato nuk marrin pjesë në shfaqje, madje as në faqen tjetër nuk do të jenë — ende nuk e di. Nëse analizojmë URL-në e kërkesës, mund të shohim se count=10 (sa profile duhet të kthehen në përgjigje, maksimumi 49).

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Do të isha i lumtur për çdo koment në lidhje me këtë.

Po eksperimentohemi

Mirë, e rëndësishmja është se tani e dimë saktësisht — profilet në përgjigje vijnë më shumë se ato që na tregojnë. Pra, mund të marrim më shumë të dhëna, pavarësisht nga kufizimi. Le të provosh ta kërkojmë API-në vetë, direkt nga konsola, me ndihmën e fetch.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Sikurse pritej, marrim një gabim, 403. Kjo është e lidhur me sigurinë, këtu ne nuk dërgojmë tokenin CSRF (CSRF në Wikipedia. Nëse do të shprehej me dy fjalë — çdo kërkesë i shtohet një token unik, që verifikohet në server për autentikim.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Ai mund të kopjohet nga çdo kërkesë tjetër e suksesshme ose nga cookies, ku ruhet në fushën ‘JSESSIONID’.

Ku ta gjej tokeninKryefjala e një kërkese tjetër:

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Ose nga cookies, drejtpërdrejt përmes konsolës:

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Provojmë përsëri, këtë herë dërgojmë në fetch cilësimet, ku shpërndajmë parametrin në header tonë csrf-token.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Sukses, na vijnë të gjithë 10 profilët. :tada:

Për shkak të ndryshimeve në kryefjalë, struktura e përgjigjes është paksa e ndryshme nga ajo që vjen në kërkesën origjinale. Mund të merret e njëjta strukturë, nëse shtojmë ‘Accept: ‘application/vnd.linkedin.normalized+json+2.1’, në objektin tonë, përmban pranë csrf tokenit.
Shembulli i përgjigjes me kryefjalën e shtuarShkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Më shumë rreth kryefjalës Accept

Çfarë ndodh më tej?

Më pas, mund ta redaktoni (me dorë ose duke e automatizuar) parametrin `start`, që tregon indeksin nga i cili do të na jepen 10 profilë (me default = 0) nga të gjithë rezultatet e kërkimit. Me fjalë të tjera, duke e rritur atë me 10 pas çdo kërkese, ne e marrim një rezultat të zakonshëm të faqes, me nga 10 profile për herë.

Në këtë etapë, pata mjaft të dhëna dhe liri për të vazhduar punën mbi projektin tim. Por do të ishte mëkat të mos provoja t'i paraqisja këto të dhëna direkt në vend, për sa kohë që i kam. Nuk do të merrem me Ember, që përdoret në front. Në fa ishte e instaluar jQuery, dhe duke e gërmuar në kujtesë njohuritë bazike të sintaksës, mund të krijojmë në disa minuta të ardhshme.

Kodi në 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="/sq/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="/sq/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">Ngarko Më Shumë</button>');
// shtojmë funksionalitet në buton
$('#load-more').addClass('artdeco-button').on('click', fetchProfiles);

// vendosim indeksin e profilit për kërkesën si të parazgjedhur
window.nextItemIndex = 0;

Nëse e ekzekutoni këtë drejtpërdrejt në konsolën e faqes së kërkimit, do të shtojë një Buton që ngarkon 10 profile të reja me çdo klikim, dhe i rendit ato në formë liste. Sigurisht, duhet të ndryshoni token dhe URL-në para kësaj. Bloku i profilit do të përmbajë emrin, pozitat, lokacionin, lidhjen në profil dhe një imazh-shkulte.

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Përfundimi

Në këtë mënyrë, me përpjekje minimale, arritëm të gjenim një pikë të dobët dhe ta kthejmë kërkimin pa kufij. Mjaftoi të analizohej të dhënat dhe rruga e tyre, duke shqyrtuar kërkesën vetë.

Nuk është një problem serioz për LinkedIn, sepse nuk paraqet ndonjë kërcënim. Më së shumti, është një humbje fitimi për shkak të këtyre "anashkalimeve" që lejojnë të mos paguash për premium. Ndoshta ky përgjigje nga serveri është e nevojshme për funksionimin e duhur të pjesëve të tjera të faqes, ose ndoshta është thjesht lenie nga zhvilluesit për shkak të mungesës së burimeve që nuk lejojnë punë cilësore. (Kjo kufizim ka filluar që nga janari i vitit 2015, deri atëherë nuk kishte kufizim).

P.S.

Natyrisht, kodi në jQuery është një shembull mjaft primitiv i mundësive. Tani kam krijuar një zgjerim për shfletuesin sipas nevojave të mia. Ai shton butona kontrolli dhe renderon profile plotësisht me imazhe, butonin e ftesës dhe lidhjet e përgjithshme. Plus, ai mbledh dinamike filtrat e lokacioneve, kompanive dhe gjërave të tjera, dhe nxjerr token nga cookies. Pra, nuk ka nevojë të bëjmë më ndonjë hardkodim. Gjithashtu, shton fusha të tjera të cilësimeve, si "sa profile të kërkohen në një herë, deri në 49".

Shkoni përtej kufirit të kërkimit në LinkedIn duke luajtur me API

Une akoma po punoj mbi këtë shtesë dhe kam në plan ta publikoj në akses të hapur. Më shkruani nëse ju intereson.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster