Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Limitu

Ci hè una tale limitazione in LinkedIn - Limitu di usu cummerciale. Hè assai prubabile chì voi, cum'è mè finu à pocu tempu, ùn l'avete mai scontru o intesu parlà.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

L'essenza di u limitu hè chì si utilizate a ricerca di e persone fora di i vostri cuntatti troppu spessu (ùn ci hè micca metrica esatta, l'algoritmu decide basatu nantu à e vostre azzioni - quantu spessu è quantu avete cercatu, aghjunghje persone), allura u risultatu di ricerca. serà limitatu à trè profili, invece di 1000 (predefinitu 100 pagine, 10 profili per pagina). U limitu hè resettatu à u principiu di ogni mese. Naturalmente, i cunti premium ùn anu micca sta limitazione.

Ma pocu tempu fà, per un prughjettu di l'animali, aghju cuminciatu à ghjucà assai cù a ricerca di LinkedIn è di colpu hà avutu sta limitazione. Naturalmente, ùn aghju micca assai piacevule, perchè ùn l'aghju micca utilizatu per alcunu scopu cummerciale, cusì u mo primu pensamentu era di studià a limitazione è pruvà à circà.

[Una chiarificazione impurtante: i materiali in l'articulu sò presentati solu per scopi informativi è educativi. L'autore ùn incuragisce micca u so usu per scopi cummirciali.]

Studiemu u prublema

Avemu: invece di dece profili cù paginazione, a ricerca torna solu trè, dopu à quale un bloccu cù una "raccomandazione" di un contu premium hè inseritu è ​​sottu sò profili sfocati è non-clickable.

Immediatamente, a manu ghjunghje à a cunsola di sviluppatore per guardà questi profili nascosti - forse pudemu caccià alcuni stili di sfocatura, o caccià l'infurmazioni da un bloccu in u marcatu. Ma, abbastanza aspettatu, questi profili sò ghjustu ritratti di piazzamentu è nisuna infurmazione hè almacenata.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Va bè, avà fighjemu a tabulazione Rete è verificate se i risultati di ricerca alternativu chì tornanu solu trè profili funzionanu veramente. Truvemu a dumanda chì ci interessa per "/api/search/blended" è fighjemu a risposta.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

I profili venenu in una matrice "inclusa", ma ci sò digià 15 entità in questu casu, i primi trè sò oggetti cù infurmazioni supplementari, ogni ughjettu cuntene infurmazioni nantu à un prufilu specificu (per esempiu, se u prufilu hè premium. ).

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

I prossimi 12 sò veri profili - risultati di ricerca, di quale solu trè ci saranu mostrati. Comu pudete dighjà, mostra solu quelli chì ricevenu infurmazioni supplementari (i primi trè oggetti). Per esempiu, se pigliate a risposta da un prufilu senza limitu, riceverete 28 entità - 10 ogetti cù supplementu. infurmazione è 18 profili.

Rispondi per prufilu senza limitiBypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API
Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Perchè ghjunghjenu più di 10 profili, ancu s'ellu hè dumandatu esattamente 10, è ùn participanu micca in a visualizazione in ogni modu, ancu in a pagina dopu ùn saranu micca - ùn sò micca ancu. Se analizà l'URL di a dumanda, pudete vede chì count = 10 (quanti profili da vultà in a risposta, massimu 49).

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Saria cuntentu di riceve qualsiasi cumenti nantu à sta materia.

Spirimu

Va bè, u più impurtante chì avà sapemu di sicuru hè chì ci sò più profili in a risposta di quelli chì ci mostranu. Questu significa chì pudemu avè più dati, malgradu u limitu. Pruvemu di tirà l'API noi stessi, direttamente da a cunsola, usendu fetch.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Cum'è s'aspittava, avemu un errore, 403. Questu hè dovutu à a sicurità, quì ùn avemu micca mandatu un token CSRF (CSRF nantu à Wikipedia. In poche parole, un token unicu hè aghjuntu à ogni dumanda, chì hè verificatu in u servitore per l'autenticità).

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Pò esse copiatu da qualsiasi altra dumanda successu o da i cookies, induve hè guardatu in u campu 'JSESSIONID'.

