تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

حد

هناك مثل هذا القيد على LinkedIn - حد الاستخدام التجاري. ومن المحتمل جدًا أنك، مثلي حتى وقت قريب، لم تواجهه أو تسمع به من قبل.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

جوهر الحد هو أنه إذا كنت تستخدم البحث عن أشخاص خارج جهات الاتصال الخاصة بك كثيرًا (لا توجد مقاييس دقيقة، فإن الخوارزمية تقرر بناءً على أفعالك - عدد مرات البحث وعدد الأشخاص الذين أضفتهم)، ثم نتيجة البحث سيكون مقتصرًا على ثلاثة ملفات تعريف، بدلاً من 1000 (100 صفحة افتراضية، 10 ملفات تعريف في كل صفحة). يتم إعادة تعيين الحد في بداية كل شهر. بطبيعة الحال، الحسابات المميزة ليس لديها هذا القيد.

ولكن منذ وقت ليس ببعيد، بالنسبة لمشروع حيوان أليف، بدأت اللعب كثيرًا باستخدام بحث LinkedIn وفجأة حصلت على هذا القيد. وبطبيعة الحال، لم يعجبني هذا كثيرًا، لأنني لم أستخدمه لأي أغراض تجارية، لذلك كان أول ما فكرت به هو دراسة القيد ومحاولة الالتفاف عليه.

[توضيح مهم: المواد الواردة في المقالة معروضة فقط للأغراض الإعلامية والتعليمية. المؤلف لا يشجع استخدامها لأغراض تجارية.]

نحن ندرس المشكلة

لدينا: بدلاً من عشرة ملفات تعريف مع ترقيم الصفحات، يُرجع البحث ثلاثة ملفات فقط، وبعد ذلك يتم إدراج كتلة تحتوي على "توصية" للحساب المميز ويوجد أدناه ملفات تعريف غير واضحة وغير قابلة للنقر.

على الفور، تمد اليد إلى وحدة تحكم المطورين لإلقاء نظرة على هذه الملفات الشخصية المخفية - ربما يمكننا إزالة بعض الأنماط غير الواضحة، أو استخراج المعلومات من كتلة في الترميز. لكن، كما هو متوقع تمامًا، تكون هذه الملفات الشخصية عادلة صور نائبة ولا يتم تخزين أي معلومات.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

حسنًا، دعونا الآن نلقي نظرة على علامة التبويب "الشبكة" ونتحقق مما إذا كانت نتائج البحث البديلة التي تعرض ثلاثة ملفات تعريف فقط تعمل بالفعل. نجد الطلب الذي يهمنا لـ "/api/search/blended" وننظر إلى الرد.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

تأتي الملفات الشخصية في مصفوفة "مضمنة"، ولكن يوجد بها بالفعل 15 كيانًا. في هذه الحالة، أول ثلاثة منها عبارة عن كائنات تحتوي على معلومات إضافية، ويحتوي كل كائن على معلومات حول ملف تعريف محدد (على سبيل المثال، ما إذا كان ملف التعريف متميزًا). ).

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

الـ 12 التالية هي ملفات شخصية حقيقية - نتائج البحث، والتي سيتم عرض ثلاثة منها فقط لنا. كما يمكنك التخمين بالفعل، فإنه يظهر فقط أولئك الذين يتلقون معلومات إضافية (الكائنات الثلاثة الأولى). على سبيل المثال، إذا أخذت الإجابة من ملف تعريف بلا حدود، فستتلقى 28 كيانًا - 10 كائنات مع إضافة. معلومات و18 ملفًا شخصيًا.

الإجابة عن الملف الشخصي بلا حدودتجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).
تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

لماذا يصل أكثر من 10 ملفات تعريف، على الرغم من طلب 10 ملفات تعريف بالضبط، ولا يشاركون في العرض بأي شكل من الأشكال، حتى في الصفحة التالية لن يكونوا كذلك - لا أعرف حتى الآن. إذا قمت بتحليل عنوان URL للطلب، فيمكنك رؤية هذا العدد = 10 (عدد الملفات الشخصية التي سيتم عرضها في الاستجابة، الحد الأقصى 49).

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

وسأكون سعيدا لتلقي أي تعليقات حول هذا الموضوع.

