なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」

Posted by arms22 on 2013年07月07日 51  1

2013年7月7日 StewitterライブラリがStewgate Uに対応しました。StewGate SG-1は7月末でサービス終了します。Stewitterライブラリをお使いの方はライブラリを更新し、トークンを新しく取得し直してください。

2012年1月15日 StewitterライブラリがArduino 1.0に対応しました。それに合わせてサンプルスケッチを書きなおしました。

イントロダクション



ArduinoからTwitterにつぶやくライブラリ「Stewitter」を作りました。OAuth認証をArduinoで実装するのは大変なので、OAuth認証を肩代りしてくれるプロキシ「StewGate U」を使ってTwitterへメッセージをポストします。

stewgate-u-log.png

StewGate U: Throw your stuff into the stewittering pot.
http://stewgate-u.appspot.com/

StewGateはアクセンス・テクノロジーのギークが作ってくれたサービスです。

株式会社アクセンス・テクノロジー - StewGate
http://omake.accense.com/wiki/StewGate


トークンを取得する


StewGateを使ってつぶやくときはユーザ名とパスワードの替わりにトークンを使います。トークンは次の手順で取得します。
  1. StewGateのページからTwitterにログインします。
  2. "連携アプリを認証"ボタンを押します。
  3. StewGateのページに戻ったらダッシュボードに移動します。
  4. ダッシュボードに移動するとトークンが表示されます。

トークンをクリックすると簡単な使い方が表示されます。
http://stewgate-u.appspot.com/api/post/

POSTデータ:
_t = 76856766df853e490ee3db911610f10e

msg = "あなたの送信したいメッセージ"
* UTF-8、URLエンコード済みにしてください。
* メッセージに "%(name)s" を含めると、トークンの名前に置換されます。


応答:
OK (ポスト成功)
エラーメッセージ (ポスト失敗)
"_t="の後のアルファベットと数字の部分がトークンなのでメモしておきましょう。
76856766df853e490ee3db911610f10e



Stewitterライブラリのインストール


次のURLからStewitterライブラリをダウンロードしてください。Arduino IDEを起動しメニューからスケッチ→ライブラリを使用→Add Library…を選択してください。

https://dl.dropboxusercontent.com/u/14188987/arduino/libraries/Stewitter.zip

またArduino 1.0.4以前をお使いの場合はZIPファイルを解凍し、Arduinoのライブラリフォルダ(~/Documents/Arduino/libraries)に直接コピーしてください。ライブラリフォルダがない場合は作成してください。

このライブラリはNeoCatさんのTwitterライブラリをベースに作成しました。

ArduinoからTwitterにPOSTするライブラリ
http://d.hatena.ne.jp/NeoCat/20090505/1241466723


サンプルスケッチ1:メッセージを送信


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


サンプルスケッチ2:最後のメンションを取得する


#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をはじめようキット
スイッチサイエンス
売り上げランキング: 709


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


Ads by Google

51 Comments

Saitou says..."StewGateの使用法について"
こんにちは。StewGate関連の記事から辿ってきました。
当方PICマイコンからアセンブラでStewGate経由の投稿を試みているのですが、投稿に際してTCP接続が確立できす悩んでいます。
stewgate.appspot.com ポート80に接続しているのですが、Err500(Internal Server Error)が帰ってきます。
接続先が違っているのでしょうか?
接続コマンドについてアドバイス頂けたら幸いです。
2010.05.28 16:38 | URL | #JalddpaA [edit]
arms22 says..."Re: StewGateの使用法について"
Internal Server Errorが帰ってきていると言うことはTCP接続が確立していると判断できますね。HTTPリクエストで送るデータに間違いがないか確認してみてください。変なデータを与えると500がでるのかも。。
2010.05.28 19:22 | URL | #- [edit]
Saitou says..."Re: StewGateの使用法について"
早速のアドバイスありがとうございます。
データを調べてみたらCONTENT LENGTH値が間違っていました。
無事投稿まで成功させることが出来ました!
有難うございました。
2010.05.29 13:19 | URL | #8iCOsRG2 [edit]
arms22 says..."Re: Re: StewGateの使用法について"
お?うまく行ったみたいですね。よかった。
2010.05.29 13:41 | URL | #- [edit]
yutyu says..."No title"
コンパイルできない(TдT)
2010.09.21 07:21 | URL | #WiSUj39Y [edit]
arms22 says..."Re: No title"
とりあえずArduino IDE の0018で試してみてください。
あとライブラリが正しくインストールされているか確認してみてください。
2010.09.21 09:06 | URL | #- [edit]
yutyu says..."コンパイル"
帰宅したらやってみます
2010.09.21 12:18 | URL | #WiSUj39Y [edit]
yutyu says..."No title"
コンパイルはうまくいきました。後は投稿できるかですね
2010.09.21 23:01 | URL | #- [edit]
yutyu says..."No title"
初心者には難しいのかな
投稿方法がわからんない
2010.09.21 23:35 | URL | #WiSUj39Y [edit]
yutyu says..."No title"
やっと投稿できるとこまで来ました

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

