toby
  • 0
Новичок

Автоматизировать ежедневный фотоблог?

  • 0

Мне было интересно, может ли кто-нибудь дать мне несколько предложений о том, как лучше всего упростить следующее;

У меня есть блог на WordPress (размещенный на частном хостинге), который я обновляю ежедневно (ну, обычно я планирую загрузку обновлений сразу) с изображениями, которые я загружаю, помечаю и пишу очень краткий комментарий.

Изначально я рассматривал папку на сервере, в которую я мог бы загружать изображения по FTP, а затем я бы написал что-то, что будет ежедневно заглядывать туда и создавать пост на основе изображения, но тогда я не был уверен в метаданных, которые я хочу вместе с Это.

Любая помощь будет принята с благодарностью.

PS Я бы сделал это вики сообщества (поскольку я не уверен, что есть хотя бы один ответ, не говоря уже об одном выдающемся правильном ответе!), но у меня пока недостаточно прав!

Share
  1. Пожалуйста, имейте в виду, что каждый день появляются и исчезают персональные платформы для размещения изображений, и что ответы на этот вопрос не должны зависеть от конкретной сторонней службы.

    • 0
  2. Есть много способов вести ежедневный фотоблог, поэтому я просто расскажу вам, как я к этому подхожу.

    Если бы я хотел настроить фотоблог на WordPress, я бы начал с учетной записи Flickr и использовал ее (или, если вам по какой-то причине не нравится Flickr, вы также можете посмотреть PhotoBucket, SmugMug, Picasa или одну из других альтернатив Flickr )..)

    Использование Flickr

    На Flickr есть инструменты массовой загрузки , которые упрощают загрузку большого количества фотографий, включая множество инструментов для управления большим количеством фотографий.

    Сам Flickr имеет встроенные инструменты для поддержки ведения фотоблогов, включая электронную почту в блог.

    И если существующие инструменты не дают вам достаточного контроля над Flickr , вы всегда можете написать несколько PHP-скриптов для интеграции и автоматизации. Есть много сообщений в блогах, чтобы показать вам, как (и я также покажу вам, как написать одно, ниже):

    И как минимум несколько PHP-библиотек для упрощения доступа к Flickr API:

    Изучение API Flickr

    Итак, допустим, вы хотите сделать небольшой фотоблог в WordPress, используя файлы, которые были загружены на Flickr? Первый шаг — получить ключ API :

    Пока вы занимаетесь этим, вы можете просто просмотреть документы API:

    Теперь есть куча разных способов запрашивать Flickr через их API. Я покажу, как выполнить запрос к набору фотографий, но вы также можете рассмотреть возможность поиска по тегам.

    В качестве первого примера я буду использовать свой набор фотографий Flickr под названием « Музей мотоциклов Барбера — 21-22 октября 2006 г.» (я использую его, потому что он нравится людям; он привлекает много трафика). который вы можете найти в photoset_id URL:

    Где найти «photoset_id» в тексте Flickr Photo Setlink
    (источник: mikeschinkel.com )

    Далее вам нужно вызвать flickr.photosets.getPhotos метод API Flickr с URL-адресом следующего формата:

    http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key={YOUR_API_KEY_GOES_HERE}&photoset_id=72157594340403773&media=photos&format=json&nojsoncallback=1
    

    Обратите внимание, что как только вы замените {YOUR_API_KEY_GOES_HERE} свой собственный ключ API, вы сможете вызвать его из своего браузера, и он будет выглядеть примерно так:

    Вызов Flickr API прямо из вашего браузера
    (источник: mikeschinkel.com )

    Также обратите внимание, что я запрашиваю JSON обратно, используя format=json&nojsoncallback=1 параметры URL, потому что мне намного проще обрабатывать JSON, чем XML, и nojsoncallback опускает обратный вызов, который потребуется при работе с Javascript.

    То, что вы получите, — это вложенная структура данных, содержащая список фотографий, и для каждой фотографии вы получите объект со следующими атрибутами (то, что я показываю ниже, это вывод первого элемента массива фотографий). как сгенерировано стандартной print_r() функцией PHP):

    [0] => stdClass Object
      (
        [id] => 276672853
        [secret] => 099eaa1af2
        [server] => 107
        [farm] => 1
        [title] => Barber Motorcycle Museum - Oct 22 2006 (500)
        [isprimary] => 0
      )
    

    Форматы URL-адресов фотографий Flickr

    Теперь, когда у нас есть список последних фотографий, вам нужно понять формат URL-адреса фотографий Flickr, о котором вы можете узнать больше здесь:

    Обычно URL-адреса фотографий на Flickr выглядят следующим образом:

    500 пикселей в ширину или в высоту «Стандартное» фото:

    • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg

    Эта версия будет иметь размер 500 пикселей по самой длинной стороне.

    Исходное изображение:

    • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{o-secret}_o.(jpg|gif|png)

    Это может быть все, что было загружено:.JPG,.GIF или.PNG.

    Версии определенного размера:

    Это всегда.JPG:

    • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[size].jpg

    Где [size] один из:

    • с — квадратик 75х75
    • t — ноготь большого пальца, 100 на самой длинной стороне
    • м — маленький, 240 по длинной стороне
    • z — средний, 640 по самой длинной стороне
    • b — большой, 1024 по самой длинной стороне (существует только для очень больших исходных изображений)

    Таким образом, следующий URL-адрес, взятый из примера результатов, возвращенных выше, извлекает следующую фотографию (обратите внимание, что z перед .jpg указывает на фотографию шириной 640 пикселей в самом длинном размере:)

    Фотография мотоцикла на Flickr

    Вооружившись всей вышеизложенной информацией, теперь мы можем создать PHP-скрипт, используя WP_Http класс WordPress для извлечения фотографий из нашего набора. Я написал простой скрипт, который вы можете скопировать в корень вашего сайта, обязательно заменив на свой, api_key и photoset_id перед запуском:

    include "wp-load.php";
    define('FLICKR_API_KEY','{YOUR_API_KEY_GOES_HERE}');
    define('FLICKR_GET_URL','http://api.flickr.com/services/rest/');
    define('PHOTO_SIZE_CHAR', 's'); // s = 75x75 pixels on longest side
    $result = flickr_get(array(
      'method'      => 'flickr.photosets.getPhotos',
      'photoset_id' => '{YOUR_PHOTOSET_ID_GOES_HERE}',
      'media'       => 'photos'
    ));
    if (isset($result['body']->photoset->photo)) {
      $size = PHOTO_SIZE_CHAR;
      foreach($result['body']->photoset->photo as $photo) {
        extract((array)$photo);
        $url = "http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}_{$size}.jpg";
        echo "<img src="{$url}" alt="{$title}" />\n";
      }
    }
    function flickr_get($params,$args=array()) {
      $http = new WP_Http();
      $params['api_key'] = FLICKR_API_KEY;
      $params['format'] = 'json';
      $params['nojsoncallback'] = 1;
      $params = http_build_query($params);
      $url = FLICKR_GET_URL . "?{$params}";
      $result = $http->get($url,$args);
      if (isset($result['response']['code']) && $result['response']['code'] == 200)
        $result['body'] = json_decode($result['body']);
      else
        $result = false;
      return $result;
    }
    

    Используя приведенное выше с моим ключом API и моим идентификатором фотосета, я получаю следующее:

    Вывод PHP-скрипта, показывающего набор фотографий Flickr
    (источник: mikeschinkel.com )

    PHP-скрипт для размещения фотосета Flickr в вашем блоге

    На основе всего написанного мной написана страница с названием blog-from-flickr.php, которую вы можете поместить в корень своего сайта и вызывать, чтобы получить следующую простую форму:

    Блог с Flickr PHP-скрипт для WordPress
    (источник: mikeschinkel.com )

    Введите действительный идентификатор фотосета, а затем нажмите эту кнопку, и вы будете перенаправлены на сообщение в блоге, которое выглядит примерно так!

    Сообщение в блоге, сгенерированное из фотосета Flickr с помощью PHP-скрипта
    (источник: mikeschinkel.com )

    To get it all working was a bit more involved than the simple code above and more than I have time left to fully document but I’ll post it below for your review (and you can also download it from here).

    Of special note are the following aspects in the code:

    • The script pulls the twenty five (25) most recent photos from the photoset and blog the earliest one of those. I assumed you’d want to upload in bulk and then post chronologically. If you upload more than 25 then you need to change the value of the constant FLICKR_PHOTO_COUNT to something larger, up to 500 (500 is the limit specified by Flickr.) Increasing it will only slightly increase how long it takes the script to run; it might not even be noticeable.

    • The script stores Flickr’s photo ID as a hidden custom field in wp_postmeta using the key '_flickr_photo_id' . That’s how I can tell if it’s been blogged before or not.

    • The script uses an HTTP POST method (i.e. using an HTML <form> ) vs an HTTP GET method (calling a URL directly) to avoid accidentally triggering the posting process and to allow posting from a different Photoset.

    • The script uses current_user_can('publish_posts') to ensure only a logged-in user with posting rights can trigger the posting logic.

    • The script grabs the photo’s description from Flickr and use it as a prefix to the <img> tag for the post content (note my example screenshot didn’t have a description hence you see only the photo.)

    • The script calls PHP’s getimagesize() with a URL of the photo to get the height and width for the <img> tag; if your server is not configured for that you won’t get size and width tags on your images (actually the code might crash; mine works so I couldn’t test. If it crashes, you’ll know. 🙂

    • I didn’t go to the effort to bring the tags over from Flickr and add them as tags, but that would be a worthwhile exercise for someone else.

    And that’s about it. On to the code…

    The Flickr Photo Blogging Code:

    <?php
    /*
    
      blog-from-flickr.php
    
      Allows the WordPress blog owner to blog a recent photo from a Flickr Photoset just by clicking a button.
    
      Author: Mike Schinkel (http://mikeschinkel.com)
    
      Just drop this example into the root of your website and call directly to see it work.
      Use the class in your plugins or themes.
    
      In Answer To: http://wordpress.stackexchange.com/questions/2830/
    
    */
    
    include "wp-load.php";
    define('FLICKR_API_KEY','{YOUR_FLICKR_API_KEY_GOES_HERE}');
    define('DEFAULT_PHOTOSET_ID','{YOUR DEFAULT_PHOTOSET_GOES_HERE');
    define('FLICKR_PHOTO_COUNT',25);
    
    define('FLICKR_GET_URL','http://api.flickr.com/services/rest/');
    
    $photoset_id = DEFAULT_PHOTOSET_ID;
    
    if (count($_POST)==0)
      echo <<<HTML
    <html>
    <body>
      <form method="post">
        Enter Flickr Photoset ID: <input type="text" name="photoset_id" value="{$photoset_id}" size="25" />
        &nbsp;<input type="submit" value="Blog Recent Photo from Flickr!" />
        <input type="hidden" name="go" value="go!" />
      </form>
    </body>
    </html>
    HTML;
    else
      BlogFlickrPhotoSetPhoto::blog_photoset_photo($_POST['photoset_id']);
    
    class BlogFlickrPhotoSetPhoto {
      static function blog_photoset_photo($photoset_id) {
        if (current_user_can('publish_posts')) {
          $photoset = self::get_photoset_photos($photoset_id);
          if (!$photoset) {
            echo 'Not a valid Photoset ID. <a href="#">Try again</a>.';
          } else {
            $photo = self::get_photo_to_blog($photoset);
            if (!$photo) {
              echo 'Unexpected Error. Photo Retrieval Failed.';
            } else {
              $permalink = self::blog_photo($photo);
              wp_safe_redirect($permalink);
            }
          }
        }
      }
      static function blog_photo($photo) {
        $img = self::get_photo_html($photo);
        $photo_info = self::get_photo_info($photo->id);
        $description = ($photo_info ? "{$photo_info['body']->photo->description->_content}<br/>" : '');
        $url = self::get_photo_url($photo);
        $post_id = wp_insert_post(array(
          'post_title' => $photo->title,
          'post_type' => 'post',
          'post_author' => 1,
          'post_content' => "{$description}{$img}",
          'post_status' => 'publish',
          'comment_status' => 'open',
          'ping_status' => 'open',
          'post_parent' => 0,
        ));
        if ($post_id) {
          update_post_meta($post_id,'_flickr_photo_id',$photo->id);
          $url = get_permalink($post_id);
        } else {
        $url = false;
        }
        return $url;
      }
      static function get_photo_to_blog($photoset) {
        global $wpdb;
        $photo = false;
        if (isset($photoset['body']->photoset->photo)) {
    
          //Collect the list of Flickr Photo_ids from our "N" most resent photoset photos
          $photos = $photoset['body']->photoset->photo;
          foreach($photos as $index => $photo) {
            $photo_ids[$index] = $photo->id;
          }
          $photo_id_list = "'" . implode("','",$photo_ids) . "'";
    
          //Get a list of all photos we've already blogged
          $posts = $wpdb->get_results("SELECT post_id,meta_value FROM wp_postmeta WHERE meta_key='_flickr_photo_id' && meta_value IN ({$photo_id_list})");
    
          //Remove any photos from the list we've already blogged
          $photo_ids = array_flip($photo_ids);
          foreach($posts as $post) {
            if (isset($photo_ids[$post->meta_value])) {
              unset($photo_ids[$post->meta_value]);
            }
          }
    
          //Grab the earliest photo we've not blogged
          if (count($photo_ids)==0) {
            $photo = false;
          } else {
            krsort($photo_ids);
            $photo = $photos[reset($photo_ids)];
          }
        }
        return $photo;
      }
      static function get_photoset_photos($photoset_id) {
        $photoset = self::flickr_get(array(
          'method'      => 'flickr.photosets.getPhotos',
          'photoset_id' => $photoset_id,
          'media'       => 'photos',
          'per_page'    => FLICKR_PHOTO_COUNT,
        ));
        return $photoset;
      }
      static function get_photo_info($photo_id) {
        $photo_info = self::flickr_get(array(
          'method'   => 'flickr.photos.getInfo',
          'photo_id' => $photo_id,
        ));
        return $photo_info;
      }
      static function get_photo_html($photo,$size='') {
        $url = self::get_photo_url($photo,$size);
        list($width, $height) = getimagesize($url);
        $hwstring = image_hwstring($width, $height);
        return "<img src="{$url}" alt="{$title}" {$hwstring} />\n";
      }
      static function get_photo_url($photo,$size='') {
        extract((array)$photo);
        $size = (!empty($size) ? "_{$size}" : ''); // If empty the 500px version will be returned.
        return "http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}{$size}.jpg";
      }
      static function flickr_get($params,$args=array()) {
        $http = new WP_Http();
        $params['api_key'] = FLICKR_API_KEY;
        $params['format'] = 'json';
        $params['nojsoncallback'] = 1;
        $params = http_build_query($params);
        $url = FLICKR_GET_URL . "?{$params}";
        $result = $http->get($url,$args);
        if (isset($result['response']['code']) && $result['response']['code'] == 200)
          $result['body'] = json_decode($result['body']);
        else
          $result = false;
        return $result;
      }
    }
    

    Полностью автоматический фотоблог на Flickr

    Если вам нужно пойти еще дальше, вы можете перекодировать приведенное выше, чтобы использовать псевдо-cron вместо запуска по HTTP POST . Вот ссылка на несколько статей, которые могут помочь в этом:

    И если псевдо-cron недостаточно хорош, вы всегда можете переименовать скрипт в непонятное имя и использовать настоящий cron для получения этого URL-адреса с неясным именем. Если вам нужно пойти по этому пути, проверьте Google, чтобы узнать, как настроить задачу cron. .

    В любом случае с cron вам, вероятно, придется удалить current_user_can() код, потому что вы не войдете в систему.

    PS Получение вашего Flickr NSID (User ID)

    Помимо вышеперечисленного, вам может понадобиться получить свой NSID Flickr (также известный как ваш идентификатор пользователя) для некоторых методов, вы можете найти его здесь:

    PPS Аутентификация PHP-скрипта с Flickr сложнее

    Вы можете заметить, что ни один из моих примеров не требовал аутентификации вызывающего абонента. Это немного сложнее для аутентификации, поэтому, если вам это нужно, обязательно изучите упомянутые библиотеки Flickr PHP, поскольку я думаю, что они справляются с этим.

    • 0
  3. Вместо этого я бы рекомендовал использовать встроенную функцию публикации по электронной почте. Вы настраиваете частный адрес электронной почты ( mysupersecretaddress12345@mydomain.com ) и отправляете изображения и свои описания на этот адрес. Затем WordPress создаст новый пост из вашей электронной почты и автоматически прикрепит изображение.

    Это немного проще, чем FTP.

    • 0

Оставить ответ

You must login to add an answer.