RubyのHTTP POSTの実装方法と問題への対処法

このQ&Aのポイント
  • RubyのHTTP POSTについてお聞きします。具体的には、特定のWebページに自動で入力を投げ、返ってくるデータを取得するスクリプトの書き方を知りたいです。
  • 実際に試してみたところ、返ってくるデータが投げたデータと同じではなく、上記のURIのソースのままでした。この問題を解決する方法を教えてください。
  • GUIでクリックして入力した場合は、末尾がmbs3.cgiのページに移動するはずですが、なぜか上手く入力を与えることができていません。アドバイスなどいただけると助かります。
回答を見る
  • ベストアンサー

RubyのHTTP POSTについて

HTTP POSTについてお聞きしたいです。 http://ligin.weizmann.ac.il/~lpgerzon/mbs4/mbs.cgi のページに、自動で入力を投げて答えを返してもらうスクリプトを書きたいです。 dataに、Inputする文字列を&でつないで、 Net::HTTP.start('ligin.weizmann.ac.il', 80) {|http| response = http.post('/~lpgerzon/mbs4/mbs.cgi',data) puts response.body } という方法で実行してみたのですが、 帰ってくる出力が、上記のURIのソースのままになってしまいます。 GUIでクリックして入力した場合は、末尾がmbs3.cgiのページに移動するはずなのですが、 なぜか上手く入力を与えることができません。 説明が曖昧で申し訳ありません。 アドバイスなどだけでも構いませんので、 よろしくお願い致します。

  • Ruby
  • 回答数3
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10258)
回答No.3

>という具合にブラウザ上でURLを入力してみても、Object not found!とい うエラーが表示されてしまいました。 タイムアウトで削除されたのではないでしょうか。 >mbs3.cgiのソースから、さらに・・・返してもらうことは出来ないものでしょうか。 ウェブの仕組みをきちんと理解されていないような印象を受けます。こういう処理(ブラウザもどきというか)をするのは初めてですよね。返されたHTMLの解釈は自分で(プログラムで)やらないといけません。その中から望みのリンクを探してさらにそれを送信します。 あと、もしかすると、Cookieが関わっているとすると、生でコーディングするのは厳しいので、Mechanizeなどのライブラリを使うと、勝手にCookie処理をしてくれます。 http://mono.kmc.gr.jp/~yhara/rubyscraping/?Mechanize

yki2010
質問者

お礼

何度もご回答頂きありがとうございました。 おっしゃる通りで、このような処理をしたのは初めてです。 今後も同様な作業が必要になるので、本やWebで調べながら進めていたのですが 何が悪いのかもわからずに困っていたところです。 HTMLの解釈は出来ると思いますので、ウェブの仕組みなどをもう少し調べながらがんばってみたいと思います。 今回はご丁寧にありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4847/10258)
回答No.2

>ここからさらにフレームのソースを返してもらうことは可能でしょうか。 SRCの値のURLをGETすれば良いだけですよね?

yki2010
質問者

お礼

ご回答ありがとうございました。 SRCの値のURLをGETで試してみたのですが、正しいフレームのソースを表示してくれませんでした。 また、http://ligin.weizmann.ac.il/tmp/1236486574414185/MENU.html?NAME=menu?scroll=yes という具合にブラウザ上でURLを入力してみても、Object not found! というエラーが表示されてしまいました。 本来ならばmbs3.cgiのページ中のフレームに、求めている数値などが表示されるので、それをテキストデータとして保存したいのですが。 mbs3.cgiのソースから、さらに <frame SRC=./tmp/1236480890238940/MENU.html NAME=menu scroll=yes> や <frame SRC=./tmp/1236480890238940/PROT_2.html NAME=prot scroll=yes> のフレームのソースだけを返してもらうことは出来ないものでしょうか。 度々の質問で恐れ入りますが よろしくお願い致します。

  • notnot
  • ベストアンサー率47% (4847/10258)
回答No.1

