【问题标题】:POST in cURL lib with PHP isn't sending使用 PHP 在 cURL lib 中的 POST 未发送
【发布时间】:2023-03-25 05:50:01
【问题描述】:

我正在尝试使用 PHP 通过 cURL 发送 POSTDATA,但我认为 post 没有发送

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$t = curl_exec($ch);

不知道为什么,但我试图登录一个页面,当我转储 $t 时,我总是看到表单,curl_error 为空,我该如何调试?尝试登录的页面不是我的!


我有一个模拟 cURL 的本地表单,它可以:

<form action="$url" method="POST">
  <input type="hidden" name="username" value="$uspw" />
  <input type="hidden" name="password" value="$uspw" />
  <input type="submit" value="Send" />
</form>

它在 $url 中登录!这是我在 cURL 中发送到 POSTFIELDS 的 $data

$data = array('username' => $uspw,
              'password' => $uspw);

是的..用户和密码是一样的


收到的标头:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Sun, 25 Nov 2012 05:23:19 GMT
Server: Apache
Cache-Control: no-cache="set-cookie"
Content-Length: 4822
Set-Cookie: SESSIONID_portalApp=xxxxxx!-xxx!xxx; path=/
Content-Language: en
X-Powered-By: Servlet/2.4 JSP/2.0
Content-Type: text/html; charset=ISO-8859-1

在此之后,我再次收到所有表格...


$data = array('username' => $uspw,
    'password' => $uspw);


$header = array('Origin: xxx',
        'Content-Type: application/x-www-form-urlencoded',
        'Connection: keep-alive',
        'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Cache-Control: max-age=0',
        'Except:',
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Accept-Encoding:gzip,deflate,sdch',
        'Accept-Language:es-ES,es;q=0.8',
        );

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
curl_setopt($ch, CURLOPT_COOKIEJAR, 'xxx.txt');
curl_setopt($ch, CURLOPT_REFERER, 'xxxx');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$t = curl_exec($ch);

谢谢!

【问题讨论】:

  • 您尚未显示您尝试发送的数据。您要登录的网站是什么?我的猜测是,如果您要取回表单,您甚至可能没有使用正确的 URL。但如果没有 URL,我无法确定。
  • 我不能公开网址,非常私密,谢谢您的负面btw。如果这有帮助,我有一个本地表单来模拟来自 URL 的表单,并且在操作中我使用与 cURL 相同的 URL,当我在本地表单中按提交时,它登录的数据是这样的:array('username' =&gt; $usr, 'password' =&gt; $pw); nothing更多
  • 调试是通过将 CURLOPT_VERBOSE 设置为 true 来完成的。
  • 如果您将我要求的信息放入问题中,我将删除反对票。您能否至少向我们展示您正在使用的本地表格。您可以更改操作。
  • 现在编辑了一些东西,这就是我能说的,伙计......好吧。另一件事是.. 当我提交时,我认为第三页将我发送到另一个页面,做标题位置,但不知道

标签: php post curl


【解决方案1】:

您似乎正在尝试不使用浏览器登录第三方系统。

这很可能不起作用,因为您没有做它所期望的事情,即建立会话 cookie。尽管您可能正确地登录,但远程站点可能会再次向您显示表单,因为您的 cookie 中没有任何内容告诉它在重定向时执行其他操作。标题解释了这一点:

设置 Cookie:SESSIONID_portalApp=xxxxxx!-xxx!xxx;路径=/

创建一个 cookie 文件供 cURL 使用(使用类似 tempnam() 的东西)并使用 CURLOPT_COOKIEJAR 指令告诉 cURL 它位于何处。您也可以从浏览器中获取现有的 cookie 并尝试,作为排除故障的另一种方法。

在初始化 cURL 之前添加:

$cookieFile = tempnam('/dev/shm', 'curlCookie_'); 

然后告诉 cURL 使用它:

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);

我建议使用/dev/shm,因为它会在重新启动后消失,您可以在任何有能力的地方创建它。只需在不再需要时小心删除它们。您还可以更改前缀,使单个文件更容易与单个请求(时间戳、PID 等)关联,便于调试。

还要确保将用户代理字符串设置为远程站点可以接受的内容。记住,它需要一个浏览器——所以你必须确保你的行为像一个浏览器。按照 cmets 的建议,设置 CURLOPT_FOLLOWLOCATION true 可能是个好主意。

如果这不起作用,请在浏览器中正常执行该操作并仔细查看页面。可能需要 JS 才能正确构建会话 .. 在这一点上,仅使用 cURL 就有点不走运了。

【讨论】:

  • 感谢您的回答!我尝试了这个,但没有什么新东西,我在 chrome 中看到,如果我加入页面,这个 cookie 总是被创建,当我登录时,另一个变量被设置,我没有收到这个新变量
  • 嗯,如果无法重现,真的很难推测。未启用 cookie 绝对是您的问题的一部分,现在的问题是..您为什么没有收到第二个变量。您是否相应地设置了用户代理字符串 / 等?你的代码在做什么 chrome 没有?设置第二个变量是否需要 JS?
  • 我认为是的,我看到了 chrome 和我的脚本发送的标题,并且是相同的:S
  • 检查页面源,如果你有匹配的标题,那么我敢打赌你有一些 JS 需要处理,这意味着启动对 AJAX 端点的第二个请求并摆弄HTTP_X_REQUESTED_WITH如果是这种情况,请标头。
  • @TimPost 如果他的本地表单有效,那么 javascript 怎么可能是他的问题?我认为你在找错树了。
【解决方案2】:

访问表单页面,然后使用 same curl 资源进行发布请求。另外,添加以下设置:

curl_setopt($ch, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "valid user agent");

【讨论】:

  • 为什么只有一个请求?应该有两个。首先是带有表单的页面,其次是提交该表单。请记住,使用 same curl 资源。另外,添加curl_setopt($ch, CURLOPT_COOKIEFILE, 'xxx.txt'); 并保留curl_setopt($ch, CURLOPT_COOKIEJAR, 'xxx.txt');
  • 不明白,提交之前和之后的 url 是一样的,我尝试用相同的资源做另一个 exec,什么都没有,总是一样的 f.... 形式 XD - btw,在cookie 文件在记录时不保存 cookie
  • 如果我添加curl_setopt($ch, CURLOPT_COOKIE,"sessionCreated=true");,则执行返回sesion expires!是会话到期时来自网络的消息
  • 我登录网络,获取标题:Cookie: ,复制该行并粘贴到标题中以使用 curl 发送,然后.. 它起作用了!!显然,当会话到期时,我需要更改标题:S 如何自动执行?
  • “登录”是什么意思?您可以清楚地看到该网站向用户放置了 cookie,并且由于您在 COOKIEJARCOOKIEFILE 中的文件不包含任何内容,这就是您的请求的问题。确保它有效且可写,请求后应该有cookie。
猜你喜欢
  • 2021-05-05
  • 2010-11-08
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多