API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Шектеу

LinkedIn-де мұндай шектеу бар - Коммерциялық пайдалану шегі. Сіз мен сияқты соңғы уақытқа дейін оны ешқашан кездестірмеген немесе естімеген шығарсыз.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Шектеудің мәні мынада: егер сіз контактілерден тыс адамдарды іздеуді тым жиі қолдансаңыз (нақты көрсеткіштер жоқ, алгоритм сіздің әрекеттеріңізге байланысты шешеді - сіз қаншалықты жиі және қаншалықты іздегеніңіз, адамдарды қосқаныңыз), содан кейін іздеу нәтижесі 1000 емес, үш профильмен шектеледі (әдепкі 100 бет, әр бетке 10 профиль). Шектеу әр айдың басында қалпына келтіріледі. Әрине, премиум шоттарында бұл шектеу жоқ.

Бірақ жақында үй жануарларына арналған жоба үшін мен LinkedIn іздеуімен көп ойнай бастадым және кенеттен бұл шектеуге ие болдым. Әрине, бұл маған онша ұнамады, өйткені мен оны коммерциялық мақсатта пайдаланбадым, сондықтан менің бірінші ойым шектеуді зерттеп, оны айналып өту болды.

[Маңызды түсініктеме: мақаладағы материалдар тек ақпараттық және білім беру мақсатында берілген. Автор оларды коммерциялық мақсатта пайдалануды қолдамайды.]

Біз мәселені зерттеп жатырмыз

Бізде: беттеу бар он профильдің орнына іздеу тек үшеуін қайтарады, содан кейін премиум есептік жазбаның «ұсынымы» бар блок енгізіледі және төменде бұлыңғыр және басу мүмкін емес профильдер бар.

Осы жасырын профильдерді қарау үшін қол дереу әзірлеуші ​​​​консоліне жетеді - мүмкін біз кейбір бұлыңғыр стильдерді алып тастай аламыз немесе түзетудегі блоктан ақпаратты шығарып аламыз. Бірақ, күтілетіндей, бұл профильдер жай ғана толтырғыш суреттер және ешқандай ақпарат сақталмайды.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Жарайды, енді «Желі» қойындысын қарап, тек үш профильді қайтаратын балама іздеу нәтижелерінің шынымен жұмыс істейтінін тексерейік. Бізді қызықтыратын «/api/search/blended» сұрауын тауып, жауапты қараймыз.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Профильдер «қосалған» массивінде келеді, бірақ онда қазірдің өзінде 15 нысан бар. Бұл жағдайда олардың алғашқы үшеуі қосымша ақпараты бар нысандар болып табылады, әрбір нысан нақты профиль туралы ақпаратты қамтиды (мысалы, профиль премиум болып табылады ма) ).

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Келесі 12 нақты профильдер - іздеу нәтижелері, олардың тек үшеуі ғана бізге көрсетіледі. Сіз қазірдің өзінде болжағаныңыздай, ол тек қосымша ақпаратты алатындарды көрсетеді (алғашқы үш нысан). Мысалы, егер сіз профильден жауапты шектеусіз алсаңыз, сіз 28 нысанды аласыз - қосымшасы бар 10 нысан. ақпарат және 18 профиль.

Профильге шектеусіз жауап беріңізAPI арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту
API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Неліктен 10-нан астам профиль келеді, бірақ дәл 10 сұралғанымен және олар дисплейге ешқандай жолмен қатыспайды, тіпті келесі бетте олар болмайды - мен әлі білмеймін. Сұраныс URL мекенжайын талдасаңыз, сіз бұл count=10 (жауапта қанша профильді қайтару керек, ең көбі 49) көре аласыз.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Мен осы мәселе бойынша кез келген түсініктеме алуға қуанышты болар едім.

Эксперимент жасайық

