API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Cheklov

LinkedIn-da bunday cheklov mavjud - Tijoriy foydalanish chegarasi. Ehtimol, siz ham, men kabi, yaqin vaqtgacha buni hech qachon uchratmagan yoki eshitmagansiz.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Cheklovning mohiyati shundaki, agar siz kontaktlaringizdan tashqaridagi odamlarni qidirishdan juda tez-tez foydalansangiz (aniq ko'rsatkichlar yo'q, algoritm sizning harakatlaringiz asosida qaror qiladi - qanchalik tez-tez va qancha qidirganingiz, odamlarni qo'shganingiz), keyin qidiruv natijasi 1000 o'rniga uchta profil bilan cheklanadi (standart 100 sahifa, har bir sahifaga 10 profil). Limit har oyning boshida tiklanadi. Tabiiyki, premium hisoblarda bu cheklov yo'q.

Ammo yaqinda uy hayvonlari loyihasi uchun men LinkedIn qidiruvi bilan ko'p o'ynay boshladim va to'satdan bu cheklovni oldim. Tabiiyki, bu menga unchalik yoqmadi, chunki men undan hech qanday tijorat maqsadlarida foydalanmaganman, shuning uchun birinchi o'ylaganim cheklovni o'rganish va undan chiqishga harakat qilish edi.

[Muhim tushuntirish: maqoladagi materiallar faqat ma'lumot va ta'lim maqsadlarida taqdim etilgan. Muallif ulardan tijorat maqsadlarida foydalanishni rag'batlantirmaydi.]

Biz muammoni o'rganmoqdamiz

Bizda bor: sahifalash bilan o'nta profil o'rniga, qidiruv faqat uchtasini qaytaradi, shundan so'ng premium hisob qaydnomasining "tavsiyalari" bo'lgan blok qo'shiladi va quyida loyqa va bosilmaydigan profillar mavjud.

Darhol, qo'l ushbu yashirin profillarni ko'rish uchun dasturchi konsoliga uzatiladi - ehtimol biz ba'zi xiralashgan uslublarni olib tashlashimiz yoki belgilashdagi blokdan ma'lumot olishimiz mumkin. Ammo, kutilgandek, bu profillar shunchaki to'ldiruvchi rasmlar va hech qanday ma'lumot saqlanmaydi.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Xo'sh, endi "Tarmoq" yorlig'ini ko'rib chiqamiz va faqat uchta profilni qaytaradigan muqobil qidiruv natijalari haqiqatan ham ishlayotganligini tekshiramiz. Biz β€œ/api/search/blended” uchun bizni qiziqtirgan soβ€˜rovni topamiz va javobga qaraymiz.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Profillar "qo'shilgan" massivda bo'ladi, lekin unda allaqachon 15 ta ob'ekt mavjud. Bu holda, ularning dastlabki uchtasi qo'shimcha ma'lumotga ega bo'lgan ob'ektlardir, har bir ob'ekt ma'lum bir profil haqida ma'lumotni o'z ichiga oladi (masalan, profil premiummi yoki yo'qmi). ).

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Keyingi 12 tasi haqiqiy profillar - qidiruv natijalari, ulardan faqat uchtasi bizga ko'rsatiladi. Siz allaqachon taxmin qilganingizdek, u faqat qo'shimcha ma'lumot olganlarni ko'rsatadi (birinchi uchta ob'ekt). Misol uchun, agar siz javobni cheksiz profildan olsangiz, siz 28 ta ob'ektni olasiz - qo'shimcha 10 ob'ekt. ma'lumot va 18 ta profil.

Cheksiz profil uchun javobAPI bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish
API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Nega 10 dan ortiq profil keladi, garchi aniq 10 tasi so'ralgan bo'lsa-da va ular hech qanday tarzda namoyishda qatnashmaydi, hatto keyingi sahifada ham ular bo'lmaydi - men hali bilmayman. Agar so'rov URL-manzilini tahlil qilsangiz, siz bu raqamni ko'rishingiz mumkin=10 (javobda qancha profil qaytarilishi kerak, maksimal 49).

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Men bu masala bo'yicha har qanday sharhni olishdan xursand bo'lardim.

Keling, tajriba qilaylik

Xo'sh, biz hozir aniq biladigan eng muhim narsa shundaki, javobda bizga ko'rsatganidan ko'ra ko'proq profillar mavjud. Bu chegaraga qaramay, ko'proq ma'lumot olishimiz mumkinligini anglatadi. Keling, fetch yordamida APIni o'zimiz to'g'ridan-to'g'ri konsoldan tortib olishga harakat qilaylik.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Kutilganidek, biz xatoga yo'l qo'ydik, 403. Bu xavfsizlik tufayli, bu erda biz CSRF tokenini yubormayapmiz (Vikipediyadagi CSRF. Xulosa qilib aytganda, har bir so'rovga serverda haqiqiyligi tekshiriladigan noyob token qo'shiladi).

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

U har qanday boshqa muvaffaqiyatli soΚ»rovdan yoki β€œJSESSIONID” maydonida saqlanadigan cookie-fayllardan koΚ»chirilishi mumkin.

Tokenni qayerdan topish mumkinBoshqa so'rovning sarlavhasi:

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Yoki cookie-fayllardan, to'g'ridan-to'g'ri konsol orqali:

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Keling, yana urinib ko'ramiz, bu safar biz olish uchun sozlamalarni o'tkazamiz, bunda biz sarlavhada parametr sifatida csrf-tokenimizni belgilaymiz.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Muvaffaqiyatli, biz barcha 10 ta profilni olamiz. :tada:

Sarlavhalardagi farq tufayli javobning tuzilishi asl so'rovda olinganidan biroz farq qiladi. Ob'ektimizga csrf tokeni yoniga "Qabul qilaman: 'application/vnd.linkedin.normalized+json+2.1" ni qo'shsangiz, xuddi shunday tuzilishga ega bo'lishingiz mumkin.
Sarlavha qo'shilgan javobga misolAPI bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Qabul qilish sarlavhasi haqida batafsil

Keyin nima?

Keyin indeksga ishora qilib, `start` parametrini tahrirlashingiz (qo'lda yoki avtomatlashtirishingiz) mumkin, shundan boshlab bizga butun qidiruv natijasidan 10 ta profil (standart = 0) beriladi. Boshqacha qilib aytadigan bo'lsak, har bir so'rovdan keyin uni 10 ga oshirib, biz bir vaqtning o'zida 10 ta profilga ega bo'lamiz.

Ushbu bosqichda menda uy hayvonlari loyihasi ustida ishlashni davom ettirish uchun etarli ma'lumotlar va erkinlik bor edi. Ammo bu ma'lumotlarni joyida ko'rsatishga urinmaslik gunoh bo'lar edi, chunki u allaqachon qo'lda edi. Biz old tomondan ishlatiladigan Emberga kirmaymiz. jQuery saytga ulangan va xotirada asosiy sintaksis bo'yicha bilimlarni qazib olib, siz bir necha daqiqada quyidagilarni yaratishingiz mumkin.

jQuery kodi

/* Ρ€Π΅Π½Π΄Π΅Ρ€ Π±Π»ΠΎΠΊΠ°, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ профиля ΠΈ вставляСм Π±Π»ΠΎΠΊ Π² список ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти Π΄Π°Π½Π½Ρ‹Π΅ */
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="/uz/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="/uz/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;

Agar siz buni to'g'ridan-to'g'ri qidiruv sahifasidagi konsolda qilsangiz, u har bir bosish bilan 10 ta yangi profilni yuklaydigan va ularni ro'yxatda ko'rsatadigan tugmani qo'shadi. Albatta, buni amalga oshirishdan oldin token va URL manzilini keraklisiga o'zgartiring. Profil blokida ism, joylashuv, joylashuv, profilga havola va joy ushlagich tasviri mavjud.

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

xulosa

Shunday qilib, biz minimal harakat bilan zaif nuqtani topdik va hech qanday cheklovlarsiz qidiruvimizni tikladik. Ma'lumotlar va uning yo'lini tahlil qilish, so'rovning o'ziga qarash kifoya edi.

Bu LinkedIn uchun jiddiy muammo deb ayta olmayman, chunki u hech qanday xavf tug'dirmaydi. Maksimal - bunday "vaqtinchalik echimlar" tufayli yo'qolgan foyda, bu sizga mukofotni to'lashdan qochish imkonini beradi. Ehtimol, bunday server javobi saytning boshqa qismlarining to'g'ri ishlashi uchun zarurdir yoki bu shunchaki ishlab chiquvchilarning dangasaligi va uni yaxshi bajarishga imkon bermaydigan resurslarning etishmasligi. (Cheklov 2015 yil yanvar oyida paydo bo'lgan; bundan oldin hech qanday cheklov yo'q edi).

PS

Tabiiyki, jQuery kodi imkoniyatlarning juda oddiy namunasidir. Ayni paytda men ehtiyojlarimga mos keladigan brauzer kengaytmasini yaratdim. U boshqaruv tugmalarini qo'shadi va rasmlar, taklifnoma tugmasi va umumiy ulanishlar bilan to'liq profillarni ko'rsatadi. Bundan tashqari, u joylar, kompaniyalar va boshqa narsalar uchun filtrlarni dinamik ravishda to'playdi va cookie-fayllardan token oladi. Shunday qilib, endi hech narsani qattiq kodlashning hojati yo'q. Xo'sh, u qo'shimcha sozlamalar maydonlarini qo'shadi, ya'ni "bir vaqtning o'zida qancha profil so'rash kerak, 49 tagacha."

API bilan o'ynash orqali LinkedIn qidiruv chegarasini chetlab o'tish

Men hali ham ushbu qo'shimcha ustida ishlayapman va uni ommaga taqdim etishni rejalashtirmoqdaman. Agar qiziqsangiz yozing.

Manba: www.habr.com

a Izoh qo'shish