以下で公開していたソースに「つぶやき」の中に「¥”」という文字を含めることで任意のコマンドが実行できるというセキュリティホールがありました。現在既に修正していますが、万が一すでに試した方は、以下のソースをもとに修正願います。
  • 15行目のダブルクォーテションをシングルクォーテションに変更しました。
  • 49行目の正規表現を修正しました。

ご迷惑をおかけしてすいません。

はじめに!!

以下はMacOSX限定です。
さらに、初めのうちはかなり笑えますが、それ以上のものは得られません。役にも立ちません。

一回目はかなり笑えます。そこだけは保証します。

このスクリプトは?

タイムラインから「つぶやき」を取得して音声で読み上げます。
音声は女性の声ですが、かなり棒読みです。

ところどころ改善の余地はありそうなのですが、それは皆さんにお任せします。

動作環境

  • MacOSX 10.5以上(開発は10.6で行いましたが10.5でも動作するはずです。)
  • Perlおよび以下のPerlモジュール
    • Net::Twitter::Lite
    • XML::DOM
    • LWP::Simple
  • Yahoo日本語形態素解析APIを使用していますので、アプリケーションIDの取得も必要です。
  • SayKana

インストール方法

1)まずはじめに、SayKanaをダウンロードしてインストールしてください。
インストール後は、ドキュメントに従って音声が出力されることをご確認願います。

2)以下のPerlモジュールをインストールしてください。

  • Net::Twiter::Lite
  • XML::DOM
  • LWP::Simple(これはプリインストールかもしれません。)

私の環境では、CPANシェルで問題なくインストールできました。

3)以下のソースをデスクトップ等に設置して、パーミッションを755にしてください。

3)twitterアカウントのアカウント名およびパスワードを12行目および13行目に入力してください。

4)YahooアプリケーションIDを取得して15行目に記述してください。

ソース

#!/usr/bin/perl -wT

undef %ENV;

use strict;
use Encode;
use LWP::Simple;
use Net::Twitter::Lite;
use XML::DOM;

my $twt_user = '';
my $twt_pass = '';
my $yahoo_id = '';
my $api_url = 'http://jlp.yahooapis.jp/MAService/V1/parse?appid=%s&sentence=%s&results=ma';
my $saykana = "/usr/local/bin/saykana '%s'";

my $twt = Net::Twitter::Lite->new(
 username => $twt_user,
 password => $twt_pass
);

my $r = $twt->friends_timeline();

my $n = 0;
foreach (@$r) {
 my $txt = encode_utf8($_->{'text'});
 my $url = sprintf($api_url, $yahoo_id, &enc($txt));
 my $xml = get($url);
 my $kana = &xml2kana($xml);
 print $kana."\n";
 system(sprintf($saykana, $kana));
}

sub enc($) {
 my $str = shift;
 $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
 $str =~ tr/ /+/;
 return $str;
}

sub xml2kana($) {
 my $xml = shift @_;
 my $parser = new XML::DOM::Parser;
 my $doc = $parser->parse ($xml);
 my $list = $doc->getElementsByTagName('reading');
 my @kana;
 for (my $i=0; $i<$list->getLength; $i++) {
 my $text = $list->item($i)->getFirstChild->getNodeValue;
 $text =~ s/'//g;
 if ($text =~ /^[0-9]+$/) {
 $text = "<NUMK VAL=".$text.">";
 } elsif ($text =~ /^\s+$/){
 $text = ',';
 }
 $text =~ s/\//\\\//g;
 push @kana, $text;
 }
 return encode_utf8(join("/", @kana)).",,,";
}

その他

  1. 空白はコンマに変換して一瞬だけスリープが入るようにしています。
  2. つぶやきとつぶやきの間にはコンマを3つ挿入して長めのスリープが入るようにしています。
  3. シングルクォーテションはsaykanaコマンドにおいてアクセントを意味する記号であることとセキュリティ上の配慮により削除しています。

本来は「。」であるが妥当なのですが、テキストエディタで本スクリプトを編集した際にsaykanaコマンドでエラーが出るため、半角の記号で代用しました。(UTF-8-MACによる問題と思われますが、くわしく検証していません。)

(追記)
よく考えたらUTF-8-MACは関係ないかも、いずれにしろJeditで「。」を入力した場合とvimで「。」を入力した場合で何かが違うみたい。(両方ともUTF-8なんですけど。)

ソースをご覧になるとわかりますが、別にtwitterじゃなくても別のものをしゃべらすのも、それほど難しくないので、適当にお楽しみください。

ライセンス

SayKanaおよびYahoo APIのライセンスは厳守していただけますようお願いいたします。

気に入ってくれた方は、ブログ等で紹介してくだされば、十分うれしい限りです。