دور زدن محدودیت جستجوی لینکدین با بازی با API

حد

چنین محدودیتی در لینکدین وجود دارد - محدودیت استفاده تجاری. بسیار محتمل است که شما، مانند من تا همین اواخر، هرگز با آن برخورد نکرده باشید یا در مورد آن چیزی نشنیده باشید.

دور زدن محدودیت جستجوی لینکدین با بازی با API

ماهیت محدودیت این است که اگر اغلب از جستجوی افراد خارج از مخاطبین خود استفاده می کنید (هیچ معیار دقیقی وجود ندارد، الگوریتم بر اساس اقدامات شما تصمیم می گیرد - چند وقت یکبار و چقدر جستجو کرده اید، افراد را اضافه کرده اید)، سپس نتیجه جستجو به جای 1000 (100 صفحه پیش فرض، 10 نمایه در هر صفحه) به سه نمایه محدود می شود. محدودیت در ابتدای هر ماه بازنشانی می شود. به طور طبیعی، حساب های پریمیوم این محدودیت را ندارند.

اما چندی پیش، برای یک پروژه حیوان خانگی، شروع به بازی زیاد با جستجوی لینکدین کردم و ناگهان به این محدودیت رسیدم. طبیعتاً من این را خیلی دوست نداشتم، زیرا از آن برای اهداف تجاری استفاده نمی کردم، بنابراین اولین فکرم مطالعه محدودیت و تلاش برای دور زدن آن بود.

[یک توضیح مهم: مطالب موجود در مقاله صرفاً برای اهداف اطلاعاتی و آموزشی ارائه شده است. نویسنده استفاده از آنها را برای مقاصد تجاری تشویق نمی کند.]

ما در حال مطالعه مشکل هستیم

ما داریم: به جای ده نمایه با صفحه بندی، جستجو فقط سه نمایه را برمی گرداند، پس از آن یک بلوک با "توصیه" یک حساب پریمیوم درج می شود و در زیر نمایه های تار و غیرقابل کلیک وجود دارد.

بلافاصله، دست به سمت کنسول توسعه‌دهنده می‌رود تا به این پروفایل‌های پنهان نگاه کند - شاید بتوانیم برخی از سبک‌های تار را حذف کنیم یا اطلاعات را از یک بلوک در نشانه‌گذاری استخراج کنیم. اما، کاملاً انتظار می رود، این پروفایل ها فقط هستند تصاویر جایگیر و هیچ اطلاعاتی ذخیره نمی شود.

دور زدن محدودیت جستجوی لینکدین با بازی با API

خوب، حالا اجازه دهید به برگه Network نگاهی بیندازیم و بررسی کنیم که آیا نتایج جستجوی جایگزین که فقط سه نمایه را برمی‌گردانند واقعاً کار می‌کنند یا خیر. ما درخواست مورد نظر خود را برای "/api/search/blended" پیدا می کنیم و به پاسخ نگاه می کنیم.

دور زدن محدودیت جستجوی لینکدین با بازی با API

نمایه‌ها در یک آرایه «شامل» قرار می‌گیرند، اما در حال حاضر 15 موجودیت در آن وجود دارد. در این مورد، سه مورد اول آن‌ها اشیایی با اطلاعات اضافی هستند، هر شی حاوی اطلاعاتی در یک نمایه خاص است (مثلاً اینکه آیا نمایه ممتاز است یا خیر. ).

دور زدن محدودیت جستجوی لینکدین با بازی با API

12 مورد بعدی نمایه های واقعی هستند - نتایج جستجو که تنها سه مورد از آنها به ما نشان داده می شود. همانطور که قبلاً می توانید حدس بزنید، فقط کسانی را نشان می دهد که اطلاعات اضافی دریافت می کنند (سه شی اول). به عنوان مثال، اگر پاسخ را از یک نمایه بدون محدودیت بگیرید، 28 موجودیت - 10 شی با اضافی دریافت خواهید کرد. اطلاعات و 18 پروفایل.

پاسخ برای پروفایل بدون محدودیتدور زدن محدودیت جستجوی لینکدین با بازی با API
دور زدن محدودیت جستجوی لینکدین با بازی با API

چرا بیش از 10 نمایه وارد می شود ، اگرچه دقیقاً 10 مورد درخواست شده است ، و آنها به هیچ وجه در نمایش شرکت نمی کنند ، حتی در صفحه بعدی نیز نخواهند بود - هنوز نمی دانم. اگر URL درخواست را تجزیه و تحلیل کنید، می توانید تعداد = 10 را ببینید (چند نمایه باید در پاسخ بازگردانده شود، حداکثر 49).

دور زدن محدودیت جستجوی لینکدین با بازی با API

خوشحال می شوم هر گونه نظری در این مورد دریافت کنم.

بیایید آزمایش کنیم

