Omseil LinkedIn se soeklimiet deur met die API te speel

Beperk

Daar is so 'n beperking op LinkedIn - KommersiΓ«le gebruik limiet. Dit is uiters waarskynlik dat jy, soos ek tot onlangs toe, dit nog nooit teΓ«gekom of daarvan gehoor het nie.

Omseil LinkedIn se soeklimiet deur met die API te speel

Die kern van die limiet is dat as jy die soektog na mense buite jou kontakte te dikwels gebruik (daar is geen presiese maatstawwe nie, die algoritme besluit op grond van jou aksies - hoe gereeld en hoeveel jy gesoek het, mense bygevoeg het), dan die soekresultaat sal beperk word tot drie profiele, in plaas van 1000 (verstek 100 bladsye, 10 profiele per bladsy). Die limiet word aan die begin van elke maand teruggestel. Natuurlik, premierekeninge het nie hierdie beperking nie.

Maar nie lank gelede nie, vir 'n troeteldierprojek, het ek baie met LinkedIn-soektog begin speel en skielik hierdie beperking gekry. Ek het natuurlik nie baie hiervan gehou nie, want ek het dit nie vir enige kommersiΓ«le doeleindes gebruik nie, so my eerste gedagte was om die beperking te bestudeer en dit te probeer omseil.

['n Belangrike verduideliking: die materiaal in die artikel word uitsluitlik vir inligtings- en opvoedkundige doeleindes aangebied. Die skrywer moedig nie die gebruik daarvan vir kommersiΓ«le doeleindes aan nie.]

Ons bestudeer die probleem

Ons het: in plaas van tien profiele met paginering, gee die soektog slegs drie terug, waarna 'n blokkie met 'n "aanbeveling" van 'n premiumrekening ingevoeg word en onder is vaag en nie-klikbare profiele.

Onmiddellik reik die hand uit na die ontwikkelaarkonsole om na hierdie versteekte profiele te kyk - miskien kan ons 'n paar vervaagde style verwyder, of inligting uit 'n blok in die opmaak onttrek. Maar, na verwagting, is hierdie profiele net plekhouer prente en geen inligting word gestoor nie.

Omseil LinkedIn se soeklimiet deur met die API te speel

Goed, kom ons kyk nou na die Netwerk-oortjie en kyk of die alternatiewe soekresultate wat slegs drie profiele gee, werklik werk. Ons vind die versoek waarin ons belangstel vir "/api/search/blended" en kyk na die antwoord.

Omseil LinkedIn se soeklimiet deur met die API te speel

Profiele kom in 'n "ingesluit" skikking, maar daar is reeds 15 entiteite daarin. In hierdie geval is die eerste drie van hulle voorwerpe met bykomende inligting, elke voorwerp bevat inligting oor 'n spesifieke profiel (byvoorbeeld of die profiel premium is. ).

Omseil LinkedIn se soeklimiet deur met die API te speel

Die volgende 12 is regte profiele - soekresultate, waarvan slegs drie aan ons gewys sal word. Soos u reeds kan raai, wys dit slegs diegene wat bykomende inligting ontvang (die eerste drie voorwerpe). Byvoorbeeld, as jy die antwoord van 'n profiel sonder 'n limiet neem, sal jy 28 entiteite ontvang - 10 voorwerpe met bykomende. inligting en 18 profiele.

Antwoord vir profiel sonder beperkingOmseil LinkedIn se soeklimiet deur met die API te speel
Omseil LinkedIn se soeklimiet deur met die API te speel

Waarom meer as 10 profiele arriveer, alhoewel presies 10 versoek word, en hulle op geen manier aan die vertoning deelneem nie, selfs op die volgende bladsy sal hulle nie wees nie - ek weet nog nie. As jy die versoek-URL ontleed, kan jy daardie telling=10 sien (hoeveel profiele om in die antwoord terug te gee, maksimum 49).

Omseil LinkedIn se soeklimiet deur met die API te speel

Ek sal bly wees om enige kommentaar oor hierdie aangeleentheid te ontvang.

Kom ons eksperimenteer

Goed, die belangrikste ding wat ons nou vir seker weet, is dat daar meer profiele in die reaksie is as wat hulle vir ons wys. Dit beteken dat ons meer data kan kry, ten spyte van die limiet. Kom ons probeer om die API self te trek, direk vanaf die konsole, met behulp van haal.

Omseil LinkedIn se soeklimiet deur met die API te speel

Soos verwag, kry ons 'n fout, 403. Dit is as gevolg van sekuriteit, hier stuur ons nie 'n CSRF-token (CSRF op Wikipedia. In 'n neutedop word 'n unieke teken by elke versoek gevoeg, wat op die bediener nagegaan word vir egtheid).

Omseil LinkedIn se soeklimiet deur met die API te speel

Dit kan gekopieer word vanaf enige ander suksesvolle versoek of van koekies, waar dit in die 'JSESSIONID'-veld gestoor word.

Waar om die teken te vindOpskrif van 'n ander versoek:

Omseil LinkedIn se soeklimiet deur met die API te speel

Of vanaf koekies, direk deur die konsole:

Omseil LinkedIn se soeklimiet deur met die API te speel

Kom ons probeer weer, hierdie keer gee ons die instellings deur om te gaan haal, waarin ons ons csrf-token spesifiseer as 'n parameter in die kop.

Omseil LinkedIn se soeklimiet deur met die API te speel

Sukses, ons ontvang al 10 profiele. :tada:

As gevolg van die verskil in opskrifte, verskil die struktuur van die antwoord effens van wat in die oorspronklike versoek ontvang is. Jy kan dieselfde struktuur kry as jy 'Aanvaar: 'application/vnd.linkedin.normalized+json+2.1' by ons voorwerp voeg, langs die csrf-token.
Voorbeeldreaksie met bygevoegde kopskrifOmseil LinkedIn se soeklimiet deur met die API te speel

Meer oor die Aanvaar-kopskrif

Wat is volgende?

Dan kan jy die `begin`-parameter wysig (handmatig of outomatiseer), wat na die indeks wys, vanwaar ons 10 profiele (verstek = 0) van die hele soekresultaat sal kry. Met ander woorde, deur dit met 10 na elke versoek te verhoog, kry ons die gewone bladsy-vir-bladsy-afvoer, 10 profiele op 'n slag.

Op hierdie stadium het ek genoeg data en vryheid gehad om aan die troeteldierprojek te werk. Maar dit sou 'n sonde gewees het om nie hierdie data direk op die plek te probeer vertoon nie, aangesien dit reeds byderhand was. Ons gaan nie na Ember, wat aan die voorkant gebruik word nie. jQuery is aan die webwerf gekoppel, en nadat u die kennis van basiese sintaksis in die geheue opgegrawe het, kan u die volgende binne 'n paar minute skep.

jQuery kode

/* Ρ€Π΅Π½Π΄Π΅Ρ€ Π±Π»ΠΎΠΊΠ°, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ профиля ΠΈ вставляСм Π±Π»ΠΎΠΊ Π² список ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти Π΄Π°Π½Π½Ρ‹Π΅ */
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="/af/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="/af/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;

As jy dit direk in die konsole op die soekbladsy doen, sal dit 'n knoppie byvoeg wat 10 nuwe profiele met elke klik laai en dit in 'n lys weergee. Verander natuurlik die teken en URL na die vereiste een voordat u dit doen. Die profielblok sal die naam, posisie, ligging, skakel na die profiel en 'n plekhouer-prent bevat.

Omseil LinkedIn se soeklimiet deur met die API te speel

Gevolgtrekking

Sodoende kon ons met 'n minimum moeite die swak plek vind en sonder beperkings ons soektog herwin. Dit was genoeg om die data en die pad daarvan te ontleed, na die versoek self te kyk.

Ek kan nie sΓͺ dat dit 'n ernstige probleem vir LinkedIn is nie, want dit hou geen bedreiging in nie. Die maksimum is verlore wins as gevolg van sulke "oplossings", wat jou toelaat om te vermy om vir premie te betaal. Miskien is so 'n bedienerreaksie nodig vir die korrekte werking van ander dele van die webwerf, of dit is bloot luiheid van die ontwikkelaars en 'n gebrek aan hulpbronne wat nie toelaat dat dit goed gedoen word nie. (Die beperking het in Januarie 2015 verskyn; voor dit was daar geen beperking nie).

PS

Natuurlik is die jQuery-kode 'n taamlik primitiewe voorbeeld van die vermoΓ«ns. Op die oomblik het ek 'n blaaieruitbreiding geskep om by my behoeftes te pas. Dit voeg beheerknoppies by en gee volledige profiele met prente, 'n uitnodigingsknoppie en algemene verbindings weer. Boonop versamel dit dinamies filters vir liggings, maatskappye en ander dinge, en haal 'n teken van koekies af. Dit is dus nie nodig om enigiets meer te hardkodeer nie. Wel, dit voeg bykomende instellingsvelde by, a la "hoeveel profiele om op 'n slag te versoek, tot 49."

Omseil LinkedIn se soeklimiet deur met die API te speel

Ek werk steeds aan hierdie toevoeging en beplan om dit aan die publiek vry te stel. Skryf as jy belangstel.

Bron: will.com

Voeg 'n opmerking