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

Скоро деякі з нас підуть віддавати свої голоси за чергових кандидатів у депутати. Депутати є нашими представниками і їм ми надаємо право приймати деякі законодавчі рішення за нас. У даних умовах логічно обирати тих хто робить свій вибір також як і ми.
Голоси депутатів перебувають на vote.duma.gov.ru. Нам залишається проголосувати за важливі для нас законопроекти у відповідності зі своїм баченням і отримати рейтинг, на основі якого і робити вибір на виборах.
Я вибрав найменш витратний шлях і написав JavaScript розширення для Chrome. Робота з ним організована через консоль браузера (Ctrl + Shift + J). Бонусом я протестував підтримку російської мови в JavaScript без препроцесорів.
Під катом вас чекає код з коментарями і коментарі до статті.

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

Код:

Файл "manifest.json":
{ 
"manifest_version": 2,
"name": "Твій кандидат",
"description": "Розширення для підрахунку персонального рейтингу депутатів на vote.duma.gov.ua",
"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 );

Файл "insert.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. Система аналізу результатів голосувань на засіданнях Державної Думи
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.