PHPでFlickr APIを使って画像アップロードする為のサンプル

PHPでFlickr APIを使って画像アップロードする為のサンプル

https://www.flickr.com/services/api/upload.api.html をみてその通りにやっても上手くいかないのでやったことを書いておきます

APIを使うための準備

Appsを作成する

https://www.flickr.com/services/apps/create/apply/

ここで得られるkeyとsecretを使って進めていきます

request_tokenの取得

request_token.phpとでもして、Appsを作成した画面に出てくる key と secret を使って oauth_token と oauth_token_secret を取得します。

<?php
$key = ' key ';
$secret = ' secret ';

try {
    $oauth = new OAuth($key, $secret);
    $request_token_info = $oauth->getRequestToken("https://www.flickr.com/services/oauth/request_token", 'call_back_url');
    if(!empty($request_token_info)) {
        print_r($request_token_info);
    } else {
        print "Failed fetching request token, response was: " . $oauth->getLastResponse();
    }
} catch(OAuthException $E) {
    echo "Response: ". $E->lastResponse . "\n";
}

// Array ( [oauth_callback_confirmed] => true [oauth_token] => hogehoge [oauth_token_secret] => hogehoge )

※ローカルで実行していたので、コールバックで戻ってこなくても済むようにしています。
※phpのOAuthモジュールが必要です。

$ yum install php-pecl-oauth

※yumで追加するコマンド

User Authorization

oauth_verifierを取得するために、authorizeします

https://www.flickr.com/services/oauth/authorize?oauth_token=[oauth_token] へブラウザでアクセス
[oauth_token]はrequest_token で取得したものを使います

ブラウザでアクセスすると call_back_url へリダイレクトされますが、それは存在しないURLでも問題ないので適当な文字を入れてけば構いません

call_back_url
?oauth_token=hogehoge
&oauth_verifier=[oauth_verifier]

とブラウザのURL欄に表示されるので、[oauth_verifier] をメモります

access_tokenの取得

<?php

$key = ' key ';
$secret = ' secret ';
$request_token = ' oauth_token ';
$request_token_secret = ' oauth_token_secret ';
$oauth_verifier = ' oauth_verifier ';

try {
    $oauth = new OAuth($key,$secret);
    $oauth->setToken($request_token, $request_token_secret);
    $access_token_info = $oauth->getAccessToken("https://www.flickr.com/services/oauth/access_token", null, $oauth_verifier);
    if(!empty($access_token_info)) {
        print_r($access_token_info);
    } else {
        print "Failed fetching access token, response was: " . $oauth->getLastResponse();
    }
} catch(OAuthException $E) {
    echo "Response: ". $E->lastResponse . "\n";
}

//Array ( [fullname] => fugafuga [oauth_token] => homuhomu [oauth_token_secret] => hohuhohu [user_nsid] => user_id

結果に oauth_token と oauth_token_secret が返ってきます。
注意点としては、request_tokenと帰ってくる変数名が一緒っていうね・・・とりあえずAPI叩くのに使うのは、access_tokenで返ってくる方の値です

画像アップロードする

rezzza/flickr というモジュールが一番使われていそうだったのでこれを使います

composer install

composer.jsonに以下を追加し composer install をする

{
  "require": {
    "guzzle/guzzle": "*",
    "guzzle/http": "*",
    "rezzza/flickr": "1.1.0"
  }
}

アップロードするPHPのサンプル

$apikey と $sercret は Appsを作成した時に得られたもの
$oauth_token と $oauth_token_secret は access_token の取得で得られたものを使います

$from_path はアップロードしたいファイルのパス
$filename はアップロード後のファイル名です

<?php
require "vendor/autoload.php";
$metadata = new Rezzza\Flickr\Metadata($apikey, $secret);
$metadata->setOauthAccess($oauth_token, $oauth_token_secret);

$factory  = new Rezzza\Flickr\ApiFactory($metadata, new Rezzza\Flickr\Http\GuzzleAdapter());

$return = $factory->upload($from_path, $filename);
if ( (string) $return->attributes()->stat == 'fail') {
    echo 'アップロードに失敗しました。';

} else {
    echo (string) $return->attributes()->photoid;
}

これで無事Flickrへ画像アップロード出来ました