ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

ขีดจำกัด

มีข้อ จำกัด ดังกล่าวใน LinkedIn - ขีดจำกัดการใช้งานเชิงพาณิชย์. มีความเป็นไปได้อย่างยิ่งที่คุณเช่นฉันจนกระทั่งเมื่อไม่นานมานี้ไม่เคยพบหรือได้ยินเรื่องนี้มาก่อน

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

สาระสำคัญของขีด จำกัด คือหากคุณใช้การค้นหาผู้คนนอกผู้ติดต่อของคุณบ่อยเกินไป (ไม่มีการวัดที่แน่นอนอัลกอริทึมจะตัดสินใจตามการกระทำของคุณ - คุณค้นหาบ่อยแค่ไหนและมากแค่ไหนเพิ่มผู้คน) จากนั้นผลการค้นหา จะถูกจำกัดไว้ที่สามโปรไฟล์ แทนที่จะเป็น 1000 (ค่าเริ่มต้นคือ 100 หน้า 10 โปรไฟล์ต่อหน้า) ขีดจำกัดจะถูกรีเซ็ตทุกต้นเดือน โดยธรรมชาติแล้ว บัญชีพรีเมียมไม่มีข้อจำกัดนี้.

แต่ไม่นานมานี้ สำหรับโปรเจ็กต์สัตว์เลี้ยง ฉันเริ่มเล่นมากกับการค้นหาใน LinkedIn และทันใดนั้นก็มีข้อจำกัดนี้ แน่นอนว่าฉันไม่ชอบสิ่งนี้มากนัก เพราะฉันไม่ได้ใช้เพื่อวัตถุประสงค์ทางการค้าใดๆ ดังนั้นความคิดแรกของฉันคือศึกษาข้อจำกัดและพยายามหลีกเลี่ยงมัน

[คำชี้แจงที่สำคัญ: เนื้อหาในบทความนี้นำเสนอเพื่อวัตถุประสงค์ในการให้ข้อมูลและการศึกษาเท่านั้น ผู้เขียนไม่สนับสนุนให้นำไปใช้ในเชิงพาณิชย์]

เรากำลังศึกษาปัญหา

เรามี: แทนที่จะมีโปรไฟล์สิบโปรไฟล์ที่มีการแบ่งหน้า การค้นหาจะส่งคืนเพียงสามโปรไฟล์ หลังจากนั้นบล็อกที่มี "คำแนะนำ" ของบัญชีพรีเมียมจะถูกแทรก และด้านล่างจะเป็นโปรไฟล์ที่พร่ามัวและไม่สามารถคลิกได้

ทันที มือดังกล่าวเอื้อมมือไปที่แผงควบคุมสำหรับนักพัฒนาซอฟต์แวร์เพื่อดูโปรไฟล์ที่ซ่อนอยู่เหล่านี้ บางทีเราอาจลบรูปแบบที่เบลอออก หรือดึงข้อมูลจากบล็อกในมาร์กอัปได้ แต่ค่อนข้างคาดหวังว่าโปรไฟล์เหล่านี้เป็นเพียง รูปภาพตัวยึดตำแหน่ง และไม่มีการจัดเก็บข้อมูลใดๆ

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

เอาล่ะ ตอนนี้เรามาดูที่แท็บเครือข่ายและตรวจสอบว่าผลการค้นหาทางเลือกที่ส่งคืนเพียงสามโปรไฟล์ใช้งานได้จริงหรือไม่ เราพบคำขอที่เราสนใจสำหรับ “/api/search/blended” และดูการตอบสนอง

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

โปรไฟล์มาในอาร์เรย์ "รวม" แต่มีเอนทิตี 15 รายการอยู่แล้ว ในกรณีนี้ สามรายการแรกเป็นออบเจ็กต์ที่มีข้อมูลเพิ่มเติม แต่ละออบเจ็กต์จะมีข้อมูลเกี่ยวกับโปรไฟล์เฉพาะ (เช่น โปรไฟล์เป็นแบบพรีเมียมหรือไม่ ).

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

