API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Хязгаарлалт

LinkedIn дээр ийм хязгаарлалт байдаг - Арилжааны хэрэглээний хязгаар. Саяхан болтол та над шиг ийм зүйлтэй таарч, сонсож байгаагүй байх.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Хязгаарын мөн чанар нь хэрэв та өөрийн харилцагчдаас гадуур хүмүүсийг хайхыг хэт олон удаа ашигладаг бол (яг тодорхой хэмжүүр байхгүй, алгоритм нь таны үйлдлээс хамаарч шийддэг - та хэр олон удаа, хэр их хайсан, хүмүүсийг нэмсэн) хайлтын үр дүн юм. 1000 биш харин гурван профайлаар хязгаарлагдах болно (өгөгдмөл 100 хуудас, нэг хуудсанд 10 профайл). Хязгаарыг сар бүрийн эхээр шинэчилдэг. Байгалийн, Дээд зэрэглэлийн дансанд ийм хязгаарлалт байхгүй.

Гэвч удалгүй гэрийн тэжээвэр амьтдын төслийн хувьд би LinkedIn хайлтаар маш их тоглож эхэлсэн бөгөөд гэнэт энэ хязгаарлалттай болсон. Угаасаа энэ нь надад тийм ч их таалагдаагүй, яагаад гэвэл би үүнийг ямар нэгэн арилжааны зорилгоор ашиглаагүй учраас хамгийн түрүүнд хязгаарлалтыг судалж, түүнийг тойрч гарахыг хичээсэн.

[Чухал тодруулга: нийтлэл дэх материалыг зөвхөн мэдээллийн болон боловсролын зорилгоор танилцуулсан болно. Зохиогч нь тэдгээрийг арилжааны зорилгоор ашиглахыг дэмждэггүй.]

Бид асуудлыг судалж байна

Бидэнд байна: хуудаслалт бүхий арван профайлын оронд хайлт нь зөвхөн гурвыг нь буцаадаг бөгөөд үүний дараа дээд зэрэглэлийн дансны "зөвлөмж" бүхий блокыг оруулсан бөгөөд доор нь бүдэг ба товших боломжгүй профайлууд байна.

Нэн даруй, гар нь хөгжүүлэгчийн консол руу хүрч, эдгээр далд профайлыг харах болно - магадгүй бид бүдгэрүүлсэн хэв маягийг арилгах эсвэл тэмдэглэгээний блокоос мэдээллийг гаргаж авах боломжтой. Гэхдээ эдгээр профайл нь зүгээр л байх болно гэж найдаж байна орлуулагчийн зургууд мөн ямар ч мэдээлэл хадгалагдахгүй.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

За, одоо Сүлжээний табыг харцгаая, зөвхөн гурван профайл буцаах өөр хайлтын үр дүн ажиллаж байгаа эсэхийг шалгацгаая. Бид сонирхож буй "/api/search/blended" хүсэлтийг олж, хариултыг харна уу.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Профайлууд нь `хамааруулсан` массиваар ирдэг боловч үүнд аль хэдийн 15 нэгж байна. Энэ тохиолдолд эхний гурав нь нэмэлт мэдээлэл бүхий объектууд бөгөөд объект бүр нь тодорхой профайлын талаарх мэдээллийг агуулна (жишээлбэл, профайл нь дээд зэрэглэлийн эсэх). ).

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Дараагийн 12 нь жинхэнэ профайл - хайлтын үр дүн бөгөөд үүнээс зөвхөн гурвыг нь бидэнд харуулах болно. Та аль хэдийн таамаглаж байгаачлан энэ нь зөвхөн нэмэлт мэдээлэл хүлээн авсан хүмүүсийг (эхний гурван объект) харуулдаг. Жишээлбэл, хэрэв та профайлаас хариултыг хязгааргүй авбал 28 нэгж - нэмэлттэй 10 объект хүлээн авах болно. мэдээлэл болон 18 профайл.

Хязгааргүй профайлын хариултAPI-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах
API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Яагаад 10-аас дээш профайл ирдэг боловч яг 10-ыг нь хүссэн боловч дэлгэцэнд ямар ч байдлаар оролцдоггүй, дараагийн хуудсанд ч оролцохгүй - би хараахан мэдэхгүй байна. Хэрэв та хүсэлтийн URL-д дүн шинжилгээ хийвэл тоо=10 (хариултанд хэдэн профайл буцаах вэ, дээд тал нь 49) байгааг харж болно.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Энэ талаар ямар нэгэн сэтгэгдлийг хүлээж авахдаа баяртай байх болно.

Туршилт хийцгээе

За, бидний одоо баттай мэдэж байгаа хамгийн чухал зүйл бол хариултанд бидэнд харуулахаас илүү олон профайл байгаа явдал юм. Энэ нь бид хязгаарыг үл харгалзан илүү их мэдээлэл авах боломжтой гэсэн үг юм. Fetch ашиглан API-г өөрсдөө консолоос шууд татахыг хичээцгээе.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Бид таамаглаж байсанчлан 403 гэсэн алдаа гарлаа. Энэ нь аюулгүй байдлын улмаас байгаа тул энд бид CSRF жетон илгээхгүй байна (Википедиа дээрх CSRF. Товчхондоо хүсэлт бүрт өвөрмөц жетон нэмсэн бөгөөд энэ нь сервер дээр жинхэнэ эсэхийг шалгадаг).

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Үүнийг бусад амжилттай хүсэлтээс эсвэл 'JSESSIONID' талбарт хадгалагдсан күүкигээс хуулж болно.