URLが、入力ページのURLなので入力ページのHTMLが返ってきて当たり前です。 ページソースを見ると、<form METHOD="POST" enctype="multipart/form-data" ACTION="mbs3.cgi"> となっているので、URLは、/mbs3.cgi にしないと。 >dataに、Inputする文字列を&でつないで、 も、やや危うげな表現ですが、大丈夫でしょうか?フィールドの名前を入れてますよね?

yki2010
質問者

お礼

早速のご回答ありがとうございました。 mbs3.cgiと直してみたら、移動した先のページのソースが返ってきました。 dataの中は、Rubyのリファレンスページなどを参考にしたので恐らく大丈夫じゃないかと思います。 PDB_ID=2JKG&CHAIN_ID=A&… のような感じです。 それと、 <html><head><title>MBS. FRAMES 2JKG</title></head> <frameset cols=25%,*> <frame SRC=./tmp/1236480759246509/MENU.html NAME=menu scroll=yes> <frame SRC=./tmp/1236480759246509/PROT_2.html NAME=prot scroll=yes> </frameset></html> のような答えが返ってくるのですが、ここからさらにフレームのソースを返してもらうことは可能でしょうか。 よろしくお願い致します。

関連するQ&A

  • HTTP POST によるレスポンスCGIについて

    HTTP POST によるレスポンスCGIについて いつも大変お世話になっております。 タイトルのシステムの組み方についてご質問がございます。 「内容」 決済システム会社からのリクエストに対するレスポンスを返すCGIを作成します。 「仕様」 通信方法:HTTP POST キャラクタセット:Shift-JIS text/csv(←ここの意味もわかりません) 仕様書には 「Httpリクエストに対するレスポンスとしてHTTPボディ部に記述してください」 例) 処理OKの場合:OK,    処理NGの場合:NG,既に完売済み CSV形式(カンマ区切り) とあります。 私のスキルとしては、「html」「PHP」が書ける程度です。 javaやPerlは全然分かりません。 仕様は単純かと思いますが、リクエストに対して自動でレスポンス(OKかNG)を返す仕組みが分かりません。 ご教授願いますでしょうか。

    • 締切済み
    • CGI
  • Rubyでnet::httpを用いてPOSTする

    今晩わ。 RubyでNet::HTTPをもちいてPOST送信する際の処理について 質問です。 Net::HTTPクラスのインスタンスメソッドのpostメソッドを用いて送信する場合 送信内容を # version 1.2 (Ruby 1.8.x or later) response = http.post('/cgi-bin/search.rb', 'query=subject&target=ruby') 上記のように、引数に渡していると思います。 このとき、値の中にパラメータのデリミタと同じ&を入れたい場合どうしたらいいのでしょうか? 例えば query=subject&target=ruby&PHP のような感じでvalueとして&を渡す場合です。 Net**HTTP::Postクラスのrequestメソッドを用いてハッシュとして渡した時は問題なかったのですが、上記のpostメソッドの時がPOSTされた値を取得するときにキチンと取得できませんでした。これはなにか対処方法があるのでしょうか? ご教授ください。 おねがいします。

    • ベストアンサー
    • Ruby
  • HTTP POST送信のヘッダの書き方

    http://appsv.ocrgrid.org/cgi-bin/weocr/nhocr.cgiに対して、 ファイルを送信してレスポンスを得たいのですがうまくいきません。 ヘッダの書き方が悪いのかデータの送り方に問題があるのか 文字コードの問題かいづれかの原因だと推測して色々試してみたの ですが正解が見つけられません。 お解りになる方ご教授いただけませんでしょうか? ■詳細 画像から一行の文字を解析表示するCGIで クライアント側には、日本語プログラム言語なでしこを利用して ファイル送信しています。 下記にサンプルコードとレスポンスヘッダを載せています。 ■プログラムの説明 テンポラリーフォルダにWEB上に用意されているサンプル画像 をダウンロードして、「あれ」と言う名前の変数にその画像 ファイルの内用を代入しています。 送信ヘッダとボディーデータを対象のCGIに先ほど取得した画像 データと保存先のファイル名を埋め込みポストしています。 #ここからサンプルプログラム サンプル画像先からHTTPデータ取得をファイル名に保存 あれにファイル名を読む 「User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; msn OptimizedIE8;JAJP) Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language:ja-JP Accept-Charset:Shift_JIS,utf-8;q=0.7,*;q=0.7 Referer:http://appsv.ocrgrid.org/nhocr/index-j.html Accept-Encoding:gzip,deflate Host:appsv.ocrgrid.org Connection:keep-alive Cache-Control:no-cache Content-Type:multipart/form-data;boundary=---------------------------7d925e1a230364」と、 「-----------------------------7d925e1a230364 Content-Disposition:form-data;name="userfile";filename="{ファイル名}" Content-Type:image/png {(あれ)}」を"http://appsv.ocrgrid.org/cgi-bin/weocr/nhocr.cgi"へHTTPポスト。 それをSJIS変換でメモ記入 ●サンプル画像先~「http://appsv.ocrgrid.org/nhocr/hello.png」で戻る。 ●ファイル名~「{テンポラリフォルダ}{サンプル画像からURLファイル名抽出}」で戻る。 #サンプルここまで /*■処理結果レスポンスの内用 HTTP/1.1 200 OK Date: Thu, 24 Sep 2009 07:09:53 GMT Server: Apache/2 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/plain ; charset=utf-8 1e File transmission has failed. 0 レスポンス内用ここまで*/

  • $HTTP_POST_VARSの値の受け渡しについて。

    PHP側でフォームで入力した内容をPOSTで受け渡すように しているのですが、 ☆HTML側☆ <FORM NAME="f1" ACTION="/point.php" METHOD="POST"> <TABLE> <TR><TD NOWRAP ALIGN="right"><font color="#444444"><b>記入者</b> </font></TD><TD>:</TD> <TD><input type="text" size="25" name="signedname" value="{val signedname}"> </TD></TR> </TABLE> </FORM> ☆PHP側☆ $req_data = $HTTP_POST_VARS; echo($req_data['signedname']); 特定の名前のときにPOSTからも値が返ってきません。 例えば、テキストに東と入力すると値が入るのですが、 西と入力すると値がわたりません。 なにか考えられる原因はあるのでしょうか? 文字コードはEUCで統一しています。 ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • Rubyでファイルアップローダーにリクエストを送る

    お世話になります。 プログラミング初心者、WindowsXP、Ruby 1.8.5 使用。 http://jp.rubyist.net/magazine/?0013-BundledLibraries 上記のページにある例を真似て、Webサーバ上のファイルアップローダーCGIにリクエストを出すスクリプト(のつもり)を書いてみました。以下自分で書いたコード: require 'net/http' Net::HTTP.start('www.honyara.com',80) {|http| res = http.post('/up.html/upload.cgi',"upload=C:\\test.txt") puts res.body } CGIはPerlで書かれています。これは自分で書いたものではなくてやはり他サイトのパクリなんでorz 自分ではよく理解できてません。 関係あるかどうかわかりませんがCGIのソースではファイルを取得するのにparam()を使っています。upload()ではなくて。 HTMLのCGI部分は次の通りです: <form method="post" action="upload.cgi" ENCTYPE="multipart/form-data">File Name<input type="file" name="upload" size="80"> <input type="submit" value="アップロード"> スクリプトを実行すると実際にサーバ側の指定のフォルダにtest.txtが作成されるが中身は空っぽです。もちろんアップしようとしてるファイルは中身があります。なぜ上手くいかないんでしょうか。そのヒントだけでもいただければ幸いです。

  • 自動ジャンプでフォームデータ(POST属性)を送りたいのですが

    問題を出すプログラムで、一定時間後に強制的に採点のページに飛ばされるプログラムを組んでいます。その際問題のデータと隠し属性(HIDDEN)のデータをPOST属性で送信したいのですが、強制移動の際の動作がどうもうまくいきません。詳しい方助言していただけないでしょうか。 構成は以下のようになっています。 <META HTTP-EQUIV="refresh" CONTENT="600;URL='./ans.cgi'"> (略) <FORM ACTION="./ans.cgi" METHOD="POST"> (問題が入ります) <INPUT TYPE="HIDDEN" NAME="id" VALUE="$id"> <INPUT TYPE="SUBMIT" VALUE="決 定">

  • Rubyでの条件分岐について

    登録フォームについての質問です。 ログイン用フォームのhome.cgi と、それにリンクするユーザー登録用フォームのregistration.cgi があり、今回質問するのはユーザー登録用のregistration.cgiの方です。そしてユーザーIDとPasswordはdata.txtに書き込んでいます。書き込み自体は成功するのですが、それ以外のところで問題がでている状態です。条件分岐がうまくいきません。 下記のように書いた時におこる問題点等について教えていただきたいと思います。 (1)IDとPassword のinput に値が空の時に、ボタンを押しても、登録完了しました と表示されてしまうので、この様な場合は、"もういちど確認してください" などの警告文を出したいです。 (2)IDとPassword の文字数に制限を入れたいのですが、分かりませんでした。 双方とも4文字以上8文字以下にしたいです。それ以外の場合は、条件分岐で、"文字数を確認してください"などの警告文を出したいです。 -------- < ここから registration.cgi >-------------------- #!/usr/bin/ruby require "cgi" cgi = CGI.new puts <<HTML Content-Type: text/html <html> <head> <title>練習問題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1>練習(1)</h1> 登録フォーム <form action="registration.cgi" method="post"> ユーザーID:<input type="text" name="login" ><br> パスワード:<input type="text" name="password"><br> <input type="submit" value="submit"> </form> HTML if cgi.params["login"][0] then f = open("data.txt","a") f.puts"%s:%s" %[cgi.params["login"][0],cgi.params["password"][0]] f.close puts "登録完了しました" else end puts <<HTML <br> <a href="./home.cgi">戻る</a> HTML -------- < ここまで >--------------------

    • ベストアンサー
    • Ruby
  • HTTPでフォームを送信したい

    JavaScriptで書かれた認証文字数チェックがある ユーザIDやパスなどの入力フォームを 本来サブミットで送信する内容を HTTPでPOSTまたはGETして、直接cgiにフォーム内容を 送信したいのですがその様なことは可能でしょうか? 可能でしたら方法やその理屈を教えていただけません でしょうか? 理由 通常ブラウザでアクセスするページを 専用のクライアントを作成し通信したいため submit形式のフォームをPOSTかGETで処理したい。

  • HTTPステータス 404 - /servlet/Testについて

    はじめまして。Javaの初心者です。 どうしてもわからないことがあります。それは、 最初にJSPページでHTMLフォームにデータを入力して <input type="submit"/>タグでサーブレットに送信し て、サーブレットでHTMLフォームのデータ を使用して処理を行わせてから再び最初のJSPページ にリクエストを転送(forward)すると、サーブレット での処理結果が表示されるのですが、そのあと再び HTMLフォームにデータを入力して <input type="submit"/>タグでサーブレットに送信す ると、「HTTPステータス 404 -/servlet/Test」などと 表示され、サーブレットが利用可能でなくなります。 なぜなのでしょうか?どのようにしたら解決できるの かどうか教えてください。お願いします。

    • ベストアンサー
    • Java
  • HTTP 200 OKの後のリダイレクト?

    OS:Windows Vista Business IEやFirefoxであるフォーム(Host:xxx.example.com/test)にPOSTしました。 そのレスポンスのHttpヘッダに「HTTP/1.1 200 OK」とありました。 続いてブラウザは別のページの取得を行いました(Host:yyy.exmaple.com/other)。 私のつたない知識では、リダイレクトを行うのは、HTTPステータスコードが301~303などの場合だと思っていたのですが、 実際は上記のようにPOST後に200が返ってきたのに、別のURLへGETを投げていました。 (IE・Firefoxとも) POST後のHTTPヘッダを見たところ、ヘッダにはLocationはなく、「yyy.example.com/other」のURLの文字列も見当たりません。 ブラウザはどうやってPOST後のリダイレクトを検知し、さらに移動先のURLを知っているのでしょうか?

専門家に質問してみよう