Saltar el límite de búsqueda de LinkedIn jugando con la API

Límite

Existe tal limitación en LinkedIn: Límite de uso comercial. Es muy probable que usted, como yo hasta hace poco, nunca lo haya encontrado ni haya oído hablar de él.

Saltar el límite de búsqueda de LinkedIn jugando con la API

La esencia del límite es que si utiliza la búsqueda de personas fuera de sus contactos con demasiada frecuencia (no hay métricas exactas, el algoritmo decide en función de sus acciones: con qué frecuencia y cuánto buscó, agregó personas), entonces el resultado de la búsqueda se limitará a tres perfiles, en lugar de 1000 (100 páginas predeterminadas, 10 perfiles por página). El límite se restablece al comienzo de cada mes. Naturalmente, las cuentas premium no tienen esta limitación.

Pero no hace mucho, para un proyecto favorito, comencé a jugar mucho con la búsqueda de LinkedIn y de repente encontré esta limitación. Naturalmente, esto no me gustó mucho, porque no lo usé para ningún propósito comercial, así que lo primero que pensé fue estudiar la limitación e intentar sortearla.

[Una aclaración importante: los materiales del artículo se presentan únicamente con fines informativos y educativos. El autor no fomenta su uso con fines comerciales.]

Estamos estudiando el problema.

Tenemos: en lugar de diez perfiles con paginación, la búsqueda arroja solo tres, después de lo cual se inserta un bloque con una "recomendación" de una cuenta premium y debajo hay perfiles borrosos y en los que no se puede hacer clic.

Inmediatamente, la mano se acerca a la consola del desarrollador para ver estos perfiles ocultos; tal vez podamos eliminar algunos estilos borrosos o extraer información de un bloque en el marcado. Pero, como era de esperar, estos perfiles son sólo imágenes de marcador de posición y no se almacena ninguna información.

Saltar el límite de búsqueda de LinkedIn jugando con la API

Bien, ahora miremos la pestaña Red y verifiquemos si los resultados de búsqueda alternativos que arrojan solo tres perfiles realmente funcionan. Encontramos la solicitud que nos interesa para "/api/search/blended" y miramos la respuesta.

Saltar el límite de búsqueda de LinkedIn jugando con la API

Los perfiles vienen en una matriz "incluida", pero ya hay 15 entidades en ella. En este caso, los tres primeros son objetos con información adicional, cada objeto contiene información sobre un perfil específico (por ejemplo, si el perfil es premium ).

Saltar el límite de búsqueda de LinkedIn jugando con la API

Los 12 siguientes son perfiles reales: resultados de búsqueda, de los cuales sólo se nos mostrarán tres. Como ya puedes adivinar, muestra solo aquellos que reciben información adicional (los primeros tres objetos). Por ejemplo, si toma la respuesta de un perfil sin límite, recibirá 28 entidades, 10 objetos adicionales. información y 18 perfiles.

Respuesta para perfil sin limiteSaltar el límite de búsqueda de LinkedIn jugando con la API
Saltar el límite de búsqueda de LinkedIn jugando con la API

Por qué llegan más de 10 perfiles, aunque se solicitan exactamente 10, y no participan de ninguna manera en la visualización, ni siquiera en la página siguiente lo estarán, todavía no lo sé. Si analiza la URL de solicitud, puede ver que cuenta = 10 (cuántos perfiles devolver en la respuesta, máximo 49).

Saltar el límite de búsqueda de LinkedIn jugando con la API

Estaré encantado de recibir cualquier comentario sobre este asunto.

experimentando

Vale, lo más importante que ahora sabemos con seguridad es que hay más perfiles en la respuesta de los que nos muestran. Esto significa que podemos obtener más datos, a pesar del límite. Intentemos extraer la API nosotros mismos, directamente desde la consola, usando fetch.

Saltar el límite de búsqueda de LinkedIn jugando con la API

Como era de esperar, obtenemos un error, 403. Esto se debe a cuestiones de seguridad, aquí no enviamos un token CSRF (CSRF en Wikipedia. En pocas palabras, se agrega un token único a cada solicitud, cuya autenticidad se verifica en el servidor).

Saltar el límite de búsqueda de LinkedIn jugando con la API

Se puede copiar de cualquier otra solicitud exitosa o de cookies, donde se almacena en el campo 'JSESSIONID'.

Dónde encontrar la fichaEncabezado de otra solicitud:

Saltar el límite de búsqueda de LinkedIn jugando con la API

O desde cookies, directamente a través de la consola:

Saltar el límite de búsqueda de LinkedIn jugando con la API

Intentemos de nuevo, esta vez pasamos la configuración para recuperar, en la que especificamos nuestro token csrf como parámetro en el encabezado.

Saltar el límite de búsqueda de LinkedIn jugando con la API

Éxito, recibimos los 10 perfiles. :tada:

Debido a la diferencia en los encabezados, la estructura de la respuesta es ligeramente diferente de la que se recibe en la solicitud original. Puede obtener la misma estructura si agrega 'Aceptar: 'application/vnd.linkedin.normalized+json+2.1' a nuestro objeto, junto al token csrf.
Respuesta de ejemplo con encabezado agregadoSaltar el límite de búsqueda de LinkedIn jugando con la API

Más información sobre el encabezado Aceptar

¿Qué será lo próximo?

Luego puede editar (manualmente o automatizar) el parámetro `inicio`, apuntando al índice, a partir del cual se nos darán 10 perfiles (predeterminado = 0) de todo el resultado de la búsqueda. En otras palabras, al incrementarlo en 10 después de cada solicitud, obtenemos el resultado habitual página por página, 10 perfiles a la vez.

En esta etapa tenía suficientes datos y libertad para seguir trabajando en el proyecto favorito. Pero habría sido un pecado no intentar mostrar estos datos en el momento, puesto que ya estaban disponibles. No entraremos en Ember, que se usa en el frente. jQuery se conectó al sitio y, después de haber desenterrado el conocimiento de la sintaxis básica en la memoria, puede crear lo siguiente en un 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="/es/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="/es/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;

Si hace esto directamente en la consola en la página de búsqueda, agregará un botón que carga 10 perfiles nuevos con cada clic y los muestra en una lista. Por supuesto, cambie el token y la URL por los requeridos antes de hacer esto. El bloque de perfil contendrá el nombre, posición, ubicación, enlace al perfil y una imagen de marcador de posición.

Saltar el límite de búsqueda de LinkedIn jugando con la API

Conclusión

Así, con un mínimo de esfuerzo, pudimos encontrar el punto débil y retomar nuestra búsqueda sin restricciones. Bastaba analizar los datos y su ruta, examinar la solicitud en sí.

No puedo decir que esto sea un problema grave para LinkedIn, porque no representa ninguna amenaza. El máximo es el lucro cesante debido a estas “soluciones alternativas”, que le permiten evitar pagar la prima. Quizás dicha respuesta del servidor sea necesaria para el correcto funcionamiento de otras partes del sitio, o sea simplemente la pereza de los desarrolladores y la falta de recursos que no permite hacerlo bien. (La limitación apareció en enero de 2015; antes no había límite).

PS

Naturalmente, el código jQuery es un ejemplo bastante primitivo de estas capacidades. De momento he creado una extensión de navegador que se adapta a mis necesidades. Agrega botones de control y genera perfiles completos con imágenes, un botón de invitación y conexiones generales. Además, recopila dinámicamente filtros para ubicaciones, empresas y otras cosas, y recupera un token de las cookies. Así que ya no es necesario codificar nada. Bueno, agrega campos de configuración adicionales, como "cuántos perfiles solicitar a la vez, hasta 49".

Saltar el límite de búsqueda de LinkedIn jugando con la API

Todavía estoy trabajando en esta adición y planeo lanzarla al público. Escribe si estás interesado.

Fuente: habr.com

Añadir un comentario