如何获取重定向的url


How do I get the redirected url?

我得到了以下Url:

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"];

但这只会让我回想起第一个url。不是加长版。我需要这个重定向的amazonapi请求。这个网站为我生成签名和时间戳(https://sowacs.appspot.com/)以便我执行api请求。也许这不是一个"正常"的重定向。我不知道,我对编码还比较陌生。。。所以我的php脚本需要url!Thx。

$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;

既然你提到你是编码新手,我将解释一下亚马逊的API是如何工作的:

  1. 您需要指定您的公钥(AWSAccessKeyId)
  2. 您需要提供请求发出时间的unix时间戳(亚马逊使用此时间戳来确定您的请求是否仍然有效,因为它将忽略上周的请求)
  3. 您需要创建一个签名,它是整个请求主体的散列,包括时间戳和公钥。通常情况下,你会使用某种密钥来签署请求。本质上,这个签名是您在请求中发送的数据的散列表示(签名)。亚马逊获取你发送的数据(不包括签名),获取你的私钥,并组装他们自己的签名,将其与你提供的签名进行比较。如果它们匹配,您的请求是可以的