Ngaliwatan wates milarian LinkedIn ku maén sareng API

Ngawatesan

Aya watesan sapertos di LinkedIn - wates pamakéan komérsial. Kamungkinan pisan anjeun, sapertos kuring dugi ka ayeuna, teu acan kantos mendakan atanapi nguping perkawis éta.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Intina watesna nyaéta upami anjeun sering sering milarian jalma di luar kontak anjeun (teu aya métrik anu pasti, algoritma mutuskeun dumasar kana tindakan anjeun - sabaraha sering sareng sabaraha anjeun milarian, nambihan jalma), teras hasil pamilarian. bakal diwatesan ku tilu propil, tinimbang 1000 (standar 100 kaca, 10 propil per kaca). Watesan direset dina awal unggal bulan. Alami, akun premium teu boga watesan ieu.

Tapi teu lami pisan, pikeun proyék piaraan, kuring mimiti maénkeun pisan sareng milarian LinkedIn sareng ujug-ujug ngagaduhan watesan ieu. Alami, kuring henteu resep pisan ieu, sabab kuring henteu nganggo éta pikeun tujuan komersil, janten panginten anu munggaran kuring nyaéta pikeun diajar watesan sareng nyobian ngurilingan éta.

[Hiji klarifikasi penting: bahan dina artikel dibere solely keur kaperluan informational jeung atikan. Panulis henteu ngadorong panggunaanana pikeun tujuan komérsial.]

Urang keur diajar masalah

Simkuring gaduh: tinimbang sapuluh propil kalawan pagination, pilarian mulih ukur tilu, nu satutasna blok kalawan "rekomendasi" akun premium diselapkeun jeung handap propil rumeuk jeung non-clickable.

Langsung, leungeun ngahontal kaluar ka konsol pamekar pikeun nempo ieu propil disumputkeun - sugan urang bisa miceun sababaraha gaya blurring, atawa nimba informasi tina blok di markup nu. Tapi, rada disangka, propil ieu ngan gambar placeholder tur euweuh informasi disimpen.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Oké, ayeuna hayu urang nempo tab Network jeung pariksa naha hasil teangan alternatif nu balik ngan tilu propil sabenerna jalan. Kami mendakan pamundut anu dipikaresep ku urang pikeun "/api/search/blend" sareng tingali résponna.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Propil asalna dina susunan `kaasup`, tapi geus aya 15 éntitas dina hal ieu, tilu kahiji di antarana mangrupakeun obyék kalawan informasi tambahan, unggal obyék ngandung informasi dina profil husus (contona, naha profil téh premium. ).

Ngaliwatan wates milarian LinkedIn ku maén sareng API

12 salajengna nyaéta propil nyata - hasil pamilarian, anu ngan ukur tilu anu bakal ditingalikeun ka kami. Sakumaha anjeun parantos tiasa nebak, éta ngan ukur anu nampi inpormasi tambahan (tilu objék munggaran). Salaku conto, upami anjeun nyandak jawaban tina profil tanpa wates, anjeun bakal nampi 28 éntitas - 10 objék kalayan tambahan. inpormasi sareng 18 profil.

Jawab pikeun profil tanpa watesNgaliwatan wates milarian LinkedIn ku maén sareng API
Ngaliwatan wates milarian LinkedIn ku maén sareng API

Naha langkung ti 10 profil sumping, sanaos persis 10 dipénta, sareng aranjeunna henteu ilubiung dina tampilan dina cara naon waé, bahkan dina halaman salajengna aranjeunna henteu - kuring henteu acan terang. Upami anjeun nganalisis URL pamundut, anjeun tiasa ningali yén cacah = 10 (sabaraha profil anu badé uih deui dina réspon, maksimal 49).

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Abdi bungah nampi komentar naon waé ngeunaan masalah ieu.

Hayu urang ékspérimén

Oke, hal anu paling penting ayeuna urang terang pasti nyaéta yén aya langkung seueur profil dina réspon tibatan anu nunjukkeun ka urang. Ieu ngandung harti urang bisa meunang leuwih data, sanajan wates. Hayu urang coba narik API sorangan, langsung ti konsol, maké dipulut.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Saperti nu diharapkeun, urang meunang kasalahan, 403. Ieu alatan kaamanan, didieu urang teu ngirim token CSRF (CSRF dina Wikipedia. Dina nutshell, token unik ditambahkeun kana unggal pamundut, nu dipariksa dina server pikeun kaaslian).

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Éta tiasa ditiron tina pamundut anu suksés atanapi tina cookies, dimana éta disimpen dina kolom 'JSESSIONID'.

