Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Οριο

Υπάρχει ένας τέτοιος περιορισμός στο LinkedIn - Όριο εμπορικής χρήσης. Είναι εξαιρετικά πιθανό και εσείς, όπως εγώ μέχρι πρόσφατα, να μην το έχετε συναντήσει ή να μην το έχετε ακούσει ποτέ.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Η ουσία του ορίου είναι ότι εάν χρησιμοποιείτε την αναζήτηση για άτομα εκτός των επαφών σας πολύ συχνά (δεν υπάρχουν ακριβείς μετρήσεις, ο αλγόριθμος αποφασίζει με βάση τις ενέργειές σας - πόσο συχνά και πόσο κάνατε αναζήτηση, προσθέσατε άτομα), τότε το αποτέλεσμα αναζήτησης θα περιοριστεί σε τρία προφίλ, αντί για 1000 (προεπιλεγμένες 100 σελίδες, 10 προφίλ ανά σελίδα). Το όριο επαναφέρεται στην αρχή κάθε μήνα. Φυσικά, Οι λογαριασμοί premium δεν έχουν αυτόν τον περιορισμό.

Αλλά πριν από λίγο καιρό, για ένα έργο για κατοικίδια, άρχισα να παίζω πολύ με την αναζήτηση LinkedIn και ξαφνικά έλαβα αυτόν τον περιορισμό. Φυσικά, δεν μου άρεσε πολύ αυτό, γιατί δεν το χρησιμοποίησα για εμπορικούς σκοπούς, οπότε η πρώτη μου σκέψη ήταν να μελετήσω τον περιορισμό και να προσπαθήσω να τον ξεπεράσω.

[Μια σημαντική διευκρίνιση: το υλικό του άρθρου παρουσιάζεται αποκλειστικά για ενημερωτικούς και εκπαιδευτικούς σκοπούς. Ο συγγραφέας δεν ενθαρρύνει τη χρήση τους για εμπορικούς σκοπούς.]

Μελετάμε το πρόβλημα

Έχουμε: αντί για δέκα προφίλ με σελιδοποίηση, η αναζήτηση επιστρέφει μόνο τρία, μετά τα οποία εισάγεται ένα μπλοκ με μια "σύσταση" ενός λογαριασμού premium και παρακάτω υπάρχουν θολά προφίλ και χωρίς κλικ.

Αμέσως, το χέρι απλώνεται στην κονσόλα προγραμματιστή για να δει αυτά τα κρυφά προφίλ - ίσως μπορούμε να αφαιρέσουμε ορισμένα στυλ θολώματος ή να εξαγάγουμε πληροφορίες από ένα μπλοκ στη σήμανση. Αλλά, πολύ αναμενόμενο, αυτά τα προφίλ είναι απλά εικόνες κράτησης θέσης και δεν αποθηκεύονται πληροφορίες.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Εντάξει, τώρα ας δούμε την καρτέλα Δίκτυο και ας ελέγξουμε αν τα εναλλακτικά αποτελέσματα αναζήτησης που επιστρέφουν μόνο τρία προφίλ λειτουργούν πραγματικά. Βρίσκουμε το αίτημα που μας ενδιαφέρει για "/api/search/blended" και κοιτάμε την απάντηση.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Τα προφίλ έρχονται σε μια «συμπεριλαμβανόμενη» συστοιχία, αλλά υπάρχουν ήδη 15 οντότητες σε αυτήν την περίπτωση, τα τρία πρώτα από αυτά είναι αντικείμενα με πρόσθετες πληροφορίες, κάθε αντικείμενο περιέχει πληροφορίες για ένα συγκεκριμένο προφίλ (για παράδειγμα, εάν το προφίλ είναι premium. ).

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Τα επόμενα 12 είναι πραγματικά προφίλ - αποτελέσματα αναζήτησης, εκ των οποίων μόνο τα τρία θα μας εμφανιστούν. Όπως μπορείτε ήδη να μαντέψετε, δείχνει μόνο όσους λαμβάνουν πρόσθετες πληροφορίες (τα τρία πρώτα αντικείμενα). Για παράδειγμα, εάν πάρετε την απάντηση από ένα προφίλ χωρίς όριο, θα λάβετε 28 οντότητες - 10 αντικείμενα με επιπλέον. πληροφορίες και 18 προφίλ.

