Untitled

 avatar
unknown
plain_text
10 days ago
4.4 kB
0
Indexable
// Utility: Wait a moment
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

// Utility: Wait for an element to appear
async function waitForElement(selector, timeout = 10000) {
    const start = Date.now();
    while (Date.now() - start < timeout) {
        const element = document.querySelector(selector);
        if (element) return element;
        await delay(500);
    }
    throw new Error(`Element not found: ${selector}`);
}

// Function to select an element using keyboard events
async function selectElement(element) {
    try {
        // Bring focus to the element
        element.focus();

        // Simulate pressing the Down Arrow key
        const downArrowEvent = new KeyboardEvent('keydown', {
            key: 'ArrowDown',
            code: 'ArrowDown',
            keyCode: 40,
            bubbles: true
        });
        element.dispatchEvent(downArrowEvent);

        // Simulate pressing the Spacebar
        const spacebarEvent = new KeyboardEvent('keydown', {
            key: ' ',
            code: 'Space',
            keyCode: 32,
            bubbles: true
        });
        element.dispatchEvent(spacebarEvent);

        // Wait for the UI to update
        await delay(1000);

        return document.getElementById('show-user-detail-expirationDate') !== null;
    } catch (error) {
        console.error('Error selecting element with keyboard:', error);
        return false;
    }
}

// Function to download CSV
function downloadCSV(data) {
    const blob = new Blob([data], { type: 'text/csv' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'user_expirations.csv';
    document.body.appendChild(a);
    a.click();
    setTimeout(() => {
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }, 100);
}

// Main function
async function getExpirationDates() {
    console.log('Waiting for user list...');
    const userList = await waitForElement('[role="option"]');
    const users = document.querySelectorAll('[role="option"]');
    console.log(`Found ${users.length} users`);

    const data = [];
    const batchSize = 50; // Process users in batches of 50
    const delayBetweenBatches = 5000; // 5 seconds delay between batches

    for (let i = 0; i < users.length; i += batchSize) {
        const batch = Array.from(users).slice(i, i + batchSize);
        console.log(`Processing batch ${i / batchSize + 1}/${Math.ceil(users.length / batchSize)}`);

        for (let j = 0; j < batch.length; j++) {
            const user = batch[j];
            const name = user.querySelector('dd') ? user.querySelector('dd').textContent.trim() : `User ${i + j + 1}`;
            console.log(`Processing user ${i + j + 1}/${users.length}: ${name}`);

            try {
                const selected = await selectElement(user);
                if (!selected) {
                    console.log(`Failed to select user: ${name}`);
                    continue;
                }

                await delay(2000); // Wait for UI to update
                const expirationDate = document.getElementById('show-user-detail-expirationDate')
                    ? document.getElementById('show-user-detail-expirationDate').textContent.trim()
                    : 'Not found';

                data.push({ name, expiration: expirationDate });
                console.log(`${name}: ${expirationDate}`);
                await delay(1000); // Wait before next user
            } catch (error) {
                console.error(`Error processing user ${i + j + 1}:`, error);
            }
        }

        if (i + batchSize < users.length) {
            console.log(`Waiting ${delayBetweenBatches / 1000} seconds before next batch...`);
            await delay(delayBetweenBatches);
        }
    }

    const csv = ['Name,Expiration Date'];
    data.forEach(row => csv.push(`"${row.name}","${row.expiration}"`));
    console.log('Complete data:', csv.join('\n'));
    downloadCSV(csv.join('\n'));
}

// Run the script after ensuring the page is fully loaded
(async () => {
    try {
        await getExpirationDates();
        console.log('Script completed!');
    } catch (err) {
        console.error('Error:', err);
    }
})();
Leave a Comment