2014年1月4日土曜日

Unityでtwitterに投稿する方法(API1.1)

あけましておめでとうございます!
元日いかがお過ごしでしたか?

お雑煮ですか?

お年玉貰い/あげましたか?

嫁はまだか?

私の元旦といえば・・・

ハッカソン!

大晦日ハッカソンの続きで萌えシタン暴きを何とかすべくプログラミングしていました。

twitterのAPI1.1に変わった部分で、ずいぶん変わったのにググったらAPI1.0の頃の情報が多くヒットして調べるのも手間でした。
しっかり書いて残しておこうと思います。
今回のコード全部はgithubにあげてあります。(絶賛リファクタリング中)
https://github.com/zi-su/unitwit

1.twitterに開発者登録する
まずはAPIを利用するために開発者登録する必要があります。
開発者サイトにアクセスして、右上のアイコンにマウスを持っていきMyApplicationを開きます。
するとCreate a new Applicationという表示が見えるので、それをクリックします。
こういう画面が開くはずです。
必要な項目は
Name アプリケーション名。何でもいいです。
Description アプリケーションの説明。何でもいいです。
Webside アプリケーションがあるサイトのURLのようです。何でも良さそうです。

後は規約にチェック入れて、Captureの数字入力して、Create your applicationをクリックして作成完了です。

2.ツイッターに投稿するためにアプリケーション設定変更
重要
ApplicationType デフォではRead設定ですが、ツイートするにはRead and Writeに変更しなければなりません。
続いて、OAuthToolタブを選択肢て表示されるConsumerKeyとConsumerSecretをメモっておきます。
後でOAuth認証する際に必要になります。

以上でtwitter Application作成の手順は完了です。
実際にUnity上で使用するためのプログラムを書きましょう。

3.Unityからtwitterに画像付きツイートするには
手順の概要としては
twitterにOauth認証のリクエストを送る→アクセストークンが返ってくるので保存する→そのアクセストークンを使用してツイッターにデータを送る。
ねっ簡単でしょ?

3.0
まず単純にtwitterにツイートのみ投稿するためには、AssetStoreを見るとLet's tweet in Unityというアセットが見つかります。
が、このスクリプトはAPI1.0の頃のままなので、現在では使用できません
しかしoauth認証の部分は大丈夫なので、うまくそこだけ頂いてきましょう。

3.1Unityで画像付きツイートするには
Unityで通信するにはWWWクラスを基本的に使うのですが、画像付きツイートしたい場合には使えません。自前でTCP通信でデータを送ります。
WWWForm使っても出来ます。そっちのが楽です。

画像付きツイートするためのURLはこちら
https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media
なのですが、ExampleRequestのヘッダー情報を見ると
mutipart/form-dataとあります。
この形式に対応できないためWWWやWWWFormを使用した方法ではうまくいきません。
なので自前でTCP通信でデータを送ります。

WWWFormの場合
PNGのバイト列をWWWForm.AddBinaryDataに追加します。
form.headerを取得し、OAuth認証の文字列を設定します。
WWW www = new WWWにformとheaderを渡すことでmultipart/form-dataのヘッダーとして送信されます。

TCPクライアントの場合
TCPクライアントでapi.twitter.comにポート80で接続します。
TCPクライアントのストリームを取得し、StreamWriteを作成して
Exampleのとおりにヘッダー情報を書き込んでいきます。
最後にFlushしてデータを送るとツイッターに画像付きツイートが投稿されるはずです。
注意
  • 12行目には送りたいツイート文字、17行目には画像のバイト文字列を書き込みます。
  • 画像のバイト文字列をBase64に変換した場合は"Content-Transfer-Encoding: base64\r\n";を14行目の後に追加します。
  • Oauth認証に必要なパラメータに"status"は含みません。
  • Content-Length の値は9行目からのヘッダーのbody部分になります。UTF-8のバイト文字列データの長さを指定します。バイト文字列データの長さにせず、文字列データの長さのまま渡していると日本語文字を含んでるとツイートされません。


以上です。
自分がハマった箇所としては
ただのツイートをする分にはWWWとWWWFormを使用することができるのですが、multipart/form-dataには対応できないため自前でTCP通信をする必要がある。
ヘッダーのボディ部分を文字列でつなげて作成して、文字列のLengthでは日本語文字が入るとツイートできない。
そもそもTCP通信もWebプログラミングでAPI使用する考え方が初だった。
ググっても出てくる情報がAPI1.0だったり、PHPやrubyのライブラリを使用していて、本当に必要なヘッダーのデータ形式がわからなかった。
ってところです。
あと、unity twitterとかで調べてもiOSやAndroidでのツイート投稿ばかりヒットして、Standaloneの情報がなかった。
これらのハマりのたび、twitter上で多くの人にアドバイスを頂き、実装できました。
アドバイスを下さった皆さん、本当にありがとうございました。

みなさんのゲームでも画像付きツイート機能を実装して
楽しいゲーム体験を創りましょう!

-----------------ここから個人的oauth認証手順メモ---------------------
・リクエストトークンを受け取る
まずリクエストトークンをリクエストします。
リクエストを送るためのAPIはこちら。
https://dev.twitter.com/docs/api/1/post/oauth/request_token
注意点として、oauth_signatureという認証用コードを作成するために、oauth_signature以外のデータが入った状態の文字列でHMAC-SHA1のキーを生成します。
返ってくるResponceにリクエストトークンと秘密鍵があるのでそれを使って認証用ページを開きます。
http://api.twitter.com/oauth/authorize?oauth_token=ここにリクエストトークン
すると認証するとpincodeが表示されているので、それをプログラムに保存しておきます。

・アクセストークンを受け取る
さきほど入手したpincodeを使って、アクセストークンを受け取ります。
データを送るAPIはこちら
https://dev.twitter.com/docs/api/1/post/oauth/access_token
リクエストトークンの時のデータに加えて
oauth_tokenにリクエストトークン、oauth_verifierにpincodeをそれぞれ入れます。
そしてsignatureの文字列を生成しておきます。
APIに送るヘッダーにするために整形します。
OAuth oauth_consumer_key="...",oauth_nonce="...",oauth_signature="...",oauth_signature_method="HMAC-SHA1",oauth_timestamp="...",oauth_token="...",oauth_version="1.0"
「...」の部分は各自で入れる部分です。
で返ってくるresponceにアクセストークンと秘密鍵とユーザーIDとスクリーンネームがあります。
-----------------ここまで個人的oauth認証メモ---------------------



2014年1月1日水曜日

大晦日はお楽しみでしたね

あけましておめでとうございます!
今年もよろしくお願いします!Oculusをよろしくお願いします!

さて、皆さん大晦日どう過ごしました?

ガキ使?

紅白?

いいや・・・大晦日といえば・・・

ハッカソン!

朝10時ごろに起きてから、大晦日ハッカソンをやっていました。
その模様は #大晦日ハッカソン でも見てください。
特に制限なく各自が自宅で緩くやるハッカソンです。

Oculusゲーム4本ぐらい作ろうとやっていました。
できあがったものを紹介していきます。


一つ目!ジャンピング!

ダウンロード先
カーソルキーで移動、白板に乗ると自動でジャンプ。
oculus被って視線変更。360パッド対応。

oculus被って頂上目指してジャンプしていくよくあるゲーム。
二時間ほどで出来ました!
ジャンプ処理でちょっと勘違いしたとこで、OnTriggerEnterの瞬間に
rigidbody.AddForce(force, ForceMode.Impulse);
とするのを、めり込んでたり直前の落下速度が残っていたりでジャンプ力が一定にならなかった。
AddForce前に座標を修正、rigidbody.velocity = Vector3.zeroで初期化して一定になる。
数あるOculusゲームでもジャンプの浮遊感と落下感による緊張が、大変よいものになります。これは真剣に作りこんでいけばかなり化ける予感がします。




二つ目!萌えシタン暴き!
oculus被ってミクさん見つめてる時、じっと胸見たり、パンツ覗こうとしたりを検知して
その瞬間をスクショとともにツイッター投稿する悪魔の所業





完成しませんでした!!!!
twitter投稿の機能実装が思ったより理解が進まなくて、元旦ハッカソンで挽回したい。

俺達のハッカソンは始まったばかりだ!!!
このガジェットでエラーが発生しました