Жарайды, біз қазір нақты білетін ең маңызды нәрсе - жауапта бізге көрсеткеннен гөрі көбірек профильдер бар. Бұл шектеуге қарамастан көбірек деректерді ала алатынымызды білдіреді. Fetch арқылы тікелей консольден API-ны өзіміз тартып көрейік.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Күтілгендей, біз қатені аламыз, 403. Бұл қауіпсіздікке байланысты, мұнда біз CSRF таңбалауышын жібермейміз (Википедиядағы CSRF. Қысқаша айтқанда, серверде түпнұсқалығы тексерілетін әрбір сұрауға бірегей таңбалауыш қосылады).

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Оны кез келген басқа сәтті сұраудан немесе «JSESSIONID» өрісінде сақталған cookie файлдарынан көшіруге болады.

Токенді қайдан табуға боладыБасқа сұраудың тақырыбы:

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Немесе кукилерден тікелей консоль арқылы:

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Қайталап көрейік, бұл жолы біз csrf-таңбалауышымызды тақырыпта параметр ретінде көрсететін, алу үшін параметрлерді береміз.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Сәттілік, біз барлық 10 профильді аламыз. :tada:

Тақырыптардағы айырмашылыққа байланысты жауап құрылымы бастапқы сұрауда алынғаннан сәл өзгеше. Нысанымызға csrf таңбалауышы жанына «Қабылдау: 'application/vnd.linkedin.normalized+json+2.1' қоссаңыз, дәл осындай құрылымды алуға болады.
Қосымша тақырыбы бар жауап үлгісіAPI арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Қабылдау тақырыбы туралы толығырақ

Ары қарай не?

Содан кейін индексті көрсететін «бастау» параметрін өңдеуге (қолмен немесе автоматтандыруға) болады, одан бастап бізге бүкіл іздеу нәтижесінен 10 профиль (әдепкі = 0) беріледі. Басқаша айтқанда, әрбір сұраудан кейін оны 10-ға көбейту арқылы біз бір уақытта 10 профильді беттік бетке шығаруды аламыз.

Бұл кезеңде менде үй жануарлары жобасында жұмысты жалғастыру үшін жеткілікті деректер мен еркіндік болды. Бірақ бұл деректерді сол жерде көрсетуге тырыспау күнә болар еді, өйткені ол қазірдің өзінде қолында. Біз майданда қолданылатын Эмберге кірмейміз. 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="/kk/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="/kk/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 арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

қорытынды

Осылайша, ең аз күш-жігермен біз әлсіз жерді тауып, іздеуді шектеусіз қалпына келтірдік. Деректерді және оның жолын талдау, сұраныстың өзін қарау жеткілікті болды.

Мен бұл LinkedIn үшін маңызды мәселе деп айта алмаймын, өйткені ол ешқандай қауіп төндірмейді. Максималды - бұл сыйлықты төлеуден аулақ болуға мүмкіндік беретін осындай «шешулердің» салдарынан жоғалған пайда. Мүмкін мұндай серверлік жауап сайттың басқа бөліктерінің дұрыс жұмыс істеуі үшін қажет болуы мүмкін немесе бұл жай ғана әзірлеушілердің жалқаулығы және оны жақсы жасауға мүмкіндік бермейтін ресурстардың жетіспеушілігі. (Шектеу 2015 жылдың қаңтарында пайда болды, бұған дейін шектеу болған жоқ).

PS

Әрине, jQuery коды мүмкіндіктердің қарапайым мысалы болып табылады. Қазіргі уақытта мен өз қажеттіліктеріме сәйкес браузер кеңейтімін жасадым. Ол басқару түймелерін қосады және суреттері, шақыру түймесі және жалпы қосылымдары бар толық профильдерді көрсетеді. Оған қоса, ол орындарға, компанияларға және басқа нәрселерге арналған сүзгілерді динамикалық түрде жинайды және cookie файлдарынан белгіні шығарады. Сондықтан енді ештеңені қатты кодтаудың қажеті жоқ. Ол «бір уақытта қанша профильді сұрау керек, 49-ға дейін» қосымша параметрлер өрістерін қосады.

API арқылы ойнау арқылы LinkedIn іздеу шегін айналып өту

Мен бұл қосымшамен әлі жұмыс істеп жатырмын және оны көпшілікке жариялауды жоспарлап отырмын. Қызық болса жазыңыз.

Ақпарат көзі: www.habr.com

пікір қалдыру