2014-09-01 150 views
0

從來就得到了以下網址:如何獲取重定向的網址?

http://sowacs.appspot.com/AWS/webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=AKIAICNDB2XMNUH7OIDA&AssociateTag=sometag&BrowseNode=10777&Operation=ItemSearch&SearchIndex=Books&Condition=All&ResponseGroup=ItemIds&ItemPage=1 

,你點擊你到一個XML文件的鏈接。當你看看Url時,會添加一個時間戳和一個簽名參數。我想在php腳本中獲得這個擴展的Url。我正在尋找小時,發現像這樣的東西:

function get_web_page($url) 
{ 
    $options = array( 
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => true, // return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_USERAGENT  => "spider", // who am i 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    //$header['errno'] = $err; 
    // $header['errmsg'] = $errmsg; 
    //$header['content'] = $content; 
    print($header[0]); 
    return $header; 
} 
$thisurl = "http://sowacs.appspot.com/AWS/ 
webservices.amazon.com/onca/xml? 
Service=AWSECommerceService& 
AWSAccessKeyId=AKIAICNDB2XMNUH7OIDA&AssociateTag=sometag&BrowseNode=10777 
&Operation=ItemSearch&SearchIndex=Books&Condition=All&ResponseGroup=ItemIds&ItemPage=1 
"; 
$myUrlInfo = get_web_page($thisurl); 
echo $myUrlInfo["url"]; 

但這只是回聲我的第一個網址。不是擴展的。我需要這個重定向的亞馬遜-API請求。本網站爲我生成簽名和時間戳(https://sowacs.appspot.com/),以便執行api請求。也許這不是一個「正常」的重定向。我不知道,我是相對較新的編碼...所以我的PHP腳本需要的URL!謝謝。

回答

1

在您的$header陣列中,您獲得了return_url密鑰,其中包含時間戳和簽名添加到請求正文的Amazon AWS API URL。

實現的一個例子:

function get_web_page($url) 
{ 
    $options = array( 
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => true, // return headers 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    return $header['redirect_url']; 
} 

$thisurl = "http://sowacs.appspot.com/AWS/webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=AKIAICNDB2XMNUH7OIDA&AssociateTag=sometag&BrowseNode=10777&Operation=ItemSearch&SearchIndex=Books&Condition=All&ResponseGroup=ItemIds&ItemPage=1"; 


// Get Amazon AWS URL 
$url = get_web_page($thisurl); 

echo $url; 

輸出是相同的結構,你的例子在你的崗位的頂部,包括時間戳和簽名:

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=AKIAICNDB2XMNUH7OIDA&AssociateTag=sometag&BrowseNode=10777&Condition=All&ItemPage=1&Operation=ItemSearch&ResponseGroup=ItemIds&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2014-09-01T03%3A18%3A02.000Z&Signature=IxRHgn7AV2YFq05I6Q33eF3aJuzEqsM5e7e1lW1xG8E%3D 

取決於你想要什麼從這裏使用該URL,但例如,您可以使用PHP獲取XML文檔的內容:

$xml = file_get_contents($url); 

...然後使用DOM解析器來處理它,比如:

$doc = new DOMDocument(); 
$doc->loadXML($xml); 

$items = $doc->getElementsByTagName('Item'); 
foreach($items as $item) { 
    echo '<li>ASIN: ' . $item->nodeValue . '</li>', PHP_EOL; 
} 

輸出:

<li>ASIN: 1454824573</li> 
<li>ASIN: 0615361161</li> 
<li>ASIN: 1454807105</li> 
<li>ASIN: 1285185242</li> 
<li>ASIN: 0314279822</li> 
<li>ASIN: 1599417049</li> 
<li>ASIN: 0735598223</li> 
<li>ASIN: 1454851368</li> 
<li>ASIN: 1133191355</li> 
<li>ASIN: 1454815485</li> 

...或者將用戶重定向到它:

header("Location: " . $url); 
exit; 

既然你提到你是編碼新手,我會解釋一下how Amazon's API works

  1. 您需要指定您的公鑰(AWSAccessKeyId)
  2. 您需要提供有關請求時的UNIX時間戳(亞馬遜使用它來確定您的要求是否仍然有效,因爲它會忽略例如上週的請求)。
  3. 您需要創建一個簽名,該簽名是包括時間戳和公鑰在內的整個請求主體的散列。通常你會使用某種密鑰來簽署請求。本質上這個簽名是你在請求中發送的數據的散列表示(簽名)。亞馬遜接收你發送的數據(不包括簽名),得到你的私鑰並組裝他們自己的簽名,並將它與你提供的簽名進行比較。如果他們匹配,您的請求就OK!
+0

完美的作品!你爲我節省了很多時間! – tyler 2014-09-01 18:37:27