読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

離席中のチャットのログを自動でメール送信してくれるソフトの作り方

メール送受信 WSH/JScript コマンドプロンプト キー操作の自動化



本ブログでは,以前

を紹介した。


この2つを組み合わせて,「ある座標に書いてある文章を30秒おきにコピーして,定期的にメールで送信する」というWSHアプリケーションを作ってみる。


もしチャットウィンドウを開きっぱなしにしておけば,「離席中もチャットのログをメールでフォローできるソフト」として利用できる。


(1)メール送信の設定

コマンドラインでメール送信する方法 (リマインダシステムを3分で作ろう)」の記事を参考にして,smailをダウンロードし,送信用のGmailのアカウントを設定する。(ポート番号など)


smailの置き場所は,ここでは D:\dev\mail\smail-v4.09\smail.exe とする。

(2)マウスの自動操作の設定

私のサイト http://www.name-of-this-site.org/ から,「マウスを自動操作するDLL」をダウンロード。

置き場所は,ここでは D:\temp\MouseControll.dll とする。


そして,同じフォルダ上に下記のスクリプトを保存。(save_chat.js)

// チャットログを取得してメール送信します


// マウス位置をセット
var ws = WScript.CreateObject("WScript.Shell");
ws.Run("rundll32.exe MouseControll.dll,_SetMouseXY@16 800,400");
ws.Run("rundll32.exe MouseControll.dll,_LeftClick@16"); // ウィンドウがアクティブになる
WScript.Sleep(500);
ws.Run("rundll32.exe MouseControll.dll,_LeftClick@16"); // テキストカーソルをフォーカス
WScript.Sleep(500);


// 全コピペ
ws.SendKeys( "^a" );
ws.SendKeys( "^c" );
WScript.Sleep(500);


// コピペ内容を抽出
var ie = new ActiveXObject( 'InternetExplorer.Application' );
ie.Navigate("about:blank");
while ( ie.Busy )
{
	WScript.Sleep(300);
}
var str = ie.Document.parentWindow.clipboardData.getData( "text" );
ie.Quit();


// ファイルに保存
var file_to = "chat_log.txt"
var ForWriting   = 2; // 書き込み(上書き)
var fso_w = WScript.CreateObject( "Scripting.FileSystemObject" );
if( fso_w.FileExists( file_to ) ) // 以前のファイルがあれば削除
{
	fso_w.DeleteFile( file_to );
}
fso_w.CreateTextFile( file_to );
var txt_w = fso_w.OpenTextFile( file_to,   ForWriting );
txt_w.WriteLine( str );
txt_w.Close();


// メールで送信
ws.Run("D:\\dev\\mail\\smail-v4.09\\smail.exe -d -hsmtp.gmail.com -f送信用に使うメールアカウント@gmail.com -sチャットログ -FD:\\temp\\chat_log.txt 携帯のメールアドレス@ezweb.ne.jp");


// 完了(10秒後に自動的に消えるダイアログ)
ws.Popup("ログを送信しました。",10,"完了通知",0);

「メールで送信」のメールアドレスの部分は,2つとも自分のものに書き換える。


そして,IEの設定を変更。

ツール>インターネットオプション>セキュリティ>インターネット>レベルのカスタマイズ>スクリプトスクリプトによる貼り付け処理の許可

の部分を「有効」にセット。(これは自己責任で行なってください。IE経由でのクリップボードへのアクセス時に,確認ダイアログが出なくなります。)



WSHで,IE経由でクリップボードの内容を読み書きする方法については,下記を参照。

WSH よりクリップボードを使う
http://frog.raindrop.jp/knowledge/archives/000824.html

Internet Explorer 7 におけるクリップボードへのスクリプト アクセスの既定のセキュリティ設定の強化
http://msdn.microsoft.com/ja-jp/library/bb250473.aspx

(3)定期実行の設定

チャットウィンドウが開かれた状態で,(2)のスクリプトが定期的に実行されればよい。

save_chat.js と同じフォルダ上に,次のバッチを保存。(save_chat.bat)

:start

rem チャットログを取得してメール送信
wscript save_chat.js

rem 一定時間待ちます
ping localhost -n 30 > nul

rem 最初に戻ります
goto start

30秒おきに(2)のスクリプトを実行するようにしている。(「30」の部分を書き換えれば時間を調整できる。)


そして,このバッチファイルへのショートカットを作って,デスクトップに保存する。

(4)実行してみる

試しに,Skypeのチャットウィンドウを開いてみよう。

ただしこの際の注意点として

  • チャットウィンドウはできるだけ大きく表示すること。(2)のスクリプトでは,マウスの座標を(左から800ピクセル,上から400ピクセル)の位置に移動している。ちょうどぴったりの座標でコピペが実行できるように,スクリプト中の座標の値や,チャットウィンドウを開いた時の大きさや位置を調整する。
  • チャットウィンドウを開いた状態で,デスクトップ上の,save_chat.bat へのショートカットがクリックできるようになっていること。(全画面に拡大してしまうとデスクトップは見えなくなってしまう。)


チャットウィンドウを開いたら,デスクトップ上の save_chat.bat へのショートカットをダブルクリックする。


下図のように,コマンドプロンプトが表示され,チャットログの自動送信が始まる。(マウスは動かさないこと。)



30秒おきに携帯にメールが届く。


以下は,手元の環境で「Skype自動音声テスト」とチャットした際に携帯に送られてきたメールのサンプル。

件名 チャットログ

本文

[17:39:15] (私の名前)の発言: hello
[17:39:20] (私の名前)の発言: お元気ですか
[17:43:08] (私の名前)の発言: あなたは通話テストなので何も話せませんね


もし前回のメール送信時以降の差分のみをメール内容に含めたいのであれば,(2)のスクリプトの部分で,過去の chat_log.txt と内容を比較するような処理を追加すればよいだろう。

補足

この記事は,下記の質問への回答として執筆させて頂きました。

http://q.hatena.ne.jp/1228458880

skypeでチャットを良く使うのですが、チャットだと離席していたりすると全ログを追うのが大変だったりします。

メールで自分が参加しているチャットの全ログを自分やMLに送るツールなどあったら教えてください。


なお,本稿で紹介したのはかなり強引な方法でしたが,Skype限定であれば Skype API を使ってもう少しまともなツールが作れるのではないかと思います。

Wikipediaの定義を教えてくれるチャットボットを作成しよう / Skype APIによるチャット機能の操作
http://itpro.nikkeibp.co.jp/article/COLUMN/20070928/283272/?P=3&ST=nettech