シリアル通信ではOK.と帰ってくるのですが
2010.09.22 04:32 | URL | #WiSUj39Y [edit]
arms22 says..."Re: No title"
ライブラリのデバッグ文を有効にしてみてください。
そしたらTwitPicが返してくるHTML文が読めます。

#define SERIAL_DEBUG 0→1

原因がわかったら教えてください。
2010.09.22 09:21 | URL | #- [edit]
yutyu says...""
同じ文章を送ろうとしていたから駄目だったのかもしれません。また、調べてみます
2010.09.22 11:47 | URL | #- [edit]
yutyu says...""
帰宅したら早速デバッグ分の所を変えてみます
2010.09.22 12:54 | URL | #- [edit]
yutyu says..."No title"
ライブラリのデバッグ文とはなんでしょうか?
2010.09.22 19:20 | URL | #- [edit]
arms22 says..."Re: No title"
TwitPicライブラリのTwitPic.cppの21行目の次の一行を変更してください。
#define SERIAL_DEBUG 0

#define SERIAL_DEBUG 1
0を1にするとデバッグ用の機能が有効になります。
2010.09.22 21:45 | URL | #- [edit]
yutyu says..."No title"
TwitPicライブラリ自体が入ってないようです
2010.09.22 22:07 | URL | #- [edit]
arms22 says..."Re: No title"
ん?
なんか変だと思ったらエントリー間違えてた。。
すみません、デバッグうんぬんの件は忘れて下さい。。

bool Stewitter::checkStatus(void)の
char c = client.read();
のあとに
Serial.print(c)
としてやると、受信したHTMLが読めます。
2010.09.22 23:51 | URL | #- [edit]
yutyu says..."No title"
う~ん、コンパイルが出来ないみたいです

Serial.print(c)以外に追記するものもあるのでしょうか?
2010.09.23 05:15 | URL | #- [edit]
arms22 says..."Re: No title"
エラーはなんてでてますか?
エラーの内容を読めばたいてい問題は解決しますよ。
がんばってトライしてみてください。
2010.09.23 11:00 | URL | #- [edit]
yutyu says..."No title"
\Stewitter.cpp: In member function 'bool Stewitter::checkStatus()':

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

の二つです。何かが足りないのでしょうか
2010.09.23 12:30 | URL | #- [edit]
arms22 says..."Re: No title"
'Serial'が定義されてません。
ってことですね。
ライブラリに #include <HardwareSerial.h> を追加してください。
2010.09.24 09:33 | URL | #- [edit]
yutyu says..."htmlの受信"
ありがとうございます。
自分ひとりだったら挫折してました

何とか受信したhtmlが見れました。
2010.09.24 21:09 | URL | #- [edit]
sentaku says..."エラーが出ます"
はじめまして
いつもblog参考にさせて頂いてます。

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

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

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

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


2011.04.19 15:16 | URL | #Kj/zZgYw [edit]
arms22 says..."Re: エラーが出ます"
こちらでも以下の環境で確認してみましたが、正常にコンパイルできているようです。
Windows XP + Arduino 0022

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

File→PreferencesでSketchbook locationを確認し、そのディレクトリにlibrariesというディレクトリを作ってその中にライブラリを置いてください。
デフォルトだとMy Documents\Arduino\librariesになると思います。
2011.04.20 09:51 | URL | #- [edit]
achi says..."コンパイルできません."
初めまして.
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