Απάντηση για προφίλ χωρίς όριοΠαράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API
Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Γιατί φτάνουν περισσότερα από 10 προφίλ, αν και ζητούνται ακριβώς 10, και δεν συμμετέχουν με κανέναν τρόπο στην εμφάνιση, ακόμη και στην επόμενη σελίδα δεν θα είναι - δεν ξέρω ακόμα. Εάν αναλύσετε τη διεύθυνση URL του αιτήματος, μπορείτε να δείτε αυτό το count=10 (πόσα προφίλ να επιστρέψετε στην απάντηση, το μέγιστο 49).

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Θα χαρώ να λάβω οποιαδήποτε σχόλια σχετικά με αυτό το θέμα.

Ας πειραματιστούμε

Εντάξει, το πιο σημαντικό πράγμα που γνωρίζουμε πλέον σίγουρα είναι ότι υπάρχουν περισσότερα προφίλ στην απάντηση από αυτά που μας δείχνουν. Αυτό σημαίνει ότι μπορούμε να λάβουμε περισσότερα δεδομένα, παρά το όριο. Ας προσπαθήσουμε να τραβήξουμε μόνοι μας το API, απευθείας από την κονσόλα, χρησιμοποιώντας το fetch.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Όπως αναμενόταν, λαμβάνουμε ένα σφάλμα, 403. Αυτό οφείλεται στην ασφάλεια, εδώ δεν στέλνουμε διακριτικό CSRF (CSRF στη Wikipedia. Με λίγα λόγια, ένα μοναδικό διακριτικό προστίθεται σε κάθε αίτημα, το οποίο ελέγχεται στον διακομιστή για αυθεντικότητα).

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Μπορεί να αντιγραφεί από οποιοδήποτε άλλο επιτυχημένο αίτημα ή από cookies, όπου αποθηκεύεται στο πεδίο 'JSESSIONID'.

Πού να βρείτε το διακριτικόΕπικεφαλίδα άλλου αιτήματος:

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Ή από cookies, απευθείας μέσω της κονσόλας:

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Ας προσπαθήσουμε ξανά, αυτή τη φορά περνάμε τις ρυθμίσεις για ανάκτηση, στις οποίες καθορίζουμε το csrf-token μας ως παράμετρο στην κεφαλίδα.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Επιτυχία, λαμβάνουμε και τα 10 προφίλ. :tada:

Λόγω της διαφοράς στις κεφαλίδες, η δομή της απάντησης είναι ελαφρώς διαφορετική από αυτή που λαμβάνεται στο αρχικό αίτημα. Μπορείτε να λάβετε την ίδια δομή εάν προσθέσετε το 'Accept: 'application/vnd.linkedin.normalized+json+2.1' στο αντικείμενό μας, δίπλα στο διακριτικό csrf.
Παράδειγμα απάντησης με προσθήκη κεφαλίδαςΠαράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Περισσότερα σχετικά με την κεφαλίδα Αποδοχή

Ποιο είναι το επόμενο;

Στη συνέχεια, μπορείτε να επεξεργαστείτε (χειροκίνητα ή αυτοματοποιημένα) την παράμετρο «start», δείχνοντας το ευρετήριο, ξεκινώντας από το οποίο θα μας δοθούν 10 προφίλ (προεπιλογή = 0) από ολόκληρο το αποτέλεσμα αναζήτησης. Με άλλα λόγια, αυξάνοντάς το κατά 10 μετά από κάθε αίτημα, παίρνουμε τη συνηθισμένη έξοδο σελίδα προς σελίδα, 10 προφίλ κάθε φορά.

