Շրջանցելով 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-ի հետ

Ուրախ կլինեմ այս հարցի վերաբերյալ որևէ մեկնաբանություն ստանալ:

Եկեք փորձարկենք

Լավ, ամենակարևորը, որ մենք հիմա հաստատ գիտենք, այն է, որ պատասխանում ավելի շատ պրոֆիլներ կան, քան նրանք ցույց են տալիս մեզ: Սա նշանակում է, որ մենք կարող ենք ավելի շատ տվյալներ ստանալ՝ չնայած սահմանափակումին: Փորձենք ինքներս քաշել API-ն՝ անմիջապես վահանակից՝ օգտագործելով fetch-ը:

Շրջանցելով LinkedIn-ի որոնման սահմանափակումը՝ խաղալով API-ի հետ

Ինչպես և սպասվում էր, մենք ստանում ենք սխալ՝ 403: Սա անվտանգության պատճառով է, այստեղ մենք չենք ուղարկում CSRF նշան (CSRF-ը Վիքիպեդիայում. Մի խոսքով, յուրաքանչյուր հարցումին ավելացվում է յուրահատուկ նշան, որը ստուգվում է սերվերում իսկության համար):

Շրջանցելով LinkedIn-ի որոնման սահմանափակումը՝ խաղալով API-ի հետ

Այն կարող է պատճենվել ցանկացած այլ հաջողված հարցումից կամ թխուկներից, որտեղ այն պահվում է «JSESSIONID» դաշտում:

Որտեղ գտնել նշանըՄեկ այլ խնդրանքի ղեկավար.

Շրջանցելով LinkedIn-ի որոնման սահմանափակումը՝ խաղալով API-ի հետ

Կամ թխուկներից՝ անմիջապես վահանակի միջոցով.

Շրջանցելով LinkedIn-ի որոնման սահմանափակումը՝ խաղալով API-ի հետ

Եկեք նորից փորձենք, այս անգամ մենք փոխանցում ենք կարգավորումները բեռնելու համար, որում որպես պարամետր վերնագրում նշում ենք մեր csrf-token-ը։

Շրջանցելով 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="/hy/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="/hy/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-ի հետ

Ես դեռ աշխատում եմ այս հավելման վրա և նախատեսում եմ այն ​​հրապարակել հանրությանը: Հետաքրքրվելու դեպքում գրեք։

Source: www.habr.com

Добавить комментарий