12 โปรไฟล์ถัดไปเป็นโปรไฟล์จริง - ผลการค้นหา ซึ่งจะแสดงให้เราเห็นเพียง 28 รายการเท่านั้น ดังที่คุณเดาได้แล้ว มันจะแสดงเฉพาะผู้ที่ได้รับข้อมูลเพิ่มเติม (สามออบเจ็กต์แรก) ตัวอย่างเช่น หากคุณรับคำตอบจากโปรไฟล์โดยไม่มีขีดจำกัด คุณจะได้รับ 10 เอนทิตี - 18 ออบเจ็กต์พร้อมข้อมูลเพิ่มเติม ข้อมูลและโปรไฟล์ XNUMX รายการ

ตอบโปรไฟล์ได้ไม่จำกัดข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API
ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

เหตุใดจึงมีโปรไฟล์มากกว่า 10 โปรไฟล์ถึงแม้ว่าจะมีการร้องขอ 10 โปรไฟล์อย่างแน่นอนและพวกเขาไม่ได้มีส่วนร่วมในการแสดง แต่อย่างใดแม้ว่าจะไม่มีในหน้าถัดไปก็ตาม - ฉันยังไม่รู้ หากคุณวิเคราะห์ URL คำขอ คุณจะเห็นว่าจำนวนนั้น=10 (จำนวนโปรไฟล์ที่จะส่งคืนในการตอบกลับ สูงสุด 49 รายการ)

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

ฉันยินดีที่จะรับความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้

มาทดลองกัน

โอเค สิ่งที่สำคัญที่สุดที่เรารู้แน่นอนตอนนี้ก็คือ มีโปรไฟล์ในการตอบกลับมากกว่าที่พวกเขาแสดงให้เราเห็น ซึ่งหมายความว่าเราสามารถรับข้อมูลได้มากขึ้นแม้ว่าจะมีขีดจำกัดก็ตาม มาลองดึง API ด้วยตัวเองโดยตรงจากคอนโซลโดยใช้การดึงข้อมูล

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

ตามที่คาดไว้ เราได้รับข้อผิดพลาด 403 นี่เป็นเพราะความปลอดภัย เราจะไม่ส่งโทเค็น CSRF ในที่นี้ (CSRF บนวิกิพีเดีย. โดยสรุป โทเค็นที่ไม่ซ้ำกันจะถูกเพิ่มลงในแต่ละคำขอ ซึ่งจะมีการตรวจสอบความถูกต้องบนเซิร์ฟเวอร์)

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

สามารถคัดลอกจากคำขออื่นๆ ที่สำเร็จหรือจากคุกกี้ โดยจัดเก็บไว้ในช่อง 'JSESSIONID'

จะหาโทเค็นได้ที่ไหนส่วนหัวของคำขออื่น:

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

หรือจากคุกกี้โดยตรงผ่านคอนโซล:

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

มาลองอีกครั้ง คราวนี้เราส่งการตั้งค่าเพื่อดึงข้อมูล โดยเราระบุโทเค็น csrf ของเราเป็นพารามิเตอร์ในส่วนหัว

ข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

สำเร็จเราได้รับทั้งหมด 10 โปรไฟล์ :tada:

เนื่องจากความแตกต่างในส่วนหัว โครงสร้างของการตอบกลับจึงแตกต่างจากที่ได้รับในคำขอดั้งเดิมเล็กน้อย คุณสามารถรับโครงสร้างเดียวกันได้หากคุณเพิ่ม 'Accept: 'application/vnd.linkedin.normalized+json+2.1' ให้กับอ็อบเจ็กต์ของเรา ถัดจากโทเค็น csrf
ตัวอย่างการตอบกลับพร้อมส่วนหัวที่เพิ่มข้ามขีดจำกัดการค้นหาของ LinkedIn ด้วยการเล่นกับ API

ข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัวยอมรับ

ทำอะไรต่อไป

จากนั้น คุณสามารถแก้ไข (ด้วยตนเองหรืออัตโนมัติ) พารามิเตอร์ `start` โดยชี้ไปที่ดัชนี โดยเริ่มจากที่เราจะได้รับ 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="/th/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="/th/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

ฉันยังคงดำเนินการในส่วนเพิ่มเติมนี้และวางแผนที่จะเผยแพร่สู่สาธารณะ เขียนหากคุณสนใจ

ที่มา: will.com

เพิ่มความคิดเห็น