使用PHP的cURL lib中的POST不发送

时间:2012-11-25 04:49:40

标签: php post curl

我正在尝试通过cURL用PHP发送POSTDATA,我认为帖子没有发送

$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);

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

  

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

为cURL创建一个cookie文件(使用tempnam()之类的东西)并使用CURLOPT_COOKIEJAR指令告诉cURL它所在的位置。您也可以从浏览器中获取现有的Cookie并尝试进行故障排除。

在初始化cURL之前添加它:

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

然后告诉cURL使用它:

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);

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

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

如果这不起作用,请在浏览器中正常执行操作并仔细查看页面。可能需要JS才能正确构建会话..此时你只是使用cURL而运气不好。

答案 1 :(得分: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");