2015/12/17

【一夜漬け】Twitter4QMLを使ってみようか。

この投稿は"Qt Advent Calendar 2015 - Qiita"の17日目(12/17分)の記事だ。

みんながんばって(何人かの人は複数エントリ書いて)つなげているQt Advent Calendar 2015、あと一日ぽっかり空いていたので、とりあえず急造で書いてみる。
まぁ、12日目の記事だって急造だったワケだし、正直おいらみたいなヘッポコにクオリティの高いテクニカルなエントリを求めること自体も間違っているワケなので(ぉぃ)、身の丈っぽいヤツでなんとか一日埋めてみようという試みだ。

Twitter4QMLとは
2014年のQtチャンピオンであるたすくさんが多分2011年ぐらいに作った、QML/QtQuickで使えるTwitterAPIのWrapper・・・なのかな。Android界隈だとTwitter4Jってのがあるけど、アレのQt版みたいな感じと言えばいいのか。


○使うための準備(Linux)
まずソースコードを取り寄せる。ソースは日本Qtユーザー会のgitサーバで公開してあるので、そこからgitコマンドで取り寄せよう。あとは、まぁ、Qt使いのみなさんにとってはお馴染みのコマンドじゃないかな。
$ git clone git://git.qt-users.jp/codereview/twitter4qml.git
$ mkdir build
$ cd build
$ qmake -r ../twitter4qml
$ make
$ sudo make install
基本、Qt5系で使うのかなと思うけど、確か(まだ)Qt4系でもビルドできたんじゃなかったかな。
Windowsとかであれば理音伊織(あやねいおり)大先生の「艦娘メモリーズ」のビルド方法の記載を参考にすればいいはず。とりあえずインストールしてしまえばQtQuick/QMLのコードから"import TwitterAPI 1.1"すれば一通りの機能が使える。

あと、多分、基本的にはQMLで使うのが正しいんだと思うけど、もちろんC++なコードからも使える。使えるんだけどおいらには使い方がよく分からない。なぜなら基本的にC++なコードを書くスキルがないからだ。
というワケでC++から使ってみたいっていうヒトも、多分理音伊織大先生の「艦娘メモリーズ」のコードとかが参考になったりすると思う。


○とりあえず使ってみる。
とりあえずいきなりタイムラインを表示するコードを書いてみる。
import QtQuick 2.3
import QtQuick.Window 2.2
import TwitterAPI 1.1

Window {
    visible: true

    width: 480
    height: 640

    OAuth {
        id: oauth
        consumer_key: 'hogehoge'
        consumer_secret: 'fugafuga'
        token: 'hogefuga'
        token_secret: 'fugahoge'
        user_id: 'xxxxxxxx'
        screen_name: 'zzzzzzzz'
    }

    StatusesHomeTimelineModel {
        id: model
    }

    ListView {
        id: view
        anchors.fill: parent
        model: model
        delegate: Rectangle {
            width: parent.width
            height: status_text.height < 64 ? 64 : status_text.height
            border.width: 1
            Row {
                anchors.fill: parent
                Image {
                    id: icon
                    width: 64
                    height: 64
                    source: model.user.profile_image_url
                }
                Column {
                    id: status_text
                    width: parent.width - 64
                    height: name.contentHeight + tweet.contentHeight
                    Text {
                        id: name
                        width: parent.width
                        text: "@%1".arg(model.user.screen_name)
                    }
                    Text {
                        id: tweet
                        width: parent.width
                        text: model.plain_text
                        wrapMode: Text.Wrap
                    }
                }
            }
        }
    }
}
簡単に見えるじゃん?
OAuth{}で認証情報渡して、StatusesHomeTimeline{}を定義しただけ。それだけでとりあえずタイムラインは取得できる。

StatusesHomeTimelineは見た通り"GET statuses/home_timeline"のAPIを叩くためのもので、他のエレメントも原則APIの名前をそのまま使っている。

例えば"GET statuses/mentions_timeline"でMentionのタイムラインを取得するのであればStatusesHomeTimeline{}をStatusesMentionsTimelineModel{}に変更すればいいって感じ。

もちろん、実際のクライアント作る時はもうちょい複雑な制御が必要(タイムラインの後進とか、過去のタイムラインを遡って取得するとか)だけど、その時も各APIで使うパラメータは基本そのままの名前でプロパティが定義してあるので、APIのドキュメントを読んでそのままコードに落とせる感じ。


○認証するには
Twitterの認証にはOAuthが必要なんだけど、これに対してOAuth{}ってのが用意されてる。
OAuth {
    id: oauth
    consumer_key: 'hogehoge'
    consumer_secret: 'fugafuga'
}
未認証状態だとoauth.stateが"0"になっている。多分、このステータスをトリガにして下の順番でコマンドを呼べば認証ができる。
  1. "oauth.state == 0"→oauth.request_token()を呼ぶと、デフォルトブラウザ経由でtwitter.comの認証画面が現れる。
  2. 認証して返ってきたpinをoauth.access_token(pin)の形で渡す。→oauth.statusに"2"がセットされる。
  3. "oauth.state == 2"→oauth.authorize()を呼ぶ。oauth.stateに"5"がセットされる。→認証完了
だいたいこんな感じだろうか。


○呟いてみる
最低限テキストを呟くコードはこうなる。
import QtQuick 2.3
import QtQuick.Controls 1.2
import TwitterAPI 1.1

ApplicationWindow {
    id: tweet

    Status { id: testStatus }

    Column {
        Text {
            text: oauth.screen_name
        }
        TextInput {
            id: tweet_text
            text: "Test"
        }
        Text {
            text: "OK"
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    var parameter = {'status': tweet_text.text}
                    testStatus.statusesUpdate(parameter)
                }
            }
        }
    }

}
内部的には命名規則通り"POST statuses/update"にあたるStatusesUpdateが用意されてはいるんだけど、この辺りはクライアントからの取扱いを楽にするためにStatus{}というエレメントが用意されている。
ツイート関連のパラメータをリストにしてStatuses.statusesUpdate()に渡すんだけど、上のように"status"だけが設定されると"statuses/update"が、一緒に"media"を設定すると"statuses/update_with_media"が、Status内部で自動的に判定されて使用(ツイート)されるようになってる。


○という事で・・・
なんかダラダラとまとまりがなく、しかも文面は解りづらいっぽいんだけど、要はTwitter4QML便利だよって話になるのかな。

あと、Twitter4QML自体もそうだし、10日目のエントリ「Qtユーザ会のご紹介」のところでチラっと紹介されている"Silk"もそうなんだけど、これらはQtライブラリを活用して作られてるってこと。
もともとQtはGUIのためのフレームワーク(ってコトで合ってるよね?)なワケなんだけど、このGUIを支える部分のクラスにはGUIを使わないプログラムの開発においても便利なものが沢山含まれていることを示してる。

とゆーワケで、QtライブラリはGUIの分野以外でも活躍してる(できる)んだよという(カレンダーのエントリー的には)「釈迦に説法」っぽい一言を添えてヘッポコなエントリをクローズしたいと思うのだ。
時間がないのとか文章まとめるのが苦手とかで紹介しきれてないけど、どこかで余裕ができたらQMLのサンプルコードみたいなのをアップできるといいな。→できるのか?>おれ

0 件のコメント: