読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Jなんとかメールのメッセージ入力欄をテキストエリアにするプロキシを書いた

社内で利用してるJなんとかメールですが、これには「メッセージ入力欄がなぜかテキストフィールドになっていて、複数行コメントが書けない」という致命的仕様バグがあります。解決策としては、「JavaScriptletやGreasemonkeyを使って、メッセージ入力欄をテキストエリアに書き換える」というのが一般的ですが、メッセージ画面を開くたびにJavaScriptletを走らせるのがメンドイ。
ということで、コンテンツ書き換えでテキストエリア化を行うプロキシを書いてみました。

機能

  • プロキシとして動作し、J何とかメールからのレスポンスをフック。メッセージ入力欄をテキストエリアに書き換える。
    • これにより、ブラウザのプロキシ設定さえ変更しておけば、自動で書き換えが行なわれるようにできる。
    • ブラウザの機能に依存しないので、どのブラウザでも複数行メッセージの入力ができる。
    • 不特定多数のクライアントにサービスを提供することも可能。(セキュリティ的にはアレだけど)

実装

実装は次の通りです。

#!/usr/bin/ruby

require 'webrick'
require 'webrick/httpproxy'
require 'uri'

# J何とかメールのホストを示す正規表現
HOST = /J何とかメールのホスト/

# プロキシを使用しないホストを指定できるようにちょっと改造。
module WEBrick
  class HTTPProxyServer
    def proxy_uri(req, res)
      if @config[:NoPoxy] == nil \
        || !(req.request_uri.to_s =~ @config[:NoPoxy])
        @config[:ProxyURI]
      end
    end
  end
end

# プロキシのハンドラ。
# 特定URLのレスポンス中のテキストフィールドをテキストエリアに変換
handler = lambda {|req,res|
  break if req.request_uri == nil
  break if res.body == nil
  break if !(req.request_uri.path =~ /(GetContent|GetInfo|SendMsg)/)
  break if !(req.host =~ HOST)
  break if !(res['content-type'] =~ /text\/html/)
  res.body.gsub!(/<INPUT TYPE="text" NAME="reply" SIZE=48 MAXLENGTH=1999 VALUE="">/m,
      "<textarea NAME='reply'></textarea>")
}

# プロキシサーバオブジェクトを作る
s = WEBrick::HTTPProxyServer.new(
  :BindAddress => '127.0.0.1',
  :Port => 8080,
  :Logger => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),
  :ProxyVia => false,

  # 移譲先プロキシの設定。なんとかゲートウェイを指定します。> 関係者
  :ProxyURI => URI.parse('プロキシのURL 例) http://hogehoge.com:80'),
  # プロキシを使用しないURIの指定
  :NoPoxy=> /プロキシを介さないURIの正規表現/,

  :ProxyContentHandler => handler
)

# 後処理の為に SIGINT を捕捉する。
Signal.trap('INT') do
  # 捕捉した場合、シャットダウンする。
  s.shutdown
end

# サーバを起動する。
s.start

ほとんど、るびま - WEBrickでプロキシサーバを作って遊ぶのコードと同じだったり。これだけでプロキシができるのがすごい。

使い方

  • 1.↑のコードに、プロキシ設定やJ何とかメールのホスト名を設定。
  • 2.修正したコードをproxy.rbに保存して実行します。(ちなみに、終了はCtrl+Cです。)
ruby proxy.rb
  • 3.ブラウザのプロキシに「localhost/8080」を指定してJ何とかメールにアクセス!
    • →メッセージ入力欄がテキストエリアになっているはず。


参考: