2 Stimmen

Formularfeld ausfüllen

Ich möchte ein Formularfeld ausfüllen und es mit CURL übermitteln. Die Webseite hat viele Formularfelder, die bereits ausgefüllt sind, also möchte ich diese Felder nicht berühren.

Ist es also möglich, Curl und Fill zu verwenden? nur das erforderliche Feld und übermitteln Sie es zusammen mit allen anderen Feldern, die bereits ausgefüllt sind?

2voto

Brad Christie Punkte 98327

Das hängt davon ab, wie das Formular anfänglich ausgefüllt wird.

Wenn die vorausgefüllten Elemente alle value="foo" dann einfach die Seite abrufen (mit curl), sie in ein DOMDocument laden, die <form> die Sie benötigen, und füllen Sie das/die benötigte(n) Feld(er) aus, dann leiten Sie es als eine weitere Anfrage unter Verwendung einer neuen cURL-Anfrage weiter (unter Berücksichtigung des Formulars action y method Attribute, sowie Formulardaten, die gesendet werden).

Allerdings, wenn sie mit JS befüllt werden und Sie nicht planen, die cURL-Anfrage zu schreiben, um zu imitieren, was Sie auf Ihrem Browser tun, sehe ich nicht eine einfache Möglichkeit, JS-Aktionen zu imitieren, dann befüllen, dann senden Sie es aus.

Außerdem werden dabei eventuell vorhandene Cookies nicht berücksichtigt. Wenn Sie diese benötigen, müssen Sie sie von der ersten Anfrage an speichern und sicherstellen, dass sie mit dem eigentlichen Übermittlungsaufruf verschickt werden.

2voto

rdlowrey Punkte 38783

Ein vollständiger Durchgang (anhand des mitgelieferten HTML-Scrape-Textes)

Zum Anpassen fügen Sie einfach Feldnamen in die $fields_i_want Array, um alle Textfeldwerte anzugeben, die Sie aus dem heruntergeladenen Quelltext ziehen möchten, und ändern Sie die URLs für Abruf- und Übermittlungsorte.

Auch eine bessere Alternative zu file_get_contents() ist Curl. Sie können die Anweisungen auf dieser SO-Posten für den Abruf von Remote-Text über curl.

// First, retrieve the remote source using file_get_contents()
$str = file_get_contents('http://www.example.com/');    

$my_field_val  = 'my_field_value';
$fields_i_want = array('audien', 'unifor');
$field_vals    = array();
$field_string  = '';

// Use DOM to parse the values you want from the form
$dom = new DOMDocument;
$dom->loadHTML($str);

// Get all the input field nodes
$inputs = $dom->getElementsByTagName('input');

// Iterate over the input fields and save the values we want to an array
foreach ($inputs as $input) {
  $name = $input->getAttribute('name');
  if (in_array($name, $fields_i_want)) {
    $val = $input->getAttribute('value');
    $field_vals[$name] = $val;
  }
}

// append the field value we set ourselves to the list
$field_vals['my_field'] = $my_field_val;

foreach ($field_vals as $key => $val) {
  $field_vals[$key] = urlencode($val)
}

// url-ify the data for the POST
foreach($fields as $key=>$value) {
  $fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');

// open connection
$ch = curl_init();

// POST the data to the form submission url
$submit_url = 'http://www.submitform.com';

// set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $submit_url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

// execute post (returns TRUE on success or FALSE on failure)
$result = curl_exec($ch);

// close connection
curl_close($ch);

1voto

camilo_u Punkte 1370

Ich bin nicht sicher, ob es passt, aber um zu prüfen, welche Felder erforderlich sind, müssen Sie den HTML-Code analysieren und für jede Eingabedatei prüfen, ob eine Angabe erforderlich ist.

Um den HTML-Code zu analysieren, können Sie einige Tools verwenden, wie z.B.:

http://framework.zend.com/manual/en/zend.dom.query.html

http://simplehtmldom.sourceforge.net/

Mit diesen Tools können Sie die Seite öffnen, nach erforderlichen Tags in den Feldern suchen und dann entscheiden, welches Formularfeld übermittelt werden soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X