nDiki : Net::Twitter

2007年4月7日 (土)

携帯電話(iモード)から Twitter を更新する

Twitter をいろいろ遊んでみて「やはり携帯電話から更新できないと」と思えてきた。

携帯電話からメールを送る事で Twitterアップデートをかけてくれるゲートウェイを設置できれば一番いいのだけれど、そのようなメールアドレスを作る場所が今はない(さすがに会社のサーバはまずい)。

ということでiモードから更新をかけられるように短い CGI プログラムを書くことにした。 CPAN には Net::Twitter という Perl モジュールがあるのだが、JSON::Any (と JSON::XS / JSON / JSON::DWIW / JSON::Syck のどれか)が必要で、ちょっと大げさなので今回は使用は見送り。 普通に CGI.pm と LWP::UserAgent で書いた。

 #!/usr/bin/perl -w

 use 5.005_03;
 use strict;
 use CGI qw(-no_xhtml);
 use Jcode;
 use LWP::UserAgent;

 my $query     = CGI->new;
 my $user_name = $query->param('u');
 my $password  = $query->param('p');
 my $status    = $query->param('s');

 $user_name = '' unless defined $user_name;
 $password  = '' unless defined $password;
 $status    = '' unless defined $status;

 my $message = '';

 if ($user_name ne '' && $password ne '' && $status ne '') {
   my $ua = LWP::UserAgent->new;
   Jcode::convert(\$status, 'utf8', 'sjis');
   $ua->credentials('twitter.com:80', 'Twitter API', $user_name, $password);
   my $request = $ua->post('http://twitter.com/statuses/update.json',
                           {status => $status . ' '});
   if ($request->is_success) {
     $message = '<p>OK</p>';
   }
 }

 print $query->header(-type => 'text/html', -charset => '');
 print '<html><head><title>Twitter update</title></title><body>';
 print '<form method="post" action="twitter">';
 print 'ユーザ名:',   $query->textfield('u'),      '<br>';
 print 'パスワード:', $query->password_field('p'), '<br>';
 print 'ステータス:', $query->textfield('s'),      '<br>';
 print '<input type="submit">';
 print '</form>';
 print $message;
 print '</body></html>';

とりあえずこれで、iモードから送信できることを確認。 パスワードの入力が面倒だけれども、サーバ側に書いておくのも嫌なので毎回送ることにした。FOMA 端末側には定型文として保存しておく以外にいい手はないのかな。

最初うまく送れなくてなんだろうと思ったが、あきやん氏の「Twitterで日本語を入力する方法 (akiyan.com)」の記事にある

  • 全て全角文字で入力して、最後に半角スペースをいれる
  • 半角全角を混在させるときは、半角文字と全角文字の間にスペースをいれる

といった日本語を入力する際の注意点がらみだったようである。 とりあえず CGI プログラムの方で最後に必ずいわゆる半角空白を追加するようにしておいた。

文字数チェックとか Twitter API の返り値チェックとか、改善すべきところはいろいろあるけれど、自分用にはまずこれでいいかな。

気が向いた時に外出先から更新かけます。

スポンサード リンク
[ 4月7日全て ]

2009年8月28日 (金)

今日のさえずり - 「チューペットみたいな何か」いっぱいあった

2009年08月27日

  • 09:28 前に座っている人のワイシャツの胸ポケットに現ナマがちらり。 [mb]
  • 09:37 「もしよかったらこれ読んでください」とラブレター風の封筒を配るオネエサンたち。アイデアは認める。 #Akihabara L:秋葉原 [mb]
  • 11:52 PAR::Environment の Pod 読むと PAR_GLOBAL_* 環境変数の説明が書いてあるんだけれど、ソースコード見ても全然使ってないんだよなあ。 *P3
  • 12:27 HDD もう1台買った。デジカメデータ用。 [mb]
  • 12:40 マクドナルドの最近のコールドカップのフタ、まんなかがオデキみたいでちょっと抵抗がある。 *P3
  • 17:38 jQuery + Flexigrid を HTML 出力に追加。 *P3
  • 19:45 えーっ、チューペット生産終了になってたのか。 [mb]
  • 19:49 あれ? チューペットって真ん中で折れるやつだっけ? 折れないやつだっけ? [mb]
  • 19:59 西友に行ってみたら「チューペットみたいな何か」いっぱいあった。焦るな。 [mb]
  • 20:02 @hitoxu もう食べられないと思うと無性に欲しくなりますね、チューペット。 [mb]
  • 23:30 2009年8月25日の歩行: 8690歩、6.69km、79分、5.03km/h、消費 319.2kcal、脂肪燃焼 45.6g、4.1エクササイズ。 *P3
  • 23:32 2009年8月26日の歩行: 855歩、0.63km、9分、4.05km/h、消費 32.8kcal、脂肪燃焼 4.7g、0.4エクササイズ。 *P3
  • 23:34 2009年8月27日の歩行: 7853歩、6.29km、58分、6.49km/h、消費 286.6kcal、脂肪燃焼 40.9g、4.2エクササイズ。 *P3

