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を使ってつぶやくときはユーザ名とパスワードの替わりにトークンを使う。トークンは次の手順で取得する。
  1. StewGateの認証ページにアクセスする
  2. "認証する"リンクをクリックする
  3. Twitterの認証画面でアカウントを入力する
  4. "許可する"ボタンを押す

再び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()
{
}



Arduino Duemilanove 328
Arduino Duemilanove 328
posted with amazlet at 10.02.14
スイッチサイエンス
売り上げランキング: 12359


Arduinoイーサネット・シールド
スイッチサイエンス
売り上げランキング: 16327



トラックバック

http://arms22.blog91.fc2.com/tb.php/296-39d636f9

[Arduino][Twitter]ArduinoからTwitterにPOSTするライブラリ OAuth版

以前、 ArduinoからTwitterにPOSTするライブラリを作って公開しましたが、その時はTwitter APIのユーザ認証にBASIC認証を使っていました。 しかし、2010年6月からBASIC認証は廃止される予定となっており、新しい認証方式であるOAuthに移行することになっています。 そこで、

コメント

StewGateの使用法について

こんにちは。StewGate関連の記事から辿ってきました。
当方PICマイコンからアセンブラでStewGate経由の投稿を試みているのですが、投稿に際してTCP接続が確立できす悩んでいます。
stewgate.appspot.com ポート80に接続しているのですが、Err500(Internal Server Error)が帰ってきます。
接続先が違っているのでしょうか?
接続コマンドについてアドバイス頂けたら幸いです。

Re: StewGateの使用法について

Internal Server Errorが帰ってきていると言うことはTCP接続が確立していると判断できますね。HTTPリクエストで送るデータに間違いがないか確認してみてください。変なデータを与えると500がでるのかも。。

Re: StewGateの使用法について

早速のアドバイスありがとうございます。
データを調べてみたらCONTENT LENGTH値が間違っていました。
無事投稿まで成功させることが出来ました!
有難うございました。

Re: Re: StewGateの使用法について

お?うまく行ったみたいですね。よかった。

No title

コンパイルできない(TдT)

Re: No title

とりあえずArduino IDE の0018で試してみてください。
あとライブラリが正しくインストールされているか確認してみてください。

コンパイル

帰宅したらやってみます

No title

コンパイルはうまくいきました。後は投稿できるかですね

No title

初心者には難しいのかな
投稿方法がわからんない

No title

やっと投稿できるとこまで来ました

でも、たまに投稿できるぐらいでが上手くいってないよです

シリアル通信ではOK.と帰ってくるのですが

Re: No title

ライブラリのデバッグ文を有効にしてみてください。
そしたらTwitPicが返してくるHTML文が読めます。

#define SERIAL_DEBUG 0→1

原因がわかったら教えてください。

同じ文章を送ろうとしていたから駄目だったのかもしれません。また、調べてみます

帰宅したら早速デバッグ分の所を変えてみます

No title

ライブラリのデバッグ文とはなんでしょうか?

Re: No title

TwitPicライブラリのTwitPic.cppの21行目の次の一行を変更してください。
#define SERIAL_DEBUG 0

#define SERIAL_DEBUG 1
0を1にするとデバッグ用の機能が有効になります。

No title

TwitPicライブラリ自体が入ってないようです

Re: No title

ん?
なんか変だと思ったらエントリー間違えてた。。
すみません、デバッグうんぬんの件は忘れて下さい。。

bool Stewitter::checkStatus(void)の
char c = client.read();
のあとに
Serial.print(c)
としてやると、受信したHTMLが読めます。

No title

う~ん、コンパイルが出来ないみたいです

Serial.print(c)以外に追記するものもあるのでしょうか?

Re: No title

エラーはなんてでてますか?
エラーの内容を読めばたいてい問題は解決しますよ。
がんばってトライしてみてください。

No title

\Stewitter.cpp: In member function 'bool Stewitter::checkStatus()':

\Stewitter.cpp:131: error: 'Serial' was not declared in this scope

の二つです。何かが足りないのでしょうか

Re: No title

'Serial'が定義されてません。
ってことですね。
ライブラリに #include <HardwareSerial.h> を追加してください。

htmlの受信

ありがとうございます。
自分ひとりだったら挫折してました

何とか受信したhtmlが見れました。

エラーが出ます

はじめまして
いつもblog参考にさせて頂いてます。

今回、この記事を参考に制作しているのですが、
下記のエラーが出てコンパイルができず、困っています。

'EthernetDHCP' was not declared in this scope
'EthernetDNS' was not declared in this scope

Arduino Ethernetライブラリは最新のバージョン
Arduinoは最新の0022バージョンを使用しています。
(バージョンを0019に落としても同等のエラーが出ました)

アドバイスよろしくお願い致します。


Re: エラーが出ます

こちらでも以下の環境で確認してみましたが、正常にコンパイルできているようです。
Windows XP + Arduino 0022

ライブラリのインストールディレクトリが間違っているのかもしれません。
もう一度インストールディレクトリを確認してみてください。

File→PreferencesでSketchbook locationを確認し、そのディレクトリにlibrariesというディレクトリを作ってその中にライブラリを置いてください。
デフォルトだとMy Documents\Arduino\librariesになると思います。

コンパイルできません.

初めまして.
Arduinoを使用していろんなことをやりたいと思ってるものです.

この記事を参考にtwitterに呟いてみようと思っているのですがコンパイルが通らずに困っています.
エラーは以下のように表示されます.


In file included from C:\Users\お客様\Desktop\lab\arduino-0022\arduino-0022\libraries\Ethernet/utility/socket.h:4,
from C:\Users\お客様\Desktop\lab\arduino-0022\arduino-0022\libraries\EthernetDHCP\utility\EthernetCompat.cpp:27:
C:\Users\お客様\Desktop\lab\arduino-0022\arduino-0022\libraries\Ethernet/utility/w5100.h:14:17: error: SPI.h: No such file or directory

As of Arduino 0019, the Ethernet library depends on the SPI library.
You appear to be using it or another library that depends on the SPI library.C:\Users\お客様\Desktop\lab\arduino-0022\arduino-0022\libraries\EthernetDHCP\utility\EthernetCompat.cpp: In function 'uint16_t ethernet_compat_write_private(uint16_t, uint8_t*, uint16_t)':
C:\Users\お客様\Desktop\lab\arduino-0022\arduino-0022\libraries\EthernetDHCP\utility\EthernetCompat.cpp:56: error: 'SPI' was not declared in this scope


原因は何でしょうか・・・.すみませんがアドバイスお願いします.

Re: コンパイルできません.

使用しているArduinoソフトウェアのバージョンを確認してください。
最新の0022版を使ってください。
EthernetDHCPライブラリは最新版を使って下さい。
SPI.hをインクルードしてください。

コンパイルできました.

返信ありがとうございます.
何とかコンパイルできました.
そしてプログラムをarduinoにアップロードしtwitterに投稿しようと試みたのですが投稿できませんでした・・・.何が原因なのでしょうか・・・

Re: コンパイルできました.

とりあえず次の項目を確認してください。
・ネットワークケーブルは正しく繋がっているか?
・IPアドレスは正しく取得できているか?
・インターネットにアクセスできる環境か?

使えました!

Uno + イーサシールド 上に Stewitter を 0022 でコンパイル,無事につぶやくことができました!
ちなみに,温度湿度センサー SHT75 と組み合わせて使っています

同じ文章だと送られない?

1回目のツイートは成功するのですが、同じ文章をツイートすると送信は成功している(OKは帰ってくる)ようなのですが、実際にはツイートされません。
文章を変えるとツイートされますが、やはり2回目以降は同じ状態になります。
これって何か制限があるのでしょうか?

Re: 同じ文章だと送られない?

twitter側の制限ですね。
WEBからでも同じツイートは2度おくれません。

なるほど

なるほどtwitter側の制限なのですね。お騒がせしました。
Secret

Ads by Google
最近の記事
カテゴリ
Arduino (113)
電子工作 (111)
スタバッテルミン (5)
スタバカップアンプ (17)
電光掲示板 (7)
イベント (54)
太陽電池 (12)
ニキシー管 (19)
ARM (8)
PIC (20)
USBデバイス (7)
V850 (17)
Xfind (6)
プログラミング (4)
Android (3)
未分類 (25)
カメラ (6)
本 (18)
mbed (2)
SoftModem (0)
3Dプリンタ (8)
Amazon.co.jp
最近のコメント
疾風改めしょー:Arduinoで作る電光掲示板 - スケッチジェネレータ(2) (06/27)
鹿煎餅:Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス(3) (06/23)
arms22:Arduinoで作る電光掲示板 - スケッチジェネレータ(2) (06/23)
arms22:Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス(3) (06/23)
arms22:Arduinoで作る電光掲示板 - スケッチジェネレータ(2) (06/23)
鹿煎餅:Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス(3) (06/22)
鹿煎餅:Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス(3) (06/22)
moja:3Dプリンターで世界遺産をプリントしてみたよ。 (06/22)
疾風:Arduinoで作る電光掲示板 - スケッチジェネレータ(2) (06/22)
arms22:Dotsduino(ドッツデュイーノ)ハンダづけ (06/19)
リンク
Ads by Google
以前の記事
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。