بسیار خوب، مهمترین چیزی که اکنون به طور قطع می دانیم این است که پروفایل های بیشتری از آنچه به ما نشان می دهند در پاسخ وجود دارد. این بدان معناست که علیرغم محدودیت، می توانیم داده های بیشتری دریافت کنیم. بیایید سعی کنیم API را خودمان، مستقیماً از کنسول، با استفاده از fetch بکشیم.

دور زدن محدودیت جستجوی لینکدین با بازی با API

همانطور که انتظار می رفت، یک خطا دریافت می کنیم، 403. این به دلیل امنیت است، در اینجا ما یک توکن CSRF ارسال نمی کنیم (CSRF در ویکی پدیا. به طور خلاصه، یک توکن منحصر به فرد به هر درخواست اضافه می شود که صحت آن در سرور بررسی می شود.

دور زدن محدودیت جستجوی لینکدین با بازی با API

می توان آن را از هر درخواست موفق دیگری یا از کوکی ها کپی کرد، جایی که در قسمت "JSESSIONID" ذخیره می شود.

رمز را از کجا پیدا کنیمسر یک درخواست دیگر:

دور زدن محدودیت جستجوی لینکدین با بازی با API

یا از کوکی ها، مستقیماً از طریق کنسول:

دور زدن محدودیت جستجوی لینکدین با بازی با API

بیایید دوباره امتحان کنیم، این بار تنظیمات را به fetch می‌دهیم که در آن توکن csrf خود را به عنوان پارامتر در هدر مشخص می‌کنیم.

دور زدن محدودیت جستجوی لینکدین با بازی با API

موفق باشید، ما هر 10 نمایه را دریافت می کنیم. :tada:

به دلیل تفاوت در هدرها، ساختار پاسخ کمی با آنچه در درخواست اصلی دریافت می شود متفاوت است. اگر «Accept: 'application/vnd.linkedin.normalized+json+2.1' را به شیء ما، در کنار توکن csrf اضافه کنید، می توانید همان ساختار را دریافت کنید.
پاسخ نمونه با هدر اضافه شدهدور زدن محدودیت جستجوی لینکدین با بازی با API

اطلاعات بیشتر در مورد هدر Accept

گام بعدی چیست؟

سپس می‌توانید پارامتر «شروع» را ویرایش کنید (به‌صورت دستی یا خودکار)، با اشاره به ایندکس، که از آن 10 نمایه (پیش‌فرض = 0) از کل نتیجه جستجو به ما داده می‌شود. به عبارت دیگر، با 10 افزایش آن پس از هر درخواست، خروجی معمول صفحه به صفحه، یعنی 10 پروفایل را در هر بار دریافت می کنیم.

در این مرحله من اطلاعات و آزادی کافی برای ادامه کار روی پروژه حیوان خانگی داشتم. اما این گناه بود که سعی نکنیم این داده ها را در محل نشان دهیم، زیرا قبلاً در دسترس بود. ما به Ember که در قسمت جلو استفاده می شود نمی رویم. 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="/fa/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="/fa/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

نتیجه

بنابراین، با حداقل تلاش، توانستیم نقطه ضعف را پیدا کنیم و جستجوی خود را بدون محدودیت دوباره به دست آوریم. کافی بود داده ها و مسیر آن را تجزیه و تحلیل کنید، خود درخواست را بررسی کنید.

نمی توانم بگویم که این یک مشکل جدی برای لینکدین است، زیرا هیچ تهدیدی ایجاد نمی کند. حداکثر سود از دست رفته به دلیل چنین "راه حل هایی" است که به شما امکان می دهد از پرداخت حق بیمه خودداری کنید. شاید چنین پاسخ سروری برای عملکرد صحیح سایر قسمت های سایت ضروری باشد یا صرفا تنبلی توسعه دهندگان و کمبود منابع باشد که اجازه نمی دهد به خوبی انجام شود. (محدودیت در ژانویه 2015 ظاهر شد؛ قبل از این محدودیتی وجود نداشت).

PS

به طور طبیعی، کد jQuery یک نمونه نسبتاً ابتدایی از قابلیت ها است. در حال حاضر من یک افزونه مرورگر را متناسب با نیاز خود ایجاد کرده ام. دکمه های کنترلی را اضافه می کند و نمایه های کامل را با تصاویر، یک دکمه دعوت و اتصالات کلی ارائه می کند. به علاوه، به صورت پویا فیلترها را برای مکان‌ها، شرکت‌ها و موارد دیگر جمع‌آوری می‌کند و یک رمز را از کوکی‌ها بازیابی می‌کند. بنابراین دیگر نیازی به هاردکد کردن چیزی نیست. خوب، فیلدهای تنظیمات اضافی را اضافه می کند، به عنوان "تعداد نمایه در یک زمان درخواست شود، تا 49."

دور زدن محدودیت جستجوی لینکدین با بازی با API

من هنوز روی این اضافه کار می کنم و قصد دارم آن را برای عموم منتشر کنم. اگر علاقه دارید بنویسید

منبع: www.habr.com

اضافه کردن نظر