Superare il limite di ricerca di LinkedIn giocando con l'API

limite

C'è una limitazione del genere su LinkedIn: Limite di utilizzo commerciale. È estremamente probabile che tu, come me fino a poco tempo fa, non ne abbia mai incontrato o sentito parlare.

Superare il limite di ricerca di LinkedIn giocando con l'API

L'essenza del limite è che se usi troppo spesso la ricerca di persone al di fuori dei tuoi contatti (non ci sono metriche esatte, l'algoritmo decide in base alle tue azioni - quanto spesso e quanto hai cercato, aggiunto persone), quindi il risultato della ricerca sarà limitato a tre profili, invece di 1000 (100 pagine predefinite, 10 profili per pagina). Il limite viene ripristinato all'inizio di ogni mese. Naturalmente, gli account premium non hanno questa limitazione.

Ma non molto tempo fa, per un progetto preferito, ho iniziato a giocare molto con la ricerca su LinkedIn e all'improvviso ho riscontrato questa limitazione. Naturalmente questo non mi è piaciuto molto, perché non lo usavo per scopi commerciali, quindi il mio primo pensiero è stato quello di studiare il limite e cercare di aggirarlo.

[Una precisazione importante: i materiali presenti nell'articolo sono presentati esclusivamente a scopo informativo ed educativo. L'autore non incoraggia il loro utilizzo per scopi commerciali.]

Stiamo studiando il problema

Abbiamo: invece di dieci profili con impaginazione, la ricerca ne restituisce solo tre, dopodiché viene inserito un blocco con la “raccomandazione” di un account premium e sotto ci sono profili sfocati e non cliccabili.

Immediatamente, la mano si allunga verso la console degli sviluppatori per esaminare questi profili nascosti: forse possiamo rimuovere alcuni stili di sfocatura o estrarre informazioni da un blocco nel markup. Ma, come era prevedibile, questi profili sono giusti immagini segnaposto e nessuna informazione viene memorizzata.

Superare il limite di ricerca di LinkedIn giocando con l'API

Ok, ora diamo un'occhiata alla scheda Rete e controlliamo se i risultati di ricerca alternativi che restituiscono solo tre profili funzionano effettivamente. Troviamo la richiesta che ci interessa per “/api/search/blended” e guardiamo la risposta.

Superare il limite di ricerca di LinkedIn giocando con l'API

I profili sono disponibili in un array "incluso", ma contiene già 15 entità. In questo caso, i primi tre sono oggetti con informazioni aggiuntive, ogni oggetto contiene informazioni su un profilo specifico (ad esempio, se il profilo è premium ).

Superare il limite di ricerca di LinkedIn giocando con l'API

I successivi 12 sono profili reali: risultati di ricerca, di cui solo tre ci verranno mostrati. Come puoi già intuire, mostra solo coloro che ricevono informazioni aggiuntive (i primi tre oggetti). Ad esempio, se prendi la risposta da un profilo senza limiti, riceverai 28 entità - 10 oggetti con aggiuntivi. informazioni e 18 profili.

Risposta per profilo senza limitiSuperare il limite di ricerca di LinkedIn giocando con l'API
Superare il limite di ricerca di LinkedIn giocando con l'API

Perché arrivano più di 10 profili, anche se ne vengono richiesti esattamente 10, e non partecipano in alcun modo alla visualizzazione, anche nella pagina successiva non lo saranno - non lo so ancora. Se analizzi l'URL della richiesta, puoi vedere che count=10 (quanti profili restituire nella risposta, massimo 49).

Superare il limite di ricerca di LinkedIn giocando con l'API

Sarei felice di ricevere eventuali commenti su questo argomento.

Sperimentiamo

Ok, la cosa più importante che ora sappiamo per certo è che ci sono più profili nella risposta di quanti ce ne mostrino. Ciò significa che possiamo ottenere più dati, nonostante il limite. Proviamo a estrarre noi stessi l'API, direttamente dalla console, utilizzando fetch.

Superare il limite di ricerca di LinkedIn giocando con l'API

