我尝试访问的网站在网址末尾添加了一个查询字符串,查询字符串对于会话ID是唯一的。我想发布到最后有查询字符串的正确url,但它只是去基本网址。
$curlarr = array(
CURLOPT_URL => "http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber",
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => urlencode($fields),
CURLOPT_HEADER => TRUE,
CURLOPT_REFERER => "http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber",
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE
);
curl_setopt_array($curlconf,$curlarr);
$result = curl_exec($curlconf);
echo curl_getinfo($curlconf, CURLINFO_EFFECTIVE_URL);
curl_getinfo的回显返回基本网址:"http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber"
如果您要将此基本网址输入浏览器,则会将您重定向到:http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber?execution=e1s1
,并且每次有新会话时前1(e1)都会增加
答案 0 :(得分:1)
第一个url将您重定向到另一个带有令牌的服务器,该服务器发送的变量(var name:execution);你应该为每个未来的http请求使用这个变量。似乎每次都会控制它,可能是为了避免浏览机器人。
这是第一页:
#curl http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber
<html><head><title>302 Moved Temporarily</title></head>
<body bgcolor="#FFFFFF">
<p>This document you requested has moved temporarily.</p>
<p>It's now at <a href="http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber?execution=e1s1">http://www.canadapost.ca/cpotools/apps/track/personal/findByRefNumber?execution=e1s1</a>.</p>
</body></html>
您使用了CURLOPT_FOLLOWLOCATION,这很好,但您还必须存储cookie(CURLOPT_COOKIEJAR)并将其用于下一个http请求(使用CURLOPT_COOKIE)
实际上,不要再使用CURLOPT_FOLLOWLOCATION了。你不想在途中丢失你的cookie。您可以解析第一页,获取“execution = xxxx”,然后使用cookie进一步。
编辑:有时,使用友好提供的API可以避免卷曲浏览。