2016-03-28 13 views
0

私はウェブを検索して何も見つかりませんでした。PHPスクリプトからフォームを入力して送信してください

ウェブサイトには、電子メールアドレス用の入力ボックスがあります。このフィールドに電子メールアドレスを入力してフォームを送信したいと思います。 私はこのコードが見つかりました:

$postdata = http_build_query(
array(
    'email' => 'youremailaddress' 
) 
); 
$opts = array('http' => 
array(
    'method' => 'POST', 
    'header' => 'Content-type: application/x-www-form-urlencoded', 
    'content' => $postdata 
) 
); 

$context = stream_context_create($opts); 

$result = file_get_contents('http://example.com/submit.php', false, $context); 

をしかし、私の場合には、アクション・ファイルは、現在のページそのものであるとURLがrewrittedされます。私は、このようなURLを入れたときに:

$result = file_get_contents('http://example.com/login.html', false, $context); 
var_dump($result); 

私はページを取得しますが、フォームは、あなたは、このタスクを達成するためにセレンwebdriverを&のPHPUnitをチェックアウトすることができます

+0

あなたは、要求タイプがPOSTで、そして唯一のフィールドは(具体的には、そこに電子メールであることをことをターゲットサイト上で確認しましCSRFトークンはありません)? –

+0

たぶんGoutteを試してみませんか? https://packagist.org/packages/fabpot/goutte – Chris

答えて

0

を送信されません。毎回送信URLが変更された場合でも、フォームに簡単に記入して提出することができます。ここでは、これがどのように動作するかの例です:

<?php 

class phproTest extends PHPUnit_Extensions_Selenium2TestCase 
{ 
     protected function setUp() 
     { 
       // Which browser to use 
       $this->setBrowser('firefox'); 
       // The base URL 
       $this->setBrowserUrl('http://example.com/'); 
     } 

     public function testContactFormExists() 
     { 
       $this->url('http://example.com/login.html'); 

       $email = $this->byName('sender_email'); 
       $submit = $this->byName('submit_button'); 

       $this->assertEquals('', $email->value()); 
       $this->assertEquals('Submit', $submit->value()); 
     } 

     public function testSubmitToSelf() 
     { 
       // set the url 
       $this->url('contact'); 

       // create a form object for reuse 
       $form = $this->byId('contact_form'); 

       // get the form action 
       $action = $form->attribute('action'); 

       // check the action value 
       $this->assertEquals('http://example.com/login.html', $action); 
       // fill in the form field values 
       $this->byName('sender_email')->value('youremailhere'); 

       // submit the form 
       $form->submit(); 
     } 
} 
?> 

はたくさんのように見えるが、あなたはそれを打破たら、それはそう悪くはありません。この方法を使用すると、実際のブラウザ(この場合はfirefox)を使用してフォームに記入して送信します。これにより、フォームの作成方法に応じて固有の送信URLを作成するために必要なjavascriptがロードされ、処理されます。

0

あなたに役立つオプションは、Fabien Potencierによって書類を提出するために書かれたGoutteです。 packagistから

例コード:

$crawler = $client->request('GET', 'http://github.com/'); 
$crawler = $client->click($crawler->selectLink('Sign in')->link()); 
$form = $crawler->selectButton('Sign in')->form(); 
$crawler = $client->submit($form, array('login' => 'fabpot', 'password' => 'xxxxxx')); 
$crawler->filter('.flash-error')->each(function ($node) { 
    print $node->text()."\n"; 
}); 

Packagistでそれを取得:https://packagist.org/packages/fabpot/goutte

関連する問題