MacがsayするCGI

Mac上で、Apache+CGIを動かして、外部から特定のURLにアクセスが来たら、そこで渡された文字列をsayコマンドに渡してMacから音声を出す、そんなことがやりたくて、作ってみた。まあ作ったってほどじゃない。

MacCGIを動かす方法と一緒にメモ。

以下の「nacookan」のところは各自のOS Xユーザ名に置き換えてね。

sayコマンドの用意

上記に書いたけど、あらためてMountain Lionに合わせて言うと、

  1. システム環境設定
  2. 音声入力と読み上げ
  3. テキスト読み上げ
  4. システムの声
  5. カスタマイズ
  6. 「日本語(日本)」のところにある「Kyoko」を選択
  7. 「インストールしますか?」と聞かれたらインストールする
  8. システムの声
  9. 「Kyoko」を選択

CGIスクリプトの用意

ここからはターミナルの作業。

$ mkdir ~/Sites
$ touch ~/Sites/.localized
$ mkdir ~/Sites/say
$ vi ~/Sites/say/say.cgi

viで以下を記述。

#! /usr/bin/env ruby

require "cgi"

cgi = CGI.new
message = cgi['message'].gsub(/'/, '')
system "say '#{message}'"
cgi.out("text/plain"){ message }

viを終了させて、以下。

$ chmod +x ~/Sites/say/say.cgi

おわり。

Apacheの用意と起動

$ sudo vi /etc/apache2/users/nacookan.conf

viで以下を記述。

<Directory "/Users/nacookan/Sites/say/">
	AddHandler cgi-script cgi
	Options MultiViews ExecCGI
	AllowOverride none
	Order allow,deny
	Allow from all
</Directory>
$ sudo apachectl start

Lionまでは、システム環境設定→共有→Web共有で内蔵Apacheの設定ができたんだけど、Mountain Lionでは項目が消えたのでターミナルからやってるわけだ。Apache自体が消えたわけではないんだけどね。

使ってみる

ブラウザのアドレスバーに、「http://(MacのIP)/~nacookan/say/say.cgi?message=テストです」と入れてみる。

Kyokoさんの声(日本語版Siriでおなじみの声)で「テストです」って読み上げられるはず。

どう使うか

自分は、サーバー用途で稼働しているMac mini上でこのCGIを動かしている。別なLinuxサーバーで動いてるJenkinsが、svnへのコミットを検知して自動でビルド&テスト環境デプロイをするようになっていて、それが終わったタイミングでこのURLを叩いてMac miniから音声で通知されるようにしている。

他にも、まあ何か通知が必要なことがLAN内で発生したときに、このURLにメッセージを渡すだけで音声でお知らせしてくれるので、いろいろ使えると思う。

ログとかを監視して何か見つけたときにお知らせとか。天気予報や時報とか。

心配なこと

OSコマンドインジェクションの脆弱性大丈夫なのかな?シングルクォートは消したけど、これだけでいいのかよくわからない。いいやり方あるなら教えて欲しい。

まあ用途的に、広くインターネット上に公開しても仕方ないと思うので、どうせLAN内だけで使うことになると思う。