Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Watesan

Ana watesan kaya ing LinkedIn - watesan panggunaan komersial. Mesthi wae sampeyan, kaya aku nganti saiki, durung nate nemoni utawa krungu.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Inti saka watesan yaiku yen sampeyan kerep nggunakake panelusuran kanggo wong ing njaba kontak sampeyan (ora ana metrik sing tepat, algoritma mutusake adhedhasar tumindak sampeyan - sepira kerepe lan sepira sampeyan nggoleki, nambahake wong), banjur asil panelusuran bakal diwatesi dadi telung profil, tinimbang 1000 (standar 100 kaca, 10 profil saben kaca). Watesan direset ing awal saben sasi. lumrahe, akun premium ora duwe watesan iki.

Nanging durung suwe, kanggo proyek pet, aku wiwit main akeh karo telusuran LinkedIn lan dumadakan entuk watesan iki. Mesthine, aku ora seneng banget, amarga aku ora nggunakake kanggo tujuan komersial, mula pikiranku pisanan yaiku sinau babagan watesan lan nyoba ngubengi.

[Klarifikasi penting: materi ing artikel kasebut mung kanggo tujuan informasi lan pendidikan. Penulis ora nyengkuyung panggunaan kanggo tujuan komersial.]

Kita sinau masalah kasebut

Kita duwe: tinimbang sepuluh profil kanthi pagination, telusuran mung ngasilake telung, sawise blok karo "rekomendasi" akun premium dilebokake lan ing ngisor iki ana profil sing surem lan ora bisa diklik.

Langsung, tangan tekan metu kanggo console pangembang kanggo ndeleng iki profil didhelikake - mbok menawa kita bisa mbusak sawetara gaya burem, utawa extract informasi saka blok ing markup. Nanging, cukup samesthine, profil iki mung gambar placeholder lan ora ana informasi sing disimpen.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Oke, saiki ayo goleki tab Jaringan lan priksa manawa asil telusuran alternatif sing mung ngasilake telung profil sing bener. Kita nemokake panjaluk sing dikarepake kanggo "/api/search/blend" lan deleng respon.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Profil teka ing array `kalebu`, nanging wis ana entitas 15. Ing kasus iki, telu sing pisanan minangka obyek kanthi informasi tambahan, saben obyek ngemot informasi babagan profil tartamtu (contone, apa profil kasebut premium. ).

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

12 sabanjure minangka profil nyata - asil telusuran, sing mung telu bakal ditampilake kanggo kita. Nalika sampeyan wis bisa guess, nuduhake mung sing nampa informasi tambahan (telu obyek pisanan). Contone, yen sampeyan njupuk jawaban saka profil tanpa watesan, sampeyan bakal nampa 28 entitas - 10 obyek karo tambahan. informasi lan 18 profil.

Jawaban kanggo profil tanpa watesanNglewati watesan panelusuran LinkedIn kanthi muter karo API
Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Napa luwih saka 10 profil teka, sanajan persis 10 dijaluk, lan dheweke ora melu tampilan kanthi cara apa wae, sanajan ing kaca sabanjure ora bakal ana - aku durung ngerti. Yen sampeyan nganalisa URL panyuwunan, sampeyan bisa ndeleng sing count = 10 (pinten profil bali ing respon, maksimum 49).

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Aku bakal seneng nampa komentar babagan perkara iki.

Ayo eksperimen

Oke, sing paling penting saiki kita ngerti manawa ana luwih akeh profil ing respon tinimbang sing dituduhake. Iki tegese kita bisa entuk luwih akeh data, sanajan ana watesan. Ayo nyoba narik API dhewe, langsung saka konsol, nggunakake fetch.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Kaya sing dikarepake, kita entuk kesalahan, 403. Iki amarga keamanan, ing kene kita ora ngirim token CSRF (CSRF ing Wikipedia. Cekakipun, token unik ditambahake ing saben panjalukan, sing dicenthang ing server kanggo keasliane).

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Bisa disalin saka panjalukan liyane sing sukses utawa saka cookie, sing disimpen ing kolom 'JSESSIONID'.

