コンピュータや音楽の事書いてます

続:ingressのCOMMの会話ログ取得

これではサーバが重すぎて、大量のログは取得出来ない。
http://d.hatena.ne.jp/neuromancer_sho/20130429/1367211233

なので、後から取得ではなく、自前サーバに現在のログをアップし続ける、という仕様にした。これならcomm側のサーバ負荷も少ない。
サーバ側 savelog.cgi

#!/bin/bash

echo -e "Content-type: text/plain;charset=UTF-8\n\n"

logfile=/home/public/ingresslog/$(date +%Y%m%d).html
yesterdayfile=/home/public/ingresslog/$(date +%Y%m%d -d '1 days ago').html

#初めて作るファイルはcss呼び出し付ける
if [ ! -f $logfile ]; then
cat <<EOF > $logfile
    <link href="http://www.ingress.com/css/style_full.css" rel="stylesheet" type="text/css">
    <link href="http://www.ingress.com/css/common.css" rel="stylesheet" type="text/css">
    <link href="ingresslog.css" rel="stylesheet" type="text/css">
EOF
fi

nowhour=$(date +%H)
#標準入力からログ書き込み
{
    while read line
        do
            wrk=$(echo "$line" | sed -re 's/ (ontouchstart|onclick)="[^"]+"//g' -e 's/<div class="plext">/<\/div><div class="plext">/' -e 's/(pl_portal_address">.*<\/span>)/\1<\/div>/')
            loghour=$(echo  "$line" | sed -re 's/.*>([0-9]+):.*/\1/')
            if [ "$nowhour" -lt "$loghour" ]; then #ログの方が未来の場合、昨日のログに書く
                echo "$wrk" >>$yesterdayfile 
                continue
            fi
            echo "$wrk" >> $logfile
        done
}
if [ $? -eq 1 ];then 
    echo "write error!!!" 
    exit
fi

echo "$logfile write done"

クライアント側は前回 http://d.hatena.ne.jp/neuromancer_sho/20130429/1367211233 の要領でfirebugなどに貼り付けて、実行する

var tid, saved, buffer, sakki=0;
var nokosu = 11; //11こ残す(過去ログ遡り防止)
var refreshMinutes = 10;
var xhr = new XMLHttpRequest();
//var theMap = nemesis.dashboard.maputils.map;

function getLog(){
  buffer = "";saved=[];
  if(new Date().valueOf() - sakki.valueOf() > 60*1000*refreshMinutes){ //たまにリフレッシュ
    sakki = new Date();
    //theMap.setZoom(theMap.zoom-1);
    //theMap.setZoom(theMap.zoom+1);
    console.log(sakki);
    buffer = sakki.toString() + "\n";
  }
  var plexts = document.getElementsByClassName("plext");
  if(!plexts || plexts.length <= nokosu){setNextTime();return;}
  for(var i=0; i<plexts.length - nokosu; i++){ //最後の方を残しておく
    saved.push(plexts[i]);
    var wrk = plexts[i].outerHTML;
  //24時間表記に変換
    wrk = wrk.replace(/(_date">)12(:[0-9]+)(AM|PM)/, '$100$2$3');
    var PMstr = wrk.match(/(_date">)([0-9]+:[0-9]+)(AM|PM)/);
    if(PMstr){
      var jikan;
      jikan = PMstr[2].match(/([0-9]+)(:[0-9]+)/);
      if(PMstr[3]=="PM"){
        jikan = ("0" + (parseInt(jikan[1]) + 12)).slice(-2) + jikan[2];
      } else {
        jikan = ("0" + parseInt(jikan[1])).slice(-2) + jikan[2];
      }
      wrk = wrk.replace(/(_date">)([0-9]+:[0-9]+)(AM|PM)/, '$1' + jikan);
    }
    buffer += wrk + "\n";
  }
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) { // DONE
      if (xhr.status == 200) { // OK
        if(xhr.responseText.indexOf("write done")){ //成功時のみタグを削除する
          for(var i=0; i<saved.length; i++){
            saved.pop().remove();
          }
        }
      } else {
        console.log("failed "+xhr.responseText);
      } 
      setNextTime();
    }
  }
  xhr.open("POST", "https://neuromancer.xxx/savelog.cgi");
  xhr.setRequestHeader("Content-Type" , "text/plain");
  xhr.send(buffer);

}
function setNextTime(){
    tid = setTimeout("getLog()", 5000);
}
getLog();

時間を遡りたい時は以下を追加し、

logarea=document.getElementById("plext_container");
tidscroll=setInterval("logarea.scrollTop=logarea.scrollHeight;if(saved.length<50)logarea.scrollTop='0px'", 3000);
nokosu=0;
refreshMinutes = 500;

もう十分なところで、

clearInterval(tidscroll);
nokosu=11;
refreshMinutes = 10;