填写表格字段

时间:2011-12-07 17:46:06

标签: php curl

我想填写一个表单字段并使用CURL提交它。网页有很多表单字段已填充,所以我不想触及这些字段。

那么是否可以使用curl并填充必填字段并将其与所有其他已填充的字段一起提交?

3 个答案:

答案 0 :(得分:2)

取决于最初填充表单的方式。

如果预先填充的元素全部使用value="foo",则只需抓取页面(使用curl),将其加载到DOMDocument中,获取您之后的<form>并填充该字段( s)您需要,然后使用新的cURL请求将其作为另一个请求传递(考虑到表单的actionmethod属性,以及发送的表单数据)。

但是,如果他们填充了JS并且您不打算编写cURL请求以模仿您在浏览器上执行的操作,我看不到一种简单的方法来模仿JS操作,然后填充,然后发送它。

此外,这不会考虑可能存在的任何cookie。如果您需要这些,您将不得不在第一次请求时存储它们,并确保在实际的提交呼叫中将它们发送出去。

答案 1 :(得分:2)

完整的演练(给定提供的HTML抓文本)

要自定义,只需在$fields_i_want数组中添加字段名称,即可指定要从下载的源文本中提取的所有文本字段值,并更改检索和提交位置的URL。

此外,file_get_contents()的更好替代方案是curl。您可以使用this SO post上的说明了解如何通过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);

答案 2 :(得分:1)

不确定它是否合适,但为了检查解析HTML所需的字段,检查每个输入文件并查找所需的提及。

要解析HTML,您可以使用以下工具:

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

http://simplehtmldom.sourceforge.net/

使用这些工具,您可以打开页面,在字段中查找所有必需的标签,然后决定使用表单字段进行提交。