Umgehen des LinkedIn-Suchlimits durch Spielen mit der API

[Da meine Erweiterung vom ausländischen Publikum viel Aufmerksamkeit erhalten hat, habe ich meinen Originalartikel ins Englische übersetzt] .

Limit


Als erstklassiges professionelles Netzwerk hat LinkedIn leider für kostenlose Konten eine Einschränkung wie das Commercial Use Limit (CUL). Höchstwahrscheinlich sind Sie, genau wie ich bis vor kurzem, noch nie auf diese Sache gestoßen und haben noch nie davon gehört.

Bild

Der Punkt des CUL ist, dass, wenn Sie zu oft nach Personen außerhalb Ihrer Verbindungen / Ihres Netzwerks suchen, Ihre Suchergebnisse auf nur 3 statt 1000 Profile beschränkt sind (standardmäßig 100 Seiten mit 10 Profilen pro Seite). Wie oft gemessen wird, weiß niemand. Es gibt keine genauen Metriken. Der Algorithmus entscheidet anhand Ihrer Aktionen - wie oft Sie gesucht haben und wie viele Verbindungen Sie hinzugefügt haben. Das kostenlose CUL wird am 1. eines jeden Kalendermonats um Mitternacht PST zurückgesetzt, und Sie erhalten erneut Ihre 1000 Suchergebnisse, wer weiß wie lange. Natürlich gibt es für Premium-Konten keine solche Beschränkung .

Vor nicht allzu langer Zeit habe ich jedoch angefangen, mit der LinkedIn-Suche nach einem Haustierprojekt herumzuspielen, und bin plötzlich mit diesem CUL festgefahren. Offensichtlich hat es mir nicht so gut gefallen; Schließlich habe ich die Suche nicht für kommerzielle Zwecke verwendet. Mein erster Gedanke war also, diese Grenze zu erkunden und zu versuchen, sie zu umgehen.

[Wichtige Klarstellung - Alle Quellenmaterialien in diesem Artikel dienen ausschließlich zu Informations- und Bildungszwecken. Der Autor empfiehlt nicht, sie für kommerzielle Zwecke zu verwenden.]


Wichtiges Update - LinkedIn hat diese Hintertür berücksichtigt und kürzlich behoben. Backdoor und Plugin funktionieren nicht mehr.



Das Problem untersuchen


Was wir bekommen haben: Anstelle von 10 Profilen mit Paginierung zeigt das Suchwerkzeug nur 3 an, gefolgt von einer "Empfehlung" zum Kauf eines Premium-Kontos, und dann sehen Sie andere unscharfe, nicht anklickbare Profile.

Das erste, was Sie als Entwickler haben, ist das Öffnen der Browser-Entwicklertools, um diese versteckten / unscharfen Profile zu untersuchen. Vielleicht können Sie einige Stile entfernen, die für die Unschärfe verantwortlich sind, oder die Daten aus dem Layout- / Markup-Block extrahieren. Wie zu erwarten ist, werden diese Profile jedoch nur als Platzhalterbilder angezeigt und enthalten keine Daten.

Bild

Okay, jetzt gehen wir zu einer Registerkarte "Netzwerk" und prüfen, ob die alternativen Suchergebnisse wirklich nur 3 Profile zurückgeben. Wir finden also die Abfrage, an der wir interessiert sind - "/ api / search / blended" - und sehen uns die Antwort an.

Bild

Profile sind im Array "include" enthalten, es sind jedoch bereits 15 Entitäten darin enthalten. In diesem Fall sind die ersten drei Objekte mit zusätzlichen Daten. Jedes Objekt enthält Informationen zu einem bestimmten Profil (z. B. wenn es sich bei dem Profil um ein Premium-Profil handelt).

Die nächsten 12 Profile sind echt - es sind tatsächlich die Suchergebnisse, von denen uns nur 3 angezeigt werden. Wie Sie bereits erraten können, zeigt LinkedIn nur die Profile an, die die zusätzlichen Informationen erhalten haben (die ersten 3 Objekte). Wenn Sie beispielsweise die Suchantwort aus dem Profil ohne Einschränkung untersuchen, werden 28 Entitäten zurückgegeben - 10 Objekte mit zusätzlichen Informationen und 18 Profile.

Antwort für ein Profil ohne Limit
Bild

Bild

Ich bin mir noch nicht sicher, warum mehr als 10 Profile zurückgegeben werden, während 10 angefordert werden und sie einem Benutzer nicht angezeigt werden - Sie werden sie nicht einmal auf der nächsten Seite sehen. Wenn Sie die Anforderungs-URL analysieren, sehen Sie, dass count = 10 ist (wie viele Profile in der Antwort zurückgegeben werden sollen, 49 ist das Maximum).

Bild

Alle Kommentare zu diesem Thema wäre sehr dankbar.

Experimentieren


Okay, jetzt wissen wir das Wichtigste mit Sicherheit - die Antwort enthält mehr Profile, als LinkedIn uns zeigt. So können wir trotz CUL mehr Daten erhalten. Versuchen wir, die API mithilfe von Fetch direkt von der Konsole abzurufen.

Bild

Wie erwartet erhalten wir den Fehler 403. Dies ist ein Sicherheitsproblem - hier senden wir kein CSRF-Token ( CSRF auf Wikipedia ). Kurz gesagt, es ist ein eindeutiges Token, das jeder Anforderung hinzugefügt wird und das auf der Serverseite auf Authentizität überprüft wird.

Bild

Sie können es von jeder anderen erfolgreichen Anfrage oder von Cookies kopieren, wo es im Feld 'JSESSIONID' gespeichert ist.

Wo finde ich einen Token?
Überschrift einer anderen Anfrage:

Bild

Von den Cookies direkt über die Konsole:

Bild

Versuchen wir es noch einmal. Dieses Mal übergeben wir die Einstellungen zum Abrufen. In den Einstellungen geben wir unser CSRF-Token als Parameter im Header an.

Bild

Erfolgreich, alle 10 Profile werden zurückgegeben. : tada:
Aufgrund des Unterschieds in den Headern unterscheidet sich die Antwortstruktur geringfügig von der ursprünglichen Anforderung. Sie können dieselbe exakte Struktur erhalten, wenn Sie neben dem CSRF-Token 'Accept:' application / vnd.linkedin.normalized + json + 2.1 'in unser Objekt einfügen.

Beispiel einer Antwort mit dem hinzugefügten Header
Bild

Mehr zum Accept Header

Was kommt als nächstes?


Jetzt können Sie (manuell oder automatisch) den Parameter "start" bearbeiten, der den Index angibt, ab dem wir 10 Profile (standardmäßig = 0) aus dem gesamten Suchergebnis erhalten können. Mit anderen Worten, wenn wir es nach jeder Anfrage um 10 erhöhen, erhalten wir unsere übliche Paginierung, 10 Profile pro Seite.

Zu diesem Zeitpunkt habe ich genug Daten und Freiheit, um weiter an dem Haustierprojekt zu arbeiten. Aber es wäre eine Sünde, nicht zu versuchen, diese Daten sofort anzuzeigen, da sie in meinen Händen lagen. Wir werden nicht in die Glut eintauchen, die für das Frontend verwendet wird. Da die JQuery in die Website integriert wurde, können Sie das Wissen über die grundlegende Syntax aus Ihrem Speicher herausholen und in wenigen Minuten das Folgende erstellen.

