我有一个相当奇怪的问题。我可以访问网站(电子邮件和密码)。抱歉,我无法向您显示此网站。我需要从它的内容中获取一些信息。 而不是我会告诉你我的代码。
//I form string of post request
$fields=array(
'name_of_login_field' => urlencode('test@gmail.com'),
'name_of_password_field' => urlencode('pass')
);
foreach($fields as $key=>$value)
{
$fields_string .= $key.'='.$value.'&';
}
$fields_string=rtrim($fields_string, '&');
然后我通过curl发送它。
$curlURL="URL";
if( $curl = curl_init() )
{
curl_setopt($curl, CURLOPT_URL, $curlURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($curl, CURLOPT_USERAGENT, "mozilla/5.0 (ipad; cpu os 7_0_4 like mac os x) applewebkit/537.51.1 (khtml, like gecko) version/7.0 mobile/11b554a safari/9537.53");
$out = curl_exec($curl);
var_dump($out);
//var_dump($out);
curl_close($curl);
}
网站的表单包含两个输入(登录密码)。它还有一个带有名称的提交按钮和一些带名称的隐藏输入 - 重定向。
如果我将google.com或我们的网站设置为$curCURL
,我会收到一些内容。如果我使用我需要解析的网站的URL,我会收到空字符串。怎么可能。我提出建议。可能有人见过类似的东西吗?
的更新
这是我的新鲜卷曲:
if( $curl = curl_init() )
{
curl_setopt($curl, CURLOPT_URL, $curlURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_USERAGENT, "mozilla/5.0 (ipad; cpu os 7_0_4 like mac os x) applewebkit/537.51.1 (khtml, like gecko) version/7.0 mobile/11b554a safari/9537.53");
$out = curl_exec($curl);
var_dump($out);
//var_dump($out);
curl_close($curl);
}
卷曲$out
为false
。如果我删除带CURLOPT_FOLLOWLOCATION
$out
的字符串为空字符串。
的 UPDATE1
我查了一下
curl -l desired-site.com
它只返回没有标题的内容。 然后我检查了
curl -s -D - desired-site.com -o /dev/null
它返回了此标题。
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Thu, 07 May 2015 08:20:23 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.4-14+deb7u11
Set-Cookie: PHPSESSID=randon_number_of_letters; expires=Sat, 09-May-2015 12:07:03 GMT; path=/
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Pragma: no-cache
Cache-Control: private
Cache-Control: no-store, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Thu, 01 Jan 1970 00:00:01 GMT
它能以某种方式帮助吗?
UPDATE2 CURLOPT_VERBOSE
给出相同的结果。但是当我将CURLOPT_HEADER
设置为true时,我可以看到标题(没有关注位置,使用它仍会返回false)
的 UPDATE3
我做这些事来设置cookie:
preg_match('/PHPSESSID=([A-Za-z0-9]+)/',$out, $matches);
$cookie="Cookie: PHPSESSID=".$matches[1];
然后加入curl:
curl_setopt($curl1, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($curl1, CURLOPT_COOKIEJAR, $cookie);
我已经建立了另一个连接:$curl1=curl_init()
我做var_dump
$cookie
和回复标题。 PHPSESSID与那里不同。我应该这样做,@ baf在评论中以其他方式说过什么?
(您必须打开表单页面,存储cookie,然后使用cookie再次发布)
答案 0 :(得分:1)
这是我在评论中的讨论中提出的建议。它将cookie存储在一个文件中并发出两个请求。只需打开表单页面并将cookie保存在cookie罐中。第二个请求发布数据。你可能想尝试一下。
$jar = tempnam('/tmp', 'cookie'); // create temporary file
$curl = curl_init($url_1); // open form page
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_COOKIEJAR, $jar);
curl_exec($curl);
curl_close($curl);
$curl = curl_init($url_2); // post data
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, $jar);
$out = curl_exec($curl);
curl_close($curl);
unlink($jar); // delete temporary file
答案 1 :(得分:0)
最后,我做到了这一点。我从chrome调试器cookie选项卡中获得了PHPSESSID
。然后我做了下面的事情(只是简单地将cookie发送到URL):
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, $curlURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_COOKIE, "PHPSESSID=900000jjsakjas");
$out = curl_exec($curl);
echo $out;
curl_close($curl);
}
这会返回很好的结果。