チャットサポートを構築する (その1)

【2018年4月20日追記】この記事は内容が古くなっている部分があります。「あらためてチャットサポートを構築する」もご覧ください。【追記ここまで】

ずっと頭の片隅にあっていつかはと思っていた話題ですが、あたためすぎて腐ってしまった感なきにしもあらずです。何しろ自分でプログラムを書くほどの能力がないので、道具が出揃うのを待っているうちに随分時間が経ってしまいました。

「チャットサポート」というものについて考えてみます。Wikipedia の記述をそのまま引用しますが、

文字通り、チャットによるサポートであり、閲覧中のWebページ内のチャットボタンをクリックするだけでリアルタイムに Web サイト運営者のサポートをリアルタイムに受けることが出来るシステム。……英語ではLive Chat Supportと呼ばれることが多い。

というものです。アメリカのネット通販サイトなどではよく目にしますが、日本ではあまり見かけません。それでも「チャットサポート」で検索すると、日本(語)でもそのようなサービスを提供するところが増えてきているようです。

しかし大手の販売サイトならともかく、月に数回程度の利用しかないと想定される規模では、月額数千–数万円のサービス料金がメリットに見合うとは、あまり思えません。

そこですべてオープンソースの個々の汎用アプリケーションを組み合わせて、無料でこの仕組みを構築することを考えてみました。プログラムを書く能力があれば自分で作れるのでしょうが、それができないために、あちこちのソフトを組み合わせることになりました。

基本はチャットですから、XMPP を使います。このプロトコル自体がオープンであり、Skype や LINE や twitter などとは異なります。

すべてオープンソースの組み合わせで構築すると

  • 費用が発生しない
  • 独占企業の都合によるサービスの変更や停止ということがない
  • 個々のアプリケーションを取り替えられる
  • カスタマイズできる
  • サーバーも自分で管理すれば他者を経由しないので情報の流出の不安がない

などのメリットがあります。

もちろん逆に、一定の労力が必要だったり、汎用アプリのため洗練されていないなどのデメリットもあります。

通常のチャットでは、話者のそれぞれが XMPP のアカウント(JIDといいます)を持ち、互いに相手先を名簿に登録しており、それぞれ手元の端末にインストールするなりした XMPP のアプリケーションを使って、サーバーを介して会話します。「チャットサポート」の場合、サポートする側(問い合わせを受ける側。以下、便宜的に「窓口側」と呼びます)は別として、一度きりかもしれない問い合わせを行う側(以下、「客側」と呼びます)に、そのためにアカウントやアプリケーションを用意してもらうことは非常に難しいでしょう。

Converse.js

まず XMPP クライアントアプリケーションですが、JavaScript で書かれたものをウェブページに設置することで、そのページにアクセスするだけで利用できるようにします。これで、客側が事前にアプリケーションをインストールしなければならないということがなくなります。

Converse.js というものを見つけました。2014年初頭現在、活発に開発されているようです。多言語化されているようですが、日本語はまだ対応していなかったので、翻訳して作者に送ってみました。この時点で日本語での情報はほとんどなく、見つけたのは「Ejabberd+Apache mod_proxy+converse.jsでXMPP(BOSH)なチャット環境を作ってみた」でした。

さて、マニュアルに従って設置してみます。<head>内に CSS と本体の js を読み込むように書き、またページ後半に初期設定を記した <script> を書きます。ここまでは簡単で、そのまま Converse.js が使えるようになりました。

テストのページで実際に見てみるとわかるように、素のままでは普通の XMPP クライアントとかわりません。すなわち、自分のアカウント情報を入力し、相手先のアカウントを指定して会話を開始する、というものです。

長くなりそうなので、この項続く

2013年に読まれた記事トップ10

流行っているみたいなので、自分のところでも見てみました。Jetpack のサイト統計情報の1年分です。

2012-12-31 to 今日

  1. gdm でのシャットダウンの禁止 (2007年10月)
  2. GNOME でのシャットダウンの禁止—最近の流儀 (2011年6月)
  3. 2台所有する自動車の1台を手放すとき、保険は等級の高いほうを残すことができる (2013年2月)
  4. WordPress 3.6 日本語版 (2013年8月)
  5. WordPress: フィルターより前にショートコードを実行させる (2013年3月)
  6. wp-login.php への攻撃に対処する (2013年9月)
  7. 公開 Jabber/XMPP サーバー (2011年7月)
  8. 日本語スタイルガイド項目別比較一覧表 (2012年3月)
  9. ja.po のコメント欄に見る WordPress 日本語版の歴史 (2013年5月)
  10. Jabber と WordPress (前編) (2010年11月)
  11. Firefox に新しいプロトコルを教える (2012年2月)

1位の記事はとても古くて、そこから誘導している改訂版みたいな内容が2位なので、これらは実質同じもの。この情報は公式に近いところに見られないのでこちらに来ているのでしょうか。こういうちょっとした設定をしたいのにとてもわかりにくい GNOME の傾向はなんとか変わってくれないものかと思います。

