特集 ニュース コラム Plug-in・カスタム関数 関連製品・サービス 書籍
活用事例 コミュニティ・リンク 人材募集
 
Perlモジュールを活用してFileMakerProからblogを更新する

はじめに

 先日、ある友人が掲示板に「FMProでつけている日記をblogにアップしたいんだけどなー」という書き込みをしていました。その人がやりたい事はblogの原稿をFileMakerProのデータベースに書きためて、「公開」ボタンを押した時にmixiの自分の日記に公開される仕組み作りでした。なかなか面白い考えですよね。でもここで問題点が。そう、「FileMakerProのレイアウト上のボタン一つでいかに日記のレコードをblogサイトにアップロードさせるか」です。標準のFileMakerProには当然そこまでの機能はありません。それでは、どういう方法が考えられるでしょうか。いくつか選択肢があります。例えば

     
  1. メールで更新  
  2. URLエンコードした文字列をつなげてblogサイトにアクセスさせる  
  3. 外部のプログラムを作る
とか。うん、3つも案が出ればまずはいいでしょう。これらを検討してみる事にします。あ、一応OSはMacOSX、更新したいblogはmixiの日記を想定しています。mixiというのは最近流行のソーシャルネットワークシステムの一つでインターネットを利用した「閉じた」ネットワークです。詳しくはmixiを読んでみて下さい。

案1

  まず案1ですが、これは例えば「メールのタイトルがblogのタイトルで本文一行目がユーザ名やパスワード、二行目以降が日記本文」というフォーマットであるアドレスにメールすると、あとはblogサーバ側で更新するといった仕組みです。これならSMTPitを使うとすぐ作れそうですね、SMTPitについてはfmpro.jpに使い方も載ってますし。
 でもこれだとメールから日記を更新する仕組みを提供している場合にしか使えないという欠点があります。参考までに対応しているblogシステムとしてはMovableTypeやsb、COREBlog、ココログ、はてなダイアリーといったblogシステムが対応してます。

案2

 では2番目。これはgetメソッドを使ってURLに各種パラメータをセットして送信する方法です。Googleで検索したあとのURL等がそうですね。この方式の方がメールで送るよりは対応するblogシステムが多そうですが、あまり長い内容だとGETメソッドの256バイト制限に引っかかってしまいます。

getで情報を渡す例:
http://servername/cgi.cgi?field1=value&field2=value2.....

案3

 そして最後の案、外部のプログラムを作るという案です。外部プログラムといってもCodeWarriorを使ってCやC++でプラグインを書いて、なんていうのは論外。個人ユースでそんなにパフォーマンスを気にする事も無いのでスクリプト言語が簡単でいいですね。幸いMacOSXにはスクリプト言語のPerlが標準で入っています。このPerlは様々なモジュールを使用する事により少ない労力で非常に多彩な機能を実現できます。今回も試しにGoogleで「Perl フォーム 自動 モジュール」で検索したところ、一番上にWWW::Mechanizeモジュールの日本語ドキュメントのページがあるのでチェックします。・・・・・・すばらしい。とりあえずSynopsisを読むと

WWW::Mechanize、あるいは縮めてMechはWebサイトとのやりとりの自動化を助けます。これはリンク先やフォームデータの送信を含む、複数のページの取得をサポートします。取得したページはそれぞれ解析され、そのリンクやフォームが抽出されます。リンクやフォームを選択し、フォームを埋め、次のページを取得することが可能です。Mechは訪れたURLの履歴を保持しますので、これを問いあわせたり再訪することも可能です。(上記リンク先より引用)
とあります。まさに今回の用途にぴったりなPerlモジュールです。しかも上記のページにはmixiへの投稿用サンプルスクリプトまで用意されています。これを使えばすぐにでも実現できる、という訳で今回は

 FMPro→日記データ書き出し→アップロード用Perl起動用シェルスクリプト実行→アップロード用Perl実行

という方法でFileMakerPro上の日記のmixiへの投稿を実現してみたいと思います

Perlモジュールをセットアップする

 今回はPerlのモジュールをインストールしなければいけないのですが、今回初めてCPANモジュールのインストールをされる方は、事前に必ずお使いのMacにXcodeToolsがインストールされている事を確認して下さい。もしインストールされていない場合は事前にインストールしておいて下さい。最近のMacなら本体に同梱されていると思いますが、もし手元にCD-ROMが無いようでしたら右上のリンクからAppleDeveloperConnectionに入ってXcodeTools(v1.5)をダウンロードして下さい。なおADCは登録制です(無料)。
 さてさて、XcodeToolsはインストールできたらモジュールのインストールです。今回はWWW::Mechanizeというモジュールをインストールします。方法は以前のコラム『フリーなツールを使ってメールをFMProに取り込んでみる[前編]』や解説しているサイトを参考にして下さい。
 インストールが終わったら一応確認です。ターミナルで下記のコマンドを実行してみて下さい。
%perl -MWWW::Mechanize -e 'print $WWW::Mechanize::VERSION,"\n"'
実行後「1.10」等というバージョン名が出たらモジュールは正常にインストールできています(表示されるバージョンナンバーは2005/02/22現在)。

サンプルデータベース「SAMPLE.fp7」

 今回のサンプルデータベースはページ右上のリンクからダウンロードして下さい。中身は単にタイトルと本文しかフィールドがないデータベースです。テーブルも一つです。このデータベースはタイトルと本文をそれぞれのフィールドに記録し、「書出」「アップロード」のスクリプトで下記のような処理を行っています

  • スクリプト「書出」でタイトルと本文をそれぞれファイル名をsub.txt,body.txtに、文字コードをShiftJISで書き出す。書き出す際には日記本文の改行を<<CR>>という改行マークに置き換えた「本文書き出し用」というフィールドを書き出しています。これはFileMakerProがテキストを書き出す際の改行に垂直タブをインストール
  • スクリプト「アップロード」でAppleScript経由で後ほど紹介するシェルを起動します。このスクリプトステップで記述されているAppleScriptは
    tell application "Finder"
    do shell script ("/<ここを絶対パスにする>/diary_up.sh")
    end tell
    
    
    です。
 今回FileMakerPro側では特別な事はしていません。しいて言えばAppleScriptを実行しているというところでしょうか。それでもたった3行なので、「おまじない」だと思って入力してみて下さいね。それとWindowsをお使いの皆さんはこの部分をうまく「Eventを送信」等で置き換えてあげる必要があります。

サンプルシェルスクリプト「diary_up.sh」

 ここではDBから書き出されたファイルをiconvコマンドを使って文字コードをEUCにしてからPerlスクリプト「mechanize_sample.pl」を起動しています。お使いになる際はスクリプト中の<絶対パス>を書かれた部分をご自分の環境に合わせて書き換えて下さい。なお、このファイルとPerlスクリプトの文字コードはEUCで保存されています。iconvコマンドは便利です。以前のコラムではnkfをインストールして使いましたが、こちらの方がデフォルトで入っていてお手軽ですからね。今回はShift-JISからEUCに文字コードを変換したかったので、
/usr/bin/iconv -f SJIS -t EUCJP /<絶対パス>/body.txt > /<絶対パス>/diary_body.txt
/usr/bin/iconv -f SJIS -t EUCJP /<絶対パス>/sub.txt > /<絶対パス>/diary_sub.txt
というコマンドを打ちました。 -f オプションが元のファイルの文字コード、 -t オプションが変換したい文字コードです。あとはリダイレクトで別ファイルに書き込んであげるだけ。このiconvコマンドはこれ以外にもかなりの種類の文字コードに対応しているので、ターミナルでの %iconv -l の実行結果や、インターネットで調べてみて下さい。

サンプルPerlスクリプト

 先ほどインストールしたPerlモジュール、WWW::Mechanizeを利用してmixiへの日記投稿スクリプトのサンプルを公開されている、塚本さんという方がいらっしゃいます。下記URLでサンプルが確認できます。

WWW::Mechanizeモジュールを使ったmixiへの投稿スクリプト
今回同梱したスクリプトは上記を参考にファイル読み込み部の修正やコマンドラインで実行する際に必要なメッセージ表示部、エラー時の処理部分を削って単純にしたものです。やっている事は「ページにアクセス」→「フォームにユーザ名とパスワード入力」→「ログインボタンクリック」→「日記ページへのリンクをクリック」→「タイトルと本文を入力」→「確認画面に移動」→「作成」という日記作成時の画面の移り変わり(遷移)を人間の代わりにPerlが行っているのです。その際に必要になるのが最初にインストールしたWWW::Mechanizeというモジュールなのでした。例えば指定したURLにアクセスするのは
my $response = $mech->get( $url );

でログイン作業は
$mech->form_number(1);
$mech->set_fields('email' => $mail, 'password' => $pass);
$response = $mech->submit;

です。間単に上記4行を解説すると、$mech->get($url)で指定したWebサイトにアクセスします。次に$mech->form_number(1)でWebページの最初のフォームを選択後、$mech->set_fields()メソッドで値を入力しています。今回はemailというなまえのテキストボックスにメールアドレスを、passwordというテキストボックスにはパスワードをそれぞれ入力しています。そして最後に$mech->submitでログインボタンをクリックする、という訳です。
 他にも $response = $mech->follow_link(url_regex => qr/list_diary.pl/i); という行がありますが、これは現在アクセスしているページの中にあるリンクのなかから「list_diary.pl」という名前のリンクを探してあったらそこをクリックします。もしlist_diary.plへのリンクが複数あった場合は最初に引っかかったlist_diary.plへのリンクをクリックした事になります。  こんな感じで普段私たちがマウスやキーボードで行っているのと同じ作業をPerlが代行してくれているのです。WWW::Mechanizeにはもっといろいろな機能があるので、ぜひ一度ドキュメントを読んでみて下さい。面白いですよ。

実行

 さて最後に今回のサンプルを実行してみましょう。実行方法は簡単です。例えば各ファイル(DB、書き出されるファイル、シェルスクリプト、Perlスクリプト)を同じディレクトリに置くようにして(デフォルトではそのように想定しています)、SAMPLE.fp7で「書出」「アップロード」のスクリプトを順に実行して下さい。しばらくマウスポインタが実行中のままになりますがしばらくすると終わります。後はブラウザでmixiの自分の日記ページを見て下さい。どうですか?日記が増えているでしょう?
 これでめでたく日記をFileMakerProデータベースで管理できるようになりました。

・・・・ いかがでしたでしょうか。多分「何、これ?」といった事が多いのではないかなと思います。まず一番最初のハードルはPerlモジュールのインストールですね。次はPerlスクリプトでしょう。最初は暗号のように感じられるかもしれませんが、そのハードルを越えるだけのメリットをPerlやシェルやその他スクリプト言語は提供してくれます。今回の例も別にmixiにしか使えない訳ではありませんので、Perlスクリプトを実際の画面遷移と同じようにする事ではてなや他のblogシステムにも反映できると思います。そのうちここでこっそりアップロードするかもしれません??  最後に、今回のように「こんな事できないかなー」というような事があったらサイトの感想を含めメールをいただければ嬉しいです。それでは今回はこの辺で。

[2005/03/01]
[有限会社ジェネコム 給前悟郎]

◆関連リンク

FMPro.jpについて |  利用規約 |  ポリシー |  お問い合わせ