2014-09-01 137 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