うーん、無法地帯になることがわかっているけども当たり障りのない言葉で躱してるって感じなのが怖いところだなぁと思いました。
APIで頑張ってみようと思ったけどもWEB情報通りにやってもうまく反応しなかった。
開発環境の違い?というか実行環境が違うというのがあると思うけども
とりあえず簡単にできそうなコメントXMLの取得で作るという形で収まった。
ユーザーJSを利用しjQueryを読み込み、現在見ているニコニコ動画の動画ページにアイコンを追加し
アイコンをクリックすると最大1000件までの現在のコメントを取得するって流れ。
まだ途中までだけど、というか最後の描画部分の際に微妙に飽きてしまっただけ。
一応コンソールには表示されるまでは作ってる。
ソートも一応つけてみたが。
// ==UserScript==
// @name ニコニココメント取得
// @version 1
// @grant none
// @description ニコニコ動画の動画一覧におけるコメントの取得
// @match http://www.nicovideo.jp/watch/*
/* load jQuery */
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js
// ==/UserScript==
jQuery(document).ready(function () {
//https://www.webprofessional.jp/sort-an-array-of-objects-in-javascript/より
//ソート関数
function compareValues(key, order='ASC') {
return function(a, b) {
if(!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
// property doesn't exist on either object
return 0;
}
const varA = (typeof a[key] === 'string') ?
a[key].toUpperCase() : a[key];
const varB = (typeof b[key] === 'string') ?
b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
} else if (varA < varB) {
comparison = -1;
}
return (
(order == 'DESC') ? (comparison * -1) : comparison;
);
};
}
//CSS'
var $obj_dialog ={
opacity: "0.9",
backgroundColor: "#ddd",
textAlign:"center",
width:350,
paddingTop:30,
paddingBottom:30,
position: "absolute",
top: 100,
right: 25,
zIndex: "900",
boxShadow:"1px 1px 3px #666",
}
var $dialog_button = {
marginRight:30,
paddingTop:10,
paddingBottom:10,
fontSize:16,
textAlign:"center",
width:100,
backgroundColor: "#fff",
cursor:"pointer",
}
var $order_button = {
display:"inline-block",
color:"#333",
marginRight:30,
paddingTop:10,
paddingBottom:10,
marginBottom:10,
borderRadius:3,
fontSize:16,
textAlign:"center",
width:100,
backgroundColor: "#eee",
border:"solid 1px #333",
cursor:"pointer",
}
var $on_button = {
color:"#eee",
backgroundColor: "#444",
opacity: "1",
cursor:"normal",
}
//xml用のURLの解析データの取得
$_main_data = $('div#js-initial-watch-data').data('api-data');
//xmlのURLの作成
var $messageServerUrl = $_main_data["thread"]["serverUrl"];
var $threadId = $_main_data["thread"]["ids"]["default"];
var $urlWithQuery = $messageServerUrl + "thread?thread=" + $threadId + "&version=20061206&res_from=-1000&scores=1";
//メインの配列の作成
var $_result_array = []; //配列の[]と{}の違いに注意
$("button.ActionButton.CalendarButton.is-inactive").before("<button class='ActionButton' id='get_coments_button' data-title='コメント取得準備'><svg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' clip-rule='evenodd' stroke-linejoin='round' stroke-miterlimit='1.4' class='CalendarButton-icon'><path i:knockout='Off' fill-rule='evenodd' clip-rule='evenodd' fill='#D6D5D5' d='M0,0h46v46H0V0z'/><path i:knockout='Off' fill-rule='evenodd' clip-rule='evenodd' fill='#D6D5D5' d='M20,55v23h65V3H61v52H20z'/></svg></button>");
$(document).on("click", "#get_coments_button", function(){
//
$.ajax({
url:$urlWithQuery,
type:'GET',
dataType:'xml',
timeout:1000,
error:function() {
//
alert("データの取得ができませんでした。");
},
success:function(xml){
var $i = 0;
//配列の作成
$(xml).find("chat").each(function() {
//vposを再生時間の表記に変更
$coment_vpos = Math.floor($(this).attr("vpos")/100) //100で割ったものを切り捨て
$_vpos_m = Math.floor($coment_vpos/60) <= 9 ? "0"+ Math.floor($coment_vpos/60) : Math.floor($coment_vpos/60); //桁数が9以下であれば0を付ける。
$_vpos_s = $coment_vpos%60 <= 9 ? "0"+ $coment_vpos%60 : $_vpos_s = $coment_vpos%60; //桁数が9以下であれば0を付ける。
$vpos_time = $_vpos_m + ":" + $_vpos_s;
//自身で変更する場合は数値や文字列に注意。
$_result_array[$i] = {"no":Number($(this).attr("no")),"comment": $(this).text(),"date":$(this).attr("date"),"vpos_time":$vpos_time,"vpos": Number($(this).attr("vpos"))};
$i++;
});//配列の作成ここまで
$(".CommentPanelMenuContainer").before("<div id='copy_coments_dialog'><div class='btn key on' data-key='vpos'>再生時間</div><div class='btn key' data-key='no'>コメ番</div><div class='btn orderby on' data-orderby='ASC'>▲ 昇順</div><div class='btn orderby' data-orderby='DESC'>▼ 降順</div><hr><button id='copy_coments_button'>書き出し</button><button id='copy_cancel_button'>閉じる</button></div>");
//CSSの適用
$("#copy_coments_dialog").css($obj_dialog);
$("#copy_coments_button,#copy_cancel_button").css($dialog_button);
$("#copy_coments_dialog .btn").css($order_button);
$("#copy_coments_dialog .btn.on").css($on_button);
}
});
});
$(document).on("click", "#copy_coments_dialog .btn", function(){
if( $(this).hasClass("orderby")){
if(!$(this).hasClass("on")){ $("#copy_coments_dialog .btn.orderby").removeClass("on"); $(this).addClass("on"); }
}else{
if(!$(this).hasClass("on")){ $("#copy_coments_dialog .btn.key").removeClass("on"); $(this).addClass("on"); }
}
$("#copy_coments_dialog .btn").css($order_button);
$("#copy_coments_dialog .btn.on").css($on_button);
});
$(document).on("click", "#copy_cancel_button", function(){
console.log("Cancel");
$("#copy_coments_dialog").remove();
});
$(document).on("click", "#copy_coments_button", function(){
//console.log($urlWithQuery);
$_orderby = $("#copy_coments_dialog .orderby.on").data("orderby");
$_key = $("#copy_coments_dialog .key.on").data("key");
console.log($_key+"|"+$_orderby);
console.log( $_result_array.sort(compareValues($_key, $_orderby )) );
});
$(document).on("click", "#copy_dialog_close", function(){
console.log("Close");
$("#copy_coments_dialog").remove();
});
});

ここで設定を切り替えることが出来る。
サイトによってはそのまま放置でもいいかもとは思う。
編集ができない場合は権限がない可能性がある。
設定を変更しても24時間は更新されない。
新しいアクティビティをリセットのONをすると
この設定をオンにしておけば、過去26か月間にサイトやアプリでトラッキング対象となったユーザーの識別子データは、古いものも含めて削除されないということですね。
ということらしい。
T
つづみです。
S
ささらです。
ー
タカハシです。
V
MAH01692
S
7月15日 晴れてる。
T
ウキウキすぎて夜にあまり寝付けることができずに朝を迎える。
ー
国道279号やらを使い大間へと進む。
S
夏も本番になってきたのでライダーさんも多く、中にはホムセン箱などを積んだ人もちらほら見かけるように。
V
MAH01693
02045
こんな感じのテキストを特定の文字を改行位置で判断しCeVIOでインポート可能なテキストフォーマットに変換する。
//入力された文章を配列に
$text = $_POST['text'];
//$text = html_entity_decode($text);
$array = explode("\n", $text); // とりあえず行に分割
$array = array_map('trim', $array); // 各行にtrim()をかける
$array = array_filter($array, 'strlen'); // 文字数が0の行を取り除く
$array = array_values($array); // これはキーを連番に振りなおしてるだけ
//print_r($array);
//キーの整理と配列の作成
$result = array();
$i = 0;
$s = 0;
//初期構文チェック
if(!$array){
echo "配列がないよ。";
return;
}else if( !is_array($array) ){
echo "から情報";
return;
}else if( !preg_match('/^[STIO\-ー]*$/',$array[0] ) ){
echo "コピペ箇所間違ってない?";
return;
}
//配列の構造変更
foreach($array as $texts){
//全角ハイフン
if( preg_match('/^(S|T|O|I|ー|\-)$/',$texts) ){
$text_jamp_flag = false;
$result[$i]["name"] = $texts;
// print_r($text_result);
$i++;
}else if( preg_match('/^[STIO\-ー]*$/',$texts) ){
$text_jamp_flag = false;
//print_r(preg_split("//u", $texts, -1, PREG_SPLIT_NO_EMPTY));
$result[$i]["name"] = preg_split("//u", $texts, -1, PREG_SPLIT_NO_EMPTY);
$i++;
}else if( preg_match('/^(P|V)$/',$texts) ){
$text_jamp_flag = true;
}else{
if(!$text_jamp_flag)$result[$i - 1 ]["text"][] = $texts;
}
}
//print_r($result);
function write_name($name){
if($name == "S"){
return "さとうささら";
}else if($name == "T"){
return "すずきつづみ";
}else if($name == "O"){
return "ONE";
}else if($name == "ー" or $name == "-"){
return "タカハシ";
}
}
foreach($result as $result_text){
if(is_array( $result_text["name"]) ){
$_count = count($result_text["name"]);
// echo $_count;
for($num = 0; $num < $_count; ){
echo write_name($result_text["name"][$num])."\t".$result_text["text"][0]."\n";
$num++;
}
}else{
$_count = count($result_text["text"]);
// echo $_count;
for($num = 0; $num < $_count; ){
echo write_name($result_text["name"])."\t".$result_text["text"][$num]."\n";
$num++;
}
}
}
実行すると
T
つづみです。
とかが
すずきつづみ[\t]つづみです。
って具合に変換される。