Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Limitahan

Mayroong ganoong limitasyon sa LinkedIn - Limitasyon sa komersyal na paggamit. Malaki ang posibilidad na ikaw, tulad ko hanggang kamakailan, ay hindi kailanman nakatagpo o nakarinig tungkol dito.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Ang esensya ng limitasyon ay kung masyadong madalas mong ginagamit ang paghahanap para sa mga tao sa labas ng iyong mga contact (walang eksaktong sukatan, ang algorithm ay magpapasya batay sa iyong mga aksyon - kung gaano kadalas at gaano ka naghanap, nagdagdag ng mga tao), pagkatapos ay ang resulta ng paghahanap ay limitado sa tatlong profile, sa halip na 1000 (default na 100 pahina, 10 profile bawat pahina). Nire-reset ang limitasyon sa simula ng bawat buwan. natural, Ang mga premium na account ay walang limitasyong ito.

Ngunit hindi nagtagal, para sa isang proyekto ng alagang hayop, nagsimula akong maglaro ng marami sa paghahanap sa LinkedIn at biglang nakuha ang limitasyong ito. Naturally, hindi ko ito masyadong gusto, dahil hindi ko ito ginamit para sa anumang komersyal na layunin, kaya ang una kong naisip ay pag-aralan ang limitasyon at subukang lampasan ito.

[Isang mahalagang paglilinaw: ang mga materyales sa artikulo ay ipinakita lamang para sa mga layuning pang-impormasyon at pang-edukasyon. Hindi hinihikayat ng may-akda ang kanilang paggamit para sa komersyal na layunin.]

Pinag-aaralan namin ang problema

Mayroon kaming: sa halip na sampung mga profile na may pagination, ang paghahanap ay nagbabalik lamang ng tatlo, pagkatapos ay isang block na may "rekomendasyon" ng isang premium na account ay ipinasok at sa ibaba ay malabo at hindi naki-click na mga profile.

Kaagad, inaabot ng kamay ang developer console upang tingnan ang mga nakatagong profile na ito - marahil ay maaari tayong mag-alis ng ilang mga istilong lumalabo, o kumuha ng impormasyon mula sa isang bloke sa markup. Ngunit, medyo inaasahan, ang mga profile na ito ay makatarungan mga larawan ng placeholder at walang impormasyon na nakaimbak.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Okay, ngayon tingnan natin ang tab na Network at tingnan kung gumagana ang mga alternatibong resulta ng paghahanap na nagbabalik lamang ng tatlong profile. Nahanap namin ang kahilingan kung saan interesado kami para sa "/api/search/blended" at tingnan ang tugon.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Ang mga profile ay nasa isang array na `kasama`, ngunit mayroon nang 15 entity sa kasong ito, ang unang tatlo sa mga ito ay mga bagay na may karagdagang impormasyon, ang bawat bagay ay naglalaman ng impormasyon sa isang partikular na profile (halimbawa, kung ang profile ay premium. ).

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Ang susunod na 12 ay mga totoong profile - mga resulta ng paghahanap, kung saan tatlo lamang ang ipapakita sa amin. Tulad ng maaari mo nang hulaan, ipinapakita lamang nito ang mga tumatanggap ng karagdagang impormasyon (ang unang tatlong bagay). Halimbawa, kung kukuha ka ng sagot mula sa isang profile na walang limitasyon, makakatanggap ka ng 28 entity - 10 bagay na may karagdagang. impormasyon at 18 profile.

Sagot para sa profile nang walang limitasyonPaglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API
Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Bakit higit sa 10 mga profile ang dumating, kahit na eksaktong 10 ang hiniling, at hindi sila nakikilahok sa pagpapakita sa anumang paraan, kahit na sa susunod na pahina ay hindi sila magiging - hindi ko pa alam. Kung susuriin mo ang URL ng kahilingan, makikita mo na bilang=10 (ilang profile ang ibabalik sa tugon, maximum na 49).

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Natutuwa akong makatanggap ng anumang komento sa bagay na ito.

Mag-eksperimento tayo

Okay, ang pinakamahalagang bagay na siguradong alam na natin ngayon ay mas maraming profile sa tugon kaysa sa ipinapakita nila sa atin. Nangangahulugan ito na makakakuha tayo ng mas maraming data, sa kabila ng limitasyon. Subukan nating hilahin ang API mismo, direkta mula sa console, gamit ang fetch.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Gaya ng inaasahan, nagkakaroon kami ng error, 403. Ito ay dahil sa seguridad, dito hindi kami nagpapadala ng CSRF token (CSRF sa Wikipedia. Sa madaling sabi, isang natatanging token ang idinaragdag sa bawat kahilingan, na sinusuri sa server para sa pagiging tunay).

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Maaari itong kopyahin mula sa anumang iba pang matagumpay na kahilingan o mula sa cookies, kung saan ito ay nakaimbak sa field na 'JSESSIONID'.

Saan mahahanap ang tokenHeader ng isa pang kahilingan:

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

O mula sa cookies, direkta sa pamamagitan ng console:

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Subukan nating muli, sa pagkakataong ito ay ipinapasa namin ang mga setting upang kunin, kung saan tinukoy namin ang aming csrf-token bilang isang parameter sa header.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Tagumpay, natatanggap namin ang lahat ng 10 profile. :tada:

Dahil sa pagkakaiba sa mga header, ang istraktura ng tugon ay bahagyang naiiba sa kung ano ang natanggap sa orihinal na kahilingan. Makukuha mo ang parehong istraktura kung idaragdag mo ang 'Accept: 'application/vnd.linkedin.normalized+json+2.1' sa aming object, sa tabi ng csrf token.
Halimbawang tugon na may idinagdag na headerPaglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Higit pa tungkol sa Tanggapin ang header

Ano ang susunod?

Pagkatapos ay maaari mong i-edit (manual o i-automate) ang parameter na `start`, na tumuturo sa index, simula kung saan bibigyan kami ng 10 profile (default = 0) mula sa buong resulta ng paghahanap. Sa madaling salita, sa pamamagitan ng pagdaragdag nito ng 10 pagkatapos ng bawat kahilingan, nakukuha namin ang karaniwang page-by-page na output, 10 profile sa isang pagkakataon.

Sa yugtong ito mayroon akong sapat na data at kalayaan upang magpatuloy sa paggawa sa proyekto ng alagang hayop. Ngunit magiging kasalanan kung hindi subukang ipakita ang data na ito sa mismong lugar, dahil nasa kamay na ito. Hindi kami pupunta sa Ember, na ginagamit sa harap. Ang jQuery ay konektado sa site, at sa paghukay ng kaalaman sa pangunahing syntax sa memorya, maaari mong gawin ang sumusunod sa loob ng ilang minuto.

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="/tl/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="/tl/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;

Kung gagawin mo ito nang direkta sa console sa page ng paghahanap, magdaragdag ito ng button na naglo-load ng 10 bagong profile sa bawat pag-click at ire-render ang mga ito sa isang listahan. Siyempre, baguhin ang token at URL sa kinakailangang isa bago ito gawin. Ang profile block ay maglalaman ng pangalan, posisyon, lokasyon, link sa profile at isang placeholder na imahe.

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Konklusyon

Kaya, sa kaunting pagsisikap, nahanap namin ang mahinang lugar at nabawi ang aming paghahanap nang walang mga paghihigpit. Ito ay sapat na upang pag-aralan ang data at ang landas nito, tingnan ang kahilingan mismo.

Hindi ko masasabi na ito ay isang seryosong problema para sa LinkedIn, dahil hindi ito nagbibigay ng anumang banta. Ang maximum ay nawawalang kita dahil sa naturang "mga workaround", na nagpapahintulot sa iyo na maiwasan ang pagbabayad para sa premium. Marahil ang ganoong tugon mula sa server ay kinakailangan para sa tamang operasyon ng iba pang mga bahagi ng site, o ito ay simpleng katamaran ng mga developer at isang kakulangan ng mga mapagkukunan na hindi nagpapahintulot na magawa ito nang maayos. (Ang limitasyon ay lumitaw noong Enero 2015; bago ito ay walang limitasyon).

PS

Naturally, ang jQuery code ay isang medyo primitive na halimbawa ng mga kakayahan. Sa ngayon ay nakagawa ako ng extension ng browser upang umangkop sa aking mga pangangailangan. Nagdaragdag ito ng mga control button at nagre-render ng buong profile na may mga larawan, isang button ng imbitasyon at mga pangkalahatang koneksyon. Dagdag pa, dynamic itong nangongolekta ng mga filter para sa mga lokasyon, kumpanya, at iba pang bagay, at kumukuha ng token mula sa cookies. Kaya hindi na kailangang mag-hardcode ng kahit ano. Well, nagdaragdag ito ng mga karagdagang field ng setting, a la "kung gaano karaming mga profile ang hihilingin sa isang pagkakataon, hanggang 49."

Paglampas sa limitasyon sa paghahanap ng LinkedIn sa pamamagitan ng paglalaro sa API

Ginagawa ko pa rin ang karagdagan na ito at plano kong ilabas ito sa publiko. Sumulat kung interesado ka.

Pinagmulan: www.habr.com

Magdagdag ng komento