如何在一个请求中由特定用户为每个Flickr标记获取一张照片?

时间:2011-07-06 21:11:15

标签: php flickr

基本上我正在做的是生成一个缩略图页面。指定用户拥有的每个标记都有一个缩略图。因此,如果用户使用了50个不同的标签,那么将有50个缩略图(我最终会对此进行分页。)。有用;这只是效率低下。即使只有8个标签,这也非常慢,因为它必须等待来自Flickr服务器的9个响应(标签列表+1)。有没有更有效的方法来做到这一点?在扫描Flickr API时,我似乎无法找到更好的解决方案。以下是我目前正在使用的内容。

<?php   
    function get_api_url($additional_params) {
        $params = array_merge($additional_params, array(
            'api_key'   => API_KEY,
            'format'    => 'php_serial',
            'user_id'   => USER_ID,
        ));

        $encoded_params = array();
        foreach ($params as $k => $v)
            $encoded_params[] = urlencode($k) . '=' . urlencode($v);

        return 'http://api.flickr.com/services/rest/?' . implode('&', $encoded_params);
    }

    // Set any additional paramaters.
    $additional_params = array(
        'method'    => 'flickr.tags.getListUser',
    );

    // Get the tags.
    $rsp_obj = unserialize(file_get_contents(get_api_url($additional_params))); 

    // Parse the tags.
    $unparsed_tags = $rsp_obj['who']['tags']['tag'];
    $tags = array();
    foreach ($unparsed_tags as $tag) {
        $tags[] = $tag['_content'];
    }

    // Set any additional parameters.
    $additional_params = array(
        'method'    => 'flickr.photos.search',
        'per_page'  => '1',
    );
    $api_url = get_api_url($additional_params);

    // Call the API and parse the response.
    echo "<div id=\"tags\">";
    foreach ($tags as $tag) {
        $rsp_obj = unserialize(file_get_contents($api_url . '&tags=' . urlencode($tag)));
        $photo = $rsp_obj['photos']['photo'][0];

        $image_url = 'http://farm' . $photo['farm'] . '.static.flickr.com/' .
            $photo['server'] . '/' . $photo['id'] . '_' . $photo['secret'] . '_m.jpg';
        $tag_url = "/gallery/?tag=$tag";
        $tag = ucwords($tag);
        echo <<<HD
            <a class="tag" href="$tag_url">
                <img src="$image_url" />
                <span class="caption">$tag</span>
            </a>
HD;
    }
    echo '</div>';

?>

1 个答案:

答案 0 :(得分:1)

您可以使用flickr.people.getPhotos方法获取有关所有用户照片的信息(每页最多500张),并将extra=tags添加到呼叫参数中。然后你可以在内存中进行每个标签的选择。这将需要更少的API调用,除非用户在其帐户中每500张照片使用少于1个唯一标记,代价是更大的API响应以及脚本中更多的内存使用和计算。

(这仅适用于少于500张照片的用户的“一个请求”标准)。