• ベストアンサー

特定のURLへのリクエストをし、そのレスポンスを変数に格納する方法

こんにちは。 ちょっと文字で表現するのが難しいのですが、行いたい事は --------- 数字は --------- というHTMLが表示されるだけのPerlプログラムA.plがあるとします。 また、「100」という数字をレスポンスで返すだけのPerlプログラムB.plがあります。 で、行いたいのは A.pl内で、B.plを呼び出して、100という数値を受け取り A.pl内で出力したいのです。 ---------------------- A.plイメージ $num=URLリクエスト関数(http://aaa.com/B.pl) <html> 数字は print << "HTML"; $num%<br> HTML </html> ---------------------- A.pl結果イメージ 数字は100 ---------------------- という感じデス。 (URLリクエスト関数()という都合の良いようなものがあれば、という あくまでイメージです) このような形で、ある特定のプログラムのレスポンスを取得して その結果を、その呼び出しも元のファイルで使用できるようにするには どのようにすればよろしいでしょうか。 ご存知の方、是非ご教授ください。

  • Perl
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
回答No.2

私が意味を取り違えているかもしれませんが、、、 そのB.plが通常のCGIとして print "Content-type:text/html\n\n"; print "100"; と言うようにちゃんとヘッダも出力するものなら #1さんのお答えどおりで出来ると思います。 でも、もしもB.plがヘッダを出力せず、 100 とだけ出力するものなら B.plが通常のCGIでは500Server Errorになってしまいますので nph-cgiにするなどhttpdでヘッダの解析をしないようにする必要が有ります  普通のApacheなどの設定ではFile名の頭にnph-をつけて nph-B.cgi などのFile名にすればOKです。 次にA.pl側ですが、nph-B.cgi側へリクエストを送っても ヘッダも何も無しで、数字のみしか帰ってこないので LWPだと解析できないのではないかと思います 面倒ですが自前でSocket通信しないといけないかと思います。 以下、サンプル(Perl離れて久しいのでダサいソースでゴメソ) #! /usr/local/bin/perl $Host = 'www.umasika.com'; $Page = "/~tarou/nph-B.cgi"; $Addr = (gethostbyname($Host))[4]; $Name = pack("S n a4 x8", 2, 80, $Addr); socket(S, 2, 1, 0); connect(S, $Name); binmode(S); select(S); $| = 1; select(stdout); print S "HEAD $Page HTTP/1.0\r\n\r\n"; $test=<S>; # これで$testに100が入る print "Content-type:text/html; charset=Shift_JIS\n\n"; print "<html><pre>\n"; print "http://$Host$Page から取得した値は = " . $test; __END__ うちで試した限りではこれで出来ましたが

その他の回答 (2)

回答No.3

もしかしてA.plとB.Plは同じサーバー内のスクリプトでしょうか? だとしたら全然違う方法で出来ます。 というかサーバー間通信など行わなくても `` などで呼び出せば出来ます #! /usr/local/bin/perl $num=`/home/hoge/www/test1/B.pl`; print << "HTML"; Content-type:text/html; charset=Shift_JIS <html> 数字は $num%<br> </html> HTML __END__

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

CPAN モジュールLWP を使って use LWP::Simple; $num=get("http://aaa.com/B.pl"); のようにできるんじゃないかな・ 実際に試してないので、$num にどんな感じで入るかは未確認です。

関連するQ&A

  • リクエストを受けたサーバ以外からのレスポンス

    質問なのですが、 1. ユーザがブラウザAからリクエストXを発行して 2. あるWebサーバBがリクエストXを受け付けて 3. WebサーバBがリクエストXの情報を、別のWebサーバCに渡して 4. WebサーバCがブラウザAへ直接レスポンスを返す。 というのはHTTPの仕様上では可能なのでしょうか? また、WebSocketやWebRTCなどを使えば可能でしょうか? ・WebサーバBとWebサーバCはIPアドレスが異なる前提でお願いします ・言語やフレームワークは無視して、仕様として可能かが知りたいです

  • squid:リクエストされた URL は取得できませんでした

    現在squidを利用してリバースプロキシを行っているのですが、取得した独自ドメインの設定がうまく行きません。 エラーメッセージは以下のようなものです。 ===========エラーここから============== エラー リクエストされた URL は取得できませんでした ----------------------------------------------------------------以下の URL を取得した際に: http://www.aaa.com/ 次のエラーが発生しました: アクセスできません. 現在設定されているアクセス制御の設定のため,あなたからのリクエストは受けつけられません.この設定が正しくないと思われる場合には,このサービスの管理者へ連絡してください. ===========エラーここまで============== pingを打つと、 www.aaa.com の名前解決は出来ているようです。 C:\Documents and Settings\user>ping www.aaa.com Pinging www.aaa.com [bbb.ccc.ddd.eee] with 32 bytes of data: Request timed out. (サーバ側でICMPを破棄する設定をしています) Aサーバでsquidを作動させ、Bサーバに実際のHTMLファイルを置いています。 Aサーバへのアクセスがあった場合に、BサーバのvirtualHost設定をしているフォルダへ飛ばすようにしています。 Aサーバでは、 1)hostsファイルにwww.aaa.comの追加 2)aaa.com.zoneという名前のゾーンファイルの作成 3)named.confにaaa.com.zoneの追記 4)squid.confに「cache_peer_access www.aaa.com allow all」を追加 5)squidおよびnamedの再起動 を行いました。 Bサーバでは 1)hostsファイルにwww.aaa.comの追加 2)virtualHostにフォルダ等の設定 3)apache再起動 4)HTMLファイルをアップするフォルダの作成 以上を行いました。 サブドメインを作ったときには上記のような設定でうまく行ったのですが、何か足りない部分がありましたら教えていただけますでしょうか。 他に不足している情報がありましたらお伝えしますので、よろしくお願いいたします。

  • plファイルの中で他のplファイルを実行

    A.plファイルとそれに付随するpmファイルがあります。 別のB.plでA.plに値を渡しながらループさせてA.plを実行し得られた値をB.plに返すことがしたいのですが、 B.plで ループ始点 require('A.pl'); ループ終点 だと一回きりの実行結果しか得られず。 #`perl A.pl @AAA`; だとreturnできずエラー となってしまいます。 何か良い方法は無いでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • EXCEL VBAでたくさんのURLの一覧からHTTPレスポンスコードを取得したい。

    VBA初心者です。 EXCEL VBAでプログラミングの練習をしています。 シート名:一覧 URL記入セル:A1~A100 結果を記入するセル:B1~B100 があり、URL記入セルに入力されているURLにアクセスし レスポンスコードを(404とか200とか)B列に書き出す というのを実行できるコードの書き方を教えてください。 (1週間取り組んでいますがまだできません・・・) サンプルコードを直接改定頂けると最高です。 宜しくお願いします。

  • Amazon WebサービスのリクエストURL表示

    恐縮ながら質問させて頂きます。PHP初心者です。 タイトルの通りですが、下記のリンクを参考に、 最終的にブラウザで開いた際に、Amazonから指定したワードの検索結果がHTMLコードの画像付き(よくブログ等であるAmazonへの商品画像つきのリンク)で表示するようにしようと試行錯誤しています。 またその検索結果を短縮URLでTwitterへ自動投稿しようと設定しています。 AmazonのAPIから商品情報を10件以上得る為のTips http://main.mints.ne.jp/blog/2012/02/14/amazon%E3%81%8B%E3%82%89%E5%95%86%E5%93%81%E6%83%85%E5%A0%B1%E3%82%92%EF%BC%91%EF%BC%90%E4%BB%B6%E4%BB%A5%E4%B8%8A%E5%BE%97%E3%82%8B%E7%82%BA%E3%81%AEtips/ amazon API (AWS) を試す PHP http://techlog.knocking.co.jp/archives/467 しかし、上記の二番目のリンクのようにPHPを書き、Amazon Web サービス リクエストURLを取得することには成功したのですが、それからどうしていいのか分からずに困っています。 現状ではローカルのXMAPPを用いて、作成したamazon.php というファイルにアクセスすると、 「 http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=○○◯◯←設定したアクセスキー、シークレットキーやパラメータの数値 」というリクエストURLが表示され、そのURLをブラウザのアドレスバーに入れると、 「この XML ファイルにはスタイル情報が関連づけられていないようです。以下にドキュメントツリーを表示します。 」という文字の下に -<ItemSearchResponse> -<OperationRequest> -<HTTPHeaders> : : というツリーが表示されます。 これからどうしていいのか分かりません。 これをHTMLでブラウザにAmazonへの商品画像つきのリンクとして表示するにはどうしたらいいのでしょうか? また、Twitterへcronを通じて自動投稿するbotも作成できたのですが、ツイートする内容を書くdata.txtの編集において、どうすればAmazon Webサービスで自動検索して抽出されたURLを自動的に変換してくれるのか分からずに困っています。 これらのAmazon WebサービスでのリクエストURLと、Twitterへの自動投稿bot作成が、平行して断片的に完結してしまって、どうすれば繋がるのか悩んでいます。 ・Amazon WebサービスでのリクエストURLをブラウザで画像表示するにはどうすればいいのか? ・そのリクエストURLの複数の検索結果をどうすればbotのdata.txtに転送してくれるのか? 抽象的で稚拙な質問で誠に申し訳ございませんが、ご存じの方がいらっしゃいましたら、1点目だけでも2点目だけでも、解決方法を御教授頂けたら幸いに存じ上げます。

    • ベストアンサー
    • PHP
  • EXCELで文字列にセルの内容を組み込む方法

    EXCElで Aの列に商品コード(数字やアルファベット+数字) Bの列に簡単なHTMLタグがありまして BのHTML内にAの商品コードを取り込みたいのですが、どういう関数?を使えばできますでしょうか? BにはURLを含んでいますので「””」(ダブルコーテション)があります。 イメージ的にはこのような感じです。 ------------------------------------------------------------------------------  A        B 0001    <img src="http://****.jp/****-◆◆◆_1"><img src="http://****.jp/****-◆◆◆_2"> ------------------------------------------------------------------------------ ◆のところにAの文字列を組み込みたいのです。 どなたかご存知の方、ご教授ください。 どうぞよろしくお願いします。

  • URLに含まれる「#」,「?」、HTTPリクエスト

    皆様いつもお世話になっております。 今日はperlでLWP::UserAgentを使って、google検索結果を得ようとしたところで、岩に躓いて肘の骨に皹が入った点で質問させていただきます。 googleで「asd」と検索するとURLは http://www.google.co.jp/#q=asd となりますが、#ってのは、ページ内遷移などを主目的とした、クライアント、ブラウザ側がご自由に使ってくださいのパラメータの記述開始マークではないのですか? まあ、これに従ったとして、 「http://www.google.co.jp/#q=asd」 を、perlのLWP::UserAgentを使って、 ---- my $ua = LWP::UserAgent->new; $ソース = $ua->get("http://www.google.co.jp/#q=asd"); # googleのトップページの検索結果が返る ---- と投げてみましたところ、Google ☆ト ッ プ ペ ー ジ☆ のソースが返ってくるのです。 Yahoo!ではasdと検索すると?がついて「http://search.yahoo.co.jp/search?p=asd」となるし、perlで同じ文字列をリクエストするとちゃんと検索結果が返ってくるので、googleの仕様がおかしいのではないか?というのが、私の推測群の現在の最有力候補であります。 ---- my $ua = LWP::UserAgent->new; $ソース = $ua->get("http://search.yahoo.co.jp/search?p=asd"); # asdの検索結果が返る ---- ちなみにですが、googleを?を使って 「http://www.google.co.jp/?q=asd」 と、ブラウザURL欄に入力しEnterを押すと、Googleトップページがテキストボックスに「asd」と入力された状態で表示されます。 この現象を説明していただける方がいらっしゃいましたら、どうかよろしくお願い致します。m(_ _)m -- 環境情報 ブラウザ IE10 OS Windows7 --

    • ベストアンサー
    • HTML
  • レスポンス待ちの間の空白画面を回避する方法

    ●状況 主となるHTML、フレームAのHTML、フレームBのHTML で構成されるページがあります。 フレームBのHTMLはサーバが動的に生成するもので、 その他は静的なファイルです。 サーバプログラムからのレスポンス待ちの間、 フレームBが真っ白になり見苦しい状況になっており これを何とかしたいと考えております。 ●対策案1について サーバプログラムやフレームBの中身を修正する事なく、 スタイルシートやJavaScriptで、フレームBの背景色を 変更することで「白い空間」をなくす事ができれば良い と思うのですが、可能でしょうか? ●対策案2について サーバが処理を終えてフレームBの中身を転送するまで の間、「しばらくお待ちください画面」を表示するには、 サーバ側、クライアント側それぞれどのような対応が 考えられるでしょうか? 上記、案1・案2に限らず現状の問題を解決できる 方法があれば、是非ご指導願います。

  • requireの使い方のどこがおかしいのでしょう?

    言語はperlです。 789.cgiから456.plを呼び出したいのですが、シンタックスエラーが出てきます。 789.cgiのrequireに関する行をコメントにしたら実行されるのですが…。 requireを使わずに、サブルーチン自体を789.cgiの中に書き込むことには成功しているのですが、 イマイチrequireを使った呼び出しのコツがわかりません。 どなたかご教授下さい。 以下にスクリプトを示しておきます。 よろしくお願いします。 *****以下789.cgi***** #!/usr/local/bin/perl use CGI::Carp qw(fatalsToBrowser); require "456.pl"; $a=12; $b=15; $d="xxxxxxxx"; $d=&plus(); print "content-type:text/html\n\n"; print <<"HTML_HTML"; <html> <head> <title> ヒアドキュメント </title> <body> ***** <br> $d <br> ***** <br> $a <br> ***** <br> $b <br> ***** </body> </html> HTML_HTML ***********以下456.pl************ sub plus { my $a=10; my $b=10; $c=$a+$b; return $c; }

    • ベストアンサー
    • CGI
  • ブラウザを使用しないでプログラムから変数を送る方法

    通常、 ・GETの場合 <a href=http://www.xxx.co.jp?a=1>submit</a> ・POSTの場合 <form method=post action="xxx.cgi"> <input type=hidden name=a value=1> <input type=submit value=submit> </form> のなどのHTMLでクリックまたはSUBMITボタンを押すとその特定のURLのWWWサーバーに変数が送られますよね。 これをブラウザを使用せず、サーバーのプログラム(perl)を使用して、そのプログラムを実行すると プログラムで指定した特定のURLのwwwサーバー(port 80)に変数を送る方法書き方を教えて下さい。 GETの場合、POSTの場合それぞれ教えてください。 通常、ブラウザがしていることを、プログラムでしたいと思っています。 よろしくお願いします

    • ベストアンサー
    • CGI

専門家に質問してみよう