使用 PHP Curl 提交表单并获取结果
Using PHP Curl to submit form and get results
网站上的表格是...
<form action="" method="POST">
<input style="width:30%;background-color:#e2e2e2;border:#000;color:#000;" type="text" name="userName" placeholder="Enter a username" required="">
<br>
<input type="submit" name="userBtn" value="get Username">
</form>
在 name="userName"
中填写一个值并单击 name="userBtn"
后,页面会刷新并将 name="userName"
的值更改为我想要的信息。
我将如何提交表单然后检索它写入的数据?
查看此详细示例,从创建新连接开始。
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
使用 curl_init() 函数创建了一个新连接,它将目标 URL 作为参数(URL 我们想要 post 我们的数据) .目标 URL 与普通形式的“动作”参数相同,看起来像这样:
<form method="post" action="http://www.domainname.com/target_url.php">
现在让我们为我们的连接设置一些选项。我们可以使用 curl_setopt() 函数来做到这一点。转到 curl_setopt() 参考页面以获取有关 curl_setopt() 的更多信息和完整的选项列表。
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
我们在这里设置什么选项?
首先,我们将连接超时设置为 30 秒,这样如果远程服务器无法响应,我们的脚本就不会无限期地等待。
然后我们设置 cURL 将如何向远程服务器标识自己。有些服务器会 return 针对不同的浏览器(或代理,例如搜索引擎的蜘蛛)提供不同的内容,因此我们希望我们的请求看起来像是来自流行的浏览器。
CURLOPT_RETURNTRANSFER 设置为 true 强制 cURL 不显示请求的输出,但 return 它作为字符串。
然后我们将 CURLOPT_SSL_VERIFYPEER 选项设置为 false,因此在无效、过期或未签名的 SSL 证书的情况下请求不会触发错误。
最后,我们将 CURLOPT_FOLLOWLOCATION 设置为 1 以指示 cURL 遵循远程站点发送的 headers 中找到的“位置:”重定向。
现在我们必须准备我们想要的数据post。我们可以先将其存储在一个数组中,其中元素的键与常规表单的输入名称相同,值是我们想要为该字段 post 的值。
例如,如果采用常规形式,我们将有:
<input type="text" name="firstName" value="Name">
<input type="hidden" name="action" value="Register">
我们像这样将它添加到我们的数组中:
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register'
对每个表单域执行相同的操作。
数据将按以下格式 posted:
键1=值1&键2=值2
为了像这样格式化数据,我们将为每个 key-value 对(例如 key1=value1)创建字符串,然后将它们放入另一个数组($post_items)使用 PHP 函数 implode() .
将它们组合成一个字符串
foreach ( $post_data as $key => $value)
{
$post_items[] = $key . '=' . $value;
}
$post_string = implode ('&', $post_items);
接下来,我们需要告诉cURL我们想要post哪个字符串。为此,我们使用 CURLOPT_POSTFIELDS 选项。
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
最后,我们执行post,然后关闭连接。
$result = curl_exec($curl_connection);
curl_close($curl_connection);
到现在,数据应该已经posted到远程URL。去检查一下,如果它没有正常工作,请使用 curl_getinfo() 函数查看可能发生的任何错误。
print_r(curl_getinfo($curl_connection));
此行显示有关传输的一系列信息。这必须在使用 curl_close();
关闭连接之前使用
您还可以通过输出 curl_errno($curl_connection) 和 curl_error($curl_connection).
查看错误的编号和描述
所以让我们把所有的东西放在一起。这是我们的代码:
<?php
//create array of data to be posted
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register';
//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
//create cURL connection
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
//set options
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
//set data to be posted
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
//perform our request
$result = curl_exec($curl_connection);
//show information regarding the request
print_r(curl_getinfo($curl_connection));
echo curl_errno($curl_connection) . '-' .
curl_error($curl_connection);
//close the connection
curl_close($curl_connection);
?>
网站上的表格是...
<form action="" method="POST">
<input style="width:30%;background-color:#e2e2e2;border:#000;color:#000;" type="text" name="userName" placeholder="Enter a username" required="">
<br>
<input type="submit" name="userBtn" value="get Username">
</form>
在 name="userName"
中填写一个值并单击 name="userBtn"
后,页面会刷新并将 name="userName"
的值更改为我想要的信息。
我将如何提交表单然后检索它写入的数据?
查看此详细示例,从创建新连接开始。
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
使用 curl_init() 函数创建了一个新连接,它将目标 URL 作为参数(URL 我们想要 post 我们的数据) .目标 URL 与普通形式的“动作”参数相同,看起来像这样:
<form method="post" action="http://www.domainname.com/target_url.php">
现在让我们为我们的连接设置一些选项。我们可以使用 curl_setopt() 函数来做到这一点。转到 curl_setopt() 参考页面以获取有关 curl_setopt() 的更多信息和完整的选项列表。
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
我们在这里设置什么选项?
首先,我们将连接超时设置为 30 秒,这样如果远程服务器无法响应,我们的脚本就不会无限期地等待。
然后我们设置 cURL 将如何向远程服务器标识自己。有些服务器会 return 针对不同的浏览器(或代理,例如搜索引擎的蜘蛛)提供不同的内容,因此我们希望我们的请求看起来像是来自流行的浏览器。
CURLOPT_RETURNTRANSFER 设置为 true 强制 cURL 不显示请求的输出,但 return 它作为字符串。
然后我们将 CURLOPT_SSL_VERIFYPEER 选项设置为 false,因此在无效、过期或未签名的 SSL 证书的情况下请求不会触发错误。
最后,我们将 CURLOPT_FOLLOWLOCATION 设置为 1 以指示 cURL 遵循远程站点发送的 headers 中找到的“位置:”重定向。
现在我们必须准备我们想要的数据post。我们可以先将其存储在一个数组中,其中元素的键与常规表单的输入名称相同,值是我们想要为该字段 post 的值。
例如,如果采用常规形式,我们将有:
<input type="text" name="firstName" value="Name">
<input type="hidden" name="action" value="Register">
我们像这样将它添加到我们的数组中:
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register'
对每个表单域执行相同的操作。
数据将按以下格式 posted: 键1=值1&键2=值2
为了像这样格式化数据,我们将为每个 key-value 对(例如 key1=value1)创建字符串,然后将它们放入另一个数组($post_items)使用 PHP 函数 implode() .
将它们组合成一个字符串 foreach ( $post_data as $key => $value)
{
$post_items[] = $key . '=' . $value;
}
$post_string = implode ('&', $post_items);
接下来,我们需要告诉cURL我们想要post哪个字符串。为此,我们使用 CURLOPT_POSTFIELDS 选项。
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 最后,我们执行post,然后关闭连接。
$result = curl_exec($curl_connection);
curl_close($curl_connection);
到现在,数据应该已经posted到远程URL。去检查一下,如果它没有正常工作,请使用 curl_getinfo() 函数查看可能发生的任何错误。
print_r(curl_getinfo($curl_connection));
此行显示有关传输的一系列信息。这必须在使用 curl_close();
关闭连接之前使用您还可以通过输出 curl_errno($curl_connection) 和 curl_error($curl_connection).
查看错误的编号和描述所以让我们把所有的东西放在一起。这是我们的代码:
<?php
//create array of data to be posted
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register';
//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
//create cURL connection
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
//set options
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
//set data to be posted
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
//perform our request
$result = curl_exec($curl_connection);
//show information regarding the request
print_r(curl_getinfo($curl_connection));
echo curl_errno($curl_connection) . '-' .
curl_error($curl_connection);
//close the connection
curl_close($curl_connection);
?>