Come previsto, riceviamo un errore, 403. Ciò è dovuto alla sicurezza, qui non stiamo inviando un token CSRF (CSRF su Wikipedia. In poche parole, a ogni richiesta viene aggiunto un token univoco, di cui viene verificata l'autenticità sul server).

Superare il limite di ricerca di LinkedIn giocando con l'API

Può essere copiato da qualsiasi altra richiesta andata a buon fine o dai cookie, dove viene memorizzato nel campo 'JSESSIONID'.

Dove trovare il gettoneIntestazione di un'altra richiesta:

Superare il limite di ricerca di LinkedIn giocando con l'API

Oppure dai cookie, direttamente tramite la console:

Superare il limite di ricerca di LinkedIn giocando con l'API

Proviamo di nuovo, questa volta passiamo le impostazioni a fetch, in cui specifichiamo il nostro token csrf come parametro nell'intestazione.

Superare il limite di ricerca di LinkedIn giocando con l'API

Successo, riceviamo tutti i 10 profili. :tada:

A causa della differenza nelle intestazioni, la struttura della risposta è leggermente diversa da quella ricevuta nella richiesta originale. Puoi ottenere la stessa struttura se aggiungi 'Accept: 'application/vnd.linkedin.normalized+json+2.1' al nostro oggetto, accanto al token csrf.
Risposta di esempio con intestazione aggiuntaSuperare il limite di ricerca di LinkedIn giocando con l'API

Ulteriori informazioni sull'intestazione Accetta

Quali sono le prospettive?

Successivamente è possibile modificare (manualmente o automatizzando) il parametro `start`, puntando all'indice, a partire dal quale ci verranno forniti 10 profili (default = 0) dall'intero risultato della ricerca. In altre parole, incrementandolo di 10 dopo ogni richiesta, otteniamo il solito output pagina per pagina, 10 profili alla volta.

A questo punto, avevo abbastanza dati e libertà per continuare a lavorare sul progetto dell'animale domestico. Ma sarebbe stato un peccato non provare a visualizzare subito questi dati, perché erano già a portata di mano. Non entreremo in Ember, che viene utilizzato nella parte anteriore. jQuery è stato collegato al sito e, dopo aver tirato fuori in memoria la conoscenza della sintassi di base, è possibile creare quanto segue in un paio 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="/it/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="/it/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 lo fai direttamente nella console nella pagina di ricerca, verrà aggiunto un pulsante che carica 10 nuovi profili ad ogni clic e li visualizza in un elenco. Naturalmente, prima di farlo, modifica il token e l'URL con quello richiesto. Il blocco del profilo conterrà il nome, la posizione, l'ubicazione, il collegamento al profilo e un'immagine segnaposto.

Superare il limite di ricerca di LinkedIn giocando con l'API

conclusione

Così, con il minimo sforzo, siamo riusciti a trovare il punto debole e riprendere la nostra ricerca senza restrizioni. È bastato analizzare i dati e il loro percorso, esaminare la richiesta stessa.

Non posso dire che questo sia un problema serio per LinkedIn, perché non rappresenta alcuna minaccia. Il massimo è la perdita di profitto a causa di tali “soluzioni alternative”, che ti consentono di evitare di pagare il premio. Forse una tale risposta del server è necessaria per il corretto funzionamento di altre parti del sito, oppure è semplicemente la pigrizia degli sviluppatori e la mancanza di risorse che non consente di farlo bene. (La restrizione è apparsa nel gennaio 2015; prima non esisteva alcun limite).

PS

Naturalmente, il codice jQuery è un esempio piuttosto primitivo delle capacità. Al momento ho creato un'estensione del browser adatta alle mie esigenze. Aggiunge pulsanti di controllo ed esegue il rendering di profili completi con immagini, un pulsante di invito e collegamenti generali. Inoltre, raccoglie dinamicamente filtri per località, aziende e altri elementi e recupera un token dai cookie. Quindi non è più necessario codificare nulla. Bene, aggiunge ulteriori campi di impostazione, come “quanti profili richiedere alla volta, fino a 49”.

Superare il limite di ricerca di LinkedIn giocando con l'API

Sto ancora lavorando su questa aggiunta e ho intenzione di rilasciarla al pubblico. Scrivi se sei interessato.

Fonte: habr.com

Aggiungi un commento