Как сортировать расширения в интернет-магазине Chrome?

Как сортировать расширения в интернет-магазине Chrome?

Google Chrome Web Store кажется мне катастрофой. Я не могу его понять.

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

Я что-то упускаю из виду?

https://chrome.google.com/webstore/category/extensions

решение1

Я создал простой сортировщик js, который работает в консоли Chrome Dev tools. Вы можете перейти на страницу GitHubздесь.

В основном сортирует расширения в Chrome Web Store. Работает на консоли Chrome Dev Tools, которая запускается Ctrl+Shift+I.

После открытия страницы расширений поиска по ссылкеhttps://chrome.google.com/webstore/search/PHRASE?_category=extensionsс заменой вашей поисковой фразы на ФРАЗУ. И затем код в sorter.js запускается на chrome dev cosole.

Сначала он загружает все расширения на бесконечно прокручиваемой странице, автоматически прокручивая страницу до тех пор, пока она не закончится. Затем он сортирует их по количеству голосов.

var i = 0;
var num_of_items = 0;
var stop = false;
function startCheck(max)
{
    i++;
    
    //document.querySelectorAll('div.h-a-Kd.a-Hd-mb')[0];
    var bottom = document.querySelectorAll('div.h-a-Hd-mb.a-Hd-mb')[0];
    bottom.scrollIntoView();
    //scrollTo(scrollX,scrollY+1000); 
    console.log(i.toString());  
    
    var items = document.querySelectorAll('.a-d-na.a-d.webstore-test-wall-tile.a-d-zc.Xd.dd');
    var new_num_of_items = items.length;
    if (num_of_items != new_num_of_items)
    {
        num_of_items = new_num_of_items;
        console.log('Loaded items : ' + new_num_of_items);
    }   
    
    if (i>max || stop) 
    {
        i = 0;
        num_of_items = 0;
        stop = false;
        items[new_num_of_items-1].scrollIntoView(false);
        sortsort();
        return;
    }
    
    var t = setTimeout(function (){startCheck(max);}, 100);
}

var MAX_COUNT = 25;
var counter = 0;
function stopCheck()
{   
    var spin = document.querySelectorAll('div.h-a-Kd.a-Hd-mb')[0];  
    var state_new = spin.attributes.style.value == "display: none;"
    
    if (state_new)
        counter++;
    else
        counter=0;
    
    console.log('Counter : ' + counter);
    if (counter > MAX_COUNT)
    {
        counter = 0;
        stop = true;        
        return;
    }
    
    var t = setTimeout(function (){stopCheck();}, 100);
}

var sortsort = function() {

    var ab = document.querySelectorAll('.a-d-na.a-d.webstore-test-wall-tile.a-d-zc.Xd.dd');
    console.log(ab.length);
    var ab_arry = Array.from(ab);

    var index_str;
    var star_str;
    ab_arry.forEach((star) => {
        
        index_str = star.attributes.hasOwnProperty("index") ? Number(star.attributes.index.value.toString().replace(/,/g, '')) : 0
        star_str  = star.getElementsByClassName("nAtiRe").length > 0 ? Number(star.getElementsByClassName("nAtiRe")[0].textContent.toString().replace(/,/g, '')).toString() : "Not voted";

        console.log( index_str + " = >>>> " + star_str);        
    });

    ab_arry.sort(function (a,b) {
        var a_star =  a.getElementsByClassName("nAtiRe").length > 0 ? Number(a.getElementsByClassName("nAtiRe")[0].textContent.toString().replace(/,/g, '')) : 0;
        var b_star =  b.getElementsByClassName("nAtiRe").length > 0 ? Number(b.getElementsByClassName("nAtiRe")[0].textContent.toString().replace(/,/g, '')) : 0;
        
        return (b_star - a_star);   
    });


    let row_nodes = document.querySelectorAll('.h-a-x > [role="grid"] > [role="row"]');
    var row_nodes_arry = Array.from(row_nodes);
    var sr;

    for (var rr = 0; rr < row_nodes_arry.length; rr++)
    {   
        sr_start = rr * 3;
        
        var msg = rr.toString() + ' <--- ';
        for (var sr = sr_start; sr < sr_start + 3 && sr < ab_arry.length ; sr++)
        {
            msg += '1:' + sr + ' ';
            row_nodes_arry[rr].appendChild(ab_arry[sr]);
        }   
        console.log(msg);
    }

}

