[英]passing credentials in PHP cURL help
我正在嘗試將憑據傳遞給網站,以便可以在其上使用 file_get_contents 來提取一些數據,但它不起作用,我得到一個空白頁,所以知道這里有什么問題嗎?
<?php
$username="munged@ring.gil.com";
$password="Koin";
$url="confluence.rogersdigitalmedia.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$str= file_get_contents("confluence.rogersdigitalmedia.com/display/prodsupport/Team+Calendar");
echo $str;
?>
這是新代碼,當我確實獲得內容時,它仍然無法工作卡在登錄屏幕上......
<?php
$username="munged@gil.ro.com";
$password="Koin";
$url="confluence.rogersdigitalmedia.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Replaced due to special chars in url for username and pass
//curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_USERPWD, urlencode($username) . ':' . urlencode($password));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo file_get_contents('http://confluence.rogersdigitalmedia.com/exportword?pageId=1114407');
?>
新代碼:我知道$url
是我必須登錄的 URL ,但是我在$data
中輸入了什么? 我知道這是我的登錄信息,但我該如何輸入(例如,<username> 空格 <password>)?
<?php
function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
您可能需要轉義用戶名中的@
:
curl_setopt($ch, CURLOPT_USERPWD, urlencode($username). ':'. urlencode($password));
這是因為某些字符(例如 @
和:
)在 URL 中具有特殊含義。您需要對它們進行轉義,以便服務器將它們視為字符,而不是指示有關 HTTP 請求的內容。
報廢這一切。 您的編輯表明您對 HTTP 的工作原理存在根本性的誤解。 您不能使用 CURL 將 HTTP 登錄憑據傳遞到需要填寫 web 表單然后希望能夠使用單獨的file_get_contents
登錄的站點。
就您實際執行此操作的方式而言...首先,確定該站點是否有 API。 如果沒有,請查明他們是否真的希望您進行屏幕抓取。 對不允許的網站進行屏幕抓取是非常糟糕的形式。 事實上,這很可能違反了版權法。
其次,對 API 進行編程。 這意味着以網站強制執行的方式登錄。 這將包含表單值(您可能需要在CURLOPT_POSTFIELDS
中發送)和 cookies (您需要在每個請求中使用它,可能使用CURLOPT_COOKIEFILE
)。
努力理解客戶端-服務器關系是如何工作的,研究 API,不要只是在問題上扔代碼並期望它能夠工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.