JQuery-Code
/* render the block, receive profile data, and insert the block in the profiles' list, using this data */ 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="/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="/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>` ); }; // fetch data and render the profiles const fetchProfiles = () => { // token const csrf = 'ajax:9082932176494192209'; // bject with the request settings, pass the token const settings = { headers: { 'csrf-token': csrf } } // request URL, with a dynamic start index at the end 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}`; /* make a request, for each profile in the response call the block rendering, and then increment the starting index by 10 */ fetch(url, settings).then(response => response.json()).then(data => { data.elements[0].elements.forEach(createProfileBlock); nextItemIndex += 10; }); }; // delete all profiles from the list $('.search-results__list').find('li').remove(); // insert the 'download profiles' button $('.search-results__list').after('<button id="load-more">Load More</button>'); // add the functionality to the button $('#load-more').addClass('artdeco-button').on('click', fetchProfiles); // set the default profile index for the request window.nextItemIndex = 0; 

Wenn Sie diese Aktionen direkt in der Konsole auf der Suchseite ausführen, fügen Sie eine Schaltfläche hinzu, mit der jedes Mal, wenn Sie darauf klicken, 10 neue Profile geladen und als Liste gerendert werden. Natürlich müssen Sie ein Token und eine URL entsprechend den erforderlichen ändern. Der Profilblock enthält einen Namen, eine Jobposition, einen Standort, einen Link zum Profil und ein Platzhalterbild.

Bild

Fazit
Daher konnten wir mit minimalem Aufwand eine Schwachstelle finden und unsere Suchoption ohne Einschränkungen wiedererlangen. Es genügte, die Daten und ihren Pfad zu analysieren und die Abfrage selbst zu untersuchen.

Ich kann nicht sagen, dass dies ein ernstes Problem für LinkedIn ist, da es keine Bedrohung darstellt. Das Schlimmste, was passieren kann, ist ein Gewinnverlust aufgrund einer solchen "Umgehung", die es Ihnen ermöglicht, kein Premium-Konto zu kaufen. Möglicherweise ist die Antwort eines solchen Servers erforderlich, damit die anderen Teile der Website ordnungsgemäß funktionieren, oder dies ist einfach die Faulheit des Mangels an Ressourcen für Entwickler, die keine bessere Leistung zulässt (The CUL erschien im Januar 2015, bevor es keine Begrenzung gab überhaupt).

PS


Alte ps
Sicher, der jQuery-Code ist ein ziemlich primitives Beispiel für Funktionen. Derzeit habe ich eine Browser-Erweiterung erstellt, die meinen Anforderungen entspricht. Es fügt Steuerschaltflächen hinzu und rendert voll funktionsfähige Profile mit Bildern, einer Einladungsschaltfläche und gegenseitigen Verbindungen. Außerdem werden dynamisch Filter von Standorten, Unternehmen und anderen Dingen erfasst und ein Token aus Cookies abgerufen. Sie müssen also nichts fest codieren. Außerdem fügt die Erweiterung zusätzliche Einstellungsfelder hinzu, z. B. "Wie viele Profile müssen gleichzeitig angefordert werden, bis zu 49."

Beispiel

Ich arbeite noch an dieser Erweiterung und plane, sie öffentlich zugänglich zu machen.
Nachricht an mich, wenn Sie interessiert sind.

Auf vielfachen Wunsch, diese Erweiterung als Open-Source-Produkt zu veröffentlichen, habe ich eine Browser-Erweiterung erstellt und für die öffentliche Nutzung bereitgestellt (kostenlos und sogar ohne Miner). Es verfügt nicht nur über die Limit-Bypass-Funktionalität, sondern auch über einige andere Funktionen. Sie können es sich ansehen und hier herunterladen - adam4leos.imtqy.com

Da es sich um eine Alpha-Version handelt, zögern Sie nicht, mich über Fehler, Ihre Ideen oder sogar über eine zu informieren
gesteinigte coole Benutzeroberfläche. Ich verbessere die Erweiterung weiter und werde von Zeit zu Zeit neue Versionen veröffentlichen.

Wichtiges Update - LinkedIn hat diese Hintertür berücksichtigt und kürzlich behoben. Backdoor und Plugin funktionieren nicht mehr.

Source: https://habr.com/ru/post/de466801/


All Articles