3位の自動車保険の話も、意外と他所では見つけにくい情報なのでしょう。

4位の WordPress 日本語版リリースリーダーの話は、twitter や facebook で広めてもらった(自分の記事としては)ようです。

5位は、いまこのリストを見て自分でも意外でした。これも他所にはあまりない情報なのかなあ。

7位と10位は古い記事ですが、Jabber/XMPP の情報は日本語ではとても少ないので、ここにたどり着くのでしょう。公開サーバー STEP.im をよろしくお願いします。

9位は、WordPress 10周年に寄せて書いたものです。

1位と2位が実質ひとつなので、11位まで掲載しました。

このブログを継続的に見ている人はたぶんほとんどなく、検索でその記事だけ単発にたどり着くのが大部分だと思っています。あたりまえのことですが、他所にない情報がよく見られているということですね。来年もそんな記事をいくつか書ければと思います。

WordPress からのほぼすべての通知を XMPP で送信するプラグイン wp_mail to XMPP

先日、WordPress のフォーラムの話題に触発されて、「コメントが来たことをメール以外で知らせる方法」という記事を書きました。

そのあともう少し一般的に考えてみました。WordPress から多くのメールが届きますが、そのほとんどは単なる「通知」で返信を要しないものです。つまりメールである必要はないのです。ということは、コメントがついた時だけでなく、WordPress からのすべてのメールを XMPP にしてもいいのではないか、と思いました。メールと XMPP は形式がとてもよく似ており、そのまま宛先を変えるだけでいいのではないか、と。

探してみたら、同じ目的の XMPP sender というものが既にありました。しかし中を見てみると古くて、メンテナンスもされていないようです。また、完全に wp_mail() を置き換えているので、条件によっては XMPP ではなくメールで送りたいと思っても応用が効きません。

WordPress からの通知は、更新・ユーザー追加・コメントなど発生源は種々あっても最終的には wp-includes/pluggable.php の中の wp_mail() によってメール発信が行われています。[1] wp_mail() を見てみますと、

function wp_mail( $to, $subject, $message, ...) {
	extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );
		...
		$phpmailer->Send();
}

という構造になっています。冒頭のフック ‘wp_mail’ は、たぶん送信先の追加や、subject(件名)や message(内容)に一律に何か加工するなどを想定されていると思いますが、その中で XMPP 送信を行ってしまえばいいと考えて、次のようなプラグインを作りました。

wp_mail to XMPP
Send almost all notifications via XMPP instead of email

https://github.com/mako09/wp-mail2xmpp にも置いてあります。

前の記事「コメントが来たことをメール以外で知らせる方法」でざざっと書いて示したプラグインは、その機能が今回のプラグインに完全に含まれますので、忘れてください。

なおこのプラグインは、別のプラグイン XMPP Enabled を利用していますので、それを先にインストールしてください。

きっかけとなったフォーラムの話題のように、複数の投稿作成者がいて誰かが投稿したことを他の作成者たちが知りたい、という場合には、投稿を通知するプラグイン(公式ディレクトリで “post notification” で検索すれば、いろいろ見つかります)、たとえば New Post Notification などをインストールしておけばいいでしょう。そのメール通知も今回のプラグインで XMPP に振り替えます。

wp_mail to XMPP の中身

このプラグインは2つのフックを備えています。

abort_xmpp_sender は、XMPP送信処理を中止するためのものです。たとえば「コンタクトフォームからの送信は、JID の有無に関わらず、メールで送信する」としたい場合、件名やヘッダなどで判定するフィルターを追加すれば、実現できます。

email_to_jid は、メールアドレスから JID に変換するフィルターを呼び出します。デフォルトでは、そのサイトに登録されているユーザーかつそのユーザーがJIDを設定している場合のみ、JID を返すフィルターを設定しています。たとえばコメントをつけた人が入力したメールアドレスのように、JID を見つけることができなければ、その人には XMPP 通知を出しません。このフックにさらにフィルターを追加して、たとえば JID があっても XMPP 通知を出さない人を設定する、あるいは逆に、JID が見つからない場合は管理者の JID に XMPP 通知を出す、などを実現できます。

これらの後に、JID があれば XMPP 通知を、JID がなければメール通知を行います。XMPP に送られる通知では、subject(件名)と message(内容)をそのまま用い、headers(ヘッダー)と attachments(添付)は送信せず無視しています。

オプションで、XMPP 通知を行ったユーザーにもメール通知を行うように設定することもできます。

おわりに

はじめてプラグインを公式に公開しようとしたら、実際に動作するコードの部分を書く時間の10倍くらいを、その周辺のことに費やしました。名前を決めること、コメントや readme を英語で書くこと、依存する別のプラグイン XMPP Enabled を国際化・日本語化して作者に連絡して取り込んでもらうこと……。いやはや、いい経験になりました。それでもコード自体にも英語にも自信がありません。おかしなところを見つけて知らせてもらえたらうれしいです。

  1. ただし Jetpack購読(subscription)は、実際には WordPress.com がメールを送信しているため、これに該当しません。

WWW 20周年(自分の中で)

今年は World Wide Web、20周年(3回目)だそうですが、自分の歴史の中でもちょうど20周年です。節目でもあるので、覚えていることを書いておこうと思います。

インターネット歴史年表で1993年を見ますと、NCSA Mosaic が公開された年です。何しろこれから WWW という時代ですから、情報元は雑誌(UNIX MAGAZINE)と fjニュースグループでしたが、身近にいた人から直接聞いて、Mosaic の動いているさまを見せてもらったのが大きなきっかけでした。早速 Mosaic を手元のマシン(Sun SPARC Classic を使っていました)にインストールして、はじめて WWW に触れたのは1993年のちょうどいまくらいの季節だったと思います。確か匿名FTPサーバーというのが日本にいくつかあって(Archie というサービスで目的のソフトを探す)、そこからダウンロードしたんだと思います。いま思えば回線はかなり細かったはずです。

それで国立がんセンターの gopher サイトで気象衛星ひまわりの画像を見たり、NTT の「日本のWWWサーバー」(そう、その頃は日本中の「全リスト」が一覧できるくらいの数しか存在しなかったのです)を見ては新しいサイトを見にいったりしていました。

何しろこの年に HTML 1.0 が出たばかりだし、本もなにもありません。Mosaic には現在のブラウザと同様に「View Source」ができたので、簡単なページのソースを見て、真似しながら書いてみたりしたものです。<P> は段落の最後につけて、ほとんど改行という意味だったし(閉じタグ</p>はまだ存在していなかった)、箇条書きの<LI>などにも閉じタグはありませんでした。それにこのように大文字で書くのが習わしでした。それから自分のマシンに CERN HTTPd や NCSA HTTPd をインストールして試したりしていました。SunOS は当時たいへんポピュラーだったので、インストールは苦もなくできたのです。

年が明けて1994年、冬季オリンピックの公式ページが公開されていると知り、会期中よく見ていたのを覚えています。ノルディック複合などで日本勢の活躍が期待された大会で、いち早く結果を知っては周囲の人に見せびらかしていました。

個人がインターネットに接続できる状況(それもダイヤルアップ)になるのは、それからしばらく後でした。

オチもなにもありません。ただの思い出話でした。

ejabberd 2.1.11

Jabber/XMPP のサーバー ejabberd 2.1.11 がリリースされたようです。 今回は事前に「翻訳を送って」と連絡があったので、以前の版にずいぶん手を入れた日本語訳を同梱してもらいました。どれほどの人が日本語版を利用しているのかさっぱり不明ですけれども。

Gajim 0.15

XMPPクライアント Gajim の0.15 が公開されました。日本語化ファイルは大幅に見直したので、以前より隨分よくなったと思っています。お気づきの点がありましたら、メール mako(あっと)pasero.net または XMPP でも同じ形の mako(あっと)pasero.net までお知らせください。

Firefox に新しいプロトコルを教える

前の記事のようにして、WordPress の記事に xmpp: のリンクを書けるようになりました。しかし、それを読む側のブラウザが「そんなの知らん」と言っては役に立ちません。

手元の環境は Linux (Debian) 上の Firefox (Debian では Iceweasel という名前) ですので、それについて書きます。その他の環境については、wiki.xmpp.org に情報があります (ただし Firefox の例を見てもやや古い情報のようです)。

ブラウザ

Firefox について、mozillaZine の Register protocol を参考にしました。

  1. ロケーションバーに about:config と入力します。
  2. 右クリック→新規作成→真偽値 とします。
  3. 「設定名」を network.protocol-handler.expose.xmpp とし、値を false とします。
  4. 次にこの xmpp: のリンクをクリックしたときに、どのアプリケーションでこのリンクを開くか、聞いてきます。これはあとで 編集→設定→プログラム のところで変更できます。

Chromium (Chrome) については、常用していないので詳しくありません。ヘルプを見ると、設定→高度な設定→コンテンツの設定 の「ハンドラ」あたりでどうにかするのでしょうか。

XMPPクライアント

ところで、この方法ではアプリケーションに URL が渡されるのですが、それを受け取って開きながら起動できる XMPP アプリケーションを2つ紹介します。

ひとつは Gajim です。ただし gajim-remote handle_uri %s という形で呼び出すのですが、Firefox から URL 以外の引数を渡せないようなので、ラッパーを介することにしました。

もうひとつは、ウェブアプリの Jappix です。Jappix の オプション→一般→XMPPリンク の「JappixでXMPPリンクを開く」をクリックすると、Firefox の、どのアプリケーションでこのリンクを開くかという選択肢に Jappix が入ります。