Python
FileMaker

TELWatcherの代替品を作ってみた(FileMakerで簡易CTIを無料で実現する方法)

かつてTELWatcherという製品がありました。

http://www.key-planning.co.jp/resource/product/twp/s_help/index.html

FileMakerで簡易CTIを実現するためのソフトウェアです。CTIというのは、電話がかかってきたときに、その電話番号に関する関する情報をコンピュータに表示する仕組みのことです。

TELWatcherの開発はかなり前に終了し、FileMaker 10までしか対応していません。しかし弊社ではつい最近までMac版のTELWatcherが現役で動いていました。当然ですがこれは無茶苦茶危険な行為です。

どうにかして最新のOSで今までどおりのCTI環境を実現できないかと考えて、TELWatcherの代替品を自分で作ってみることにしました。

TELWatcherはUSBでモデムやゲートウェイ機器と接続して電話番号を取得しています。
それほど複雑なことはしていないはずなので、USBから電話番号を取得する部分さえ解決すれば何とかなりそうだという予感はありました。

調査

まず、電話がかかってきたときにUSB経由でどんな情報が取得できるのか調査してみました。
弊社で使っているのは、一般の電話回線とIPネットワークを繋ぐVoIPゲートウェイ製品の一種です。
モデムやゲートウェイは、シリアル通信でATコマンドを使って制御できるという知識はあったので、シリアル通信関連の情報を調べたところ、Macでは以下のコマンドでシリアル通信の接続先を調べられることがわかりました。

$ ls /dev/tty.*

実行結果を見ると、どうやら/dev/tty.usbmodemxxxxxxxxというのが対象機器のようでした。(xxxxxxxxは数字)
実際にシリアル通信を行うにはcuコマンドを使います。
接続して、試しにATコマンドを打ってOKが返ってくるのを確認し、切断するまでの流れは下記のようになりました。

$ sudo cu -l /dev/tty.usbmodemxxxxxxxx
Connected.
AT
OK
~.
Disconnected

次に接続した状態で電話をかけてみました。

$ sudo cu -l /dev/tty.usbmodemxxxxxxxx
Connected.
{ここで電話をかける}
ARING 1 --- 080xxxxxxxx

4カラム目の080で始まる番号がテストで使用した携帯電話番号です。
何パターンかテストしてみましたが、この機器では4カラム目に必ず相手の電話番号が来るようです。

作成

ここまで分かれば後は簡単です。
今回はPythonで書いてみました。

Pythonでシリアル通信を行うには事前にpyserialモジュールをインストールする必要があります。

$ pip install pyserial

モジュールをインストールしたら下記のファイルを作成して実行します。

myCTI.py
import webbrowser
import serial
import datetime

try:
    # Gatewayのシリアル通信を開く
    ser = serial.Serial('/dev/tty.usbmodemxxxxxxxx',9600)

    while True:
        # 改行まで読み込み
        line = ser.readline()
        # 電話番号は4カラム目
        number = line.split()[3]
        # FMPプロトコルでFileMakerを呼び出す
        url = 'fmp://{ユーザー名}:{パスワード}@{ホスト名(IPアドレス)}/{ファイル名}?script={スクリプト名}&param=' + number
        webbrowser.open(url)
        # ログ出力
        dt = datetime.datetime.today()
        log = dt.strftime("%Y-%m-%d %H:%M:%S") + ' ' + line.rstrip()
        print(log)
except:
    print('エラー終了')
finally:
    ser.close()

無限ループで待機し、電話がかかってきたら任意のFileMakerスクリプトを実行するという単純な仕組みです。
URL部分はFileMaker用にFMPプロトコルにしていますが、この部分は任意なので、例えばIFTTTのトリガーを呼び出したり、外部APIをキックしたりと、工夫次第で色々できます。
FileMaker側では、スクリプトの呼び出しを受けてレコードを作成するようにしておきます。あとは顧客情報とリレーションさせて会社名を表示するようにしておけば、簡易CTIの出来上がりです。

Macの場合、Sierraからtty.usbmodemがサポートされなくなったそうなので注意が必要です。
El Capitanからモジュールを移植すれば動くらしいという情報も見かけましたが試してはいません。

Windowsの場合はモデムに合ったドライバを入れれば動作しました。ドライバの対応状況次第ですが、弊社の場合は運良くWindows10に適合したドライバが見つかったので、当分の間はこのスクリプトがあれば大丈夫そうです。