دعونا نجرب

حسنًا، أهم شيء نعرفه الآن على وجه اليقين هو أن هناك ملفات تعريف في الرد أكثر مما تظهره لنا. وهذا يعني أنه يمكننا الحصول على المزيد من البيانات، على الرغم من الحد الأقصى. دعونا نحاول سحب واجهة برمجة التطبيقات بأنفسنا، مباشرة من وحدة التحكم، باستخدام الجلب.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

كما هو متوقع، حصلنا على خطأ 403. وهذا بسبب الأمان، ونحن هنا لا نرسل رمز CSRF (CSRF في ويكيبيديا. باختصار، تتم إضافة رمز فريد لكل طلب، والذي يتم فحصه على الخادم للتأكد من صحته).

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

يمكن نسخه من أي طلب ناجح آخر أو من ملفات تعريف الارتباط، حيث يتم تخزينه في الحقل "JSESSIONID".

أين يمكن العثور على الرمز المميزرأس طلب آخر:

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

أو من ملفات تعريف الارتباط مباشرة من خلال وحدة التحكم:

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

دعونا نحاول مرة أخرى، هذه المرة نمرر الإعدادات المراد جلبها، حيث نحدد رمز csrf الخاص بنا كمعلمة في الرأس.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

النجاح، نتلقى جميع الملفات الشخصية العشرة. :تادا:

نظرًا للاختلاف في العناوين، يختلف هيكل الاستجابة قليلًا عما تم تلقيه في الطلب الأصلي. يمكنك الحصول على نفس البنية إذا أضفت "قبول:"application/vnd.linkedin.normalized+json+2.1" إلى كائننا، بجوار رمز csrf.
مثال على الاستجابة مع رأس مضافتجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

المزيد عن رأس القبول

ما هي الخطوة التالية؟

بعد ذلك يمكنك تحرير (يدويًا أو تلقائيًا) معلمة "البدء"، مع الإشارة إلى الفهرس، بدءًا من حيث سيتم منحنا 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="/ar/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="/ar/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 إلى الرمز المطلوب قبل القيام بذلك. ستحتوي كتلة الملف الشخصي على الاسم والمنصب والموقع ورابط الملف الشخصي وصورة العنصر النائب.

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

اختتام

وهكذا، وبأقل جهد، تمكنا من العثور على نقطة الضعف واستعادة بحثنا دون قيود. كان يكفي تحليل البيانات ومسارها والنظر في الطلب نفسه.

لا أستطيع أن أقول إن هذه مشكلة خطيرة بالنسبة لـ LinkedIn، لأنها لا تشكل أي تهديد. الحد الأقصى هو الربح الضائع بسبب هذه "الحلول البديلة"، والتي تسمح لك بتجنب دفع قسط التأمين. ربما تكون هذه الاستجابة من الخادم ضرورية للتشغيل الصحيح لأجزاء أخرى من الموقع، أو أنها مجرد كسل المطورين ونقص الموارد التي لا تسمح بذلك بشكل جيد. (ظهر القيد في يناير 2015، وقبل ذلك لم يكن هناك حد).

PS

وبطبيعة الحال، يعد كود jQuery مثالًا بدائيًا إلى حد ما على القدرات. لقد قمت حاليًا بإنشاء ملحق للمتصفح ليناسب احتياجاتي. يضيف أزرار تحكم ويعرض ملفات تعريف كاملة بالصور وزر دعوة واتصالات عامة. بالإضافة إلى ذلك، فهو يجمع عوامل التصفية للمواقع والشركات وأشياء أخرى ديناميكيًا، ويسترد رمزًا مميزًا من ملفات تعريف الارتباط. لذلك ليست هناك حاجة إلى ترميز أي شيء بعد الآن. حسنًا، فهو يضيف حقول إعدادات إضافية، مثل "عدد الملفات الشخصية التي يجب طلبها في المرة الواحدة، حتى 49."

تجاوز حد البحث في LinkedIn من خلال اللعب بواجهة برمجة التطبيقات (API).

ما زلت أعمل على هذه الإضافة وأخطط لإصدارها للجمهور. اكتب إذا كنت مهتما.

المصدر: www.habr.com

إضافة تعليق