我正在尝试通过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);
谢谢!
答案 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");