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

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


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


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


Под катом вас ждёт код с комментариями и комментарии к статье.
18cd8a9ffa734647841323063442e33e.jpg


В папке «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.
    Например: http://vote.duma.gov.ru/vote/95967 (ссылка взята отсюда здесь)
  2. Открываем консоль браузера (Ctrl + Shift + J).
    3.1. Если против пишем:


    против()

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


    за()

  3. Нажимаем Enter

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


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

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


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

  3. Нажимаем Enter

Результат


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


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


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

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


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

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


Заключение


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


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


Источники


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

Комментарии (2)

  • 29 июля 2016 в 17:15

    +4

    Вот это импортозамещение в названии переменных/функций!
    • 29 июля 2016 в 17:29 (комментарий был изменён)

      0

      Главное что работает без препроцессора благодаря Unicode.

© Habrahabr.ru