> >

 |  tomori_icon  | 
 |  category_icon  | 

2004年07月14日 (水)

CategoryImagencftpput を利用して RSS を自動でアップロード

ここ数日 iBlog Spy に刺激されて、 FTP に自動で RSS ファイルをアップロードする方法を模索しておりましたが、漸くうまく行ったのでメモエントリ。

[同日一部修正]

【前置き】

そもそも iBlog が日本語環境でも適切な RSS ファイルを出力してくれれば問題はないのですが、現状では iblogPatcher に頼らざるを得ません。ところが iblogPatcher は元々は .Mac 用に開発された物なので、現状では FTP に対応していません(【参考リンク】公開先が FTPサーバのときの iBlog とiblogPatcher 利用方法)。今まではこの Blog を設置しているロリポップに FTP でパブリッシュした上で、ローカルにもパブリッシュファイルを書き出し、そこに iblogPatcher の PublishAfter を適用、以前紹介した FTP mini に修正された rss.xml をドラッグドロップしてアップロード、と言う作業を毎回行っていました。

そこで今回 NcFTP Software という Terminal から利用するクライアントソフトを利用して自動化してみました。元々 Mac OS X には ftp と言うコマンドが用意されていますが、これだと機能が限定されていて、自動でログインなどが出来ない模様。じゃあ ncftp だと出来るのかと言うと、これもちょっと情報が錯綜していていささか往生しましたが、 ncftp に含まれる ncftpput と言うコマンドを利用する事で可能になりました。以下、手順です。

【 NcFTP のダウンロードとインストール】

まず上記 NcFTP の本家サイトのダウンロードページからダウンロードします。 Mac OS X 用のインストーラも有りますので、難しい事は何も有りません。 中段辺りの Download NcFTP Client と有る下の 「Mac OS X 10.3」と言うリンクをクリックしてダウンロード、インストールします。

【コマンドラインの書式】

これはインストール後に Terminal で ncftpput と入力し return する事で見る事が出来ます。またこのモードから抜ける場合は Q キーを押すと普段のプロンプトに戻ります。

(mode1) ncftpput [flags] remote-host "remote-directory" "local-files..."
(mode2) ncftpput -f login.cfg [flags] remote-directory "local-files..."
(mode3) ncftpput -c remote-host "remote-path-name" < stdin

僕は2番目 (mode2) の方法を用いましたので、これを例に説明します。

【 login.cfg を作成する】

login.cfg とは FTP ホストにログインする為のホスト、ユーザ名、パスワードを記述した設定ファイルです。 mi 等のテキストエディタで改行コードを LF にしたテキストファイルを以下のように作成します。

host (FTPホスト)
user (ユーザ名)
pass (パスワード)
これをホームフォルダ直下に「login.cfg」として保存します。

次にこれが外部から閲覧されないようにパーミッションを設定します。但し、外部からホームフォルダにアクセス出来ない環境である場合、この限りでは有りません。ここは飛ばしてしまいましょう。
  Terminal に以下をタイプして return します。

chmod 700 ~/login.cfg

【実行コマンドライン】

次に Terminal に入力するコマンドラインです。普通にホームフォルダにいる状態のプロンプトに続けてタイプして動作しますし、これを元にコマンドファイルを作るのも手でしょう。
 僕の環境を例に記述します。赤字は任意の文字列ですので、環境に合わせて変更して下さい。

ncftpput -f login.cfg -a /iblog "~/Sites/publish/iblog/rss.xml"

これだけだと何なので、一応各コマンドの意味を説明しておきます。

  • ncftpput : ncftpput を呼び出す。
  • -f : 続いて記述されるファイルを読み出し、 FTP 接続を実行する option (この場合は login.cfg )。
  • -a : ASCII モードで転送する。これは多分不要なんじゃないかと思います。特に他に付け加える option (flags) が思い浮かばなかったので、取りあえず入れてみました(^^;
  • /iblog : リモート(接続先)のディレクトリを指定する。 FTP ホストは login.cfg に記述していますので、それに続くディレクトリを指定します。
  • "~/Sites/publish/iblog/rss.xml" : ローカルのアップロードしたいファイル。これは僕が iBlog からパブリッシュ時にローカルに吐き出させ、 iblogPatcher を適用している RSS ファイルです。パスの前後はダブルクォートで括ります。

【自動化の方法とアップルスクリプトでのスクリプト例】

最後にコマンドの入力を自動化する為に iBlog Spy をちょこっと改造しました。本当はコマンドファイルを作成して、 iblogPatcher の PublishAfter 時に OPEN_FILES.plugin を用いて呼び出す方がスマートな気もするのですが、なぜか僕の環境では Finder 、若しくは iblogPatcher から呼び出した(要は Terminal への open コマンド)場合、コマンドファイルは連続して実行出来ません。なぜかアップルスクリプトからは連続してコマンドを実行する事が出来ます。一応例としてアップルスクリプトで Terminal にこのコマンドを渡して実行する例を書いておきます。

tell application "Terminal"
do script with command "
ncftpput -f login.cfg -a /iblog '~/Sites/publish/iblog/rss.xml'"
end tell

赤字は任意です。

これだけです。アップルスクリプトの場合、ターミナルに送るコマンドをダブルクォートで括る必要が有りますので、ローカルファイルのディレクトリはシングルクォートで記述しましたが、これでも問題なく動作しました。これをアプリケーション形式で保存して、 iblogPatcher から開く、と言う手も有ります。但し、この方法だといちいちアプリケーションとして起動してしまうので、ちょっと鬱陶しいです。そこで直接 iBlog Spy に記述してしまう事にしました。以下がその例です。

【 iBlog Spy を改造する】

まずは iBlog Spy を Script Editor.appで開き、 property を設定しました。

--START settings の行の
property ib_pub_cmd : "iblogPatcher --blog myblog.txt publish after"
の下に
property ncftpput_cmd : "ncftpput -f login.cfg -a /iblog '〜/Sites/publish/iblog/rss.xml'"
と追記
続いて Script Editor.app で「do script with command ib_pub_cmd」を検索します。その部分に続いて先程 property で設定したコマンドを呼び出すように追記します。具体的にはこうです。
tell application "Terminal"
activate
do script with command ib_pub_cmd
my wait_finish(now_pub_m_date, old_pub_m_date, target_pub_file)
do script with command ncftpput_cmd
my close_term()
end tell

赤字が追記部分です。
property に使用した「ncftpput_cmd」は何でも構いません。

以上で完成です。これで漸く FTP 環境でも iBlog を2クリックでプレビュー→パブリッシュが完了するようになりました。長い道のりだったぁ〜〜(^^;
[同日修正] ken_taka さんに「ちょっと冗長かも」とご指摘いただいて、上記スクリプトの改造個所を変更しました。ありがとうございます。

【参照させて頂いたリンク】

【謝辞】

毎度初心者の質問に丁寧に答えて頂き、尚且つ、実験までつきあって下さった ken_taka さん、ありがとうございました。

Posted by at 10:17


▼1年前はこんなこと書いてました...▼