Dimana manggihan tokenLulugu pamundut séjén:

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Atawa tina cookies, langsung ngaliwatan konsol:

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Hayu urang cobian deui, waktos ieu urang lulus setélan pikeun dipulut, dimana urang nangtukeun csrf-token urang salaku parameter dina lulugu.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Suksés, kami nampi sadaya 10 profil. :tada:

Kusabab bédana header, struktur résponna rada béda ti anu ditampi dina pamundut aslina. Anjeun tiasa kéngingkeun struktur anu sami upami anjeun nambihan 'Tampa: 'application/vnd.linkedin.normalized+json+2.1' kana obyék urang, gigireun token csrf.
Conto réspon kalayan tambahan luluguNgaliwatan wates milarian LinkedIn ku maén sareng API

Leuwih lengkep ngeunaan lulugu Tampa

Naon saterusna?

Teras anjeun tiasa ngédit (sacara manual atanapi ngajadikeun otomatis) parameter `start`, nunjuk kana indéks, mimitian ti mana kami bakal dibéré 10 profil (standar = 0) tina sakabéh hasil pamilarian. Dina basa sejen, ku incrementing eta ku 10 sanggeus unggal pamundut, urang meunang kaluaran kaca-demi-halaman dawam, 10 profil dina hiji waktu.

Dina tahap ieu kuring kungsi cukup data jeung kabebasan neruskeun gawe dina proyék piaraan. Tapi éta bakal éra henteu nyobian nampilkeun data ieu langsung di tempat, sabab éta parantos aya. Kami moal lebet kana Ember, anu dianggo di payun. jQuery disambungkeun ka loka, sarta sanggeus ngali kaluar pangaweruh sintaksis dasar dina mémori, anjeun bisa nyieun handap dina sababaraha 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="/su/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="/su/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;

Upami anjeun ngalakukeun ieu langsung dina konsol dina halaman panéangan, éta bakal nambihan tombol anu ngamuat 10 propil énggal sareng unggal klik sareng ngajantenkeun kana daptar. Tangtosna, robih token sareng URL kana anu diperyogikeun sateuacan ngalakukeun ieu. Blok profil bakal ngandung nami, posisi, lokasi, tautan kana profil sareng gambar pananda tempat.

Ngaliwatan wates milarian LinkedIn ku maén sareng API

kacindekan

Ku kituna, kalayan usaha minimal, urang bisa manggihan titik lemah tur meunangkeun deui pilarian kami tanpa larangan. Ieu cukup pikeun nganalisis data jeung jalur na, kasampak kana pamundut sorangan.

Kuring teu bisa disebutkeun yen ieu masalah serius pikeun LinkedIn, sabab teu pasang aksi anceman nanaon. Maksimum ieu leungit kauntungan alatan "workarounds" misalna, nu ngidinan Anjeun pikeun nyingkahan Mayar pikeun premium. Panginten réspon sapertos kitu ti server dipikabutuh pikeun operasi anu leres tina bagian-bagian sanés situs, atanapi éta ngan saukur kedul para pamekar sareng kakurangan sumber anu henteu ngamungkinkeun éta dilakukeun ogé. (Watesan muncul dina Januari 2015; sateuacan ieu teu aya watesna).

PS

Alami, kodeu jQuery mangrupakeun conto rada primitif tina kamampuhan. Di momen kuring geus dijieun extension browser pikeun nyocogkeun ka kabutuhan kuring. Éta nambihan tombol kontrol sareng ngajantenkeun profil lengkep sareng gambar, tombol uleman sareng sambungan umum. Tambih Deui, éta dinamis ngumpulkeun saringan pikeun lokasi, pausahaan, jeung hal séjén, sarta retrieves token tina cookies. Jadi teu perlu hardcode nanaon deui. Nya, éta nambihan widang setélan tambahan, a la "sabaraha profil anu dipénta sakaligus, dugi ka 49."

Ngaliwatan wates milarian LinkedIn ku maén sareng API

Kuring masih ngusahakeun tambahan ieu sareng ngarencanakeun pikeun ngaleupaskeun ka umum. Tulis lamun kabetot.

sumber: www.habr.com

Tambahkeun komentar