Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Grenze

Auf LinkedIn gibt es eine solche Einschränkung - Kommerzielle Nutzungsbeschränkung. Es ist sehr wahrscheinlich, dass Sie, wie ich bis vor kurzem, noch nie davon gehört oder gehört haben.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Der Kern des Limits besteht darin, dass, wenn Sie die Suche nach Personen außerhalb Ihrer Kontakte zu oft verwenden (es gibt keine genauen Messwerte, der Algorithmus entscheidet anhand Ihrer Aktionen – wie oft und wie oft Sie gesucht, Personen hinzugefügt haben), dann das Suchergebnis wird auf drei statt auf 1000 Profile beschränkt (standardmäßig 100 Seiten, 10 Profile pro Seite). Das Limit wird zu Beginn jedes Monats zurückgesetzt. Natürlich, Premium-Konten haben diese Einschränkung nicht.

Aber vor nicht allzu langer Zeit begann ich für ein Lieblingsprojekt viel mit der LinkedIn-Suche herumzuspielen und bekam plötzlich diese Einschränkung. Das gefiel mir natürlich nicht so gut, da ich es nicht für kommerzielle Zwecke nutzte, also war mein erster Gedanke, die Einschränkung zu studieren und zu versuchen, sie zu umgehen.

[Eine wichtige Klarstellung: Die Materialien im Artikel dienen ausschließlich Informations- und Bildungszwecken. Der Autor empfiehlt nicht, sie für kommerzielle Zwecke zu nutzen.]

Wir untersuchen das Problem

Wir haben: Statt zehn Profilen mit Paginierung liefert die Suche nur drei, danach wird ein Block mit der „Empfehlung“ eines Premium-Kontos eingefügt und darunter sind verschwommene und nicht anklickbare Profile.

Sofort geht die Hand zur Entwicklerkonsole, um sich diese versteckten Profile anzusehen – vielleicht können wir einige Stile entfernen, die Unschärfe erzeugen, oder Informationen aus einem Block im Markup extrahieren. Aber erwartungsgemäß sind diese Profile gerecht Platzhalterbilder und es werden keine Informationen gespeichert.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Okay, jetzt schauen wir uns die Registerkarte „Netzwerk“ an und prüfen, ob die alternativen Suchergebnisse, die nur drei Profile zurückgeben, tatsächlich funktionieren. Wir finden die Anfrage, die uns interessiert, für „/api/search/blended“ und schauen uns die Antwort an.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Profile kommen in einem „included“-Array vor, aber es gibt bereits 15 Entitäten darin. In diesem Fall sind die ersten drei davon Objekte mit zusätzlichen Informationen, jedes Objekt enthält Informationen zu einem bestimmten Profil (z. B. ob das Profil Premium ist). ).

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Die nächsten 12 sind echte Profile – Suchergebnisse, von denen uns nur drei angezeigt werden. Wie Sie bereits erraten können, werden nur diejenigen angezeigt, die zusätzliche Informationen erhalten (die ersten drei Objekte). Wenn Sie beispielsweise die Antwort aus einem Profil ohne Limit übernehmen, erhalten Sie 28 Entitäten – 10 Objekte mit zusätzlichen. Informationen und 18 Profile.

Antwort für Profil ohne LimitUmgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen
Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Warum mehr als 10 Profile ankommen, obwohl genau 10 angefordert werden, und diese in keiner Weise an der Anzeige teilnehmen, auch auf der nächsten Seite nicht, weiß ich noch nicht. Wenn Sie die Anfrage-URL analysieren, sehen Sie, dass count=10 (wie viele Profile in der Antwort zurückgegeben werden sollen, maximal 49).

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Über Kommentare zu diesem Thema würde ich mich freuen.

Lasst uns experimentieren