2009年08月28日

[ 8月28日全て ]

2009年12月27日 (日)

今日のさえずり - くるぴかポッチャマ廻しにくい

naney:4228896260

2009年12月26日

2009年12月27日

[ 12月27日全て ]

2009年12月30日 (水)

Net::OAuth を使って Twitter からフィードを取得

Twitter の replies (mentions) をフィードリーダや Plagger で読めるようにするために、Basic 認証Twitter にアクセスしてフィードをとってきてそのまま出力する Perl CGI スクリプトを書いて使っていたのだが、やはり Basic 認証が嫌なので OAuth 認証に書き換えた。

Net::Twitter モジュールだと取ってきたフィードが Perl のデータ構造になってしまいそのまま再度出力するのが面倒なので、Net::OAuth モジュールでリクエストを作って投げるようにした。

以下エラー処理等を省略したコード。

Web サイトに設置すれば(CGI スクリプト側で認証を済ませて)認証無しで replies のフィードが取れるようになるので簡単にフィードリーダで読めるようになる。

 #!/usr/bin/perl -w

 use strict;
 use warnings;
 use CGI;
 use LWP::UserAgent;
 use Net::OAuth;
 use Data::Random qw(rand_chars);

 $Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

 my $consumer_key    = 'YOUR CONSUMER KEY';
 my $consumer_secret = 'YOUR CONSUMER SECRET';
 my $access_token    = 'YOUR ACCESS TOKEN';
 my $access_token_secret = 'YOUR ACCESS TOKEN SECRET';

 my $url    = 'http://twitter.com/statuses/replies.atom';
 my $method = 'GET';

 my $query = CGI->new;

 my $request = Net::OAuth->request('protected resource')->new(
   consumer_key     => $consumer_key,
   consumer_secret  => $consumer_secret,
   request_url      => $url,
   request_method   => $method,
   signature_method => 'HMAC-SHA1',
   timestamp        => time,
   nonce        => join('', rand_chars(ssize => 16, set => 'alphanumeric')),
   token        => $access_token,
   token_secret => $access_token_secret,

   extra_params => {count => '200'});

 $request->sign;

 my $ua = LWP::UserAgent->new;
 my $response;

 if ($method eq 'GET') {
   $response = $ua->get($request->to_url);
 }
 else {
   $response = $ua->post($request->to_url);
 }

 print $query->header('application/atom+xml; charset=utf-8');
 print $response->content;
[ 12月30日全て ]

2013年2月13日 (水)

今日のさえずり: 新しいメンバが「幸せです」と言っていたので私も幸せです

naney:8468461907

2013年02月13日

  • 07:47 バレンタインチョコ! http://t.co/fjXRXgqF
  • 07:58 RT @maru_kei: ビープでPCM再生とかね。 RT @Naney: 16色表示機種で VRAM 高速切り替えで多色表示化するビューアーってあったよねーて話したけど伝わらなかった。
  • 08:13 @maru_kei 大学の FMR(だったかな?)で鳴らしてました。
  • 08:16 twitcle plus 1.0.1 で素早く改善要望対応・不具合修正してきて素晴しい。命がけの絶対時刻表示とかクライアント名表示とか。今後次第では永久保存 .apk になるかも。個人的には API 残数見られると嬉しいです。
  • 09:49 着席。 (@ 株式会社ミクシィ (mixi, Inc.)) http://t.co/MLvJm4vq
  • 12:21 git fsck してる。
  • 12:23 でも QGit が"ASSERT in Cache::load, corrupted SHA after ..." といって止まるので泣ける。
  • 12:26 QGit が止まっているように見えたのはモーダルダイアログが裏に回っているだけだった。
  • 12:40 開発環境で投稿した不健全投稿に対して若い女子から「イイネ!」されてて恥ずかしい。違うんです。テストなんです。
  • 14:57 “Sleeping Time @Naneyhttp://t.co/dSXaoq5J
  • 18:16 新しいメンバが「幸せです」と言っていたので私も幸せです。
  • 18:21 今日 TPP と言った気がしますが TAP の言い間違いです。
  • 18:42 「今は Module::Build を使っておけば良いんじゃないかと思っています」 / “おそらくはそれさえも平凡な日々: CPANモジュールのパッケージングの歴史” http://t.co/2rY45dYT
  • 18:42 “[D] Flickr画像に自動的にExif情報を付加するブログパーツ FlickrEx - Drift Diary XV” http://t.co/GtEnllaB
  • 19:05 今からロイヤルティの勉強する。
  • 20:55 RT @matsutakegohan1: 今日は社内でカスタマーロイヤリティの勉強会を行っております。よりお客様に近いサービスを目指します! http://t.co/7JeVMsZi
  • 22:42Twitter API v1.1とNet::Twitter::Lite - $shibayu36->blog;” http://t.co/dGytnATL
  • 23:49 @as_tone おいしい蕎麦屋さんプリーズ。
  • 23:54 親がくれるチョコを義理チョコと呼ぶのはまだ小僧。
  • 24:19 晩御飯食べ終わったので毎日の習慣通り冷蔵庫からチョコレート出して食べた。
