読者です 読者をやめる 読者になる 読者になる

やっとわかったPOSTの方法 つづき

やっとわかったPOSTの方法のつづきです。

Fiddlerをインストールしよう

今回はMicrosoft社のFiddler Web Debugger - A free web debugging toolを使ってみようと思います。僕自身もこのアプリの使い方はほとんど分かっていませんので知っている範囲のみで書いていきます。

まず、サクッとFiddlerをインストールして起動してください。

左側のサイドバーみたいなところにフォーカスを当ててCtrl+Xでリストをからにできます。
F12キーを押すとブラウザの通信をキャプチャするかしないかをOn/Offできます。左下のアイコンでその状態がわかります。
あとはちょこちょこあとで説明します。

POSTするリクエストボディを調べよう

ここではe-honを題材にしていきます。
とりあえず、Fiddlerを閉じるかF12を押してキャプチャをOffにしてさらにCtrl+Xしておいてください。

e-honのトップページ上部にある検索窓に「Fenrir」と入力して検索をクリックしてみてください。
Fenrir関連の書籍が検索されて出てきます。この検索フォームではPOSTメソッドが使われています。
では、もう一度Fiddlerを起動するかF12を押してキャプチャをOnにしてください。
今度は検索窓に「Sleipnir」と入力してけんさくしてみてください。
Sleipnir関連の書籍が検索されて出てきます。
ここでFiddlerを見てください。

こんな風になっていませんか?
人によっては導入しているスクリプトやプラグインとうで微妙にセッション数が違うと思いますが似たような感じになっていると思います。
ここで左ペインの一番上のセッションをクリックし、右ペインの上の”Session Inspector”タブをクリックし手ください。ここの”TextView”タブをクリックするとあらわれるのがリクエストボディです。

spKeyword=Sleipnir&scope=1&button=btnSpeed&mode=speed

よーく見ると"spKeyword="に続いて先ほど検索窓に入力した”Sleipnir”があります。ここの部分を変えることでいろいろなキーワードのリクエストボディを作れることがわかりました。

POST先URLは?

フォームのHTMLソースを見ればそれで済むのですがここではせっかくなのでFiddlerで。
今度は”TextView”タブではなく”Raw”タブをクリックしてください。

ここの12行目の”Host:”以降のハイパーリンク部分とここの一番上の行の

POST /bec/SA/Forward?cnt=1 HTTP/1.1

の”POST”と”HTTP/1.1”の間の部分とをつなぎます。

http://www.e-hon.ne.jp/bec/SA/Forward?cnt=1

これがPOST先のURLです。

やっと出てきた Navigate2メソッド

POSTで検索するための

  • リクエストボディ
  • リクエスト先URL

がそろったので本題の”Navigate2”メソッドです。

このメソッドによってPOSTします。
詳しくは僕には知識が足りなすぎるので以下のリンクを参考にしてください。
Navigate2 リファレンス
Excite エキサイト: ページが見つかりません

で、いきなりソースを貼り付ける

var engine = "http://www.e-hon.ne.jp/bec/SA/Forward?cnt=1";
var request = "spKeyword={all}&scope=1&button=btnSpeed&mode=speed";
var encode = "shift_jis";

var selectedText = document.selection.createRange().text;
request = request.replace(/{all}/, selectedText.replace(/&/, "%26").replace(/\?/, "%3F")); 
var strHeader = "Content-Type: application/x-www-form-urlencoded\r\n"; 

var WebBrowserObject = API.GetWebBrowserObject(API.GetDocumentID(API.ActiveIndex)); 
//WebBrowserObjectのNavigate2メソッドを使う
WebBrowserObject.Navigate2(engine, 0x1, "", ExEncode(request,encode), strHeader); 

function ExEncode(str, charset) { 
   var ads =  new ActiveXObject("ADODB.Stream"); 
   var res; 
    
   ads.Open(); 
   ads.Charset = charset; 
   ads.WriteText(str); 
   ads.Position = 0; 
   ads.Type = 1; 
    
   //UTF8への変換で先頭にBOMが付加されるのを除去. 
   //一回目でいきなり(Type設定前に?)3を設定するとエラー吐く。 
   if (charset == "utf-8") ads.Position = 3; 
    
   res = ads.Read(); 
   ads.Close(); 
    
   return res; 
} 


上のスクリプトはプヨぷよ氏のSearchActionCreatorが生成するスクリプトから抜粋・改変したものです。
フレームページ対策とかは全くやってないです。
11行目のNavigete2メソッドの第二引数に ”0x1” を指定する(ダブルクオートで囲まない)とSleipnirでは新規タブで開くようになります。

こうだったらなぁ。

文字コードエンコード)がやっかいです。もっと直感的にできるようなメソッドとかないのかなぁ。
Cookieもセットできるようなのですがどうもうまくいかない。 数字部分が欠けてしまうのはなぜだろう。

バテた

タイトル部分の説明はなし。
非常に尻すぼみなエントリ。