Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

TTwitter私家版 111120。

今回ちょっと更新範囲が広すぎてチェックが全然できてないんですが、どうやら本家TTwitterが更新再開するらしく、作業が無駄になる予感しかしないのでさっさと公開しておきます^p^

ダウンロードはこちらから。
http://twc.xrea.jp/junk/TTwitter/

仕様変更

APIのラッパーと、ラッパーを使ったクラスの二層化

TTwitterライブラリは、TTwitterクラスとその内部で使われているTTwitterHTTPクラスの両方で直接APIを呼ぶ処理があり、これが拡張性を下げてる感じがしたので、APIを呼ぶ処理をTTwitterAPIクラス(TTwitterHTTPから改名)にまとめ、それをTTwitterクラスが使う形にしました。
TTwitterAPIクラスは完全に単独で機能するため、TTwitterクラスを使わずにAPIを呼ぶことが可能です。
(というか今回はAPIの層を重点的に更新したのでTTwitterはあんまり機能強化されてないです)

TTwitterXXXXTimelineをTTwitterTimelineクラスに集約、パラメータをParamsプロパティに移行

前回の更新でCountプロパティとTweetCountプロパティが紛らわしいという指摘があったので。

更新

REST API全てに対応

全てというのはStreaming APIを除く全てのAPIです。一覧は以下にあります。
https://dev.twitter.com/docs/api

廃止

TTwitter.AutoRateCheckプロパティの廃止

レスポンスヘッダからレートリミット(いわゆるAPI制限)が取れるため、必要無くなりました。
ただしレスポンスとあるように、何らかのAPIを使った際の返答として受け取るため、APIを一度も呼んでない状態で制限を知りたい場合はTTwitter.RefreshRateLimitStatusメソッドを呼んで下さい。

TTwitterFriendsTimelineを廃止

Twitter公式ドキュメントでDeprecatedだったので。

TTwitterAPIクラスの使い方

現在のTTwitterコンポーネントは非力なので、実際に使う場合はAPI呼び出しのラッパーであるTTwitterAPIクラスを直接使うことを現時点ではオススメします。
使い方はとても簡単です。

uses ..., Twitter_API, Twitter_Common;

// ツイートするサンプル
procedure TForm1.Button1Click(Sender: TObject);
var
  api: TTwitterAPI;
begin
  api := TTwitterAPI.Create('Consumer Key', 'Consumer Secret', 'Access Token', 'Access Token Secret', True{UseSSL}, rfJson);
  try
    Memo1.Text := api.PostStatusesUpdate('ほげほげ');
  finally
    api.Free;
  end;
end;

ちなみにAPIの戻り値は全て文字列で、その中身はTTwitterAPI.Createの第6引数で指定したもの*1が返ります。公式でも転送量の削減に繋がることから推奨してますし、Twitter_Dataユニットに扱いやすくするための処理なども入っているため、戻り値はJSON形式をオススメします。ただしGetUsersProfileImageメソッドだけは特別で、Twitter APIの仕様上これのみURLが返ります(詳しくは公式ドキュメント参照)。
メソッド名はHTTPメソッドとリソース名を足したもの*2になっているので、公式リファレンスで説明が探しやすいと思います。

User関数(Twitter_Commonユニット)

Twitter APIには、スクリーン名(screen_name)かユーザID(user_id)のどちらかを必要とするものが多くあります。最初はそれぞれoverloadしたメソッドを作ってたんですが、後述の分岐も含めるとメソッドが数百個余分に増えそうだったので、ちょっと考えました。

User関数はITwitterUserIDを返すだけの単純な処理です。引数はスクリーン名を取るものとユーザIDを取るものの二種類のoverloadがあります。
そしてスクリーン名かユーザIDのどちらかが必要なAPIは、ITwitterUserIDを引数に取るようになっています。使い方としては以下のような感じです。

function User(const AScreenName: string): ITwitterUserID; overload;
function User(const AUserID: Int64): ITwitterUserID; overload;

// どちらも同じ結果になる
Memo1.Text := api.GetUsersShow(User('lynatan'));
Memo1.Text := api.GetUsersShow(User(37630752));

List関数(Twitter_Commonユニット)

存在理由としてはUser関数と同じですが、こちらの方が少し複雑です。
List系APIには、リストID(list_id)かリスト名(slug)を必要とするものがあります。さらに、リスト名を指定した場合は、そのオーナーとなるアカウントをスクリーン名かユーザ名で指定する必要があります。
これをメソッドのoverloadで解決しようとすると、ほとんどのメソッドが3倍に増える上、引数で別のアカウントを指定するものなどもあるので、最悪の場合1つのAPIで6つのメソッドになってたりしました。なのでこれもList関数とそれが返すITwitterListIDで解決します。

function List(const AListID: Int64): ITwitterListID; overload;
function List(const ASlug: string; const AOwnerScreenName: string): ITwitterListID; overload;
function List(const ASlug: string; const AOwnerID: Int64): ITwitterListID; overload;

その他

ここには書いてないような修正点や仕様の変更もたぶんいっぱいあるはずなので、仕様上の不明な点があれば聞いてください。ただしコンポーネントのインストール方法などの基本的なことはご自分で調べていただけると助かります。

*1:JSONXMLが指定可能

*2:例えば'GET statuses/home_timeline'であれば'GetStatusesHomeTimeline'