PHPのCookieについて質問です。


現在フォームページにアクセスして、サーバーに情報を送信するという作業を行いたいと考えています。

具体的にはオークションのページ(ヤフオク)に自動的にログインしたいと考えております。

ログインしたいページは


https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp

のページで、

このページにIDとPWを入力してログインしたいと考えています。

前回少し回答を頂き自分でPearを用いたやり方を今回考えてみました。

しかし、未だにうまく出来ず困っております。

分からない点ですが

サーバーからクッキーを返してもらった後に

①Pearを使って、どのようにデータを送る準備をするのか?

②Pearを使って、実際にどのようにデータをサーバーに送信するか?

この2点がよく分かりません。

自分でこうすればうまくいくのではないか?
というコードをコメントに書いたのでもしよければ見ていただいて、ご回答いただければと考えています。

お手数をおかけしますが、わかるかたおりましたらご回答をよろしくお願いいたします。





回答の条件
  • 1人2回まで
  • 登録:2009/10/15 02:32:01
  • 終了:2009/10/20 02:11:46

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/10/15 11:34:17

ポイント100pt

こんなコードでログインできます。

<?php
require_once 'HTTP/Request.php';

$id = 'ユーザID';
$pw = 'パスワード';

$url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp';

$request =& new HTTP_Request();
$request->setURL($url);
$request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)');
$request->addHeader('Keep-Alive', 300);
$request->addHeader('Connection', 'keep-alive');

$response = $request->sendRequest();
if (PEAR::isError($response)) {
  echo $response->getMessage();
  exit;
}

$html = $request->getResponseBody();

preg_match('/<img width=1 height=1 alt="" src="(.*?)">/is', $html, $matches);
$burl = $matches[1];
$request->setURL($burl);
$request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)');
$request->addHeader('Referer', $url);
$request->addHeader('Keep-Alive', 300);
$request->addHeader('Connection', 'keep-alive');
$response = $request->sendRequest();
if (PEAR::isError($response)) {
  echo $response->getMessage();
  exit;
}

$cookies = $request->getResponseCookies();

preg_match_all('/<input type="hidden" name="(.*?)" value="(.*?)">/', $html, $matches, PREG_SET_ORDER);


$request->setURL('https://login.yahoo.co.jp/config/login?');
$request->setMethod(HTTP_REQUEST_METHOD_POST);
$request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)');
$request->addHeader('Referer', $url);
$request->addHeader('Keep-Alive', 300);
$request->addHeader('Connection', 'keep-alive');

foreach ($cookies as $cookie) {
  $request->addCookie($cookie['name'], $cookie['value']);
}
foreach ($matches as $entry) {
  $request->addPostData($entry[1], $entry[2]);
}
$request->addPostdata('login', $id);
$request->addPostdata('passwd', $pw);
$response = $request->sendRequest();
if (PEAR::isError($response)) {
  echo $response->getMessage();
  exit;
}

print_r ($request->getResponseCookies());
exit;
?>

最後に出力しているCookieを使えば、オークションのサイトにアクセスできると思います。


このコードに行きついた方法ですが、FireFoxのLive HTTP Headerプラグインを使って、実際のブラウザの動作と同じことをHTTP_Requestにやらせました。なので、無駄な部分があるかもしれません。

ちなみにCookieが取得できなかったのは、UserAgentの指定を見て、Yahooが返してくれないようです。


何かの参考になれば。

id:aiomock

ご回答ありがとうございます。

2009/10/15 12:20:40
  • id:aiomock
    以下 私が考えましたPearのコードです。

    <?

    //①Pearの設定

    require_once 'HTTP/Request.php';

    $url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp';

    $request = &new HTTP_Request();
    $request->setURL($url);



    //②クッキーを取得

    $result = $request->sendRequest();
    if (!PEAR::isError($result)) {
    $cookie = $request->getResponseCookies();
    }

    //③データを設定

    $id='test';
    $pw='test';

    ここが難しいです。。

    input タグの属性部分をセットするといいみたいなことを聞いたのですが今いちセッティングの仕方が分かりません。。
    .challenge (チャレンジコード)というものがあるみたいでここが毎回変わるみたいなのですがその対処も難しそうです。。


    //④USER AGENT 設定

    $http->addHeader("User-Agent", "My PEAR PROGRAM");


    USER AGENT はネットで調べてページからそのまま使えるか分からず持ってきたのですが

    当方OSはWindowsVista ブラウザはFireFox 3.0.14を使用していますが設定は合っていますでしょうか?


    //⑤データを送信

    $req->addCookie(ここにデータを入れる);

    データの設定方法がわからないので、ここのデータの送信のところもaddCookieを使えば何とかいけるのでは?という所までしか分かりません。。


    以上の流れでログインできるのではないか?と考えているのですが③と⑤が今いちよくつかめません。。

    もしよろしければPEARを前提に③と⑤の簡単な型みたいなものを時間があるかたおりましたら作成していただけないでしょうか?
    よろしくお願いいたします。

    ?>
  • id:aiomock
    受け取ったクッキーを見てみればなにか解決策が見つかるのではないか?と思い

    $cookie = $request->getResponseCookies();

    の後に

    echo $cookie ;

    としたのですが、空白でした。

    私の考え方というのは間違っていたのでしょうか?

    getResponseCookies(); の値というのは 通常見れないものなのでしょうか?

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

トラックバック

  • PHPでYahoo!Japanにログインする Yahoo!にはYahoo!デベロッパーネットワーク(YDN)というのがあって、とても便利なのだが、YDNでは取得できない情報を取得したかったのでその時のメモです。ちなみ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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