Induve truvà u tokenIntestazione di una altra dumanda:

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

O da i cookies, direttamente attraversu a cunsola:

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Pruvemu di novu, sta volta passemu i paràmetri per piglià, in quale avemu specificatu u nostru csrf-token cum'è un paràmetru in l'intestazione.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Successu, ricevemu tutti i 10 profili. :tada:

A causa di a diffarenza in headers, a struttura di a risposta hè un pocu sfarente da ciò chì hè ricevutu in a dumanda originale. Pudete ottene a listessa struttura si aghjunghje 'Accetta: 'application/vnd.linkedin.normalized+json+2.1' à u nostru ughjettu, accantu à u token csrf.
Esempiu di risposta cù l'intestazione aghjuntuBypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Più nantu à l'intestazione Accept

Chi c'è vicinu?

Allora pudete edità (manualmente o autumàticu) u paràmetru `start`, indicà à l'indici, partendu da quale avemu da esse datu 10 profili (default = 0) da tuttu u risultatu di ricerca. In altri palori, aumentendu da 10 dopu ogni dumanda, avemu u solitu abituali di pagina per pagina, 10 profili à u tempu.

In questu stadiu aghju avutu abbastanza dati è libertà per cuntinuà à travaglià nantu à u prughjettu di l'animali. Ma saria stata una vergogna di ùn pruvà à vede sta dati in u locu, postu chì era digià in manu. Ùn andemu micca in Ember, chì hè utilizatu in fronte. jQuery hè stata cunnessa à u situ, è avè scavatu a cunniscenza di a sintassi di basa in memoria, pudete creà e seguenti in un paru di minuti.

codice 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="/co/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="/co/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;

Se fate questu direttamente in a cunsola nantu à a pagina di ricerca, aghjunghje un buttone chì carica 10 novi profili cù ogni clic è li rende in una lista. Di sicuru, cambia u token è l'URL à quellu necessariu prima di fà questu. U bloccu di prufilu cuntene u nome, a pusizione, u locu, u ligame à u prufilu è una maghjina di piazza.

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

cunchiusioni

Cusì, cù un minimu di sforzu, pudemu truvà u puntu debule è ripiglià a nostra ricerca senza restrizioni. Era abbastanza per analizà e dati è u so percorsu, fighjate in a dumanda stessu.

Ùn possu micca dì chì questu hè un prublema seriu per LinkedIn, perchè ùn ponu micca minaccia. U massimu hè persu prufittu per via di tali "workarounds", chì vi permette di evitari pagà per premium. Forsi una tale risposta da u servitore hè necessariu per u funziunamentu currettu di l'altri parti di u situ, o hè simplicemente pigrizia di i sviluppatori è una mancanza di risorse chì ùn permettenu micca fà bè. (A limitazione apparsu in ghjennaghju 2015; prima ùn ci era micca limitu).

PS

Naturalmente, u codice jQuery hè un esempiu primitivu di e capacità. À u mumentu aghju creatu una estensione di navigatore per adattà à i mo bisogni. Aghjunghje buttuni di cuntrollu è rende profili cumpleti cù stampi, un buttone d'invitu è ​​cunnessione generale. In più, raccoglie dinamicamente filtri per lochi, cumpagnie è altre cose, è recupera un token da i cookies. Allora ùn ci hè più bisognu di codificà qualcosa. Ebbè, aghjunghje campi di paràmetri supplementari, à la "quanti profili da dumandà à u tempu, finu à 49".

Bypassendu u limitu di ricerca di LinkedIn per ghjucà cù l'API

Sò sempre travagliatu annantu à questa aghjunta è pensa à liberà à u publicu. Scrivite si site interessatu.

Source: www.habr.com

Add a comment