startCheck(3000);
stopCheck();

решение2

Делать особо нечего, но вот несколько мелочей, которые вы можете сделать:

  • По рейтингу (1) :
    • Вы можете фильтровать по рейтингу — устанавливать нижний предел запусков для ваших результатов.
  • Недавно обновлено (2) :
    • Недавно обновлено, как заявил Google, мы не можем знать, есть ли за этим что-то еще. Я предполагаю (из того, что я вижу), что это на самом деле "недавно обновленные популярные расширения".
  • Популярность (3) :
    • Я думаю, что наиболее близким будетВыбор редакторараздел. Обычно это хорошие и популярные приложения/расширения, и тот факт, что их выбирают, также повышает их популярность.
  • Новейшие:
    • К сожалению, это, похоже, невозможно. Возможно, если есть лента обновлений из интернет-магазина, вы можете получить эту информацию оттуда.
  • Загрузки:
    • Не совсем вариант, хотя я думаю, что это можно узнать (более или менее) по другим параметрам (рейтинг, избранность, выбор редактора и т. д.)

введите описание изображения здесь

решение3

Я нашел способ сортировать расширения по «недавно обновленным» немного окольным путем с помощью Google:

Например, я искал последние дополнения jQuery:

  • идти кwww.google.com, искать...
    'сайт:chrome.google.com "jquery"' (или вы также можете использовать 'intitle:"jquery"')
  • нажмите на 'Инструменты > В любое время', измените его на 'На прошлой неделе' или любой другой временной интервал, который вы хотите

результаты будут включать как недавно добавленные, так и обновленные дополнения

решение4

это работает для меня (март 2024 г.)

нажать кнопку «Загрузить еще» несколько раз

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
    for (let i = 0; i < 5; i++) {
        document.querySelector('button.Vs7jVd').click();
        await sleep(i * 1000);
    }
    console.log('Done');
}

demo();

сортировать расширения по рейтингу

// Function to sort extensions by downloads
function sortExtensionsByDownloads() {
  var extensions = [];
  // Selecting each extension item
  var extensionElements = document.querySelectorAll('[jsname="hs2VQd"]:not(.load-more-button)');
  extensionElements.forEach(function(extension) {
    var name = extension.querySelector('.GzKZcb').innerText.trim();
    var downloadsText = extension.querySelector('.Y30PE').innerText.trim();
    extensions.push({ name: name, downloadsText: downloadsText, element: extension });
  });

  // Sorting extensions by number of downloads
  extensions.sort(function(a, b) {
    return compareDownloads(a.downloadsText, b.downloadsText);
  });

  // Reordering extensions on the webpage
  var parentElement = extensionElements[0].parentNode;
  extensions.forEach(function(extension) {
    parentElement.appendChild(extension.element);
  });
}

// Function to compare download counts
function compareDownloads(a, b) {
  // Regular expression to extract numeric value and unit
  var regex = /([\d.]+)\s*([KM]*)/;
  var matchA = regex.exec(a);
  var matchB = regex.exec(b);

  // Extract numeric value and unit
  var aValue = parseFloat(matchA[1]);
  var aUnit = matchA[2];
  var bValue = parseFloat(matchB[1]);
  var bUnit = matchB[2];

  // Convert units to numerical values
  if (aUnit === 'K') aValue *= 1000;
  if (bUnit === 'K') bValue *= 1000;
  if (aUnit === 'M') aValue *= 1000000;
  if (bUnit === 'M') bValue *= 1000000;

  // Compare numerical values
  return bValue - aValue;
}

// Call the function to sort extensions by downloads
sortExtensionsByDownloads();

Связанный контент