【Unity】 Unityでツイートするサンプル「UnityTwiTest」(API 1.1対応)
→GitHub : Suzeep/UnityTwiTestGit
興味本位でUnityでTwitter連携の事をネットであれやこれやと調べていたら、
既にフリーのアセットがあった。
Let's Tweet In Unity by YoungWook Yang -- Unity Asset Store
が、動かしてみると肝心のツイートが出来ない。410 Goneと出る。
ググってみると、どうやらTwitter APIのバージョンが1.1になった事で
アクセストークンの取得までは上手くいっているが、ツイート部分が動作しなくなっているようで。
POST statuses/update | Twitter Developers
この辺を見て、何だURIが変わっただけじゃないか、とソースコードを書き換えて実行。
が、今度は401 Unauthorizedと出てダメ。
ここから、Twitter APIやOAuthの事をまだ知らなかった自分にとって、長い格闘が始まった(笑)
OAuthに問題があるのか、UnityのWWWの使い方が間違っているのか、どちらかだろうと思ったが
結論から言うと何と両方だった。
これを解決する為にOAuthについて調べ、認証のシグネチャ計算やヘッダー作成の部分を
全て見ていって、ところどころ間違っているのを修正。
(結構不味い処理だったよ...)
それから1週間ぐらいいじり倒して、シグネチャ計算やヘッダは間違っていないだろうとほぼ確信を持てるまでいった。
それでもUnauthorizedがまだ出る。
ググって調べまくってもAPI 1.1対応されたこのアセットの情報は当然無く、
単純にUnity以外の普通の.NETプロジェクトのコードを発見したりして余計に混乱。
「どうやったらUnityだけでAPI 1.1対応のツイートが出来るんだ!」
そう嘆いていたら、ふとこんな文章を見つける。
WWWForm・・・だと・・・!?
そしてWWWFormを使ってのリファクタに取り組んでみた。
WWWFormのインスタンスを直接WWWに放り込む方式でも最初はダメだったので、もう諦めようかと思った。
が、その時偶然にも公式リファレンスのある部分を見て別の使い方を発見する。
public WWWForm form = new WWWForm();
public System.Collections.Hashtable headers = form.headers;
public byte[] rawData = form.data;
public string url = "www.myurl.com";
public WWW www = new WWW(url, rawData, headers);
・・・これだ!
画像の文章を読む限り、
form.AddField( "status", text );
headers = form.headers;
headers["Authorization"] = (ヘッダ作成)
としてやって、最後に
WWW web = new WWW( "https://api.twitter.com/1.1/statuses/update.json", form.data, headers );
としてやれば・・・
見事に成功。
諦めかけていたが、ふとしたきっかけでの奇跡の逆転劇だった。
せっかくなので綺麗にリファクタしてGitHubに残すことにして、今回のサンプルプロジェクトを作った。
自分みたいな迷える子羊さんがここに辿り着いてくれる事を願って?w
→GitHub : Suzeep/UnityTwiTestGit
そういえば、この後に最近同じ事にチャレンジしていた方の記事を発見した。
■スクリプトグラフ: Let's Tweet In Unity を Twitter API 1.1 で動かす
お、WWWFormを使う所まで一緒だ、どれどれ後も同じかな?と思って見ていると、
何とびっくり、自鯖にPHPでモジュール作ってそれをWWWで呼び出すという斜め上の対応をされていたw
そんな方法もあるのかと感心しつつ、いやそれは無いよなぁ... と思いつつ。
自分の方法が正答かは全くもって分からないのだが、
とりあえず動いていれば良し。
これをきっかけにUnityでTwitterアプリの作成に挑戦しているところ。
どこまでやられるかは分からないけど、案外やってみると面白い。
次は、TLの表示かな...
ソフトバンククリエイティブ
売り上げランキング: 1,736
翔泳社
売り上げランキング: 7,236
[ | 2013年08月21日 20:05:51 : Unity | ] |