1256996267 アフィリエイトに使用する商品データとして、あるECサイトからCSVデータを取得できることになりました。

http://○○○.net/○○/item.csvで、
画像をこちらに置きました。こんな画面です。
http://f.hatena.ne.jp/images/fotolife/m/miipa/20091031/20091031221740_120.jpg
のように、ユーザー、パスワードを聞いてきます。正しく認証できないと、「401 Authorization Required」が表示されます。
もちろん、手で入力すればログインできて目的のデータを取得できるのですが、
php+cronにて自動でデータを取得したいので、phpでデータを取得する記述方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:2009/10/31 22:37:49
  • 終了:2009/11/01 12:22:21

ベストアンサー

id:hato0013 No.1

hato0013回答回数20ベストアンサー獲得回数62009/10/31 22:50:24

ポイント200pt

http://pear.php.net/manual/ja/package.http.http-request.php

PEARのHTTP_Requestを使うと簡単に実現できますね。

id:miipa

phpとcronでそのサイトにいって、ユーザーIDとパスワードを自動で入力するということが、このHTTP_Requestでできるのでしょうか?

具体的に動かし方を書いてもらえるとありがたいです。

よろしくお願いいたします。

もしかしたら、自分が認証画面を作成する側としてのpearじゃなかったですか?

2009/10/31 23:06:06

その他の回答(3件)

id:hato0013 No.1

hato0013回答回数20ベストアンサー獲得回数62009/10/31 22:50:24ここでベストアンサー

ポイント200pt

http://pear.php.net/manual/ja/package.http.http-request.php

PEARのHTTP_Requestを使うと簡単に実現できますね。

id:miipa

phpとcronでそのサイトにいって、ユーザーIDとパスワードを自動で入力するということが、このHTTP_Requestでできるのでしょうか?

具体的に動かし方を書いてもらえるとありがたいです。

よろしくお願いいたします。

もしかしたら、自分が認証画面を作成する側としてのpearじゃなかったですか?

2009/10/31 23:06:06
id:sirotugu40 No.2

sirotugu40回答回数449ベストアンサー獲得回数142009/10/31 23:02:49

ポイント10pt

phpでベーシック認証

http://www.bnote.net/php/php/22_basic_auth.shtml

id:miipa

このサイトもあちらこちらでよく見たので、理解しようとしたのですが、自分なりに理解したところでは、自分が認証するサイト側の情報じゃないでしょうか?

もし、この情報で、私のやりたいことができるのなら、再度教えてください。

それとも私の質問の仕方が悪いかもしれませんが。

2009/10/31 23:08:42
id:hato0013 No.3

hato0013回答回数20ベストアンサー獲得回数62009/10/31 23:25:38

ポイント200pt

> phpとcronでそのサイトにいって、ユーザーIDとパスワードを自動で入力するということが、このHTTP_Requestでできるのでしょうか?

できます。

> もしかしたら、自分が認証画面を作成する側としてのpearじゃなかったですか?

違います。

> 具体的に動かし方を書いてもらえるとありがたいです。

