Contourner la limite de recherche de LinkedIn en jouant avec l'API

Limite

Il y a une telle limitation sur LinkedIn - Limite d'utilisation commerciale. Il est fort probable que vous, comme moi jusqu'à récemment, ne l'ayez jamais rencontré ou entendu parler de lui.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

L'essence de la limite est que si vous utilisez trop souvent la recherche de personnes en dehors de vos contacts (il n'y a pas de métrique exacte, l'algorithme décide, en fonction de vos actions - combien de fois et combien vous avez recherché, ajouté des personnes), alors la recherche le résultat sera limité à trois profils, au lieu de 1000 (par défaut 100 pages, 10 profils par page). La limite est réinitialisée au début de chaque mois. Naturellement, Les comptes Premium n'ont pas cette limitation..

Mais il n'y a pas si longtemps, pour un projet pour animaux de compagnie, j'ai commencé à jouer avec la recherche LinkedIn et j'ai soudainement eu cette limitation. Naturellement, je ne l'aimais pas vraiment, car je ne l'utilisais pas à des fins commerciales, donc ma première pensée a été d'étudier la limitation et d'essayer de la contourner.

[Une clarification importante - le matériel de l'article est présenté à des fins d'information et d'éducation uniquement. L'auteur n'encourage pas leur utilisation à des fins commerciales.]

Nous étudions le problème

Nous avons : au lieu de dix profils avec pagination, la recherche n'en renvoie que trois, après quoi un bloc avec une "recommandation" d'un compte premium est inséré et des profils flous et non cliquables passent en dessous.

Immédiatement, la main atteint la console du développeur pour voir ces profils cachés - nous pouvons peut-être supprimer certains styles qui créent un flou ou extraire des informations d'un bloc dans le balisage. Mais, comme on pouvait s'y attendre, ces profils ne sont que images d'espace réservé et aucune information n'est stockée.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Bon, jetons maintenant un coup d'œil à l'onglet Réseau et vérifions si les résultats de recherche alternatifs fonctionnent vraiment, ne renvoyant que trois profils. Nous trouvons la requête qui nous intéresse dans "/api/search/blended" et regardons la réponse.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Les profils viennent dans le tableau "inclus", mais il y a déjà 15 entités. Dans ce cas, les trois premiers sont des objets avec des informations supplémentaires, chaque objet contient des informations sur un profil spécifique (par exemple, si le profil est premium ).

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Les 12 suivants sont de vrais profils - des résultats de recherche, dont seulement trois nous seront présentés. Comme vous pouvez le deviner, il ne montre que ceux qui reçoivent des informations supplémentaires (les trois premiers objets). Par exemple, si vous prenez une réponse d'un profil sans limite, alors 28 entités viendront - 10 objets avec supplémentaires. informations et 18 profils.

Réponse pour profil sans limiteContourner la limite de recherche de LinkedIn en jouant avec l'API
Contourner la limite de recherche de LinkedIn en jouant avec l'API

Pourquoi il y a plus de 10 profils, alors qu'exactement 10 sont demandés, et qu'ils ne participent en aucune façon à l'affichage, même sur la page suivante, ils ne le seront pas - je ne le sais pas encore. Si vous analysez l'URL de la requête, vous pouvez voir que count=10 (combien de profils à renvoyer dans la réponse, maximum 49).

Contourner la limite de recherche de LinkedIn en jouant avec l'API

J'apprécierais tout commentaire à ce sujet.

Expérimenter

Eh bien, la chose la plus importante que nous sachions maintenant avec certitude est qu'il y a plus de profils dans la réponse qu'ils ne nous en montrent. Nous pouvons donc obtenir plus de données, malgré la limite. Essayons d'extraire l'API nous-mêmes, directement depuis la console, en utilisant fetch.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Comme prévu, nous obtenons une erreur, 403. Ceci est dû à la sécurité, nous n'envoyons pas de jeton CSRF ici (CSRF sur Wikipédia. En un mot, un jeton unique est ajouté à chaque demande, dont l'authenticité est vérifiée sur le serveur).

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Il peut être copié à partir de toute autre demande réussie ou à partir de cookies, où il est stocké dans le champ 'JSESSIONID'.

Où trouver le jetonEn-tête d'une autre requête :

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Soit depuis les cookies, directement via la console :

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Essayons à nouveau, cette fois nous passons les paramètres à récupérer, dans lesquels nous spécifions notre csrf-token comme paramètre dans l'en-tête.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Succès, nous recevons les 10 profils. :tada:

En raison de la différence d'en-têtes, la structure de la réponse est légèrement différente de celle de la demande d'origine. Nous pouvons obtenir la même structure en ajoutant 'Accept: 'application/vnd.linkedin.normalized+json+2.1' à notre objet, à côté du jeton csrf.
Exemple de réponse avec un en-tête ajoutéContourner la limite de recherche de LinkedIn en jouant avec l'API

En savoir plus sur l'en-tête Accepter

Quelle est la prochaine?

Ensuite, vous pouvez modifier (manuellement ou automatiquement) le paramètre `start`, indiquant l'index, à partir duquel nous aurons 10 profils (par défaut = 0) à partir de l'ensemble du résultat de la recherche. Autrement dit, en l'incrémentant de 10 après chaque requête, on obtient la pagination habituelle, 10 profils à la fois.

À ce stade, j'avais suffisamment de données et de liberté pour continuer à travailler sur le projet animal de compagnie. Mais c'était un péché de ne pas essayer d'afficher ces données sur place, car elles sont à portée de main. En Ember, qui est utilisé à l'avant, on ne grimpera pas. jQuery était connecté au site, et après avoir déterré la connaissance de la syntaxe de base en mémoire, vous pouvez créer ce qui suit en quelques minutes.

Code 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="/fr/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="/fr/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 cela est fait directement dans la console sur la page de recherche, cela ajoutera un bouton qui charge 10 nouveaux profils à chaque clic et les affiche sous forme de liste. Bien sûr, avant cela, remplacez le jeton et l'URL par ceux qui sont nécessaires. Le bloc de profil contiendra le nom, le titre du poste, l'emplacement, le lien vers le profil et une image d'espace réservé.

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Conclusion

Ainsi, avec un minimum d'efforts, nous avons pu trouver un point faible et reprendre la recherche sans restrictions. Il suffisait d'analyser les données et leur cheminement, de se pencher sur la requête elle-même.

Je ne peux pas dire que c'est un problème sérieux pour LinkedIn, car cela ne représente aucune menace. Le maximum est le manque à gagner dû à de tels «contournements», ce qui vous permet de ne pas payer la prime. Peut-être qu'une telle réponse du serveur est nécessaire au bon fonctionnement d'autres parties du site, ou c'est juste la paresse des développeurs, un manque de ressources qui ne leur permet pas de bien faire. (La restriction est apparue depuis janvier 2015, avant cette limite ne l'était pas).

PS

Naturellement, le code jQuery est un exemple plutôt primitif des possibilités. Pour le moment, j'ai créé une extension de navigateur pour mes besoins. Il ajoute des boutons de contrôle et affiche des profils complets avec des images, un bouton d'invitation et des connexions générales. De plus, il collecte dynamiquement des filtres pour les emplacements, les entreprises et d'autres éléments, et extrait un jeton des cookies. Vous n'avez donc pas besoin de coder quoi que ce soit. Eh bien, il ajoute des champs de paramètres supplémentaires, à la "combien de profils à demander à la fois, jusqu'à 49".

Contourner la limite de recherche de LinkedIn en jouant avec l'API

Je travaille toujours sur ce module complémentaire et je prévois de le rendre accessible au public. Écrivez si vous êtes intéressé.

Source: habr.com

Ajouter un commentaire