如何使用 PHP cURL 手动执行 'form submit'?
how to do 'form submit' manually using PHP cURL?
这是我在 PHP 中使用 cURL 所做的:
1) 登录网站:http://example.com 并使用以下方法获取结果页面:
$fp = fopen("cookie.txt", "w");
fclose($fp);
$login = curl_init();
curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($login, CURLOPT_TIMEOUT, 40000);
curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($login, CURLOPT_URL, "http://main.com");
curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($login, CURLOPT_POST, TRUE);
curl_setopt($login, CURLOPT_POSTFIELDS, "id=myID&pw=myPW");
ob_start();
return curl_exec ($login);
ob_end_clean();
curl_close ($login);
unset($login);
2) 结果我获取的页面是 HTML 格式:
<form id="form" action="http://example.com/example.jsp" method="POST">
<select name="mySelect">
<option value="1" selected>one</option>
<option value="2" selected>two</option>
<option value="3" selected>three</option>
</select>
<input type="submit" value="SUBMIT" />
</form>
3) 我点击"SUBMIT"按钮从上面提交html
4) 我被重定向到一个不同的页面,这是提交表单的结果。
但在这里,我想提取 不同的页面 ,而不是通过 php 手动执行 'submit' 来重定向到。而不是单击“提交”按钮。
因此,当我尝试使用 cURL 执行此操作时,我遇到的问题是 POST 完成时就好像 我没有登录 。我需要保持登录状态才能使用 cURL 执行 POST 操作。
有没有办法做到这一点?可能是通过让 cookie 保持活动状态,或者让会话保持活动状态以进行第二个 POST 操作?
您必须进行第二次 curl 尝试,这次将 url 和 post 字段更改为您在第 2 步中获取的字段。
为了获得所需的字段,您可以使用 dom(例如,Simple HTML Dom Parser) library initialized with the code obtained in step 2 or simple regular expresions (preg_match)
轻松生活,用痛风
https://github.com/FriendsOfPHP/Goutte
基本上它不会让您提取 URL,完成并提交表单并检索生成的页面。真的很简单也很好。
我在 Symfony 中使用它,但它也应该与普通 PHP 一起使用。
这是我在 PHP 中使用 cURL 所做的:
1) 登录网站:http://example.com 并使用以下方法获取结果页面:
$fp = fopen("cookie.txt", "w");
fclose($fp);
$login = curl_init();
curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($login, CURLOPT_TIMEOUT, 40000);
curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($login, CURLOPT_URL, "http://main.com");
curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($login, CURLOPT_POST, TRUE);
curl_setopt($login, CURLOPT_POSTFIELDS, "id=myID&pw=myPW");
ob_start();
return curl_exec ($login);
ob_end_clean();
curl_close ($login);
unset($login);
2) 结果我获取的页面是 HTML 格式:
<form id="form" action="http://example.com/example.jsp" method="POST">
<select name="mySelect">
<option value="1" selected>one</option>
<option value="2" selected>two</option>
<option value="3" selected>three</option>
</select>
<input type="submit" value="SUBMIT" />
</form>
3) 我点击"SUBMIT"按钮从上面提交html
4) 我被重定向到一个不同的页面,这是提交表单的结果。
但在这里,我想提取 不同的页面 ,而不是通过 php 手动执行 'submit' 来重定向到。而不是单击“提交”按钮。
因此,当我尝试使用 cURL 执行此操作时,我遇到的问题是 POST 完成时就好像 我没有登录 。我需要保持登录状态才能使用 cURL 执行 POST 操作。 有没有办法做到这一点?可能是通过让 cookie 保持活动状态,或者让会话保持活动状态以进行第二个 POST 操作?
您必须进行第二次 curl 尝试,这次将 url 和 post 字段更改为您在第 2 步中获取的字段。
为了获得所需的字段,您可以使用 dom(例如,Simple HTML Dom Parser) library initialized with the code obtained in step 2 or simple regular expresions (preg_match)
轻松生活,用痛风
https://github.com/FriendsOfPHP/Goutte
基本上它不会让您提取 URL,完成并提交表单并检索生成的页面。真的很简单也很好。
我在 Symfony 中使用它,但它也应该与普通 PHP 一起使用。