Where kanggo nemokake tokenHeader saka panjalukan liyane:

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Utawa saka cookie, langsung liwat console:

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Coba maneh, wektu iki kita ngliwati setelan kanggo njupuk, ing ngendi kita nemtokake csrf-token minangka parameter ing header.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Sukses, kita nampa kabeh 10 profil. :tada:

Amarga bedane header, struktur respon rada beda karo sing ditampa ing panyuwunan asli. Sampeyan bisa entuk struktur sing padha yen sampeyan nambahake 'Nampa: 'application/vnd.linkedin.normalized+json+2.1' kanggo obyek kita, jejere token csrf.
Tuladha tanggapan kanthi tambahan headerNglewati watesan panelusuran LinkedIn kanthi muter karo API

Luwih lengkap babagan header Nampa

Apa sabanjurΓ©?

Banjur sampeyan bisa ngowahi (kanthi manual utawa ngotomatisasi) parameter `miwiti`, nuding menyang indeks, wiwit saka ngendi kita bakal diwenehi 10 profil (standar = 0) saka kabeh asil panelusuran. Kanthi tembung liyane, kanthi nambah 10 sawise saben panyuwunan, kita entuk output kaca saben kaca, 10 profil sekaligus.

Ing tataran iki, aku duwe cukup data lan kebebasan kanggo terus nggarap proyek pet. Nanging bakal dadi dosa yen ora nyoba nampilake data kasebut langsung ing papan kasebut, amarga wis ana. Kita ora bakal pindhah menyang Ember, sing digunakake ing ngarep. jQuery disambungake menyang situs, lan wis ndudhuk metu kawruh sintaks dhasar ing memori, sampeyan bisa nggawe ing ngisor iki ing sawetara menit.

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

Yen sampeyan nindakake iki langsung ing console ing kaca telusuran, bakal nambah tombol sing ngemot 10 profil anyar saben klik lan nggawe ing dhaptar. Mesthi wae, ganti token lan URL menyang sing dibutuhake sadurunge nindakake iki. Blok profil bakal ngemot jeneng, posisi, lokasi, link menyang profil lan gambar placeholder.

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

kesimpulan

Mangkono, kanthi minimal gaweyan, kita bisa nemokake titik sing lemah lan entuk maneh panelusuran tanpa watesan. Cukup kanggo nganalisa data lan dalane, goleki panjaluk kasebut.

Aku ora bisa ngomong yen iki minangka masalah serius kanggo LinkedIn, amarga ora nyebabake ancaman. Maksimum wis ilang MediaWiki amarga kuwi "workarounds", sing ngijini sampeyan kanggo supaya mbayar premium. Mbok menawa respon server kasebut perlu kanggo operasi sing bener ing bagean liya saka situs kasebut, utawa mung kesed para pangembang lan kekurangan sumber daya sing ora ngidini supaya bisa ditindakake kanthi apik. (Watesan kasebut muncul ing Januari 2015; sadurunge iki ora ana watesan).

PS

Mesthi, kode jQuery minangka conto kemampuan sing rada primitif. Ing wayahe aku wis nggawe extension browser sing cocog karo kabutuhan. Nambahake tombol kontrol lan nggawe profil lengkap karo gambar, tombol undhangan lan sambungan umum. Kajaba iku, kanthi dinamis nglumpukake saringan kanggo lokasi, perusahaan, lan liya-liyane, lan njupuk token saka cookie. Dadi ora perlu hardcode apa-apa maneh. Inggih, nambah lapangan setelan tambahan, a la "pinten profil kanggo njaluk ing wektu, nganti 49."

Nglewati watesan panelusuran LinkedIn kanthi muter karo API

Aku isih nggarap tambahan iki lan rencana bakal diluncurake menyang publik. Tulis yen sampeyan kasengsem.

Source: www.habr.com

Add a comment