2013-09-11 66 views
1

我試圖從flickr使用Flickr API獲取圖像,並且無法弄清楚如何獲得唯一的圖像。我已經審查我使用了specific method的參數和這裏就是我想出了:Flickr API返回重複圖像

<?php 
class Flickr { 

    private $flickr_key; 
    private $flickr_secret; 
    private $format = 'json'; 

    public function __construct($flickr_key, $flickr_secret) { 

     $this->flickr_key = $flickr_key; 
     $this->flickr_secret = $flickr_secret; 
    } 


    public function searchPhotos($query = '', $tags = '') { 

     $urlencoded_tags = array(); 

     $tags_r = explode(',', $tags); 
     foreach($tags_r as $tag){ 
      $urlencoded_tags[] = urlencode($tag); 
     } 

     $url = 'http://api.flickr.com/services/rest/?'; 
     $url .= 'method=flickr.photos.search'; 
     $url .= '&text=' . urlencode($query); 
     $url .= '&tags=' . implode(',', $urlencoded_tags); 
     $url .= '&sort=relevance'; 
     $url .= '&safe_search=1'; 
     $url .= '&content_type=4'; 
     $url .= '&api_key=' . $this->flickr_key; 
     $url .= '&format=' . $this->format; 
     $url .= '&per_page=10'; 
     $url .= '&media=photos'; 
     $url .= '&privacy_filter=1'; 

     $result = @file_get_contents($url); 


     $json = substr($result, strlen("jsonFlickrApi("), strlen($result) - strlen("jsonFlickrApi(") - 1); 

     $photos = array(); 
     $data = json_decode($json, true); 
     if($data['stat'] != 'fail'){ 
      $photos = $data['photos']['photo']; 
      return $photos; 
     }else{ 
      return false; 
     } 
    } 
} 

我會叫它像:

$flickr = new Flickr($flickr_key, $flickr_secret); 

$query = 'Kaspersky Internet Security 2013'; 
$tags = 'software'; 

$results = $flickr->searchPhotos($query, $tags); 
foreach($results as $img){ 
    $src = "http://farm" . $img['farm'] . ".static.flickr.com/" . $img['server'] . '/' . $img['id'] . '_' . $img['secret'] . '_m.jpg'; 
?> 
    <img src="<?php echo $src; ?>"/> 
<?php 
} 

這裏的問題是我不時得到重複的圖像。 我也試過使用phpflickr庫。但我仍然有同樣的問題:

$flickr = new phpFlickr($api_key); 

$args = array(
    'text' => 'Kaspersky Internet Security 2013', 
    'tags' => 'software', 
    'per_page' => '10', 
    'safe_search' => '1', 
    'content_type' => '4', 
    'media' => 'photos', 
    'sort' => 'relevance', 
    'privacy_filter' => '1' 
); 

$results = $flickr->photos_search($args); 

$hashes = array(); 
$sources = array(); 

$images = $results['photo']; 

foreach($images as $img){ 

    $src = "http://farm" . $img['farm'] . ".static.flickr.com/" . $img['server'] . '/' . $img['id'] . '_' . $img['secret'] . '_m.jpg'; 

    $current_hash = sha1_file($src); 


    if(!in_array($current_hash, $hashes)){ 
?> 
    <img src="<?php echo $src; ?>" alt=""> 
<?php  
    } 

    $hashes[] = $current_hash; 
} 

你可以從我使用sha1_file方法來比較每個圖像的哈希上面的代碼中看到從Flickr返回。但是,這是一個很大的性能損失:

without sha1_file: 0.81311082839966 
with sha1_file: 6.8974900245667 

任何想法我可以做,以防止來自Flickr的重複回來?正如你所看到的,我只能返回10張圖片,這就是我所需要的。我也嘗試添加儘可能多的符合我需求的參數,但仍然沒有運氣。提前致謝!

+0

有關此任何更新或更多信息?我已經返回85,763張照片,但其中只有4280張是獨一無二的。根據我的電話JSON,應該有> 500,000獨特。 – ow3n

回答

1

嘗試在API瀏覽器中,將this給你相同的結果?

我嘗試使用您指定的參數,它返回總共34個結果。

+0

仍然相同,最後3個結果都是一樣的,雖然文件名是不同的。 – user225269

+1

是不是表示店主上傳了重複的照片? API將它們識別爲兩個不同的文件,但您可以*看到*它是相同的圖像...您需要通過添加其他屬性來過濾重複項,例如標題,說明等 – xialin