質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

2回答

4927閲覧

PHP(Goutte)のsubmit()はformのactionが相対パスの場合はできないのでしょうか?

risaito74

総合スコア44

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2017/01/18 08:45

編集2017/01/18 09:17

(Windows8 / XAMPP上でPHPを実行)
とあるサイトへの自動ログインをPHPのGoutteで行おうと、以下のコードを書きました。

PHP

1<?php 2require_once 'goutte.phar'; 3 4use Goutte\Client; 5 6$ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; 7// Goutteオブジェクトの生成 8$client = new Client( ['HTTP_USER_AGENT' => $ua ]); 9 10$crawler = $client->request('GET', 'http://(とあるサイト)'); 11//var_dump($crawler); 12 13$loginForm = $crawler->filter('.newLogin')->form(); 14$loginForm['txt_account'] = '(アカウント)'; 15$loginForm['txt_password'] = '(パスワード)'; 16$crawler = $client->submit($loginForm); 17//var_dump($loginForm); 18//var_dump($crawler); 19 20echo $crawler->html();

上記のコードを実行するとログインはできず、ログイン入力画面へ戻ってしまいます。
(echo $crawler->html()の出力がログイン入力画面)

別途request()でPOSTする方法でログインはできたのですが、上記コードではなぜログインできないのか調べていたところ、<form>のactionに注目しました。

html

1<form style="display:none;" class="newLogin" method="post" action="./C1Login.php"> 2(中略) 3<input type="text" size="15" id="id" maxlength="40" name="txt_account" value="" tabindex="1" style="width: 200px;font-family:tahoma;font-size: 20px;/* margin: auto; */"> 4 </div> 5 <div class="login-input"> 6 <span>パスワード</span> 7 <input type="password" size="20" id="pass" maxlength="40" name="txt_password" value="" tabindex="2" style="width: 200px;font-family:tahoma;font-size: 20px;"> 8 </div> 9 <div class="login-btn"> 10 <button type="submit" name="login" tabindex="4" style="padding:0;" value="ログイン">

つまり、actionが相対パスなので実行環境であるローカルホストからのパスになってしまうから、正しいPOST先を参照できないことが原因ではないかと考えました。

この考え方であっているのか、また別の原因があるのか、ご助言いただければ幸いです。

参考までにrequest()でログインできたコードも下記に記載いたします。

PHP

1<?php 2require_once 'goutte.phar'; 3 4use Goutte\Client; 5 6$ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; 7// Goutteオブジェクトの生成 8$client = new Client( ['HTTP_USER_AGENT' => $ua ]); 9 10$array = [ 11 'txt_account' => '(アカウント)', 12 'txt_password' => '(パスワード)', 13 'chk_save' => '', 14 'login' => 'ログイン', 15]; 16 17$crawler = $client->request('POST', 'http://(とある)/C1Login.php', $array); 18 19echo $crawler->html();

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

※参考にしたサイト
Goutteでスクレイピングする方法めも

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

推測ですが...
POSTデータのchk_saveかloginの値がうまく行ったときと違うのではないかと思います。

特に$loginFormを取得するときにfilterを使っていますので、正しくログインボタンが押されたことになっていない可能性があります。selectButton('ログイン')を使ったらどうでしょうか。

php

1$loginForm = $crawler->selectButton('ログイン')->form();

あとは、$loginFormをvar_dumpで出力するとPOSTデータが確認できるので、見てみるといいかもしれません

php

1var_dump($loginForm);

投稿2017/01/18 09:28

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risaito74

2017/01/18 14:32

ありがとうございます。事情があって次に開発環境に触れるのが来週になりますが、試してみたいと思います。
guest

0

パッと見た目に、上のコードは
$crawler = $client->request('GET', 'http://(とあるサイト)');
となっていて、GETメソッドです。

で下のコードは
$crawler = $client->request('POST', 'http://(とある)/C1Login.php', $array);
POSTメソッドです。

そもそも該当HTMLはPOSTメソッドを使っている訳ですから、GETでリクエストしてもダメだろうと推察します。

投稿2017/01/18 09:06

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risaito74

2017/01/18 09:13

回答ありがとうございます。 ご指摘の点ですが、GETでログインフォームを取得した後、アカウント、パスワードのvalueに値をセットし、submit()でsubmitボタン押下と同じ処理が実行される…というものと理解しています。 以下のサイトの「アクセス先にあるフォームを送信する」を参考にしました。 http://qiita.com/77web@github/items/3cd3b56985d5c6845661
shi_ue

2017/01/18 09:17

あ、頓珍漢な答えでしたね。 理解されている通り、相対パスになっているので、取得したソースからPOSTすると失敗するんでしょうね。 Goutteが何をやっているのかソースを読まないといけませんが、Wireshark等でパケットをキャプチャしてみると原因がつかみやすいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問