まめ畑

ゆるゆると書いていきます

ニコニコ動画の時報を消す簡易Proxy書いてみた

先日、id:aTaGoが、ニコ動の時報だけ消せたらいいのにというような事をTwitterにポストしていたので、少し書いてみた。
現在、ニコ動のPlayerにはプレミアム会員向けに「ニコ割OFF」機能が実装されています。また、プレミアム会員でなくてもマーキーエリアに表示する情報が書かれたXMLをブロックする事で、ニコ割を回避する方法もありますが、これらはニコ割ゲームやアンケート、生放送の予定通知なども含めてOFFにしてしまいます。時報だけ見たくないという場合には、対応していません。


WEBrickを使って、時報と思われる箇所だけをマーキー情報XMLから消すProxyを簡単に書いてみました。このProxyを通過させれば時報と思われる物は再生されません。判定自体が甘いので、時報以外の物も除外してしまう可能性があったり、わざわざローカルでProxyを起動しないといけないので、自由に改変して使って下さい。


Proxyを通過すると、

このXML


のようになります。
一応、ニコ割開始時間のタグには、があり、前者はで指定した時間までの間に再生される物だったと思うので、時間が指定されていて、かつ00分に再生となっている物を時報と判断しています。


コードは

require "webrick"
require "webrick/httpproxy"
require "stringio"
require "zlib"
require "rexml/document"

handler = Proc.new do |req, res|
  begin
    if res["content-type"] == "text/xml; charset=UTF-8"
      marquee_xml = res.body
      if res.header["content-encoding"] == "gzip"
        Zlib::GzipReader.wrap(StringIO.new(marquee_xml)) do |gz|
          marquee_xml = gz.read
        end
        res.header.delete("content-encoding")
        res.header.delete("content-length")
      end

      xml = REXML::Document.new(marquee_xml)
      xml.elements.each("/marquee_data/marquee/just_time") do |element|
        start_time = element.text
        if start_time[-2, 2] == "00"
          del_marquee = element.parent unless element.nil?
          xml.root.delete(del_marquee)
        end
      end
      marquee_xml = xml.to_s
    end
  rescue
    marquee_xml = res.body
  ensure
    res.body = marquee_xml
  end
end


config = {
  :BindAddress => "127.0.0.1",
  :Port => 8080,
  :ProxyVia => false,
  :ProxyContentHandler => handler
}

zihop = WEBrick::HTTPProxyServer.new(config)
[:INT, :TERM].each do |sig|
  Signal.trap(sig) { zihop.shutdown }
end

zihop.start

既にProxyが設定されている場合は、configを以下のように書き換えて下さい。

require "uri"   #追加

config = {
  :BindAddress => "127.0.0.1",
  :Port => 8080,
  :ProxyVia => false,
  :ProxyContentHandler => handler,
  :ProxyURI => URI.parse('http://proxyurl:port/')
}

起動するポートなどもお好みで変更して下さい。


全ての通信を通過させるのもなんなので、以下の内容を書いたpacファイルをブラウザに指定することで、マーキーXMLを取得するAPIへのアクセスだけ通過させる事が出きます。

function FindProxyForURL(url, host){
  if(shExpMatch(url, "http://flapi.nicovideo.jp/api/getmarqueev3")){
    return "PROXY localhost:8080";
  }else{
    return "DIRECT";
  }
}

一応、http://mame-lab.com/pac/zihop.pacに置いてあるので、ブラウザの設定中の、「自動プロキシ設定スクリプト」などと書かれたところに、このアドレスを指定するといいかと思います。pacファイル中のProxyのアドレスやポート番号は使う環境に合わせて書き換えてください。