Σε αυτό το στάδιο είχα αρκετά δεδομένα και ελευθερία για να συνεχίσω να εργάζομαι στο έργο κατοικίδιων ζώων. Αλλά θα ήταν αμαρτία να μην προσπαθήσουμε να εμφανίσουμε αυτά τα δεδομένα επί τόπου, καθώς ήταν ήδη διαθέσιμα. Δεν θα πάμε στο Ember, το οποίο χρησιμοποιείται στο μπροστινό μέρος. Το jQuery συνδέθηκε με τον ιστότοπο και έχοντας ανακαλύψει τη γνώση της βασικής σύνταξης στη μνήμη, μπορείτε να δημιουργήσετε τα ακόλουθα σε λίγα λεπτά.

Κωδικός jQuery

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

Εάν το κάνετε απευθείας στην κονσόλα στη σελίδα αναζήτησης, θα προσθέσει ένα κουμπί που φορτώνει 10 νέα προφίλ με κάθε κλικ και τα αποδίδει σε μια λίστα. Φυσικά, αλλάξτε το διακριτικό και τη διεύθυνση URL στο απαιτούμενο πριν το κάνετε αυτό. Το μπλοκ προφίλ θα περιέχει το όνομα, τη θέση, την τοποθεσία, τον σύνδεσμο προς το προφίλ και μια εικόνα κράτησης θέσης.

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Συμπέρασμα

Έτσι, με ελάχιστη προσπάθεια, καταφέραμε να βρούμε το αδύναμο σημείο και να ανακτήσουμε την αναζήτησή μας χωρίς περιορισμούς. Αρκούσε να αναλύσουμε τα δεδομένα και τη διαδρομή τους, να εξετάσουμε το ίδιο το αίτημα.

Δεν μπορώ να πω ότι αυτό είναι ένα σοβαρό πρόβλημα για το LinkedIn, επειδή δεν αποτελεί απειλή. Το μέγιστο είναι χαμένο κέρδος λόγω τέτοιων «λύσεων αντιμετώπισης», που σας επιτρέπει να αποφύγετε να πληρώσετε για το ασφάλιστρο. Ίσως μια τέτοια απόκριση διακομιστή είναι απαραίτητη για τη σωστή λειτουργία άλλων τμημάτων του ιστότοπου ή είναι απλώς τεμπελιά των προγραμματιστών και έλλειψη πόρων που δεν επιτρέπει να γίνει καλά. (Ο περιορισμός εμφανίστηκε τον Ιανουάριο του 2015, πριν από αυτό δεν υπήρχε όριο).

PS

Φυσικά, ο κώδικας jQuery είναι ένα μάλλον πρωτόγονο παράδειγμα των δυνατοτήτων. Αυτή τη στιγμή έχω δημιουργήσει μια επέκταση προγράμματος περιήγησης που ταιριάζει στις ανάγκες μου. Προσθέτει κουμπιά ελέγχου και αποδίδει πλήρη προφίλ με εικόνες, κουμπί πρόσκλησης και γενικές συνδέσεις. Επιπλέον, συλλέγει δυναμικά φίλτρα για τοποθεσίες, εταιρείες και άλλα πράγματα και ανακτά ένα διακριτικό από cookies. Επομένως, δεν χρειάζεται πλέον να κωδικοποιήσετε τίποτα. Λοιπόν, προσθέτει πρόσθετα πεδία ρυθμίσεων, a la "πόσα προφίλ να ζητήσετε τη φορά, έως και 49".

Παράκαμψη του ορίου αναζήτησης του LinkedIn παίζοντας με το API

Εξακολουθώ να εργάζομαι πάνω σε αυτήν την προσθήκη και σκοπεύω να την κυκλοφορήσω στο κοινό. Γράψε αν σε ενδιαφέρει.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο