次の方法で共有


Coding4Fun: .NET で Flickr を使用する

.NET で Flickr を使用する

Alan Lewis
eBay

July 20, 2006
日本語版最終更新日 2006 年 9 月 20 日

最近は誰もかれもが ”Web 2.0” Web ベース アプリケーションの最新流行の 1 つである Flickr を使っているようです。広く模倣されたスタイル、ソーシャル ネットワーキング対応のレイアウト、真に対話的なユーザー操作を実現する最新 AJAX 技術の使用によって、Flickr はインターネット アプリケーションの将来的な目標を掲げました。また、”Web 2.0” アプリケーション (この用語を使うのは本当にこれで最後にします) の主な基準は、提供されているパブリック API であり、これを使用して写真を表示および操作する新しく興味深い方法を構築できます。この記事には英語のページへのリンクも含まれています。サンプル プログラム ファイル内では実際のコメント行は英語で書かれていますが、この記事内では説明目的で日本語で書かれています。

はじめに

最初にお伝えすることは、この記事では .NET 2.0 を対象としていますが、Flickr.Net API ライブラリは .NET 1.1 でも動作するので、どうぞあきらめないでください。また、Visual Studio 2005 または無償の Visual Studio 2005 Express Editions のいずれかを使用した .NET でのアプリケーション作成の知識を前提としています。主に Windows フォーム アプリケーションに焦点を当てていますが、Flickr.Net API ライブラリは Medium Trust 環境でホストされたアプリケーションなどの Web アプリケーションでも同様に使用できます (Medium Trust の詳細については、筆者の Web サイト (英語) をご覧ください)。

また、Flickr の使用に関する知識とアカウントがあることを前提としています。もしまだお持ちでなかったら、アカウントを取得することをお勧めします。

API キーを取得する

