Framhjá leitarmörk LinkedIn með því að spila með API

Takmarka

Það er slík takmörkun á LinkedIn - Takmörk fyrir viðskiptanotkun. Það er afar líklegt að þú, eins og ég þar til nýlega, hafi aldrei lent í því eða heyrt um það.

Framhjá leitarmörk LinkedIn með því að spila með API

Kjarninn í takmörkunum er að ef þú notar leitina að fólki utan tengiliða þinna of oft (það eru engar nákvæmar mælingar, reikniritið ákveður út frá aðgerðum þínum - hversu oft og hversu mikið þú leitaðir, bættir fólki við), þá leitarniðurstaðan verður takmarkað við þrjú snið, í stað 1000 (sjálfgefið 100 síður, 10 snið á síðu). Mörkin eru endurstillt í byrjun hvers mánaðar. Auðvitað, iðgjaldareikningar hafa ekki þessa takmörkun.

En ekki alls fyrir löngu, fyrir gæludýraverkefni, byrjaði ég að leika mér mikið með LinkedIn leit og fékk allt í einu þessa takmörkun. Mér líkaði þetta náttúrulega ekki mjög vel, því ég notaði það ekki í neinum viðskiptalegum tilgangi, þannig að fyrsta hugsun mín var að kynna mér takmörkunina og reyna að komast framhjá því.

[Mikilvæg skýring: efnið í greininni er eingöngu sett fram í upplýsinga- og fræðslutilgangi. Höfundur hvetur ekki til notkunar þeirra í viðskiptalegum tilgangi.]

Við erum að rannsaka vandamálið

Við höfum: í stað tíu sniða með blaðsíðugerð skilar leitin aðeins þremur, eftir það er sett inn blokk með „ráðleggingum“ um úrvalsreikning og fyrir neðan eru óskýr og ósmellanleg snið.

Samstundis teygir höndin út til þróunarborðsins til að skoða þessi földu snið - kannski getum við fjarlægt einhverja óskýra stíl eða dregið upplýsingar úr blokk í merkingunni. En, alveg búist við, eru þessi snið bara staðsetningarmyndir og engar upplýsingar eru geymdar.

Framhjá leitarmörk LinkedIn með því að spila með API

Allt í lagi, nú skulum við líta á Network flipann og athuga hvort aðrar leitarniðurstöður sem skila aðeins þremur sniðum virka í raun. Við finnum beiðnina sem við höfum áhuga á fyrir „/api/search/blended“ og skoðum svarið.

Framhjá leitarmörk LinkedIn með því að spila með API

Snið koma í "innifalið" fylki, en það eru nú þegar 15 einingar í því. Í þessu tilviki eru fyrstu þrír þeirra hlutir með viðbótarupplýsingum, hver hlutur inniheldur upplýsingar um tiltekið snið (td hvort sniðið sé aukagjald ).

Framhjá leitarmörk LinkedIn með því að spila með API

Næstu 12 eru alvöru prófílar - leitarniðurstöður, þar af verða aðeins þrjár sýndar okkur. Eins og þú getur nú þegar giskað á sýnir það aðeins þá sem fá viðbótarupplýsingar (fyrstu þrír hlutir). Til dæmis, ef þú tekur svarið úr prófíl án takmarkana færðu 28 einingar - 10 hluti með viðbótar. upplýsingar og 18 snið.

Svar fyrir prófíl án takmarkanaFramhjá leitarmörk LinkedIn með því að spila með API
Framhjá leitarmörk LinkedIn með því að spila með API

Hvers vegna fleiri en 10 snið berast, þó að beðið sé um nákvæmlega 10, og þeir taka ekki þátt í skjánum á nokkurn hátt, jafnvel á næstu síðu verða þeir ekki - ég veit það ekki ennþá. Ef þú greinir slóð beiðninnar geturðu séð að fjöldi=10 (hversu mörgum prófílum á að skila í svarinu, hámark 49).

Framhjá leitarmörk LinkedIn með því að spila með API

Mér þætti vænt um að fá allar athugasemdir um þetta mál.

Gerum tilraunir

Allt í lagi, það mikilvægasta sem við vitum núna fyrir víst er að það eru fleiri prófílar í svarinu en þeir sýna okkur. Þetta þýðir að við getum fengið fleiri gögn, þrátt fyrir mörkin. Við skulum reyna að draga API sjálf, beint úr stjórnborðinu, með því að nota niðurhal.

Framhjá leitarmörk LinkedIn með því að spila með API

Eins og við var að búast fáum við villu, 403. Þetta er vegna öryggis, hér erum við ekki að senda CSRF tákn (CSRF á Wikipedia. Í hnotskurn er einstakt tákn bætt við hverja beiðni sem er athugað á þjóninum fyrir áreiðanleika).

Framhjá leitarmörk LinkedIn með því að spila með API

Það er hægt að afrita það úr hvaða annarri heppnuðu beiðni eða úr vafrakökum, þar sem það er geymt í 'JSESSIONID' reitnum.

Hvar á að finna tákniðFyrirsögn annarrar beiðni:

Framhjá leitarmörk LinkedIn með því að spila með API

Eða úr vafrakökum, beint í gegnum stjórnborðið:

Framhjá leitarmörk LinkedIn með því að spila með API

Við skulum reyna aftur, að þessu sinni sendum við stillingarnar til að sækja, þar sem við tilgreinum csrf-táknið okkar sem færibreytu í hausnum.

Framhjá leitarmörk LinkedIn með því að spila með API

Velgengni, við fáum alla 10 prófíla. :tada:

Vegna mismunar á hausum er uppbygging svarsins aðeins frábrugðin því sem barst í upphaflegu beiðninni. Þú getur fengið sömu uppbyggingu ef þú bætir 'Samþykkja: 'application/vnd.linkedin.normalized+json+2.1' við hlutinn okkar, við hliðina á csrf tákninu.
Dæmi um svar með viðbættum hausFramhjá leitarmörk LinkedIn með því að spila með API

Meira um hausinn Samþykkja

Hvað er næst?

Síðan geturðu breytt (handvirkt eða sjálfvirkt) færibreytunni „byrjun“, sem bendir á vísitöluna, þar sem við fáum 10 snið (sjálfgefið = 0) úr allri leitarniðurstöðunni. Með öðrum orðum, með því að hækka það um 10 eftir hverja beiðni, fáum við venjulega úttak síðu fyrir síðu, 10 snið í einu.

Á þessu stigi hafði ég næg gögn og frelsi til að halda áfram að vinna að gæludýraverkefninu. En það hefði verið synd að reyna ekki að birta þessi gögn beint á staðnum, þar sem þau voru þegar til staðar. Við förum ekki inn í Ember, sem er notað að framan. jQuery var tengt við síðuna og eftir að hafa grafið upp þekkinguna á grunnsetningafræði í minni geturðu búið til eftirfarandi á nokkrum mínútum.

jQuery kóða

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

Ef þú gerir þetta beint í stjórnborðinu á leitarsíðunni mun það bæta við hnappi sem hleður 10 nýjum sniðum með hverjum smelli og birtir þau á lista. Auðvitað skaltu breyta tákninu og vefslóðinni í það sem þarf áður en þú gerir þetta. Prófílblokkinn mun innihalda nafn, stöðu, staðsetningu, tengil á prófílinn og staðsetningarmynd.

Framhjá leitarmörk LinkedIn með því að spila með API

Ályktun

Þannig tókst okkur, með lágmarks fyrirhöfn, að finna veika blettinn og endurheimta leit okkar án takmarkana. Það var nóg að greina gögnin og leið þeirra, skoða beiðnina sjálfa.

Ég get ekki sagt að þetta sé alvarlegt vandamál fyrir LinkedIn, því það stafar engin ógn af. Hámarkið er tapaður hagnaður vegna slíkra „úrræða“ sem gerir þér kleift að forðast að borga fyrir iðgjald. Kannski er slík viðbrögð miðlara nauðsynleg fyrir réttan rekstur annarra hluta síðunnar, eða það er einfaldlega leti hönnuða og skortur á fjármagni sem gerir það ekki kleift að gera það vel. (Takmörkunin birtist í janúar 2015; áður voru engin takmörk sett).

PS

Auðvitað er jQuery kóðinn frekar frumstætt dæmi um hæfileikana. Í augnablikinu hef ég búið til vafraviðbót sem hentar mínum þörfum. Það bætir við stjórnhnappum og birtir heildarsnið með myndum, boðshnappi og almennum tengingum. Auk þess safnar það síum fyrir staðsetningar, fyrirtæki og annað á virkan hátt og sækir tákn úr vafrakökum. Svo það er engin þörf á að harðkóða neitt lengur. Jæja, það bætir við fleiri stillingarreitum, a la "hversu mörg snið á að biðja um í einu, allt að 49."

Framhjá leitarmörk LinkedIn með því að spila með API

Ég er enn að vinna að þessari viðbót og ætla að gefa hana út fyrir almenning. Skrifaðu ef þú hefur áhuga.

Heimild: www.habr.com

Bæta við athugasemd