4

我正在尝试使用 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);

谢谢你!

4

2 回答 2

1

看起来您正试图在没有浏览器的情况下登录第三方系统。

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

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

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

在初始化 cURL 之前添加:

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

然后告诉 cURL 使用它:

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);

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

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

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

于 2012-11-25T09:16:10.513 回答
0

访问表单页面,然后使用相同的 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");
于 2012-11-25T13:28:54.493 回答