Okay, das Wichtigste, was wir jetzt sicher wissen, ist, dass die Antwort mehr Profile enthält, als sie uns anzeigen. Das bedeutet, dass wir trotz des Limits mehr Daten erhalten können. Versuchen wir, die API mithilfe von fetch selbst direkt aus der Konsole abzurufen.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Wie erwartet erhalten wir die Fehlermeldung 403. Dies geschieht aus Sicherheitsgründen, hier senden wir kein CSRF-Token (CSRF auf Wikipedia. Kurz gesagt: Jeder Anfrage wird ein eindeutiger Token hinzugefügt, der auf dem Server auf Authentizität überprüft wird.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Es kann von jeder anderen erfolgreichen Anfrage oder von Cookies kopiert werden, wo es im Feld „JSESSIONID“ gespeichert wird.

Wo finde ich den Token?Header einer anderen Anfrage:

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Oder aus Cookies, direkt über die Konsole:

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Versuchen wir es noch einmal, dieses Mal übergeben wir die Einstellungen an fetch, in dem wir unser CSRF-Token als Parameter im Header angeben.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Erfolgreich, wir erhalten alle 10 Profile. :tada:

Aufgrund der unterschiedlichen Header unterscheidet sich die Struktur der Antwort geringfügig von der Struktur, die in der ursprünglichen Anfrage empfangen wurde. Sie können die gleiche Struktur erhalten, wenn Sie „Accept: 'application/vnd.linkedin.normalized+json+2.1“ zu unserem Objekt neben dem CSRF-Token hinzufügen.
Beispielantwort mit hinzugefügtem HeaderUmgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Mehr zum Accept-Header

Was kommt als nächstes?

Anschließend können Sie den Startparameter bearbeiten (manuell oder automatisiert), der auf den Index verweist, ab dem wir 10 Profile (Standard = 0) aus dem gesamten Suchergebnis erhalten. Mit anderen Worten: Indem wir ihn nach jeder Anfrage um 10 erhöhen, erhalten wir die übliche seitenweise Ausgabe, jeweils 10 Profile.

Zu diesem Zeitpunkt hatte ich genügend Daten und Freiheit, um an meinem Lieblingsprojekt weiterzuarbeiten. Aber es wäre eine Sünde gewesen, nicht zu versuchen, diese Daten sofort anzuzeigen, da sie bereits vorhanden waren. Wir gehen nicht auf Ember ein, das an der Front verwendet wird. jQuery wurde mit der Site verbunden und nachdem Sie die Kenntnisse der grundlegenden Syntax im Speicher ausgegraben haben, können Sie in wenigen Minuten Folgendes erstellen.

jQuery-Code

/* рендер блока, принимаем данные профиля и вставляем блок в список профилей используя эти данные */
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="/de/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="/de/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;

Wenn Sie dies direkt in der Konsole auf der Suchseite tun, wird eine Schaltfläche hinzugefügt, die mit jedem Klick 10 neue Profile lädt und in einer Liste darstellt. Bevor Sie dies tun, ändern Sie natürlich das Token und die URL auf die erforderlichen. Der Profilblock enthält den Namen, die Position, den Standort, den Link zum Profil und ein Platzhalterbild.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Abschluss

So konnten wir mit minimalem Aufwand die Schwachstelle finden und unsere Suche ohne Einschränkungen wieder aufnehmen. Es reichte aus, die Daten und ihren Pfad zu analysieren und sich die Anfrage selbst anzusehen.

Ich kann nicht sagen, dass dies ein ernstes Problem für LinkedIn darstellt, da es keine Bedrohung darstellt. Das Maximum ist der entgangene Gewinn aufgrund solcher „Workarounds“, wodurch Sie die Zahlung einer Prämie vermeiden können. Möglicherweise ist eine solche Serverantwort für den ordnungsgemäßen Betrieb anderer Teile der Website erforderlich, oder es ist einfach die Faulheit der Entwickler und ein Mangel an Ressourcen, die eine gute Ausführung nicht zulassen. (Die Beschränkung trat im Januar 2015 in Kraft; davor gab es keine Beschränkung).

PS

Natürlich ist der jQuery-Code ein eher primitives Beispiel für die Fähigkeiten. Im Moment habe ich eine Browser-Erweiterung erstellt, die meinen Bedürfnissen entspricht. Es fügt Steuerschaltflächen hinzu und rendert vollständige Profile mit Bildern, einer Einladungsschaltfläche und allgemeinen Verbindungen. Außerdem sammelt es dynamisch Filter für Standorte, Unternehmen und andere Dinge und ruft ein Token aus Cookies ab. Es besteht also keine Notwendigkeit mehr, etwas fest zu codieren. Nun, es werden zusätzliche Einstellungsfelder hinzugefügt, etwa „wie viele Profile gleichzeitig angefordert werden sollen, bis zu 49“.

Umgehen Sie das Suchlimit von LinkedIn, indem Sie mit der API spielen

Ich arbeite immer noch an dieser Ergänzung und plane, sie der Öffentlichkeit zugänglich zu machen. Bei Interesse einfach schreiben.

Source: habr.com

Kommentar hinzufügen