ขีดจำกัด
มีข้อ จำกัด ดังกล่าวใน LinkedIn -
สาระสำคัญของขีด จำกัด คือหากคุณใช้การค้นหาผู้คนนอกผู้ติดต่อของคุณบ่อยเกินไป (ไม่มีการวัดที่แน่นอนอัลกอริทึมจะตัดสินใจตามการกระทำของคุณ - คุณค้นหาบ่อยแค่ไหนและมากแค่ไหนเพิ่มผู้คน) จากนั้นผลการค้นหา จะถูกจำกัดไว้ที่สามโปรไฟล์ แทนที่จะเป็น 1000 (ค่าเริ่มต้นคือ 100 หน้า 10 โปรไฟล์ต่อหน้า) ขีดจำกัดจะถูกรีเซ็ตทุกต้นเดือน โดยธรรมชาติแล้ว
แต่ไม่นานมานี้ สำหรับโปรเจ็กต์สัตว์เลี้ยง ฉันเริ่มเล่นมากกับการค้นหาใน LinkedIn และทันใดนั้นก็มีข้อจำกัดนี้ แน่นอนว่าฉันไม่ชอบสิ่งนี้มากนัก เพราะฉันไม่ได้ใช้เพื่อวัตถุประสงค์ทางการค้าใดๆ ดังนั้นความคิดแรกของฉันคือศึกษาข้อจำกัดและพยายามหลีกเลี่ยงมัน
[คำชี้แจงที่สำคัญ: เนื้อหาในบทความนี้นำเสนอเพื่อวัตถุประสงค์ในการให้ข้อมูลและการศึกษาเท่านั้น ผู้เขียนไม่สนับสนุนให้นำไปใช้ในเชิงพาณิชย์]
เรากำลังศึกษาปัญหา
เรามี: แทนที่จะมีโปรไฟล์สิบโปรไฟล์ที่มีการแบ่งหน้า การค้นหาจะส่งคืนเพียงสามโปรไฟล์ หลังจากนั้นบล็อกที่มี "คำแนะนำ" ของบัญชีพรีเมียมจะถูกแทรก และด้านล่างจะเป็นโปรไฟล์ที่พร่ามัวและไม่สามารถคลิกได้
ทันที มือดังกล่าวเอื้อมมือไปที่แผงควบคุมสำหรับนักพัฒนาซอฟต์แวร์เพื่อดูโปรไฟล์ที่ซ่อนอยู่เหล่านี้ บางทีเราอาจลบรูปแบบที่เบลอออก หรือดึงข้อมูลจากบล็อกในมาร์กอัปได้ แต่ค่อนข้างคาดหวังว่าโปรไฟล์เหล่านี้เป็นเพียง
เอาล่ะ ตอนนี้เรามาดูที่แท็บเครือข่ายและตรวจสอบว่าผลการค้นหาทางเลือกที่ส่งคืนเพียงสามโปรไฟล์ใช้งานได้จริงหรือไม่ เราพบคำขอที่เราสนใจสำหรับ “/api/search/blended” และดูการตอบสนอง
โปรไฟล์มาในอาร์เรย์ "รวม" แต่มีเอนทิตี 15 รายการอยู่แล้ว ในกรณีนี้ สามรายการแรกเป็นออบเจ็กต์ที่มีข้อมูลเพิ่มเติม แต่ละออบเจ็กต์จะมีข้อมูลเกี่ยวกับโปรไฟล์เฉพาะ (เช่น โปรไฟล์เป็นแบบพรีเมียมหรือไม่ ).
12 โปรไฟล์ถัดไปเป็นโปรไฟล์จริง - ผลการค้นหา ซึ่งจะแสดงให้เราเห็นเพียง 28 รายการเท่านั้น ดังที่คุณเดาได้แล้ว มันจะแสดงเฉพาะผู้ที่ได้รับข้อมูลเพิ่มเติม (สามออบเจ็กต์แรก) ตัวอย่างเช่น หากคุณรับคำตอบจากโปรไฟล์โดยไม่มีขีดจำกัด คุณจะได้รับ 10 เอนทิตี - 18 ออบเจ็กต์พร้อมข้อมูลเพิ่มเติม ข้อมูลและโปรไฟล์ XNUMX รายการ
ตอบโปรไฟล์ได้ไม่จำกัด
เหตุใดจึงมีโปรไฟล์มากกว่า 10 โปรไฟล์ถึงแม้ว่าจะมีการร้องขอ 10 โปรไฟล์อย่างแน่นอนและพวกเขาไม่ได้มีส่วนร่วมในการแสดง แต่อย่างใดแม้ว่าจะไม่มีในหน้าถัดไปก็ตาม - ฉันยังไม่รู้ หากคุณวิเคราะห์ URL คำขอ คุณจะเห็นว่าจำนวนนั้น=10 (จำนวนโปรไฟล์ที่จะส่งคืนในการตอบกลับ สูงสุด 49 รายการ)
ฉันยินดีที่จะรับความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้
มาทดลองกัน
โอเค สิ่งที่สำคัญที่สุดที่เรารู้แน่นอนตอนนี้ก็คือ มีโปรไฟล์ในการตอบกลับมากกว่าที่พวกเขาแสดงให้เราเห็น ซึ่งหมายความว่าเราสามารถรับข้อมูลได้มากขึ้นแม้ว่าจะมีขีดจำกัดก็ตาม มาลองดึง API ด้วยตัวเองโดยตรงจากคอนโซลโดยใช้การดึงข้อมูล
ตามที่คาดไว้ เราได้รับข้อผิดพลาด 403 นี่เป็นเพราะความปลอดภัย เราจะไม่ส่งโทเค็น CSRF ในที่นี้ (
สามารถคัดลอกจากคำขออื่นๆ ที่สำเร็จหรือจากคุกกี้ โดยจัดเก็บไว้ในช่อง 'JSESSIONID'
จะหาโทเค็นได้ที่ไหนส่วนหัวของคำขออื่น:
หรือจากคุกกี้โดยตรงผ่านคอนโซล:
มาลองอีกครั้ง คราวนี้เราส่งการตั้งค่าเพื่อดึงข้อมูล โดยเราระบุโทเค็น csrf ของเราเป็นพารามิเตอร์ในส่วนหัว
สำเร็จเราได้รับทั้งหมด 10 โปรไฟล์ :tada:
เนื่องจากความแตกต่างในส่วนหัว โครงสร้างของการตอบกลับจึงแตกต่างจากที่ได้รับในคำขอดั้งเดิมเล็กน้อย คุณสามารถรับโครงสร้างเดียวกันได้หากคุณเพิ่ม 'Accept: 'application/vnd.linkedin.normalized+json+2.1' ให้กับอ็อบเจ็กต์ของเรา ถัดจากโทเค็น csrf
ตัวอย่างการตอบกลับพร้อมส่วนหัวที่เพิ่ม
ข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัวยอมรับ
ทำอะไรต่อไป
จากนั้น คุณสามารถแก้ไข (ด้วยตนเองหรืออัตโนมัติ) พารามิเตอร์ `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 เนื่องจากไม่ได้ก่อให้เกิดภัยคุกคามใดๆ จำนวนสูงสุดคือการสูญเสียกำไรเนื่องจาก “วิธีแก้ปัญหา” ดังกล่าว ซึ่งช่วยให้คุณหลีกเลี่ยงการจ่ายเบี้ยประกันภัยได้ บางทีการตอบสนองของเซิร์ฟเวอร์อาจจำเป็นสำหรับการทำงานที่ถูกต้องของส่วนอื่น ๆ ของไซต์หรือเป็นเพียงความเกียจคร้านของนักพัฒนาและการขาดทรัพยากรที่ไม่อนุญาตให้ทำได้ดี (ข้อจำกัดปรากฏในเดือนมกราคม 2015 ก่อนหน้านี้ไม่มีขีดจำกัด)
PS
โดยธรรมชาติแล้ว รหัส jQuery เป็นตัวอย่างที่ค่อนข้างดั้งเดิมของความสามารถ ในขณะนี้ ฉันได้สร้างส่วนขยายเบราว์เซอร์เพื่อให้เหมาะกับความต้องการของฉัน เพิ่มปุ่มควบคุมและแสดงโปรไฟล์แบบเต็มด้วยรูปภาพ ปุ่มเชิญ และการเชื่อมต่อทั่วไป นอกจากนี้ยังรวบรวมตัวกรองแบบไดนามิกสำหรับสถานที่ บริษัท และสิ่งอื่น ๆ และดึงโทเค็นจากคุกกี้ ดังนั้นจึงไม่จำเป็นต้องฮาร์ดโค้ดอะไรอีกต่อไป มันเพิ่มช่องการตั้งค่าเพิ่มเติม “จำนวนโปรไฟล์ที่จะขอในแต่ละครั้ง สูงสุด 49 รายการ”
ฉันยังคงดำเนินการในส่วนเพิ่มเติมนี้และวางแผนที่จะเผยแพร่สู่สาธารณะ เขียนหากคุณสนใจ
ที่มา: will.com