Evitando o límite de busca de LinkedIn xogando coa API

Límite

Hai tal limitación en LinkedIn - Límite de uso comercial. É moi probable que ti, coma min ata hai pouco, nunca o atopases nin escoitaches falar del.

Evitando o límite de busca de LinkedIn xogando coa API

A esencia do límite é que se usas a busca de persoas fóra dos teus contactos con demasiada frecuencia (non hai métricas exactas, o algoritmo decide en función das túas accións: con que frecuencia e canto buscaches, engadiu persoas), entón o resultado da busca limitarase a tres perfís, en lugar de 1000 (por defecto 100 páxinas, 10 perfís por páxina). O límite restablece ao comezo de cada mes. Naturalmente, as contas premium non teñen esta limitación.

Pero non hai moito, para un proxecto de mascota, comecei a xogar moito coa busca de LinkedIn e de súpeto conseguín esta limitación. Por suposto, isto non me gustou moito, porque non o utilizaba con fins comerciais, polo que o primeiro que pensei foi estudar a limitación e tentar sortear.

[Unha aclaración importante: os materiais do artigo preséntanse unicamente con fins informativos e educativos. O autor non fomenta o seu uso con fins comerciais.]

Estamos estudando o problema

Temos: en lugar de dez perfís con paxinación, a busca devolve só tres, despois dos cales insírese un bloque cunha "recomendación" dunha conta premium e a continuación aparecen perfís borrosos e non clicables.

Inmediatamente, a man chega á consola do programador para mirar estes perfís ocultos; quizais poidamos eliminar algúns estilos borrosos ou extraer información dun bloque no marcado. Pero, como era de esperar, estes perfís son só imaxes de marcador de posición e non se almacena información.

Evitando o límite de busca de LinkedIn xogando coa API

Está ben, vexamos agora a pestana Rede e comprobemos se realmente funcionan os resultados de busca alternativos que devolven só tres perfís. Atopamos a solicitude que nos interesa para "/api/search/blended" e miramos a resposta.

Evitando o límite de busca de LinkedIn xogando coa API

Os perfís veñen nunha matriz "incluída", pero xa hai 15 entidades nela. Neste caso, os tres primeiros son obxectos con información adicional, cada obxecto contén información sobre un perfil específico (por exemplo, se o perfil é premium). ).

Evitando o límite de busca de LinkedIn xogando coa API

Os seguintes 12 son perfís reais: resultados de busca, dos cales só se nos mostrarán tres. Como xa podes adiviñar, mostra só os que reciben información adicional (os tres primeiros obxectos). Por exemplo, se tomas a resposta dun perfil sen límite, recibirás 28 entidades - 10 obxectos con adicionais. información e 18 perfís.

Resposta para o perfil sen límiteEvitando o límite de busca de LinkedIn xogando coa API
Evitando o límite de busca de LinkedIn xogando coa API

Por que chegan máis de 10 perfís, aínda que se solicitan exactamente 10, e non participan de ningún xeito na exhibición, nin sequera na páxina seguinte, aínda non o sei. Se analizas o URL da solicitude, podes ver ese reconto=10 (cantos perfís hai que devolver na resposta, máximo 49).

Evitando o límite de busca de LinkedIn xogando coa API

Estaría encantado de recibir calquera comentario sobre este asunto.

Imos experimentar

Vale, o máis importante que agora sabemos con certeza é que hai máis perfís na resposta dos que nos mostran. Isto significa que podemos obter máis datos, a pesar do límite. Imos tentar tirar a API nós mesmos, directamente desde a consola, usando Fetch.

Evitando o límite de busca de LinkedIn xogando coa API

Como era de esperar, recibimos un erro, 403. Isto é debido á seguridade, aquí non estamos enviando un token CSRF (CSRF na Wikipedia. En poucas palabras, engádese un token único a cada solicitude, que se verifica no servidor para a súa autenticidade).

Evitando o límite de busca de LinkedIn xogando coa API

Pódese copiar de calquera outra solicitude exitosa ou de cookies, onde se almacena no campo 'JSESSIONID'.

Onde atopar o tokenCabeceira doutra solicitude:

Evitando o límite de busca de LinkedIn xogando coa API

Ou desde as cookies, directamente a través da consola:

Evitando o límite de busca de LinkedIn xogando coa API

Inténtalo de novo, esta vez pasamos a configuración para buscar, na que especificamos o noso csrf-token como parámetro na cabeceira.

Evitando o límite de busca de LinkedIn xogando coa API

Éxito, recibimos os 10 perfís. :tada:

Debido á diferenza de cabeceiras, a estrutura da resposta é lixeiramente diferente da que se recibe na solicitude orixinal. Podes obter a mesma estrutura se engades 'Aceptar: 'application/vnd.linkedin.normalized+json+2.1' ao noso obxecto, xunto ao token csrf.
Exemplo de resposta con cabeceira engadidaEvitando o límite de busca de LinkedIn xogando coa API

Máis información sobre a cabeceira Aceptar

Cal é o próximo?

Despois pode editar (manual ou automatizar) o parámetro `inicio`, apuntando ao índice, a partir do cal se nos darán 10 perfís (por defecto = 0) de todo o resultado da busca. Noutras palabras, ao incrementalo en 10 despois de cada solicitude, obtemos a saída habitual páxina por páxina, 10 perfís á vez.

Nesta fase tiña suficientes datos e liberdade para seguir traballando no proxecto da mascota. Pero tería sido un pecado non tentar mostrar estes datos no lugar, xa que xa estaban a man. Non imos entrar en Ember, que se usa na fronte. jQuery conectouse ao sitio e, despois de extraer o coñecemento da sintaxe básica na memoria, podes crear o seguinte nun par de minutos.

código 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="/gl/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="/gl/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 o fas directamente na consola da páxina de busca, engadirá un botón que cargará 10 novos perfís con cada clic e mostrarase nunha lista. Por suposto, cambia o token e o URL polo necesario antes de facelo. O bloque de perfil conterá o nome, a posición, a localización, a ligazón ao perfil e unha imaxe de marcador de posición.

Evitando o límite de busca de LinkedIn xogando coa API

Conclusión

Así, cun mínimo esforzo, puidemos atopar o punto débil e recuperar a nosa busca sen restricións. Bastaba con analizar os datos e o seu camiño, mirar a propia solicitude.

Non podo dicir que este sexa un problema grave para LinkedIn, porque non supón ningunha ameaza. O máximo é o beneficio perdido debido a tales "solucións alternativas", que che permiten evitar pagar por prima. Quizais esa resposta do servidor sexa necesaria para o correcto funcionamento doutras partes do sitio, ou simplemente sexa a preguiza dos desenvolvedores e a falta de recursos que non permiten facelo ben. (A limitación apareceu en xaneiro de 2015; antes non había límite).

PS

Por suposto, o código jQuery é un exemplo bastante primitivo das capacidades. Neste momento creei unha extensión do navegador para satisfacer as miñas necesidades. Engade botóns de control e mostra perfís completos con imaxes, un botón de invitación e conexións xerais. Ademais, recompila de forma dinámica filtros para localizacións, empresas e outras cousas, e recupera un token das cookies. Polo tanto, xa non hai necesidade de codificar nada. Ben, engade campos de configuración adicionais, como "cantos perfís solicitar á vez, ata 49".

Evitando o límite de busca de LinkedIn xogando coa API

Aínda estou traballando nesta adición e penso publicala ao público. Escribe se estás interesado.

Fonte: www.habr.com

Engadir un comentario