回答編集履歴

5

罫線

2016/12/08 09:37

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -45,6 +45,10 @@
45
45
 
46
46
 
47
47
  それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
48
+
49
+
50
+
51
+ ----
48
52
 
49
53
 
50
54
 

4

誤字

2016/12/08 09:37

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -124,4 +124,6 @@
124
124
 
125
125
  [password] => *********
126
126
 
127
+ )
128
+
127
- )```
129
+ ```

3

誤字

2016/12/08 09:34

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  $loginForm['username'] = '**********@sample.com';
10
10
 
11
- $loginForm['password'] = '*********'
11
+ $loginForm['password'] = '*********';
12
12
 
13
13
  $crawler = $client->submit($loginForm);
14
14
 
@@ -45,3 +45,83 @@
45
45
 
46
46
 
47
47
  それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
48
+
49
+
50
+
51
+ **おまけ**
52
+
53
+ 以下は、自分で作ったフォームにgoutteでクロールさせてみて、POSTデータがどうなっているか実験してみた結果です。
54
+
55
+
56
+
57
+ フォーム側
58
+
59
+ ```php
60
+
61
+ <?php
62
+
63
+ print_r($_POST);
64
+
65
+ ?>
66
+
67
+ <form method='POST'>
68
+
69
+ <input name="username" type="text">
70
+
71
+ <input name="password" type="text">
72
+
73
+ <button type="submit" name="_eventId_proceed" onclick="this.childNodes[0].nodeValue='ログインしています…'">ログイン</button>
74
+
75
+ </form>
76
+
77
+ ```
78
+
79
+
80
+
81
+ クロール側
82
+
83
+ ```php
84
+
85
+ <?php
86
+
87
+ require __DIR__ . "/vendor/autoload.php";
88
+
89
+
90
+
91
+ use Goutte\Client;
92
+
93
+
94
+
95
+ $client = new Client();
96
+
97
+ $crawler = $client->request('GET', 'http://example.com/hoge.php');
98
+
99
+ $loginForm = $crawler->selectButton('ログイン')->form();
100
+
101
+ $loginForm['username'] = '**********@sample.com';
102
+
103
+ $loginForm['password'] = '*********';
104
+
105
+ $crawler = $client->submit($loginForm);
106
+
107
+ echo $crawler->text();
108
+
109
+ ```
110
+
111
+
112
+
113
+ 結果(フォーム側のprint_r($_POST)の出力結果)
114
+
115
+ ```
116
+
117
+ Array
118
+
119
+ (
120
+
121
+ [_eventId_proceed] =>
122
+
123
+ [username] => **********@sample.com
124
+
125
+ [password] => *********
126
+
127
+ )```

2

間違えていたので、全面的に書き換えた

2016/12/08 09:34

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -1,38 +1,4 @@
1
- 確かにsubmitボタンのnameはGoutteでsubmitした場合、postデータとして渡されない感じもするので可能性はあると思います。以下のようにすると自前でinputを追加できますよ
2
-
3
- ```php
4
-
5
- use DomDocument;
6
-
7
- use Symfony\Component\DomCrawler\Field\InputFormField;
8
-
9
-
10
-
11
- $domdocument = new DOMDocument;
12
-
13
- $input = $domdocument->createElement('input');
14
-
15
- $input->setAttribute('name', '_eventId_proceed');
16
-
17
- $input->setAttribute('value', '');
18
-
19
- $input = new InputFormField($input);
20
-
21
- $loginForm->set($input);
22
-
23
- ```
24
-
25
- 参考:[Adding Additional Fields to Symfony Form before Submit](http://stackoverflow.com/questions/25869185/adding-additional-fields-to-symfony-form-before-submit)
26
-
27
-
28
-
29
- それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
30
-
31
-
32
-
33
- **(追記)**
34
-
35
- すみません...少し勘違いをしていました。以下のようにformを取得する際にselectButtonを使えば、submitボタンのnameもpostデータとして渡されいました。なので、以下のコードでやれば、inputを自前で追加る必要なさそうです
1
+ 以下のようにformを取得する際にselectButtonを使えば、submitボタンのnameもpostデータとして渡されると思います
36
2
 
37
3
  ```php
38
4
 
@@ -47,3 +13,35 @@
47
13
  $crawler = $client->submit($loginForm);
48
14
 
49
15
  ```
16
+
17
+
18
+
19
+ ただし、Goutteはjavascriptの挙動はトレースできないので、javascriptでinputの追加などの処理があるなら、以下のように自前でinputを追加する必要があります。
20
+
21
+ ```php
22
+
23
+ use DomDocument;
24
+
25
+ use Symfony\Component\DomCrawler\Field\InputFormField;
26
+
27
+
28
+
29
+ $domdocument = new DOMDocument;
30
+
31
+ $input = $domdocument->createElement('input');
32
+
33
+ $input->setAttribute('name', 'hoge');
34
+
35
+ $input->setAttribute('value', 'hoge');
36
+
37
+ $input = new InputFormField($input);
38
+
39
+ $loginForm->set($input);
40
+
41
+ ```
42
+
43
+ 参考:[Adding Additional Fields to Symfony Form before Submit](http://stackoverflow.com/questions/25869185/adding-additional-fields-to-symfony-form-before-submit)
44
+
45
+
46
+
47
+ それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。

1

補足

2016/12/08 09:26

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -27,3 +27,23 @@
27
27
 
28
28
 
29
29
  それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
30
+
31
+
32
+
33
+ **(追記)**
34
+
35
+ すみません...少し勘違いをしていました。以下のようにformを取得する際にselectButtonを使えば、submitボタンのnameもpostデータとして渡されていました。なので、以下のコードでやれば、inputを自前で追加する必要なさそうです。
36
+
37
+ ```php
38
+
39
+ $crawler = $client->request('GET', 'https://sample.com/login/');
40
+
41
+ $loginForm = $crawler->selectButton('ログイン')->form();
42
+
43
+ $loginForm['username'] = '**********@sample.com';
44
+
45
+ $loginForm['password'] = '*********'
46
+
47
+ $crawler = $client->submit($loginForm);
48
+
49
+ ```