/* * @title Radish Network Speed Testing の測定結果をダウンロード * @description 「みんなの測定結果」の絞り込み検索後に実行すると、指定した期間のデータをCSVファイルとしてダウンロードできる。 * @include http://netspeed.studio-radish.com/cgi-bin/netspeed/openresult/openresult.cgi?* * @license MIT License * @private */ (function(w, d) { 'use strict'; var DEFAULT_PERIOD_MONTH = 1, period_month = prompt('収集期間: n(ヶ月) (※nヶ月前~昨日までの測定データが対象)', DEFAULT_PERIOD_MONTH); if (period_month === null) { return; } period_month = parseInt(period_month, 10); if (period_month <= 0) { period_month = DEFAULT_PERIOD_MONTH; } var script = d.createElement('script'); script.src = '//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js'; d.body.appendChild(script); function check() { if (!w.jQuery) { setTimeout(check, 100); return; } var $ = w.jQuery; function change_speed_to_Mbps(speed) { if (!$.trim(speed).match(/([\d.]+)\s*(\w?)bps/i)) { return speed; } var value = RegExp.$1, unit = RegExp.$2; switch (unit.toUpperCase()) { case 'K': value /= 1000.0; break; case 'M': break; case 'G': value *= 1000.0; break; case 'T': value *= 1000000.0; break; default: value /= 1000000.0; break; } return value; } function get_filter_info() { var option_text_list = [], filter_setting = $('div#filter_setting'); filter_setting.find('select').each(function() { var select = $(this), value = select.val(); select.find('option[value=' + value + ']').each(function() { var option = $(this), text = option.text().replace(/[─│┌┐┘└├┬┤┴┼]/g, ''); option_text_list.push(text); }); }); var zipcode = ''; filter_setting.find('input').each(function() { var input = $(this), type = input.attr('type'), name = input.attr('name'), value = input.val(); switch (type) { case 'checkbox': option_text_list.push( value + '=' + (input.prop('checked') ? 'ON' : 'OFF') ); break; case 'text': if (name == 'zipcode1') { zipcode += value; } else if (name == 'zipcode2') { zipcode += '-' + value; option_text_list.push(zipcode); } break; } }); return option_text_list.join('・'); } function get_date_string(date) { return date.getFullYear() + '/' + (parseInt(date.getMonth(),10) + 1) + '/' + date.getDate(); } function get_time_string(date) { return date.getHours() + ':' + date.getMinutes(); } function get_date(speed_data) { if ( !speed_data.match(/(\d{4})\/(\d{1,2})\/(\d{1,2})[\s()a-zA-Z]+(\d{1,2}):(\d{1,2})/) ) { return null; } return new Date(RegExp.$1, RegExp.$2 - 1, RegExp.$3, RegExp.$4, RegExp.$5); } function get_any_value(data, title, terminator) { if ( !data.match(title + '\\s*[::]\\s*(.*?)' + terminator) ) { return ''; } return $.trim(RegExp.$1); } function get_server(speed_data) { return get_any_value(speed_data, '測定サーバー', '\\*詳細情報\\*'); } function get_service_type(speed_data2) { return get_any_value(speed_data2, '使用回線', '\\n'); } function get_isp(speed_data2) { return get_any_value(speed_data2, 'プロバイダ', '\\n'); } function get_area(speed_data2) { return get_any_value(speed_data2, '測定地', '\\n'); } function get_speed_info(table) { var topic_id = $.trim(table.find('a[href *= "openresult.cgi?topic"]').first().text()), NA = '', downlink_speed = NA, uplink_speed = NA, speed_list = [], speed_data = table.find('div.speeddata').first().text(), speed_data2 = table.find('div.speeddata2').first().text(); table.find('span.graphmarker').each(function(){ speed_list.push(change_speed_to_Mbps($(this).text())); }); if (table.find('nobr:contains(下り)').size() < 1) { speed_list.unshift(NA); } if (table.find('nobr:contains(上り)').size() < 1) { speed_list.push(NA); } if (2 <= speed_list.length) { downlink_speed = speed_list[0]; uplink_speed = speed_list[1]; } return { topic_id : topic_id , date : get_date(speed_data) , server : get_server(speed_data) , service_type : get_service_type(speed_data2) , isp : get_isp(speed_data2) , area : get_area(speed_data2) , downlink_speed : downlink_speed , uplink_speed : uplink_speed }; } var get_page_info = (function() { var next_url_dict = {}, topic_id_dict = {}; return function(page_root, since_date, until_date) { var speed_info_list = [], next_url = null, first_date = new Date(); page_root.find('table.graphscale').each(function() { var table = $(this).parents('table').eq(1), speed_info = get_speed_info(table), target_date = speed_info.date, topic_id = speed_info.topic_id; if (!speed_info.date) { console.log('日付不正: ' + topic_id); return; } if (topic_id_dict[topic_id]) { console.log('topic_id重複: ' + topic_id); return; } topic_id_dict[topic_id] = true; if (target_date < first_date) { first_date = target_date; } if (target_date < since_date || until_date <= target_date) { console.log('期間外: ' + topic_id); return; } /* //if (speed_info.downlink_speed < 0) { // console.log('下りスピードデータなし' + topic_id); // return; //} */ speed_info_list.push(speed_info); }); if (since_date <= first_date) { next_url = page_root.find('a[href *= "openresult.cgi"]:contains(過去のデータへ)').first().attr('href'); if (next_url_dict[next_url]) { next_url = null; } next_url_dict[next_url] = true; } return { speed_info_list : speed_info_list , next_url : next_url } }; })(); (function() { var speed_info_list = [], until_date = new Date(), since_date, download_link_id = 'data-to-csv', download_link = $('a#' + download_link_id), page = 1, link_text = '【#PAGE#ページ目データ: #COUNT# 件 (合計:#TOTAL# 件)】'; until_date = new Date(until_date.getFullYear(), until_date.getMonth(), until_date.getDate()); since_date = new Date(until_date.getTime()) since_date.setMonth(until_date.getMonth() - period_month); if (0 < download_link.size()) { download_link.remove(); } download_link = $('') .attr('id', download_link_id) .css({ 'margin-left' : '32px' , 'font-size' : '16px' , 'background-color' : 'yellow' }); $('div.title1').append(download_link); function get_csv_line(csv_columns) { var output_columns = []; $.each(csv_columns, function(index, csv_column) { output_columns.push('"' + (typeof csv_column == 'string' ? csv_column.replace(/"/g, '""') : csv_column) + '"'); }); return output_columns.join(','); } function finish() { var csv_lines = [], max_date = new Date(until_date.getTime()); max_date.setDate(until_date.getDate() - 1); csv_lines.push(get_csv_line([ get_date_string(since_date) , '~' , get_date_string(max_date) , '絞り込み条件:' , get_filter_info() ])); csv_lines.push(get_csv_line([ 'Topic ID' , '測定日' , '時刻' , '測定サーバー' , '使用回線' , 'プロバイダ' , '測定地' , '下り速度(Mbps)' , '上り速度(Mbps)' ])); $.each(speed_info_list, function(index, speed_info) { var date = speed_info.date; csv_lines.push(get_csv_line([ speed_info.topic_id , get_date_string(date) , get_time_string(date) , speed_info.server , speed_info.service_type , speed_info.isp , speed_info.area , speed_info.downlink_speed , speed_info.uplink_speed ])); }); var csv = csv_lines.join('\n'), bom = new Uint8Array([0xEF, 0xBB, 0xBF]), blob = new Blob([bom, csv], {'type' : 'text/csv'}), file_name = 'netspeed.studio-radish.com_' + period_month + 'months_' + (new Date().getTime()) + '.csv', data_url = (w.URL || w.webkitURL).createObjectURL(blob); download_link .attr('download', file_name) .attr('href', data_url); if (w.navigator.msSaveOrOpenBlob) { function open_dialog() { w.navigator.msSaveOrOpenBlob(blob, file_name); } download_link.click(open_dialog).click(); } else { download_link.get(0).click(); } } function load_page(page_info) { $.merge(speed_info_list, page_info.speed_info_list); download_link.text( link_text .replace(/#PAGE#/g, page) .replace(/#COUNT#/g, page_info.speed_info_list.length) .replace(/#TOTAL#/g, speed_info_list.length) ); if (!page_info.next_url) { finish(since_date, until_date); return; } $.get(page_info.next_url, function(html){ var html = html.replace(/(?:^[\s\S]*?