Токеныг хаанаас олох вэӨөр хүсэлтийн толгой хэсэг:

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Эсвэл күүкигээс шууд консолоор дамжуулан:

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Дахин оролдоод үзье, энэ удаад бид csrf-токеныг толгой хэсэгт параметр болгон зааж өгөх тохиргоог хийв.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Амжилттай, бид бүх 10 профайлыг хүлээн авдаг. :тада:

Гарчигуудын ялгаатай байдлаас шалтгаалан хариултын бүтэц нь анхны хүсэлтэд хүлээн авсан зүйлээс арай өөр байна. Хэрэв та csrf токены хажууд 'Accept: 'application/vnd.linkedin.normalized+json+2.1'-г манай объект дээр нэмбэл ижил бүтэцтэй болно.
Толгой хэсгийг нэмсэн хариултын жишээAPI-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Зөвшөөрөх толгой хэсгийн талаар дэлгэрэнгүй

Дараа нь юу юм бэ?

Дараа нь та "эхлэх" параметрийг индекс рүү чиглүүлэн засварлаж (гараар эсвэл автоматжуулах) боломжтой бөгөөд үүнээс эхлэн бид хайлтын бүх үр дүнгээс 10 профайл (анхдагч = 0) өгөх болно. Өөрөөр хэлбэл, хүсэлт бүрийн дараа 10-аар нэмэгдүүлснээр бид ердийн хуудасны гаралтыг, нэг удаад 10 профайлыг авдаг.

Энэ үе шатанд би гэрийн тэжээмэл амьтны төсөл дээр үргэлжлүүлэн ажиллах хангалттай мэдээлэл, эрх чөлөөтэй байсан. Гэхдээ энэ мэдээлэл аль хэдийн бэлэн байсан тул газар дээр нь харуулахыг оролдохгүй байх нь нүгэл болно. Бид урд талд хэрэглэгддэг Ember руу орохгүй. jQuery нь сайтад холбогдсон бөгөөд санах ойн үндсэн синтаксийн мэдлэгийг ухаж авснаар та хэдхэн минутын дотор дараах зүйлийг үүсгэж болно.

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

Хэрэв та үүнийг хайлтын хуудсан дээрх консол дээр шууд хийвэл товшилт бүрт 10 шинэ профайлыг ачаалж, жагсаалтад оруулах товчлуур нэмэгдэх болно. Мэдээжийн хэрэг, үүнийг хийхээсээ өмнө токен болон URL-г шаардлагатай болгон өөрчил. Профайл блок нь нэр, албан тушаал, байршил, профайл руу холбох холбоос болон орлуулагчийн зургийг агуулна.

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

дүгнэлт

Тиймээс бид хамгийн бага хүчин чармайлтаар сул талыг олж, хайлтаа хязгаарлалтгүйгээр сэргээж чадсан. Өгөгдөл, түүний замд дүн шинжилгээ хийх, хүсэлтийг өөрөө үзэхэд хангалттай байсан.

Энэ нь LinkedIn-ийн хувьд ноцтой асуудал гэж би хэлж чадахгүй, учир нь энэ нь ямар ч аюул занал учруулахгүй. Хамгийн дээд тал нь ийм "шаардлага" -аас болж алдагдсан ашиг бөгөөд энэ нь шимтгэл төлөхөөс зайлсхийх боломжийг олгодог. Магадгүй ийм серверийн хариу үйлдэл нь сайтын бусад хэсгүүдийг зөв ажиллуулахад шаардлагатай байж болох юм, эсвэл зүгээр л хөгжүүлэгчдийн залхуурал, нөөцийн хомсдол нь үүнийг сайн хийх боломжийг олгодоггүй. (Хязгаарлалт 2015 оны XNUMX-р сард гарсан; үүнээс өмнө хязгаарлалт байгаагүй).

PS

Мэдээжийн хэрэг, jQuery код нь боломжуудын нэлээд энгийн жишээ юм. Одоогоор би өөрийн хэрэгцээнд нийцүүлэн хөтөчийн өргөтгөл үүсгэсэн. Энэ нь хяналтын товчлууруудыг нэмж, зураг, урилга товч, ерөнхий холболттой профайлыг бүрэн хэмжээгээр гаргадаг. Нэмж дурдахад, энэ нь байршил, компани болон бусад зүйлсийн шүүлтүүрийг динамикаар цуглуулж, күүкигээс жетон авдаг. Тиймээс ямар ч зүйлийг хатуу кодлох шаардлагагүй болсон. Энэ нь нэмэлт тохиргооны талбаруудыг нэмж, "нэг удаад хэдэн профайл хүсэх вэ, 49 хүртэл".

API-тай тоглох замаар LinkedIn-ийн хайлтын хязгаарыг алгасах

Би энэ нэмэлт дээр ажиллаж байгаа бөгөөд олон нийтэд хүргэхээр төлөвлөж байна. Сонирхож байвал бичээрэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх