API ile oynayarak LinkedIn'in arama sınırını aşmak

Sınırı

LinkedIn'de böyle bir sınırlama var - Ticari kullanım sınırı. Sizlerin de benim gibi yakın zamana kadar bu konuyla hiç karşılaşmamış ya da duymamış olmanız son derece muhtemeldir.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Sınırın özü, kişilerinizin dışındaki kişileri aramak için çok sık kullanırsanız (kesin ölçümler yoktur, algoritma eylemlerinize göre karar verir - ne sıklıkta ve ne kadar aradığınıza, kişi eklediğinize), ardından arama sonucunun ortaya çıkmasıdır. 1000 yerine üç profille sınırlı olacaktır (varsayılan 100 sayfa, sayfa başına 10 profil). Limit her ayın başında sıfırlanır. Doğal olarak, premium hesaplarda bu sınırlama yoktur.

Ancak kısa bir süre önce bir evcil hayvan projesi için LinkedIn aramasıyla çok fazla oynamaya başladım ve aniden bu sınırlamayla karşılaştım. Doğal olarak bu pek hoşuma gitmedi çünkü herhangi bir ticari amaç için kullanmadım, bu yüzden ilk düşüncem sınırlamayı incelemek ve onu aşmaya çalışmaktı.

[Önemli bir açıklama: Makaledeki materyaller yalnızca bilgilendirme ve eğitim amaçlı sunulmaktadır. Yazar bunların ticari amaçlarla kullanılmasını teşvik etmemektedir.]

Sorunu inceliyoruz

Elimizde: Sayfalandırmalı on profil yerine, arama yalnızca üç tane döndürüyor, ardından premium hesap "önerisini" içeren bir blok ekleniyor ve altında bulanık ve tıklanamayan profiller var.

Bu gizli profillere bakmak için el hemen geliştirici konsoluna uzanıyor; belki bazı bulanık stilleri kaldırabilir veya işaretlemedeki bir bloktan bilgi alabiliriz. Ancak, oldukça beklendiği gibi, bu profiller sadece yer tutucu resimleri ve hiçbir bilgi saklanmaz.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Tamam, şimdi Ağ sekmesine bakalım ve yalnızca üç profil döndüren alternatif arama sonuçlarının gerçekten işe yarayıp yaramadığını kontrol edelim. İlgilendiğimiz isteği “/api/search/blend” için buluyoruz ve cevaba bakıyoruz.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Profiller "dahil" dizisinde gelir, ancak içinde zaten 15 varlık vardır. Bu durumda, bunların ilk üçü ek bilgilere sahip nesnelerdir, her nesne belirli bir profil hakkında bilgi içerir (örneğin, profilin premium olup olmadığı) ).

API ile oynayarak LinkedIn'in arama sınırını aşmak

Sonraki 12 tanesi gerçek profillerdir; arama sonuçlarından yalnızca üçü bize gösterilecektir. Zaten tahmin edebileceğiniz gibi, yalnızca ek bilgi alan kişileri (ilk üç nesne) gösterir. Örneğin, yanıtı sınırı olmayan bir profilden alırsanız, 28 varlık - 10 ek nesne alırsınız. bilgi ve 18 profil.

Sınırsız profil için cevapAPI ile oynayarak LinkedIn'in arama sınırını aşmak
API ile oynayarak LinkedIn'in arama sınırını aşmak

Tam olarak 10 tanesi istenmesine rağmen neden 10'dan fazla profil geliyor ve hiçbir şekilde gösterime katılmıyorlar, bir sonraki sayfada bile olmayacaklar - henüz bilmiyorum. İstek URL'sini analiz ederseniz sayının=10 olduğunu görebilirsiniz (yanıtta kaç profil döndürülecek, maksimum 49).

API ile oynayarak LinkedIn'in arama sınırını aşmak

Bu konuyla ilgili herhangi bir yorum almaktan memnuniyet duyarım.

Haydi deneyelim

Tamam, artık kesin olarak bildiğimiz en önemli şey, yanıtlarda bize gösterdiklerinden daha fazla profilin olduğudur. Bu, sınıra rağmen daha fazla veri alabileceğimiz anlamına geliyor. Fetch'i kullanarak API'yi doğrudan konsoldan kendimiz çekmeye çalışalım.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Beklendiği gibi 403 hatası alıyoruz. Bunun nedeni güvenliktir, burada CSRF jetonu göndermiyoruz (Vikipedi'de CSRF. Özetle, her isteğe benzersiz bir jeton eklenir ve bu jeton, sunucuda orijinallik açısından kontrol edilir).

API ile oynayarak LinkedIn'in arama sınırını aşmak

Başka herhangi bir başarılı istekten veya 'JSESSIONID' alanında saklanan çerezlerden kopyalanabilir.

Jeton nerede bulunur?Başka bir isteğin başlığı:

API ile oynayarak LinkedIn'in arama sınırını aşmak

Veya doğrudan konsol aracılığıyla çerezlerden:

API ile oynayarak LinkedIn'in arama sınırını aşmak

Tekrar deneyelim, bu sefer csrf jetonumuzu başlıkta parametre olarak belirttiğimiz ayarları fetch'e aktarıyoruz.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Başarılı, 10 profilin tamamını aldık. :tada:

Başlıklardaki farklılık nedeniyle yanıtın yapısı orijinal istekte alınandan biraz farklıdır. Nesnemize csrf tokenının yanına ‘Accept: ‘application/vnd.linkedin.normalized+json+2.1’ komutunu eklerseniz aynı yapıyı elde edebilirsiniz.
Eklenen başlıkla örnek yanıtAPI ile oynayarak LinkedIn'in arama sınırını aşmak

Kabul Et başlığı hakkında daha fazla bilgi

Sırada ne var?

Daha sonra, tüm arama sonucundan bize 10 profilin (varsayılan = 0) verileceği dizini işaret ederek "başlat" parametresini düzenleyebilirsiniz (manuel veya otomatik hale getirebilirsiniz). Başka bir deyişle, her istekten sonra bunu 10'ar artırarak, her seferinde 10 profil olmak üzere her zamanki sayfa sayfa çıktıyı elde ederiz.

Bu aşamada evcil hayvan projesi üzerinde çalışmaya devam etmek için yeterli veriye ve özgürlüğe sahiptim. Ancak bu veriler zaten el altında olduğundan, anında görüntülemeye çalışmamak günah olurdu. Ön tarafta kullanılan Kor’a girmeyeceğiz. jQuery siteye bağlandı ve temel sözdizimi bilgisini bellekten çıkardıktan sonra birkaç dakika içinde aşağıdakileri oluşturabilirsiniz.

jQuery kodu

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

Bunu doğrudan arama sayfasındaki konsolda yaparsanız, her tıklamayla 10 yeni profil yükleyen ve bunları bir listede görüntüleyen bir düğme eklenecektir. Elbette bunu yapmadan önce belirteci ve URL'yi gerekli olanla değiştirin. Profil bloğu adı, konumu, konumu, profilin bağlantısını ve yer tutucu resmini içerecektir.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Sonuç

Böylece minimum çabayla zayıf noktayı bulmayı ve kısıtlama olmaksızın arayışımızı yeniden kazanmayı başardık. Verileri ve yolunu analiz etmek, isteğin kendisine bakmak yeterliydi.

Bunun LinkedIn açısından ciddi bir sorun olduğunu söyleyemem çünkü herhangi bir tehdit oluşturmuyor. Maksimum, prim ödemekten kaçınmanıza olanak tanıyan bu tür "geçici çözümler" nedeniyle kaybedilen kardır. Belki de sitenin diğer bölümlerinin doğru çalışması için böyle bir sunucu yanıtı gereklidir veya geliştiricilerin tembelliği ve bunun iyi yapılmasına izin vermeyen kaynak eksikliğidir. (Sınırlama Ocak 2015'te ortaya çıktı; bundan önce herhangi bir sınırlama yoktu).

PS

Doğal olarak jQuery kodu, yeteneklerin oldukça ilkel bir örneğidir. Şu anda ihtiyaçlarıma uygun bir tarayıcı uzantısı oluşturdum. Kontrol düğmeleri ekler ve resimlerle, bir davet düğmesiyle ve genel bağlantılarla tam profiller oluşturur. Ayrıca konumlar, şirketler ve diğer şeyler için filtreleri dinamik olarak toplar ve çerezlerden bir jeton alır. Yani artık hiçbir şeyi sabit kodlamaya gerek yok. Peki, "bir seferde kaç profilin isteneceği, en fazla 49" gibi ek ayar alanları ekler.

API ile oynayarak LinkedIn'in arama sınırını aşmak

Hala bu ekleme üzerinde çalışıyorum ve bunu kamuoyuna yayınlamayı planlıyorum. İlgileniyorsanız yazın.

Kaynak: habr.com

Yorum ekle