このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
エクスポータという名前が付く以上、
データを何かしらの形でエクスポートしなければならない。
開発者にとっては、XML で出力すれば便利だろう。
XSLT なり DOM なり使って自由に操れるので。
でも、人が読むバックアップ用途としてみると、
XML なんて吐かれても使えねぇ。利用者としては
エクスポートした後も簡単に読めるようにしたい。
さて、どうしようか。
まず、1 日記 1 ファイルとすることにしよう。
俺みたいにアホ程日記を書いてると、
すべての日記を連結したサイズは馬鹿にならないからだ。
そして、出力形式に関しては HTML/XML を採用する。
全ての HTML/XML 吐かせるのは無駄になるので、
あらかじめテンプレートを外部に用意しておき、
テンプレートの中の決められた部分に、
日記のタイトルや本文が埋め込まれて出力されるようにする。
例えば、以下のようにテンプレートを作っておく。
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$title</h1>
<p>$date</p>
<p>$body</p>
</body>
</html>
$title などが実際の内容に置き換わるってわけだ。
さて、この場合スクリプトは引数を受け取って処理する必要がある。
コマンドラインのパラメータについても決めておこう。
WScript には引数を自動的に処理してくれる仕組みがある。
WScript は Windows 流の引数を扱うので、
名前つき引数 / で始まり、値は:の後に続けて入力する。
/user:メールアドレス
/password:パスワード
/template:テンプレートファイル名(省略可能)
出力フォルダ
こんなものかな。
出力フォルダは名前のない引数で直接指定する。
名前のない引数は、基本的に省略せず、
コマンドにとって主要な情報を渡す用途として利用する。
「エクスポート」コマンドなので、「出力先」が主要引数だ。
そして、メールアドレスとパスワード、テンプレートは、
名前つき引数を使って入力させることにしよう。
名前つき引数は、一般的には省略可能な引数だ。
テンプレートを省略した場合は既定のものを使う。
今のところは Cookie の管理をしていないので、
メールアドレスとパスワードは省略できないのだが、
まあ、名前つき引数にしておくことにしよう。
名前のない引数が増えると分かりにくくなるしね。
では、引数の処理を行うコードを書いてみる。
========== Main.js ==========
function showErrorAndExit(message) {
WScript.StdErr.WriteLine(message);
WScript.Quit(1);
}
function main() {
// 名前なし引数
var unnamed = WScript.Arguments.Unnamed;
// 名前つき引数
var named = WScript.Arguments.Named;
// /? でヘルプ
if (named.Exists("?")) {
WScript.Arguments.ShowUsage();
WScript.Quit();
}
// 引数チェック
if (unnamed.length < 1 || unnamed.Item(0) == undefined
|| unnamed.Item(0).length == 0) {
showErrorAndExit("エクスポート先のフォルダが指定されていません。");
}
var folder = unnamed.Item(0);
if (!named.Exists("user") || named.Item("user") == undefined
|| named.Item("user").length == 0) {
showErrorAndExit("メールアドレスが指定されていません。");
}
var user = named.Item("user");
if (!named.Exists("password") || named.Item("password") == undefined
|| named.Item("password").length == 0) {
showErrorAndExit("パスワードが指定されていません。");
}
var password = named.Item("password");
var template = "default.html";
if (named.Exists("template")) {
template = named.Item("template");
if (template == undefined || template.length == 0) {
showErrorAndExit("テンプレートのファイル名が指定されていません。");
}
}
WScript.Echo("user: " + user);
WScript.Echo("password: " + password);
WScript.Echo("template: " + template);
WScript.Echo("folder: " + folder);
}
main();
========== end of Main.js ==========
これで、以下のようにコマンドを実行できる。
$ MixiExporter.wsf my-diary /user:mail /password:foo
user: mail
password: foo
template: default.html
folder: my-diary
一般的にWindows のコマンドは、/? でヘルプが出るが、
wsf はコマンドのヘルプを表示するための、
特別なサポート構文がある。
========== MixiExporter.wsf ==========
<?xml version="1.0" encoding="shift-jis" ?>
<job>
<runtime>
<description>mixi の日記をエクスポートします。</description>
<example>利用例: MixiExporter.wsf "my-backup" /user:mailbox@example.com /password:foobar</example>
<unnamed
name="folder"
helpstring="エクスポート先のフォルダ。"
many="false"
required="1"
/>
<named
name="user"
helpstring="mixi アカウントのメールアドレス。"
type="string"
required="true"
/>
<named
name="password"
helpstring="mixi アカウントのパスワード。"
type="string"
required="true"
/>
<named
name="template"
helpstring="出力に使用するテンプレートのファイル名。"
type="string"
required="false"
/>
</runtime>
<script language="javascript" src="./lib/XMLHttpRequest.js" />
<script language="javascript" src="./lib/HttpUtil.js" />
<script language="javascript" src="./lib/MixiError.js" />
<script language="javascript" src="./lib/MixiSession.js" />
<script language="javascript" src="./lib/MixiDiaryEntry.js" />
<script language="javascript" src="./lib/MixiDiary.js" />
<script language="javascript" src="./Main.js" />
</job>
========== end of MixiExporter.wsf ==========
こういう風にタグを書いておけば、
WScript.Arguments.ShowUsage() を呼び出すことで、
wsf の内容に基づいて、標準出力にヘルプが表示される。
$ MixiExporter.wsf /?
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
mixi の日記をエクスポートします。
使い方 : MixiExporter.wsf folder /user:値 /password:値 [/template:値]
オプション :
folder : エクスポート先のフォルダ。
user : mixi アカウントのメールアドレス。
password : mixi アカウントのパスワード。
template : 出力に使用するテンプレートのファイル名。
利用例: MixiExporter.wsf "my-backup" /user:mailbox@example.com /password:foobar
よし、外枠は整った。