2016-03-28 10 views
0

Ich suchte im Internet und nichts gefunden.Formular aus PHP-Skript ausfüllen und senden

Auf der Website gibt es ein Eingabefeld für eine E-Mail-Adresse. Ich möchte dieses Feld mit einer E-Mail-Adresse füllen und das Formular senden. Ich fand diesen Code:

$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); 

Aber in meinem Fall, die Action-Datei ist die aktuelle Seite selbst und die URL rewritted wird. Also, wenn ich die URL so:

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

erhalte ich die Seite aber die Form ist nicht

+0

Sie auf der Zielstelle vergewissert haben, dass die Anfrage Typ POST ist, und dass der einzige Bereich ist E-Mail (genauer gesagt, es ist kein CSRF-Token)? –

+0

Vielleicht Goutte versuchen? https://packagist.org/packages/fabpot/goutte – Chris

Antwort

0

gesendet Sie können das Selen WebDriver & PHPUnit zu prüfen, diese Aufgabe zu erfüllen. Sie sollten in der Lage sein, das Formular einfach auszufüllen und zu senden, auch wenn sich die URL der Einreichung jedes Mal ändert. Hier ist ein Beispiel dafür, wie dies funktionieren würde:

<?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(); 
     } 
} 
?> 

Sieht aus wie eine Menge, aber wenn man es brechen, es ist nicht so schlimm. Mit dieser Methode verwenden Sie einen aktuellen Browser (in diesem Fall Firefox), um das Formular auszufüllen und zu senden. Dadurch wird JavaScript geladen und verarbeitet, was möglicherweise erforderlich ist, um die eindeutige URL für die Einreichung zu erstellen, je nachdem, wie Ihr Formular erstellt wurde.

0

Eine Option, die für Sie arbeiten kann, ist Goutte von Fabien Potencier zum Abschicken von Formularen geschrieben.

Beispielcode aus 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"; 
}); 

Get it on Packagist: https://packagist.org/packages/fabpot/goutte

Verwandte Themen