Функция JavaScript для получения идентификатора Instagram

У меня есть функция JavaScript с кнопкой события для получения идентификатора пользователей Instagram, но проблема в том, что она получит только идентификатор первого пользователя, и если я попытаюсь перейти к другому профилю, она выдаст идентификатор старого профиля. , вместо получения профиля текущей страницы?

(function() {
    'use strict';

    // Function to extract profile ID from the Instagram page
    function getProfileId() {
        // Extracting profile ID from the page source
        var pageSource = document.documentElement.innerHTML;
        var profileIdPattern = /"profilePage_(\d+)"/;
        var matches = pageSource.match(profileIdPattern);
        if (matches && matches.length > 1) {
            return matches[1];
        }
        return null;
    }

    // Function to copy text to clipboard
    function copyToClipboard(text) {
        GM_setClipboard(text, 'text');
    }

    // Function to create and append a copy button to the Instagram page
    function createCopyButton() {
        var button = document.createElement('button');
        button.textContent = 'Copy Profile ID';
        button.style.position = 'fixed';
        button.style.top = '20px';
        button.style.right = '20px';
        button.style.zIndex = '9999';
        button.style.padding = '10px';
        button.style.border = 'none';
        button.style.backgroundColor = '#3897f0';
        button.style.color = '#fff';
        button.style.cursor = 'pointer';
        button.addEventListener('click', function() {
            var profileId = getProfileId();
            if (profileId) {
                copyToClipboard(profileId);
                console.info('Profile ID copied to clipboard:', profileId);
                alert('Profile ID copied to clipboard:\n' + profileId);
            } else {
                console.info('Profile ID not found.');
                alert('Profile ID not found.');
            }
        });
        document.body.appendChild(button);
    }

    // Run the function to create the copy button when the page is loaded
    window.addEventListener('load', createCopyButton);

})();

Как мне исправить это так, чтобы он перезагружался каждый раз, когда я пытаюсь получить идентификатор нового профиля после первого?

Переход на другую страницу, скорее всего, на самом деле не загружает совершенно новую страницу, а только загружает контент в фоновом режиме, который затем добавляется в текущий документ, а элементы, созданные из содержимого предыдущих страниц, только скрываются. Таким образом, внутренний HTML будет содержать несколько вхождений "profilePage_XYZ", но ваш код соответствует только первому из них...

CBroe 27.02.2024 11:37

Есть ли способ исправить это тогда? Мне кажется, он должен как-то каждый раз обновлять страницу, а это значит, что приходится делать много ненужной загрузки?

theprogrammer451 27.02.2024 12:21

Попробуйте сопоставить все, а не только первое, а затем работать с последним полученным совпадением...? (Не уверен, что IG помещает это только в одно место документа или может быть несколько вхождений одного и того же идентификатора пользователя.)

CBroe 27.02.2024 12:23

Вы пробовали использовать API Instagram?

double-beep 04.03.2024 14:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Символ user_id не всегда присутствует в HTML-коде страницы, для получения стабильного результата вам придется использовать API. Чтобы свести изменения к минимуму, вы можете заменить функцию getProfileId на это:

function getProfileId() {
    const username_div = document.querySelector('header > section > div:first-child > div:first-child'); // this div should contain the user handle
    if (!username_div) return;
    const url = `https://www.instagram.com/api/v1/users/web_profile_info/?username=${username_div.textContent}`;
    const request = new XMLHttpRequest();
    request.open('GET', url, false); // synchronous request
    request.setRequestHeader('x-ig-app-id', '936619743392459'); // important header, will get error(400) without it
    request.send();
    const obj = JSON.parse(request.responseText);
    return obj.data.user.id;
}

если вы хотите использовать выборку, вам придется использовать обратный вызов или изменить свои функции на использование async/await.

Кроме того, вы можете захотеть отображать кнопку только на страницах профиля, например, прослушивая события навигации.

например: window.navigation.addEventListener('navigatesuccess', () => setTimeout(toggleButton, 1000))

toggleButton может быть примерно так:

function toggleButton(){
    const button = document.querySelector('#get-id');
    const target = document.querySelector('header > section > div:first-child');
    button && (button.style.visibility = target ? 'visible' : 'hidden');
}

и обязательно добавьте эти строки в конец функции createCopyButton:

button.id = 'get-id';
toggleButton();

Другие вопросы по теме