原因は何でしょうか・・・.すみませんがアドバイスお願いします.
2011.06.06 14:36 | URL | #m/ox79a. [edit]
arms22 says..."Re: コンパイルできません."
使用しているArduinoソフトウェアのバージョンを確認してください。
最新の0022版を使ってください。
EthernetDHCPライブラリは最新版を使って下さい。
SPI.hをインクルードしてください。
2011.06.06 19:46 | URL | #- [edit]
achi says..."コンパイルできました."
返信ありがとうございます.
何とかコンパイルできました.
そしてプログラムをarduinoにアップロードしtwitterに投稿しようと試みたのですが投稿できませんでした・・・.何が原因なのでしょうか・・・
2011.06.07 14:46 | URL | #m/ox79a. [edit]
arms22 says..."Re: コンパイルできました."
とりあえず次の項目を確認してください。
・ネットワークケーブルは正しく繋がっているか?
・IPアドレスは正しく取得できているか?
・インターネットにアクセスできる環境か?
2011.06.07 16:05 | URL | #- [edit]
ty says..."使えました!"
Uno + イーサシールド 上に Stewitter を 0022 でコンパイル,無事につぶやくことができました!
ちなみに,温度湿度センサー SHT75 と組み合わせて使っています
2011.07.09 10:34 | URL | #- [edit]
Yuizi says..."同じ文章だと送られない?"
1回目のツイートは成功するのですが、同じ文章をツイートすると送信は成功している(OKは帰ってくる)ようなのですが、実際にはツイートされません。
文章を変えるとツイートされますが、やはり2回目以降は同じ状態になります。
これって何か制限があるのでしょうか?
2011.09.06 10:24 | URL | #- [edit]
arms22 says..."Re: 同じ文章だと送られない?"
twitter側の制限ですね。
WEBからでも同じツイートは2度おくれません。
2011.09.06 12:19 | URL | #- [edit]
Yuizi says..."なるほど"
なるほどtwitter側の制限なのですね。お騒がせしました。
2011.09.06 15:03 | URL | #- [edit]
NIX says..."URLエンコード?"
すみません、教えてください。
日本語もOKと書いてありますが、StewGate側では「UTF-8、URLエンコード済みにしてください」と書いてあります。
ライブラリを見てもURLエンコードしている所が無いようなのですがどのように対応しているのでしょうか?
よろしくお願い致します。
2013.07.25 18:02 | URL | #mQop/nM. [edit]
arms22 says..."Re: URLエンコード?"
すみません、URLエンコードはしていません。。
2013.07.26 18:49 | URL | #- [edit]
hepotann says..."教えて下さい"
初めまして。
今自分はwifiシールド(cc3300)を使ってツイッターに投稿しようと考えています。イーサネットシールドじゃないと無理なのでしょうか?もし方法があれば教えていただければと思います。
よろしくお願い致します。
2014.07.04 17:50 | URL | #- [edit]
arms22 says..."Re: 教えて下さい"
スケッチ&ライブラリはイーサネットシールドの使用を前提に書かれています。
ただそれほど大きな変更はしなくてもwifiシールドで使えると思います。
2014.07.05 17:24 | URL | #- [edit]
hepotann says..."ありがとうございます"
ありがとうございます。
もう少し自力で頑張ってみます
2014.07.06 01:11 | URL | #- [edit]
hepotann says..."うまくできませんでした"
あれから試行錯誤を繰り返したのですがcode:0が帰ってきてうまく投稿できません。
そもそもですがイーサネットシールドを使わなくてもEthernet.hをインクルードしたままでも大丈夫なのでしょうか。これを消すとエラーがでるので...
またcode:0が帰ってきてるというのはどのような状態なのでしょうか。わかりましたら教えていただければと思います。
2014.07.10 17:35 | URL | #- [edit]
arms22 says..."No title"
wifiシールド(cc3300)のサンプルないのかな?
それに合わせて変更すればいいと思うんだけど。

wifi接続できた後はふつうにHTTPプロトコルに乗っ取って通信するだけで良いはず。
code:0を返してきてるのはサーバー?
2014.07.11 13:21 | URL | #j7sy4omY [edit]
M says..."LastMentionのサンプルコードで、「code:0」が返却されます。"
自宅では実行できていたので、学校のネットワークにしたのが原因かなと推測しているのですが、他に可能性はありますか?
また、回避策があれば教えていただければ幸いです。よろしくお願いいたします。
2015.07.29 09:50 | URL | #jRkldm8Q [edit]
arms22 says...""
ちょっと原因がわかりませんね。。
次のようにコードを変更して、どのような応答が返ってきているか確認すると原因がわかるかもしれません。

int status = twitter.wait();

int status = twitter.wait(&Serial);
2015.07.29 10:41 | URL | #j7sy4omY [edit]
M says...""
早速の回答ありがとうございました。
変更してみましたが結果は変わらず「code:0」と表示されました。
Stewitter.cppにシリアルへの出力を追加して確認していたところ、if(checkStatusのclient.available())に入っていないようでした。
2015.07.29 20:03 | URL | #jRkldm8Q [edit]
arms22 says...""
まったく返答がないのはおかしいね。
ネットワークに繋がっていないんじゃないかな?
proxyを経由しないとだめかもしれないね。
2015.07.30 09:03 | URL | #j7sy4omY [edit]
ika says..."NO_MENTION_FOUND"
こんにちは。
最後のメンションを取得するサンプルスケッチで
「NO_MENTION_FOUND」と返ってきます。
この原因はどのような問題が考えられるのでしょうか。

メッセージを送信するサンプルスケッチはうまく動作しており、
Twitter上でつぶやきがひとつもないという状態ではないです。

よろしくお願いします。
2015.08.23 12:30 | URL | #- [edit]
ika says..."NO_MENTION_FOUND"
すみません。
自己解決しました。
2015.08.23 14:38 | URL | #- [edit]
kiwi says...""
初めまして
当方電子工作初心者です。

現在、一定時間おきに現在の気温や湿度をtwitterにポストさせるために、サンプルスケッチのsetupのソースをloopに入れて一定時間おきにループしてポストさせようとしています。
また、気温以外に表示させたい文字があるため、msgにセンサから取得した気温の値を追加して表示しようとしています。
しかし、シリアルモニタには正しいmsgが表示されるのですが、twitter.post(msg)がfalseを返して"connection failed."となりポストできていません。

文字列の追加は以下のように行っています。

char Hu[16]; //湿度を入れる文字配列
char Te[16]; //温度を入れる文字配列
dtostrf(Humi, 6, 2, Hu); //Humiが湿度、float型であるため文字列に変換しHuに入れる
dtostrf(Temp, 6, 2, Te); //Tempが温度、float型であるため文字列に変換しTeに入れる

strcat(msg,Hu); //msgにHuを追加
strcat(msg,Te); //msgにTeを追加

Serial.println(msg); //シリアルモニタに表示、正しく表示できる

if (twitter.post(msg)) { //falseが返ってきてSerial.println("connection failed.");になる
//サンプルスケッチ1と全く同じため省略
 }
else {
Serial.println("connection failed.");
}

また、このままループさせてしまうとmsgにどんどん文字が入ってしまうため、loopの最後に以下のように初期化を行っています。
//msgの初期化
for (int i = 0; i < sizeof(msg); i++){
msg[i] = 0;
}

このような感じになります。
説明下手かもしれませんが、何卒よろしくお願いいたします。
2016.07.18 17:07 | URL | #- [edit]
kiwi says...""
追記
Stewitter.cpp内の、「bool Stewitter::post(const char *msg)」にある「client.connect(STEWGATE_HOST, 80)」がfalseであるから、twitter.post(msg)もfalseになっているのでしょうか?
2016.07.18 17:14 | URL | #- [edit]
kiwi says...""
訂正
何度も申し訳ありません。
文字列の追加の部分で間違いがあったので訂正させていただきます。

×char msg[] = "伝えたい文字列";

○char test[] = "伝えたい文字列";
 char msg[] = "";

× strcat(msg,Hu);
 strcat(msg,Te);

○strcat(msg,test);
 strcat(msg,Hu);
 strcat(msg,Te);

以前のプログラムではmsgが0で初期化されてしまうため、こういう形で追加しておりました。
よろしくお願いします。
2016.07.18 17:30 | URL | #- [edit]
kiwi says...""
すみません、解決しました。
お騒がせしまして申し訳ありませんでした。
2016.07.19 17:02 | URL | #- [edit]
mango says...""
こんにちは。
ブログを参考にさせていただいております。
この分野の初心者です。

サンプルスケッチ1のコンパイルも書き込みも成功したのですが、twitter上にメッセージが来ません。
何がうまくいっていないのか、見当がつきません。

arduino uno , win 10, arduino ide 1.7.11を使っています

何かしらご助言をいただきたいです。よろしくお願いします。
2016.11.19 13:57 | URL | #- [edit]
arms22 says..."Re: タイトルなし"
まずは基本的なところから、
・Arduinoはネットワークに繋がっているか?
・外部のネットワークに接続できるか?

上記問題なければレスポンス待ちしている部分を次のように書き換えて何が出力されるか確認してみてください。

int status = twitter.wait();

int status = twitter.wait(&Serial);
2016.11.27 15:30 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。