2014-09-01 2 views
0

I've получил следующий 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, есть метка времени и добавлен параметр подписи. Я хотел бы получить этот расширенный Url в php-скрипте. Я искал часы и нашел такие вещи, как:

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. Не расширенный. Мне нужно перенаправление для запроса amazon-api. Этот сайт генерирует подпись и временную метку для меня (https://sowacs.appspot.com/), чтобы я мог выполнить api-запрос. Возможно, это не «нормальное» перенаправление. Я понятия не имею, я относительно новичок в кодировании ... поэтому мой PHP-скрипт нуждается в URL-адресе! Спасибо.

ответ

1

В вашем массиве $header у вас есть ключ return_url, который содержит URL-адрес API AWA Amazon с меткой времени и подписью, добавленной в тело запроса.

Пример реализации:

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, но, например, вы можете получить содержимое документа XML с помощью PHP:

$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 метку, когда был сделан запрос (Amazon использует это, чтобы определить, является ли запрос остается в силе, так как он будет игнорировать запрос с прошлой недели, например).
  3. Вам необходимо создать подпись, которая является хешем всего тела запроса, включая метку времени и ваш открытый ключ. Обычно вы должны использовать секретный ключ для подписи запроса. По сути, эта подпись представляет собой хешированное представление (подпись) данных, которые вы отправляете в свой запрос. Amazon берет данные, которые вы отправляете (за исключением подписи), получает свой секретный ключ и собирает собственную подпись того, что должно быть, и сравнивает его с подписью, которую вы предоставили. Если они совпадают, ваш запрос в порядке!
+0

работает отлично! Ты спас меня много времени! – tyler