- PVSM.RU - https://www.pvsm.ru -

Персональный рейтинг депутатов каждому при помощи JavaScript и браузера Chrome

Скоро некоторые из нас пойдут отдавать свои голоса за очередных кандидатов в депутаты. Депутаты являются нашими представителями и им мы предоставляем право принимать некоторые законодательные решения за нас. В данных условиях логично выбирать тех кто делает свой выбор также как и мы.

Голоса депутатов находятся на vote.duma.gov.ru [1]. Нам остаётся проголосовать за важные для нас законопроекты в соответствии со своим видением и получить рейтинг на основе которого и делать выбор на выборах.

Я выбрал наименее затратный путь и написал JavaScript расширение для Chrome. Работа с ним организованна через консоль браузера (Ctrl + Shift + J). Бонусом я протестировал поддержку русского языка в JavaScript без препроцессоров.

Под катом [2] вас ждёт код с комментариями и комментарии к статье.
Персональный рейтинг депутатов каждому при помощи JavaScript и браузера Chrome - 1 [2]

В папке "vote" три файла "manifest.json", "insert.js", "script.js" в кодировке UTF-8 (без BOM).

Код:

Файл "manifest.json":

{ 
  "manifest_version": 2,
  "name": "Твой кандидат",
  "description": "Расширение для подсчёта персонального рейтинга депутатов на vote.duma.gov.ru",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": [ "http://vote.duma.gov.ru/*" ],
      "js": [ "insert.js" ],
      "run_at": "document_end"
    }
  ],
  "web_accessible_resources": [
    "script.js"
  ]
} 

Часть манифеста "web_accessible_resources" даёт доступ странице загружать и использовать перечисленные в ней файлы плагина. "script.js" это основной скрипт в котором вся логика.

Хром не даёт прямого доступа расширениям к переменным страницы. Мы внедряем свой скрипт("script.js") в саму страницу при помощи "insert.js".

Файл "insert.js":

var script   = document.createElement( 'script' );
script.type  = 'text/javascript';
script.src   = chrome.extension.getURL( 'script.js' );
script.async = 1;
document.head.appendChild( script );

Файл "script.js":

var голосовать = function( ваш_голос )
{
    // Для хранения рейтинга и остальных данных депутатов используется localStorage
    var депутаты = JSON.parse( localStorage.getItem( "депутаты" ) || "{}" )

    // В переменной deputiesData храняться голоса депутатов за текущий закнопроект и другие данные.
    deputiesData.forEach( function( депутат )
    {
        var ls_депутат = депутаты[ депутат.url ];

        // Восстанавливаем сохранённый рейтинг или устанавливаем 0
        депутат.рейтинг = ( !ls_депутат ) ? 0 : ls_депутат.рейтинг;

        // Восстанавливаем статистику
        депутат.статистика = ( !ls_депутат ) ? {} : ls_депутат.статистика;

        // Копируем имя
        депутат.имя = депутат.sortName;

        // Сохраняем статистику голосов депутатов на будущее.
        if ( ! депутат.статистика[ депутат.result ] )
            депутат.статистика[ депутат.result ] = 1;
        else
            депутат.статистика[ депутат.result ] ++;

        // У каждого депутата есть ссылка с его ID на результаты его голосования.
        // Используем её как уникальный идентификатор.
        депутаты[ депутат.url ] = депутат;

        // Результат голосования каждого депутата лежит в переменной result
        // Соответствия взяты из функции renderer скрипта на странице с результатами голосования на vote.duma.gov.ru.
        // Значение -1 соответствует голосу "За"
        // Значение 0 соответствует голосу "Воздержался"
        // Значение 1 соответствует голосу "Против"
        // Значение 2 соответствует голосу "Не голосовал"

        // Меняем рейтинг депутата в соответствии с нашим выбором.
        депутат.рейтинг += ( депутат.result == ваш_голос ) ? 1 : -1;
    } )

    //Сохраняем рейтинг и другие данные в localStorage
    localStorage.setItem( "депутаты" , JSON.stringify( депутаты ) );
}

var за = function()
{
    // Значение -1 соответствует голосу "За"
    return голосовать( -1 );
}

var против = function()
{
    // Значение 1 соответствует голосу "Против"
    return голосовать( 1 );
}

var вывести_по_рейтингу = function( список )
{
    var список_по_рейтингу = [];

    for ( ключ in список )
        список_по_рейтингу.push( список[ ключ ] );

    список_по_рейтингу.sort( function( первый, второй )
    {
        // Сортируем в порядке убывания рейтинга
        return второй.рейтинг - первый.рейтинг;
    } )

    список_по_рейтингу.forEach( function( элемент )
    {
        // Выводим результаты в консоль
        console.log( элемент.имя + ": " + элемент.рейтинг + ( элемент.количество ? "(" + элемент.количество + ")" : "" ) );
    } )

}

var рейтинг_депутатов = function()
{
    var депутаты = JSON.parse( localStorage.getItem( "депутаты" ) || "{}" );

    вывести_по_рейтингу( депутаты );
}

var рейтинг_партий = function()
{
    var депутаты = JSON.parse( localStorage.getItem( "депутаты" ) || "{}" );
    var партии = {};

    for ( идентификатор in депутаты )
    {
        var депутат = депутаты[ идентификатор ];
        var партия = партии[ депутат.factionCode ];
        if ( партия )
        {
            // Рейтинг партии складывается из рейтинга депутатов.
            партия.рейтинг += депутат.рейтинг;
            партия.количество ++;
        }
        else
            партии[ депутат.factionCode ] = { имя: депутат.faction , рейтинг: депутат.рейтинг , количество: 1 };
    }

    вывести_по_рейтингу( партии );
}

console.log( "за() - проголосовать заn
против() - проголосовать противn
рейтинг_депутатов() - выводит текущий рейтинг депутатов в соответствии с вашими голосамиn
рейтинг_партий() - выводит текущий рейтинг партий в соответствии с вашими голосамиn
" )

Установка

  1. Копируем папку "vote" с содержимым на локальный диск.
  2. В браузере Chrome открываем "chrome://extensions/" или "Главное Меню > Дополнительные инструменты > Расширения"
  3. Ставим галочку "Режим разработчика"
  4. Нажимаем "Загрузить распакованное расширение..."
  5. Находим и выбираем папку "vote" со скриптами.
  6. Нажимаем ОК.

Использование

Голосуем

  1. Заходим на страницы с голосами депутатов на vote.duma.gov.ru [1].
    Например: http://vote.duma.gov.ru/vote/95967 [3] (ссылка взята отсюда здесь [4])
  2. Открываем консоль браузера (Ctrl + Shift + J).
    3.1. Если против пишем:

    против()

    3.2. Если за пишем:

    за()

  3. Нажимаем Enter

Получаем рейтинг

  1. Заходим на любую страницу vote.duma.gov.ru [1].
  2. Открываем консоль браузера (Ctrl + Shift + J) ещё не открыта.
    3.1. Для вывода рейтинга депутатов:

    рейтинг_депутатов()

    3.2. Для вывода рейтинга партий:

    рейтинг_партий()

  3. Нажимаем Enter

Результат

В результате каждый пользователь этого скрипта получает свой рейтинг депутатов и партий в соответствии со своим выбором и выбором депутатов.

Пример рейтинга депутатов:

Иванов Иван Иванович: 5
Петров Пётр Петрович: 0
Сидоров Владимир Владимирович: -5

Пример рейтинга партий (в скобках количество депутатов):

Пиастрская: 100 (10)
Фарианская: 0 (1)
АнтиПиастрская: -100 (1)

Все имена и события вымышлены. Совпадения случайны.

Заключение

Надеюсь этот скрипт поможет делать более осознанный выбор своего представителя в законодательной власти. А заодно и покажет пример написания расширения для анализа данных на государственных сайтах .

Об ошибках прошу писать в личные сообщения.

Источники

  1. Создаём своё расширение для Google Chrome [5]
  2. Как запускать расширения Хрома не из магазина WebStore [6]
  3. Скрипты на GitHub [7]
  4. Система анализа результатов голосований на заседаниях Государственной Думы [1]

Автор: ivan386

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/164153

Ссылки в тексте:

[1] vote.duma.gov.ru: http://vote.duma.gov.ru/

[2] Под катом: https://habrahabr.ru/post/306744/

[3] http://vote.duma.gov.ru/vote/95967: http://vote.duma.gov.ru/vote/95967

[4] здесь: https://geektimes.ru/post/277682/#comment_9389162

[5] Создаём своё расширение для Google Chrome: https://habrahabr.ru/post/198652/

[6] Как запускать расширения Хрома не из магазина WebStore: https://habrahabr.ru/post/226063/

[7] Скрипты на GitHub: https://github.com/ivan386/vote

[8] Источник: https://habrahabr.ru/post/306744/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best