先ほどのリンク(http://pear.php.net/manual/ja/package.http.http-request.php)のBasic 認証のページを参照ください。

下記、一部抜粋です。

require_once "HTTP/Request.php";

$req =& new HTTP_Request("http://example.com/protected.html");
$req->setBasicAuth("johndoe", "foo");

$response = $req->sendRequest();

if (PEAR::isError($response)) {
    echo $response->getMessage();
} else {
    echo $req->getResponseBody();
}
id:miipa

エックスサーバですが、pearの使い方が良くわからないので、直接pearを使用します。

e HTTP_Requestは古いので、HTTP_Request2

エラーが出たので、Net_URL2をダウンロードして使用しました。

しかし、$req->setBasicAuth("johndoe", "foo");の部分を確かに、ID、パスワードとしましたが、

Fatal error: Call to undefined method HTTP_Request2::setBasicAuth()

とエラーメッセージが出ます。

そもそもベーシック認証かどうかはどう判定すればいいのですか?

2009/11/01 00:00:38
id:HALSPECIAL No.4

HALSPECIAL回答回数407ベストアンサー獲得回数862009/11/01 03:23:56

ポイント10pt

>そもそもベーシック認証かどうかはどう判定すればいいのですか?

レスポンスヘッダで判断できると思います。

FireFoxであればLive HTTP Headers等のプラグインで確認できます。


賢者の漬け物石: Basic認証とDigest認証のヘッダ

【Basic認証のヘッダ】

WWW-Authenticate: Basic ・・・

【Digest 認証のヘッダ】

WWW-Authenticate: Digest ・・・

  • id:hato0013
    > e HTTP_Requestは古いので、HTTP_Request2

    HTTP_Request2は使った事ないですが、ドキュメントによると、下記のコードで動くんじゃないでしょうか。

    >||
    require_once 'HTTP/Request2.php';

    $request = new HTTP_Request2('http://○○○.net/○○/item.csv');
    $request->setAuth('ユーザ名', 'パスワード', HTTP_Request2::AUTH_BASIC);

    try {
    $response = $request->send();
    if (200 == $response->getStatus()) {
    echo $response->getBody();
    } else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
    }
    } catch (HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
    }
    ||<

    ダイジェスト認証の場合はAUTH_BASICをAUTH_DIGESTに変更ですね。

    > Fatal error: Call to undefined method HTTP_Request2::setBasicAuth()

    HTTP_Request2にはsetBasicAuthというメソッドがないと言ってます。ドキュメント読まれました?

    > そもそもベーシック認証かどうかはどう判定すればいいのですか?

    判定するのではなく、データの提供元にお問い合わせください。
    お問い合わせの結果、判定する必要がある(判定しても良い)ならその時改めて考えるべき問題です。
  • id:HALSPECIAL
    HALSPECIAL 2009/11/01 09:13:46
    HTTP_Request::setBasicAuth()はHTTP_Request2->setAuth()に変更されました。
    setAuthメソッドだそうです。


    $req->setAuth("johndoe", "foo", HTTP_Request2::AUTH_BASIC);


    うえちょこ@ぼろぐ
    http://labs.uechoco.com/blog/2009/01/php-pear-http_request2-sample-2.html
  • id:miipa
    hato0013さんの
    require_once 'HTTP/Request2.php';

    $request = new HTTP_Request2('http://○○○.net/○○/item.csv');
    $request->setAuth('ユーザ名', 'パスワード', HTTP_Request2::AUTH_BASIC);
    try {
    $response = $request->send();
    if (200 == $response->getStatus()) {
    echo $response->getBody();
    } else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
    }
    } catch (HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
    }
    という記述で、画面にcsvファイルが表示されるようになりました。ありがとうございました!
    ということは、ベーシック認証だったのですね。
    HALSPECIALさんのfirefox プラグインも試みましたが、使用方法がいまいちわからずでした。すいません。

    あとの問題は、画面に出ているcsvファイルをどうやってファイルとして保存するかです。

    copy("http://○○○.net/○○/item.csv","item.csv");
    とか
    $fcat=fopen("http://○○○.net/○○/item.csv","r");
    やってもだめなようですね。自分の無力を痛感します。
    どうかこれも教えてください。
  • id:hato0013
    もう一歩ですね!

    $response->getBody()がCSVデータの中身になるので、PHP5なら

    file_put_contents('出力先のファイル名', $response->getBody());

    とすれば良いかと思います。PHP4はfile_put_contentsという関数がないので、
    下記のようになります。

    $fp = fopen('出力先ファイル名', 'w');
    flock($fp, LOCK_EX);
    fputs($fp, $response->getBody());
    flock($fp, LOCK_UN);
    fclose($fp);


  • id:miipa
    できました!!
    本当にありがとうございました!!
    感動です!!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません