Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」
2012年1月15日 StewitterライブラリがArduino 1.0に対応しました。それに合わせてサンプルスケッチを書きなおしました。
イントロダクション
OAuthに対応したArduino用のTwitterライブラリ「Stewitter」を作ったよ。正確にはStewGate- "OAuth に対応していないクライアントから Twitter にアクセスするためのプロキシ" -を経由してつぶやくライブラリだ。
2010年6月からTwitter APIのBASIC認証が非推奨・廃止予定になることが決まった。BASIC認証はBase64でエンコードしたユーザ名とパスワードをHTTPリクエストと一緒に送る認証方式だ。実装が簡単なので多くのソフトウェア、サービスで利用されている。けど、ユーザ名とパスワードを暗号化せずに送るので容易に盗み見られる可能性がある。
Twitterは今後、BASIC認証のサポートを打ち切ってより安全なOAuthによる認証のみサポートする。2010年6月以降、すぐにBASIC認証が使えなくなるわけではないけど、今のうちに対応しておいたほうがいいだろう。
StewGate
詳細は省くけどOAuthによる認証手順はArduinoで実装するにはあまりにも複雑なんだ。そこでOAuthの認証処理を肩代りしてくれるプロキシ「StewGate」を使う。StewGateはアクセンス・テクノロジーのギークが作ってくれたサービスだ。ギークに感謝しつつ使わせてもらおう。
StewGate -- Throw your stuff into the stewittering pot.
http://stewgate.appspot.com/
株式会社アクセンス・テクノロジー - StewGate
http://omake.accense.com/wiki/StewGate
トークンを取得する
StewGateを使ってつぶやくときはユーザ名とパスワードの替わりにトークンを使う。トークンは次の手順で取得する。
再びStewGateのページが表示されて、次のようなテキストが表示される。
ライブラリのインストール
次のURLからStwitterライブラリをダウンロードし、解凍したフォルダを~/Documents/Arduino/librariesフォルダにコピーしてください。librariesフォルダがない場合は新規作成してください。
Stewitterライブラリ(Arduino 1.0 対応)
http://arms22.googlecode.com/files/Stewitter-1.0.zip
このライブラリはNeoCatさんのTwitterライブラリをベースに作成しました。
ArduinoからTwitterにPOSTするライブラリ
http://d.hatena.ne.jp/NeoCat/20090505/1241466723
サンプルスケッチ(メッセージを送信)
サンプルスケッチ(最後のメンションを取得)
イントロダクション
OAuthに対応したArduino用のTwitterライブラリ「Stewitter」を作ったよ。正確にはStewGate- "OAuth に対応していないクライアントから Twitter にアクセスするためのプロキシ" -を経由してつぶやくライブラリだ。
2010年6月からTwitter APIのBASIC認証が非推奨・廃止予定になることが決まった。BASIC認証はBase64でエンコードしたユーザ名とパスワードをHTTPリクエストと一緒に送る認証方式だ。実装が簡単なので多くのソフトウェア、サービスで利用されている。けど、ユーザ名とパスワードを暗号化せずに送るので容易に盗み見られる可能性がある。
Twitterは今後、BASIC認証のサポートを打ち切ってより安全なOAuthによる認証のみサポートする。2010年6月以降、すぐにBASIC認証が使えなくなるわけではないけど、今のうちに対応しておいたほうがいいだろう。
StewGate
詳細は省くけどOAuthによる認証手順はArduinoで実装するにはあまりにも複雑なんだ。そこでOAuthの認証処理を肩代りしてくれるプロキシ「StewGate」を使う。StewGateはアクセンス・テクノロジーのギークが作ってくれたサービスだ。ギークに感謝しつつ使わせてもらおう。
StewGate -- Throw your stuff into the stewittering pot.
http://stewgate.appspot.com/
株式会社アクセンス・テクノロジー - StewGate
http://omake.accense.com/wiki/StewGate
トークンを取得する
StewGateを使ってつぶやくときはユーザ名とパスワードの替わりにトークンを使う。トークンは次の手順で取得する。
- StewGateの認証ページにアクセスする
- "認証する"リンクをクリックする
- Twitterの認証画面でアカウントを入力する
- "許可する"ボタンを押す
再びStewGateのページが表示されて、次のようなテキストが表示される。
http://stewgate.appspot.com/sg1/post/
POSTデータ:
_t = a78aedc52439h7pwqoie12445asf0877
msg = "あなたの送信したいメッセージ"
* UTF-8、URLエンコード済みにしてください。
* メッセージに "%(name)s" を含めると、トークンの名前に置換されます。
応答:
OK (ポスト成功)
エラーメッセージ (ポスト失敗)
"_t="の後のアルファベットと数字の部分がトークンなのでメモしておこう。a78aedc52439h7pwqoie12445asf0877ライブラリのインストール
次のURLからStwitterライブラリをダウンロードし、解凍したフォルダを~/Documents/Arduino/librariesフォルダにコピーしてください。librariesフォルダがない場合は新規作成してください。
Stewitterライブラリ(Arduino 1.0 対応)
http://arms22.googlecode.com/files/Stewitter-1.0.zip
このライブラリはNeoCatさんのTwitterライブラリをベースに作成しました。
ArduinoからTwitterにPOSTするライブラリ
http://d.hatena.ne.jp/NeoCat/20090505/1241466723
サンプルスケッチ(メッセージを送信)
#include <SPI.h>
#include <Ethernet.h>
#include <Stewitter.h>
// MACアドレス
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// "YourToken"をあなたのトークンで書き換えてください。
Stewitter twitter("YourToken");
// メッセージ(日本語もOK)
char msg[] = "こんにちは世界!私はアルデュイーノ!";
void setup()
{
delay(1000);
Ethernet.begin(mac);
Serial.begin(9600);
Serial.println("connecting ...");
// twitterに接続して、メッセージを送信
if (twitter.post(msg)) {
// 完了を待つ
int status = twitter.wait();
// status が 200なら正常に完了
if (status == 200) {
// レスポンスを表示
Serial.println(twitter.response());
}
else {
Serial.print("failed : code ");
Serial.println(status);
}
}
else {
Serial.println("connection failed.");
}
}
void loop()
{
}
サンプルスケッチ(最後のメンションを取得)
#include <SPI.h>
#include <Ethernet.h>
#include <Stewitter.h>
// MACアドレス
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// "YourToken"をあなたのトークンで書き換えてください。
Stewitter twitter("YourToken");
void setup()
{
delay(1000);
Ethernet.begin(mac);
Serial.begin(9600);
Serial.println("connecting ...");
// twitterに接続して、 最後のメンション(@yourname の入ったメッセージ)を取得
if (twitter.lastMention()) {
// 完了を待つ
int status = twitter.wait();
// status が 200なら正常に完了
if (status == 200) {
// 最後のメンションを表示
// ex) 20100111082341|874453678|whosaysni|@yourname whats up?
Serial.println(twitter.response());
}
else {
Serial.print("failed : code ");
Serial.println(status);
}
}
else {
Serial.println("connection failed.");
}
}
void loop()
{
}