چنین محدودیتی در لینکدین وجود دارد - محدودیت استفاده تجاری. بسیار محتمل است که شما، مانند من تا همین اواخر، هرگز با آن برخورد نکرده باشید یا در مورد آن چیزی نشنیده باشید.
ماهیت محدودیت این است که اگر اغلب از جستجوی افراد خارج از مخاطبین خود استفاده می کنید (هیچ معیار دقیقی وجود ندارد، الگوریتم بر اساس اقدامات شما تصمیم می گیرد - چند وقت یکبار و چقدر جستجو کرده اید، افراد را اضافه کرده اید)، سپس نتیجه جستجو به جای 1000 (100 صفحه پیش فرض، 10 نمایه در هر صفحه) به سه نمایه محدود می شود. محدودیت در ابتدای هر ماه بازنشانی می شود. به طور طبیعی، حساب های پریمیوم این محدودیت را ندارند.
اما چندی پیش، برای یک پروژه حیوان خانگی، شروع به بازی زیاد با جستجوی لینکدین کردم و ناگهان به این محدودیت رسیدم. طبیعتاً من این را خیلی دوست نداشتم، زیرا از آن برای اهداف تجاری استفاده نمی کردم، بنابراین اولین فکرم مطالعه محدودیت و تلاش برای دور زدن آن بود.
[یک توضیح مهم: مطالب موجود در مقاله صرفاً برای اهداف اطلاعاتی و آموزشی ارائه شده است. نویسنده استفاده از آنها را برای مقاصد تجاری تشویق نمی کند.]
ما در حال مطالعه مشکل هستیم
ما داریم: به جای ده نمایه با صفحه بندی، جستجو فقط سه نمایه را برمی گرداند، پس از آن یک بلوک با "توصیه" یک حساب پریمیوم درج می شود و در زیر نمایه های تار و غیرقابل کلیک وجود دارد.
بلافاصله، دست به سمت کنسول توسعهدهنده میرود تا به این پروفایلهای پنهان نگاه کند - شاید بتوانیم برخی از سبکهای تار را حذف کنیم یا اطلاعات را از یک بلوک در نشانهگذاری استخراج کنیم. اما، کاملاً انتظار می رود، این پروفایل ها فقط هستند تصاویر جایگیر و هیچ اطلاعاتی ذخیره نمی شود.
خوب، حالا اجازه دهید به برگه Network نگاهی بیندازیم و بررسی کنیم که آیا نتایج جستجوی جایگزین که فقط سه نمایه را برمیگردانند واقعاً کار میکنند یا خیر. ما درخواست مورد نظر خود را برای "/api/search/blended" پیدا می کنیم و به پاسخ نگاه می کنیم.
نمایهها در یک آرایه «شامل» قرار میگیرند، اما در حال حاضر 15 موجودیت در آن وجود دارد. در این مورد، سه مورد اول آنها اشیایی با اطلاعات اضافی هستند، هر شی حاوی اطلاعاتی در یک نمایه خاص است (مثلاً اینکه آیا نمایه ممتاز است یا خیر. ).
12 مورد بعدی نمایه های واقعی هستند - نتایج جستجو که تنها سه مورد از آنها به ما نشان داده می شود. همانطور که قبلاً می توانید حدس بزنید، فقط کسانی را نشان می دهد که اطلاعات اضافی دریافت می کنند (سه شی اول). به عنوان مثال، اگر پاسخ را از یک نمایه بدون محدودیت بگیرید، 28 موجودیت - 10 شی با اضافی دریافت خواهید کرد. اطلاعات و 18 پروفایل.
پاسخ برای پروفایل بدون محدودیت
چرا بیش از 10 نمایه وارد می شود ، اگرچه دقیقاً 10 مورد درخواست شده است ، و آنها به هیچ وجه در نمایش شرکت نمی کنند ، حتی در صفحه بعدی نیز نخواهند بود - هنوز نمی دانم. اگر URL درخواست را تجزیه و تحلیل کنید، می توانید تعداد = 10 را ببینید (چند نمایه باید در پاسخ بازگردانده شود، حداکثر 49).
خوشحال می شوم هر گونه نظری در این مورد دریافت کنم.
بیایید آزمایش کنیم
بسیار خوب، مهمترین چیزی که اکنون به طور قطع می دانیم این است که پروفایل های بیشتری از آنچه به ما نشان می دهند در پاسخ وجود دارد. این بدان معناست که علیرغم محدودیت، می توانیم داده های بیشتری دریافت کنیم. بیایید سعی کنیم API را خودمان، مستقیماً از کنسول، با استفاده از fetch بکشیم.
همانطور که انتظار می رفت، یک خطا دریافت می کنیم، 403. این به دلیل امنیت است، در اینجا ما یک توکن CSRF ارسال نمی کنیم (CSRF در ویکی پدیا. به طور خلاصه، یک توکن منحصر به فرد به هر درخواست اضافه می شود که صحت آن در سرور بررسی می شود.
می توان آن را از هر درخواست موفق دیگری یا از کوکی ها کپی کرد، جایی که در قسمت "JSESSIONID" ذخیره می شود.
رمز را از کجا پیدا کنیمسر یک درخواست دیگر:
یا از کوکی ها، مستقیماً از طریق کنسول:
بیایید دوباره امتحان کنیم، این بار تنظیمات را به fetch میدهیم که در آن توکن csrf خود را به عنوان پارامتر در هدر مشخص میکنیم.
موفق باشید، ما هر 10 نمایه را دریافت می کنیم. :tada:
به دلیل تفاوت در هدرها، ساختار پاسخ کمی با آنچه در درخواست اصلی دریافت می شود متفاوت است. اگر «Accept: 'application/vnd.linkedin.normalized+json+2.1' را به شیء ما، در کنار توکن csrf اضافه کنید، می توانید همان ساختار را دریافت کنید. پاسخ نمونه با هدر اضافه شده
سپس میتوانید پارامتر «شروع» را ویرایش کنید (بهصورت دستی یا خودکار)، با اشاره به ایندکس، که از آن 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 را به مورد نیاز تغییر دهید. بلوک نمایه شامل نام، موقعیت، مکان، پیوند به نمایه و یک تصویر نگهدارنده خواهد بود.
نتیجه
بنابراین، با حداقل تلاش، توانستیم نقطه ضعف را پیدا کنیم و جستجوی خود را بدون محدودیت دوباره به دست آوریم. کافی بود داده ها و مسیر آن را تجزیه و تحلیل کنید، خود درخواست را بررسی کنید.
نمی توانم بگویم که این یک مشکل جدی برای لینکدین است، زیرا هیچ تهدیدی ایجاد نمی کند. حداکثر سود از دست رفته به دلیل چنین "راه حل هایی" است که به شما امکان می دهد از پرداخت حق بیمه خودداری کنید. شاید چنین پاسخ سروری برای عملکرد صحیح سایر قسمت های سایت ضروری باشد یا صرفا تنبلی توسعه دهندگان و کمبود منابع باشد که اجازه نمی دهد به خوبی انجام شود. (محدودیت در ژانویه 2015 ظاهر شد؛ قبل از این محدودیتی وجود نداشت).
PS
به طور طبیعی، کد jQuery یک نمونه نسبتاً ابتدایی از قابلیت ها است. در حال حاضر من یک افزونه مرورگر را متناسب با نیاز خود ایجاد کرده ام. دکمه های کنترلی را اضافه می کند و نمایه های کامل را با تصاویر، یک دکمه دعوت و اتصالات کلی ارائه می کند. به علاوه، به صورت پویا فیلترها را برای مکانها، شرکتها و موارد دیگر جمعآوری میکند و یک رمز را از کوکیها بازیابی میکند. بنابراین دیگر نیازی به هاردکد کردن چیزی نیست. خوب، فیلدهای تنظیمات اضافی را اضافه می کند، به عنوان "تعداد نمایه در یک زمان درخواست شود، تا 49."
من هنوز روی این اضافه کار می کنم و قصد دارم آن را برای عموم منتشر کنم. اگر علاقه دارید بنویسید