Как я могу получить одну фотографию для каждого тега Flickr конкретным пользователем в одном запросе? - PullRequest
2 голосов
/ 07 июля 2011

В основном я создаю страницу с миниатюрами.Существует один эскиз для каждого тега, который есть у указанного пользователя.Так что, если пользователь использовал 50 различных тегов, будет 50 миниатюр (в конечном итоге я разбью это на страницы).Оно работает;это просто неэффективно.Даже с 8 тегами это очень медленно, так как приходится ждать 9 ответов (+1 для списка тегов) с серверов Flickr.Есть ли более эффективный способ сделать это?Кажется, я не могу найти лучшего решения во время сканирования API Flickr.Вот что я сейчас использую для этого:

<?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 Ответ

1 голос
/ 07 июля 2011

Вы можете использовать метод flickr.people.getPhotos для получения информации обо всех фотографиях пользователя (максимум 500 на страницу) и добавить extra=tags к параметрам для вызова.Затем вы можете сделать выбор для каждого тега в памяти.Это потребует меньше вызовов API, если пользователь не использует менее 1 уникального тега на 500 фотографий в своей учетной записи, за счет более крупных ответов API и большего использования памяти и вычислений в вашем сценарии.критерий «одного запроса» для пользователей с количеством фотографий менее 500).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...