開始するには、Flickr で使用する "API キー" を取得する必要があります。新しいキーの申し込みやキーの管理は、Flickr サービスの Web サイト (http://www.flickr.com/services/api/keys) (英語) の [Your Keys] セクションから行います。新しいキーの申し込みはすぐにできます。API キーを取得できたら、同じページに戻って [Edit Configuration] リンクをクリックします。これにより、API キーの使用についての説明を編集し、Flickr での認証済み要求の実行に必要な "Shared Secret (秘密文字列)" が表示できるようになります。

以下のサンプルを実行するときは、サンプル API キーを自分のキーで置き換える必要があります。

Flickr.Net API ライブラリを取得する

Flickr.Net Web サイトから Flickr.Net API ライブラリをダウンロードできます。Flickr.Net に固有の質問を投稿するフォーラムもあります (Flickr API 全般に関する質問は Flickr API メーリング リストへの投稿をお勧めします)。

ダウンロードには、ライブラリのソース コードと、デバッグおよびリリース用にコンパイルされた DLL が含まれます。記事の目的に沿ってここではリリース DLL を使用しますが、ソース コード プロジェクトを自由に独自のソリューションに直接追加できます。

Flickr API のコンセプト

Flickr API にはいくつかのコンセプトおよび名前表記規則があり、ここで確認しておくと便利です。

ユーザー

ユーザーは "ユーザー ID" によって一意に識別されます。ユーザー ID は "40123132@N01." などになります。"ユーザー名" が参照される場合、これは "画面名" と同じです。画面名はホームページに表示される名前であり、ユーザーが自由に変更できます。いつでも変更できるよう、この名前をアプリケーションでキャッシュしないようにします。

最後の用語は "エイリアス" で、これは識別に使われる Flickr URL の部分です。アカウントを作成すると、これはユーザー ID と同一になります (この URL は常に動作します)。この URL をユーザーがより利用しやすいフォーマットで一度だけ指定できます。

認証

ユーザーの認証時は Flickr によって "トークン" が与えられます。このトークンは API キー、認証したユーザー、および指定されたアクセス許可 (読み取り専用または書き込みなど) に対して一意です。このトークンは、ユーザーが認証を解除しない限り有効であり、アプリケーション内部にキャッシュすると理想的です。

認証後は、Flickr への呼び出しがユーザーによって送信されたかのように応答し、プライベート フォトや、秘密のマークを付けた友人や家族の写真など、自分以外は見ることのできない写真が表示されます。写真を変更して、新しい写真をアカウントにアップロードすることも可能です。

認証を行わなくても、パブリック フォトの表示、ユーザーまたはタグによる写真の検索、パブリック グループの閲覧など、さまざまな操作が可能です。

写真のリスト

Flickr で検索を実行すると、しばしば 1 回の検索ではすべての写真が返されず、結果がページングされます。たとえば、検索で通常 1000 枚の写真が返されるとすると、最初の 100 枚の写真の詳細が返され、次の 100 枚が続き、同様に 10 ページまで続きます。多くの場合、ページのサイズ (毎回返される写真の数) と返されるページ数を指定できます。たとえば、ページのサイズ (これは PerPage プロパティです) を 500 に設定した場合は 2 ページが返されます。ほとんどの場合、最大値は 500 ですが、Flickr API のドキュメントでメソッドがサポートする値を確認してください。

行け、Flickr

Flickr のインスタンスを作成する

まず、上で取得した API キーを渡して、簡単な Flickr オブジェクトを作成します。

Visual C#

  
    string apikey = "1234abcd1234abcd";
Flickr flickr = new Flickr(apikey);

Visual Basic

  
    Dim apikey As String = "1234abcd1234abcd"
Dim f As Flickr = New Flickr(apikey)

この Flickr オブジェクトのインスタンスから、検索の実行、グループの閲覧、ユーザーの検索、およびユーザーの認証に必要な手順の実行 ("Shared Secret" も指定した場合) ができます。

写真を検索する

次のコード行は、すべての Flickr の写真から "microsoft" というタグが付いた写真を検索します。

Visual C#

  PhotoSearchOptions searchOptions = new PhotoSearchOptions();
searchOptions.Tags = "microsoft";
Photos microsoftPhotos = flickr.PhotosSearch(searchOptions);

Visual Basic

  
    Dim searchOptions As PhotoSearchOptions = New PhotoSearchOptions()
searchOptions.Tags = "microsoft"
Dim microsoftPhotos As Photos = f.PhotosSearch(searchOptions)

PhotoSearchOptions クラスは、写真を検索するための最も簡単で柔軟な方法です。ほとんどのプロパティはオプションですが、UserId、Tags、SortOrder などの、複雑な検索機能に利用可能なすべてのオプションを備えています。

Photos クラスには選ばれたプロパティがありますが、中にはすぐにわかりにくいものもあります。既に触れましたが、Flickr で検索を実行すると結果がページングされます。既定の 1 ページは 100 枚の大きさであり、上の検索を行うと、指定された検索で最初の 100 枚が返されます (100 枚に満たない場合もあります)。Photos.TotalPhotos は現行の検索で使用できる写真の合計数を指定し、一方、Photos.TotalPages は使用可能なすべての写真を取得するのに返す必要がある "ページ" 数を指定します。PhotoSearchOptions クラスの Page プロパティを変更すると、さらに別のページを Flickr から返すことができます。

次のコード行は、上の検索について、結果の 2 番目と 3 番目のページを Flickr から返します。

Visual C#

  searchOptions.Page = 2;
Photos microsoftPhotos2 = flickr.PhotosSearch(searchOptions);
searchOptions.Page = 3;
Photos microsoftPhotos3 = flickr.PhotosSearch(searchOptions);

Visual Basic

  searchOptions.Page = 2
Dim microsoftPhotos2 As Photos = f.PhotosSearch(searchOptions)
searchOptions.Page = 3
Dim microsoftPhotos3 As Photos = f.PhotosSearch(searchOptions)

Photos クラスにも PhotoCollection プロパティがありますが、ここに実際の写真が格納されます。PhotoCollection オブジェクトをまとめて追加し、結果の 1 ページまたは複数のページをまとめることができます。foreach 文を使用して、コレクション内のすべての写真をループ処理することもできます。

Visual C#

  PhotoCollection allPhotos = microsoftPhotos.PhotoCollection;
allPhotos.AddRange(microsoftPhotos2.PhotoCollection);
allPhotos.AddRange(microsoftPhotos3.PhotoCollection);
foreach (Photo photo in allPhotos)
{
    Console.Write("Photos title is " + photo.Title);
}

Visual Basic

  
    Dim allPhotos As PhotoCollection = microsoftPhotos.PhotoCollection
allPhotos.AddRange(microsoftPhotos2.PhotoCollection)
allPhotos.AddRange(microsoftPhotos3.PhotoCollection)
For Each p As Photo In allPhotos
    Console.Write("Photos title is " & p.Title)
Next For

ユーザーおよび写真を検索する

ユーザーを検索するには、ユーザーの画面名またはホームページの URL で検索する必要があります (または、認証を使用します。これについては後で説明します)。ユーザーの画面名 ("Sam Judson" など) がわかっている場合は、次のようにして、そのユーザーのユーザー ID を取得します。

Visual C#

  
    string screenName = "Sam Judson";
FoundUser user = flickr.PeopleFindByUsername(screenName);
string userId = user.UserId;

Visual Basic

  
    Dim screenName As String = "Sam Judson"
Dim user As FoundUser = f.PeopleFindByUsername(screenName)
Dim userId As String = user.UserId

次にこのユーザー ID を使用して、ユーザーの写真、お気に入り、グループ、連絡先などを検索できます (英国の皆さんに API を通じてアメリカ式のスペル "favorite" を使っていることをお詫びします。でも、Flickr がそうしているのであって筆者のせいではありません)。

Visual C#

  
    // ユーザーの写真の 1 ページ目
// 興味の程度による並べ替え
PhotoSearchOptions userSearch = new PhotoSearchOptions ();
userSearch.UserId = userId;
userSearch.Sort = SortOrder.InterestingnessAsc;
Photos usersPhotos = flickr.PhotosSearch(userSearch);
// ユーザーの連絡先の取得
Contacts contacts = flickr.ContactsGetPublicList(userId);
// ユーザーのお気に入りの 1 ページ目の取得
Photos usersFavoritePhotos = flickr.FavoritesGetPublicList(userId);
// ユーザー グループ一覧の取得
PublicGroupInfo[] usersGroups = flickr.PeopleGetPublicGroups(userId);

Visual Basic

  
    ' ユーザーの写真の 1 ページ目
' 興味の程度による並べ替え
Dim userSearch As PhotoSearchOptions = New PhotoSearchOptions()
userSearch.UserId = userId
userSearch.Sort = SortOrder.InterestingnessAsc
Dim usersPhotos As Photos = flickr.PhotosSearch(userSearch)
' ユーザーの連絡先の取得
Dim contacts As Contacts = flickr.ContactsGetPublicList(userId)
' ユーザーのお気に入りの 1 ページ目の取得
Dim usersFavoritePhotos As Photos = flickr.FavoritesGetPublicList(userId)
' ユーザー グループ一覧の取得
Dim usersGroups As PublicGroupInfo() = flickr.PeopleGetPublicGroups(userId)

1 日中ここに座って API の全メソッドのリストを作りたいところですが、基本的に Flickr API に存在するものは .Net ライブラリにあり、メソッド名は Flickr メソッドと同じですが、違いは先頭に付いている "flickr" とピリオドです。たとえば、"flickr.people.getPublicGroups" は Flickr.Net API ライブラリで "PeopleGetPublicGroups" です。

認証

この部分は、(少なくとも Flickr との対話の点から) どのアプリケーションでも最も複雑な部分かもしれませんので、順番に見ていきましょう。最終的に提供されるサンプル アプリケーションでは、デスクトップ認証を完全に実装しています。Web ベース認証は、わずかに異なりますが、最後に触れます。

Frob を取得する

Frob とはいったいなんでしょうか? Frob の意味は筆者もよく知らないのですが、基本的には Flickr に渡す一時キーであり、これはユーザーにアプリケーションの認証を求めます。認証されると、その同じ Frob を使用して "認証トークン" と、認証済みユーザーのユーザー ID を取得することができます。

ユーザーに場所を通知する

Frob が取得できたら、API キーおよび必要なアクセス許可と共に、署名済み URL で Flickr に渡す必要があります。幸い、ライブラリに、自動で署名し、ユーザーをリダイレクトする URL を返すメソッドが用意されています。ただし、この URL を計算する "Shared Secret" を知っている必要があります (Shared Secret をまだ取得していない場合は、上の「API キーを取得する」を参照してください)。

サンプル コード

フォーム上に 2 つのボタンがあると考えてください。最初のボタンは [Authenticate Me] で、2 つ目は [Complete Authentication] です。次のコードは、ユーザーの読み取り/書き込みのアクセス許可を認証する 2 つのボタンに対する、フォームに含まれるコードを示します。

Visual C#

  
    using FlickrNet;
// Frob をプライベート変数に格納します。
private string tempFrob;
private string ApiKey = "1234abcd1234abcd1234";
private string SharedSecret = "abcd1234abcd";
protected void AuthMeButton_Click(object sender, EventArgs e)
{
    // Flickr インスタンスを作成します。
    Flickr flickr = new Flickr(ApiKey, SharedSecret);
    // Frob を取得します。    
    tempFrob = flickr.AuthGetFrob();
    // Flickr でユーザーをリダイレクトする URL を計算します。
    string flickrUrl = flckr.AuthCalcUrl(tempFrob, AuthLevel.Write);
    // 次の行は、ユーザーの既定のブラウザで URL を読み込みます。
    System.Diagnostics.Process.Start(flickrUrl);
}
protected void CompleteAuthButton_Click(object sender, EventArgs e)
{
    // Flickr インスタンスを作成します。
    Flickr flickr = new Flickr(ApiKey, SharedSecret);
    try 
    {
        // 一時 Frob を使用して認証を取得します。
        Auth auth = flickr.AuthGetToken(tempFrob);
        // このトークンを後で使用するために保存するか、 
        // または Flickr インスタンスでの使用を設定します。
        Console.WriteLine("User authenticated successfully");
        Console.WriteLine("Authentication token is " + auth.Token); 
        flickr.ApiToken = auth.Token;
Console.WriteLine("User id is " + auth.UserId);
    }
    catch(FlickrException ex)
    {
        // ユーザーによってアプリケーションが認証されなかった場合は 
        // FlickrException がスローされます。
        Console.WriteLine("User did not authenticate you");
        Console.WriteLine(ex.ToString());
    }
}

Visual Basic

  
    Imports FlickrNet
' Frob をプライベート変数に格納します。
Private tempFrob As String
Private ApiKey As String = "1234abcd1234abcd1234"
Private SharedSecret As String = "abcd1234abcd"
Private Sub AuthMeButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' Flickr インスタンスを作成します。
    Dim f As Flickr = New Flickr(ApiKey, SharedSecret)
    ' Frob を取得します。    
    tempFrob = f.AuthGetFrob()
    ' Flickr でユーザーをリダイレクトする URL を計算します。
    Dim flickrUrl As String = f.AuthCalcUrl(tempFrob, AuthLevel.Write)
    ' 次の行は、ユーザーの既定のブラウザで URL を読み込みます。
    System.Diagnostics.Process.Start(flickrUrl)
End Sub
Private Sub CompleteAuthButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' Flickr インスタンスを作成します。
    Dim f As Flickr = New Flickr(ApiKey, SharedSecret)    
    Try
        ' 一時 Frob を使用して認証を取得します。
        Auth a = f.AuthGetToken(tempFrob)
        ' このトークンを後で使用するために保存するか、 
        ' または Flickr インスタンスでの使用を設定します。
        Console.WriteLine("User authenticated successfully")
        Console.WriteLine("Authentication token is " & a.Token)
        f.ApiToken = a.Token
Console.WriteLine("User id is " & a.UserId)
    
    Catch ex As FlickrException
        ' ユーザーによってアプリケーションが認証されなかった場合は 
        ' FlickrException がスローされます。
        Console.WriteLine("User did not authenticate you")
        Console.WriteLine(ex.ToString())
    End Try
End Sub

ご覧のように、ユーザーが認証しなかった場合は、AuthGetToken メソッドがスローした例外がキャッチされ、この状況が処理されます。

認証の完了

認証が済んでユーザーのトークンを取得すると、2 つのことが起こります。第 1 に、認証された状態でのみ利用可能な新しいメソッドを呼び出せるようになります。たとえば、Flickr.PhotosSetTags() は、認証済みユーザーの指定の写真にタグを設定します。ユーザーのアカウントに写真をアップロードすることもできます。

第 2 に、一部のメソッドの動作がわずかに変わります。たとえば、上のような "microsoft" タグを持つ写真の検索では、そのタグを持つユーザーのすべてのプライベート フォトに加えて、同じタグを持つユーザーのパブリック フォトと他のユーザーのパブリック フォトが返されます。

トークンの設定は、後のコンストラクタ段階でも行うことができます。

Visual C#

  Flickr flickr = new Flickr(ApiKey, SharedSecret, AuthToken); 
// または 
flickr.ApiToken = newToken;

Visual Basic

  
    Dim f As Flickr = New Flickr(ApiKey, SharedSecret, AuthToken)
' または 
f.ApiToken = newToken

Web 認証での相違

Web ベース認証では、API キーの [Edit Configuration] ページで、アプリケーションを認証したユーザーをリダイレクトするページを指定する必要があります。これは "コールバック URL" と呼ばれます。Web ベース認証を使用する場合、Frob を作成する必要はありません。

Flickr.AuthCalcWebUrl メソッドを使用して、ユーザーをリダイレクトする URL を生成できます。

Visual C#

  
    string url = flickr.AuthCalcWebUrl(AuthLevel.Write);
Response.Redirect(url);

Visual Basic

  
    Dim url As String = f.AuthCalcWebUrl(AuthLevel.Write)
Response.Redirect(url)

コールバック URL で指定されたページで、Frob がクエリ文字列で渡されます。コールバック URL が http://example.com/flickr.aspx である場合、ユーザーは http://example.com/flickr.aspx?frob=1234abcd1234abcd にリダイレクトされます。

Frob を使用して、上のサンプルと同様、認証トークンを取得できます。

Visual C#

  
    protected void Page_OnLoad(object sender, EventArgs e)
{
    string frob = Request.QueryString["frob"];
    Flickr flickr = new Flickr(ApiKey, SharedSecret);
    Auth auth = flickr.AuthGetToken(frob);
    // 後からの呼び出しに備えてトークンを保存します。
}

Visual Basic

  
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim frob As String = Request.QueryString("frob")
    Dim f As Flickr = New Flickr(ApiKey, SharedSecret)
    Dim a As Auth = f.AuthGetToken(frob)
    ' 後からの呼び出しに備えてトークンを保存します。
End Sub

写真をアップロードする

ユーザーの認証が済んだら、ユーザーのアカウントに写真をアップロードできます。

手順はとても簡単です。ハード ディスク上のファイルから直接行う方法、または、Stream オブジェクトから行う方法のいずれも使用できます。

Visual C#

  
    string file = "test.jpg";
string title = "Test Photo";
string descripton = "This is the description of the photo";
string tags = "tag1,tag2,tag3";
string photoId = flickr.UploadPicture(file, title, dscription, tags);

Visual Basic

  
    Dim file As String = "test.jpg"
Dim title As String = "Test Photo"
Dim descripton As String = "This is the description of the photo"
Dim tags As String = "tag1,tag2,tag3"
Dim photoId As String = f.UploadPicture(file, title, dscription, tags)

メソッドには、写真のタイトル、説明、タグを設定する各パラメータと、パブリックまたはプライベートの写真を示すパラメータ (上に表示されていない、オプションの 3 つのブール型パラメータ) があります。

写真を更新する

写真がアップロードできたら、セットに追加したり、1 つ以上のグループに追加したり、説明やタイトルを更新したり、タグを追加したりする場合があります。

次のコードでは、以前アップロードした写真のタイトルと説明を更新し、ユーザーのセット リストの最初のセットに追加します。

Visual C#

  flickr.PhotosSetMeta(photoId, "New Title", "New Description");
// ユーザー セットの一覧を取得します。 Photosets sets = flickr.PhotosetsGetList();
// コレクションの最初のセットを取得します。
Photoset set = sets.PhotosetCollection[0];
// 写真をそのセットに追加します。
flickr.PhotosetsAddPhoto(set.PhotosetId, photoId);

Visual Basic

  f.PhotosSetMeta(photoId, "New Title", "New Description")
' ユーザー セットの一覧を取得します。
Dim sets As Photosets = f.PhotosetsGetList();
' コレクションの最初のセットを取得します。
Dim set As Photoset = sets.PhotosetCollection(0)
' 写真をそのセットに追加します。
f.PhotosetsAddPhoto(set.PhotosetId, photoId)

まとめ

ご覧のとおり、Flickr と対話する実際の手順は比較的単純です。大変なのは、新しくて興味深いアプリケーションのアイデアを提供することです。

このアプリケーションの第 2 部では、WIA Coding 4 Fun の記事「Look at Me! Windows Image Acquisition (英語) 」に基づいてアプリケーションを開発します。このアプリケーションでは、互換デバイスをコンピュータに接続すると自動的に画像をアップロードします。

筆者は英国ニューキャッスルの BT に勤務する .NET 開発者で、時間があるとたくさんの写真をとり、Flickr にアップロードし、それらを表示するおかしなスクリーン セーバーを作成しています。コンピュータの前に座っていないときは、もっと多くの写真をとったり、ノーサンバーランドや湖水地方にロック クライミングに出かけるのが好きです。筆者の Flickr 写真は http://www.flickr.com/photos/samjudson (英語) で見ることができます。また、Channel9 Flickr.Net forum または筆者のブログ http://www.wackylabs.net/ (英語) にご連絡いただくか、mailto:%20sam@wackylabs.net までメールをお送りください。

top of page Top of Page