この投稿は"
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"になっている。多分、このステータスをトリガにして下の順番でコマンドを呼べば認証ができる。
- "oauth.state == 0"→oauth.request_token()を呼ぶと、デフォルトブラウザ経由でtwitter.comの認証画面が現れる。
- 認証して返ってきたpinをoauth.access_token(pin)の形で渡す。→oauth.statusに"2"がセットされる。
- "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のサンプルコードみたいなのをアップできるといいな。→できるのか?>おれ