2011年06月04日

Twitterのプロフィール画像を取得する方法2(C#メモ)

前回の記事『Twitterのプロフィール画像を取得する方法(C#メモ)』で users/profile_image を使っていたのですが、どうやら確認のために使うもので通常は使ってはいけないようです。

こちらの記事で指摘されてました。
profileImageの取得 twitter4j

ここにも書いてありました。
twitter/api/users/profile_image/twitter

どうやら users/profile_image_url で取得するのが正しいようなので、サンプルを書き直しました。

ユーザー情報を取得するためには次のAPIを使用します。

http://api.twitter.com/1/users/show.[format]

APIの説明はこの辺りを参照してください。
GET users/show

前回同様、WebRequest、WebResponseを使ってユーザーの情報を取得します。

WebRequest api_req = WebRequest.Create(
    "http://api.twitter.com/1/users/show.xml?screen_name=XXXX");
WebResponse api_res = api_req.GetResponse();

読み込んだユーザーの情報をXMLパーサに読み込ませて、profile_image_urlを取得します。

StreamReader api_sr = new StreamReader(api_res.GetResponseStream());
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.LoadXml(api_sr.ReadToEnd());

System.Xml.XmlNode node = xml.SelectSingleNode("/user/profile_image_url");
string profile_image_url = node.InnerText;

以降は、前回と同様です。
profile_image_urlが画像のURLです。このURLから画像を取得するのも、WebRequest、WebResponseで良いです。

WebRequest image_req = WebRequest.Create(profile_image_url);
WebResponse image_res = image_req.GetResponse();

画像はSystem.IO.Streamを使ってBitmapに変換するのが楽です。

System.IO.Stream stream = image_res.GetResponseStream();
Bitmap bitmap = new Bitmap(stream);

後は、取得したbitmapを好きなようにすれば良いです。

簡単なサンプルプログラムを作ってみました。

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Xml;

〜省略〜

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // 画像を取得するID
        string screen_name = "XXXX"; // ←画像を取得したいIDを入れてください

        // 画像を取得
        Bitmap image = GetProfileImage(screen_name);

        // PictureBoxに設定
        PictureBox picture = new PictureBox();
        picture.Left = 10;
        picture.Top = 10;
        picture.Size = image.Size;
        picture.Image = image;
        this.Controls.Add(picture);
    }

    // Users取得APIのアドレス
    private static readonly string USERS_SHOW_URL = 
        "http://api.twitter.com/1/users/show.xml";

    /// <summary>
    /// ProfileImageを取得する
    /// </summary>
    /// <param name="screen_name">ProfileImageを取得するID(screen_name)</param>
    /// <returns>取得した画像</returns>
    public Bitmap GetProfileImage(string screen_name)
    {
        // Users情報を取得
        WebRequest api_req = WebRequest.Create(
            USERS_SHOW_URL + "?screen_name=" + screen_name);
        WebResponse api_res = api_req.GetResponse();
        StreamReader api_sr = new StreamReader(
            api_res.GetResponseStream());

        // XmlDocumentに読み込ませる
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(api_sr.ReadToEnd());

        // profile_image_urlを取得
        XmlNode node = xml.SelectSingleNode("/user/profile_image_url");
        string profile_image_url = node.InnerText;

        // 画像を取得
        WebRequest image_req = WebRequest.Create(profile_image_url);
        WebResponse image_res = image_req.GetResponse();

        // BITMAPに変換
        Stream stream = image_res.GetResponseStream();
        Bitmap bitmap = new Bitmap(stream);

        // 後始末
        stream.Close();
        image_res.Close();
        api_res.Close();

        // BITMAPを返却
        return bitmap;
    }
}

実行結果は次のようになります。
twitter-profile-image-sample2.png

私の画像だと面白みがないですね。

実際には、プロフィール画像だけを取得するケースというのは少ないと思います。ユーザーの情報をまるごと取得したときに、プロフィール画像のURLも一緒に読み込めますし、ユーザー情報はタイムラインを取得したときも一緒に取れるので、ついでに取得することができます。

注意点として、このやり方ですと、画像サイズの指定ができません。通常は48x48のサイズが返されるようですが、ときどき大きい画像が返されることがあるようです。実際に使うときには、画像サイズはBitmapなりPicutreBoxなりで調整する必要があると思います。
ちょっと疑問なのは、ツイッターのクライアント(例えば「ついっぷる」とか)で非常に大きいサイズの画像が表示できるものがありますよね。ユーザーが大きい画像をアップロードしているのだと思いますが、このAPIだと48x48のサイズしか取得できません。何か方法があるんでしょうが、良く分からないですね。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 09:15 | Comment(0) | TrackBack(0) | C#