続: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;