2015-04-17 172 views
2

我想向需要登录的网页发出请求。 我成功地把饼干与SESSID并将其写入具有卷曲文件:带cURL和cookie的PHP post请求

$username = 'xxx'; 
$password = 'xxxxxxx'; 
$url = 'http://example.com'; 
$cookie="cookie.txt"; 
$postdata = "username=$username&userpass=$password&autologin=1&userlogin=Login"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 

curl_close($ch); 

在此之后我想打一个POST请求到现场与饼干所以它认出了我作为登录现在使用API​​返回JSON信息,如果你这样做的话: site.com/API/command.get(x) - 只是一个例子。所以如果你在浏览器中打开它,它将返回JSON数据。

任何人都可以帮助我的方式,如何做到这一点?我是新来卷曲。

无论我尝试什么,我都会重定向到登录页面。 试图通过curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);,没有成功。

+0

发布“cookie.txt”中的内容 – Machavity

+0

只需将SESSID放在Cookie中并不意味着您已经登录。它仅表示服务器可以将您识别为来自SESSID的客户端。你也必须登录。 –

+0

嗨,在文件中有这样的信息:#Netscape HTTP Cookie文件 #http://curl.haxx.se/rfc/cookie_spec.html #此文件是由libcurl!编辑需要您自担风险。 site.com \t \t FALSE/\t \t FALSE 1429265797 \t ZBW_SESSID –

回答

1

为您提示谢谢你们。 我如何得到它的工作是与此代码(其实我用了错误的数据后):

$username = 'xxx'; 
$password = 'xxxx'; 
$url = 'http://example.com'; //request to the page i want the content from 
$cookie="cookie.txt"; 

$url1 = "http://example.com/command.."; 

//login form action url 
$postinfo = "act=login&login=$username&pass=$password"; 

$cookie_file_path = "cookie.txt"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_NOBODY, false); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 
//set the cookie the site has for certain features, this is optional 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
curl_setopt($ch, CURLOPT_USERAGENT, 
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 

$result = curl_exec($ch); 
//var_dump($result); 

//page with the content I want to grab 
curl_setopt($ch, CURLOPT_URL, $url1); 
//do stuff with the info with DomDocument() etc 
$html = curl_exec($ch); 
var_dump($html); 
curl_close($ch); 

我在这里(计算器)得到这个代码的某个地方。感谢发布它的人!不记得确切的名字。这就像一个魅力!

0

也许你会试试guzzle?我写了一些游戏引擎的代理,并且我得到了类似的Cookie问题。

重要:我没有找到简单的方法来处理键值风格的cookie。所以,就我而言,它的决定更接近黑客而不是解决方案。我粘的cookie字符串:

foreach ($request->cookies as $key => $cookie) { 
    $cookie_str .= $key .'='.$cookie . '; 
} 

而且我的解决办法是这样的:

$client = new GuzzleHttp\Client([ 
    'headers' => [ 
     'Cookie' => $cookie_str 
    ] 
]); 

$reqv = $client -> createRequest('POST', 'some_url'); 
$resp = $client -> send($reqv); 
+0

我希望你真的得到正确的Cookies了:) –

1

我发现卷曲的饼干罐有问题的,所以我写了我自己的程序。还有一些时候我需要添加从页面中删除的cookies。
对于此CURLOPT_HEADER必须为真。

curl_setopt($ch, CURLOPT_HEADER, true); 

    $data = curl_exec($ch); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $requestHeader= substr($data,0,$skip); 
    $data = substr($data,$skip); 
    $e = 0; 
    while(true){ 
    $s = strpos($requestHeader,'Set-Cookie: ',$e); 
    if (!$s){break;} 
    $s += 12; 
    $e = strpos($requestHeader,';',$s); 
    $cookie = substr($requestHeader,$s,$e-$s) ; 
    $s = strpos($cookie,'='); 
    $key = substr($cookie,0,$s); 
    $value = substr($cookie,$s); 
    $cookies[$key] = $value; 
    } 

然后使用$饼干[]:

$cookie = ''; 
$show = ''; 
$delim = ''; 
foreach ($cookies as $k => $v){ 
    $cookie .= "$delim$k$v"; 
    $delim = '; '; 
} 

然后使用$饼干:

curl_setopt($ch, CURLOPT_COOKIE, $cookie); 

遇到麻烦时,我经常设置FOLLOWLOCATION为false:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 

如果存在重定向,您可以看到发生了什么,并且需要获取在重定向URL的响应头中设置的Cookie,则FOLLOWLOCATION必须设置为false。

当curl URL将您带到重定向curl_getinfo时,将获得重定向位置URL。

$status = intval(curl_getinfo($ch,CURLINFO_HTTP_CODE)); 
if ($status > 299 && $status < 400){ 
    $url= curl_getinfo($ch,CURLINFO_REDIRECT_URL); 
} 
// update cookies, do not clear `cookies()`; 

当遇到困难我使用这些选项可以同时获得响应和响应头。响应标题将返回curl_exec()数据。请求头将是curl_getinfo()

curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $request); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 


$data = curl_exec($ch); 
if (curl_errno($ch)){ 
    $data .= 'Retreive Base Page Error: ' . curl_error($ch); 
} 
else { 
    $info = rawurldecode(var_export(curl_getinfo($ch),true)); 
    $data = curl_exec($ch); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $requestHeader= substr($data,0,$skip); 
    $data = substr($data,$skip); 
    $filename = parse_url($url, PHP_URL_HOST); 
    $filename .= parse_url($url, PHP_URL_PATH) . '.txt'; 
    $fp = fopen($filename,'w'); 
    fwrite($fp,$info\n$data"); 
    fclose($fp); 

    $data = substr($data,$skip); 
} 

两个头和HTML被存储在文件中的回报。然后,您可以查看HTTP头,HTML和JavaScript。有时cookie由document.cookie设置,或者用window.location重定向页面,或者用JS单击HTML表单的提交按钮。在这些情况下,可能需要刮取cookie和/或从curl数据重定向位置。


然后我使用FireFox Inspector或Chrome开发工具。

我去网络选项卡

在Firefox中,我去设定,并开启“启用持久性日志”
在Chrome中我点击“保存日志”在网络选项卡

然后我使用浏览器去任何我想要去卷曲的地方。

现在我可以看到每个请求和响应,包括重定向并将它们与保存标题进行比较。


当你需要的头看起来就像保存浏览器标题:

创建一个数组把请求头键值
填写申请阵列,使正是在请求上传的标题。
例:

$request = array(); 
$request[] = "Host: www.example.com"; 
$request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
$request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0"; 
$request[] = "Accept-Language: en-US,en;q=0.5"; 
$request[] = "Connection: keep-alive"; 
$request[] = "Cache-Control: no-cache"; 
$request[] = "Pragma: no-cache"; 

添加卷曲:

curl_setopt($ch, CURLOPT_HTTPHEADER, $request); 

很多时候,它是非常容易使用的移动版本。许多时候桌面版本页面都需要JavaScript,而手机版本则不需要。我使用FireFox和用户代理切换器,使用旧的Motorola用户代理来检索标题和HTML。然后,我使用相同的用户代理卷曲的HTTPHEADER

request[] = 'User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0