[ 2月13日全て ]

2013年3月4日 (月)

ぼちぼち Twitter API 1.1 対応 (Net::Twitter::Lite で)

さくらのレンタルサーバ

  my $response
    = URI::Fetch->fetch(
    "http://api.twitter.com/1/statuses/user_timeline.rss?user_id=$id&count=200"
    ) or die URI::Fetch->errstr;

とかレガシーなコードが動いているの(2007年11月に書いた*1)で、Twitter API 1.1 に対応せねば。

Net::Twitter::Lite を使うか。Net::Twitter::Lite を cpanm で home の下にインストール

 curl -LO http://xrl.us/cpanm
 chomod 755 cpanm
 cpanm -l /home/naney/local/libperl-twitter Net::Twitter::Lite

で自分の Tweet を取ってくるのはだいたいこんな感じ。

 #!/usr/bin/perl

 use warnings;
 use strict;
 use HTTP::Date;
 use Net::Twitter::Lite;

 use lib
   qw(/home/naney/local/libperl-twitter/lib/perl5 /home/naney/local/libperl-twitter/lib/perl5/i386-freebsd-64int);

 my $consumer_key        = 'aaa';
 my $consumer_secret     = 'bbb';
 my $access_token        = 'ccc';
 my $access_token_secret = 'ddd';
 my $id                  = 自分の Twitter アカウントの ID(数字);

 my $twitter = Net::Twitter::Lite->new(
   apiurl           => 'http://api.twitter.com/1.1',
   legacy_lists_api => 0,
   consumer_key     => $consumer_key,
   consumer_secret  => $consumer_secret
 );

 $twitter->access_token($access_token);
 $twitter->access_token_secret($access_token_secret);

 my $timeline = $twitter->user_timeline(
   {
     count       => 200,
     user_id     => $id,
     include_rts => 'true'
   }
 );

 foreach my $tweet (@$timeline) {
   my $time     = $tweet->{created_at};
   $time =~ s/\+0000/UTC/;
   $tweet->{_created_at} = HTTP::Date::str2time($time);

   # use $tweet here.
 }

[ Perl ]

*1RSSURL は去年修正

今日のさえずり: 60秒キャンペーン終わったので5分ほどかかった

2013年03月04日

  • 08:32 RT @corvussolis: @unk @Naney こんにちは、CorvusSKKの作者です。アスキーモードでの入力での現象だと推察しますが、次のリリース(ver.0.9.6?)で修正出来ると思いますのでしばらくお待ち下さい。
  • 08:33 @corvussolis ありがとうございます。 CorvusSKK まだ使わせていただいたこと無いのですが、新しいバージョンが出たら試してみます!
  • 10:58 欲しいのど飴がオフィスグリコに無い!
  • 12:23 今日会った方に Sublime Text 2 薦められた。サイト見てみるとスゲー強力そうで気になる。 http://t.co/eAOKLJhf9t
  • 14:27 60秒キャンペーン終わったので5分ほどかかった。 (@ マクドナルド 南青山店) http://t.co/ICQdyNvVFd
  • 15:08 gogoshigoto (@ 株式会社ミクシィ (mixi, Inc.)) http://t.co/WdPqb4vuch
  • 16:12 “404 Blog Not Found:perl - 最速のUTF-8処理法” http://t.co/ccY175Yhwz
  • 17:30 映画ドラえもん のび太のひみつ道具博物館がいいらしいので気になる。道具いっぱい出そうだもんなぁ。
  • 21:49 サーバに Net::Twitter::Lite 入れてるところ。
  • 23:40 Storable するところまで Net::Twitter::Lite 使うように書き換えた。
[ 3月4日全て ]

2013年6月16日 (日)

Twitter API v1.1 対応とか、パイプでやりとりするの JSON でいいのとか

Twitter API v1.1 に対応していないスクリプトがあって、たしか OAuth 対応はしてあるけど RSS 形式を使っていたので JSON で取得して処理するようにしなければなーと思ってたんだけれど、そもそも OAuth 対応すらしてなかった。

なので Net::Twitter::Lite を使うように書き換え。

あと、いままで1つのスクリプトで「Twitter API を呼び出してタイムライン取得」「シリアライズしてファイルに保存」「Wiki 形式に整形して書き出し」をしていたんだけれど、UNIX 哲学に従って小スクリプトに分割してパイプで受け渡すように変更するなど。

スクリプト間のやりとりは構造化テキストデータなので JSON にしたんだけれど、若干これでいいのかなぁ感はある。テキスト形式だし最近の主流フォーマットではあるんだけれど、それでもシェルから見ると複雑な形式な気がするんだよね。でもあと軽量な構造化テキストフォーマットだと YAML ぐらいかなぁ。

[ 6月16日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・PO をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.05306s / load averages: 0.40, 0.38, 0.34
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker