プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Twilio 試した(3/3):FAX 受信と通知を試しました

Twilio 試用のその3になります。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

さて、最後は FAX の受信と通知を試してみたいと思います。

FAX 受信

受信するだけなら、下記のように定義した TwiML を作成し、

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive mediaType="application/pdf" storeMedia="true">
  </Receive>
</Response>

電話番号の設定画面で、下記のようにFAX受信時に、上記のTwiMLを呼び出すように設定します。

f:id:junichim:20181109115719p:plain

受信テスト

上記の設定後、自宅の電話器からFAXをTwilioの電話番号あてに送ります。するとなんの変化もありません。 まあ、電話機側はFAX送信に失敗するとエラーを表示するので、送れてはいるんだと思います。

受け取ったFAXはどうやって確認するのだろうか?

と思っていたら、FAXに関しては、電話の録音などと違い、REST API 経由でしか確認ができないそうです(Twilio のサポートさんに教えていただきました)。

とりあえずブラウザで受信FAX一覧リストを取得するURLをたたきます。

jp.twilio.com

ユーザー名とアカウント名の入力が求められるので、AccountSid と AuthToken を入力します(コントロールパネルのダッシュボードで確認できます)。 詳しくはここに載ってます。

するとJSON形式の文字列がずらずらと取得されます。こんな感じのイメージです。

{
     "meta":{
         "page":0
        ,"page_size":50
        ,"first_page_url":"https://fax.twilio.com/v1/Faxes?PageSize=50&Page=0"
        ,"previous_page_url":null
        ,"url":"https://fax.twilio.com/v1/Faxes?PageSize=50&Page=0"
        ,"next_page_url":null
        ,"key":"faxes"
    }
    ,"faxes":[
        {
             "media_sid":"MExxxxxxxxxxxxxxxx"
            ,"status":"received"
            ,"direction":"inbound"
            ,"from":"+81xxxxxxxxxx"
            ,"date_updated":"2018-11-08T06:43:25Z"
            ,"price":"-0.6"
            ,"account_sid":"アカウントSID"
            ,"to":"+81xxxxxxxxxxx"
            ,"date_created":"2018-11-08T06:43:01Z"
            ,"url":"https://fax.twilio.com/v1/Faxes/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ,"sid":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ,"duration":23
            ,"num_pages":1
            ,"quality":"standard"
            ,"price_unit":"JPY"
            ,"api_version":"v1"
            ,"media_url":"https://media.twiliocdn.com/fax/xxxxxxxxxxxx"
            ,"links":{
                 "media":"https://fax.twilio.com/v1/Faxes/FXxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Media"
            }
        }
        ,{
             "media_sid":"MEyyyyyyyyyyyyyyyyyyyyyyyy"
            ,"status":"received"
            ,"direction":"inbound"

この一覧には、送信、受信の両方の情報が載っています。受信したFAXは、status が received 、送信したFAXは、delivered になります。 確かに受信できているようです。

実際の受信データは media_url に記載されているリンクを表示すると、無事に pdfが表示され、送ったFAXであることがわかりました (今回の場合 TwiML で受信データ種類を pdf と指定しています。Tiffも選べるようです)。

FAX 受信と通知

あと、もう一息。

ここまで来たら、受信があったら、通知を出せばOKです。通知にもいろいろありますが、ここはまずメールに出します。 ついでに、通知だけでなく受け取ったFAXそのものも添付ファイルで送れるとなおうれしいです。

今回は、 TwiML でFAXを受け取り、actionで受け取り後に呼び出すURLを指定します。そのURLは、TwilioのFunctions(サーバーレスな関数実行機能。AWSのlambda みたいなもの)を定義して、そいつで処理します。

Functions

TwiML がFAX受信後に呼び出す関数を定義します。

Runtime の Functions を選択します。

f:id:junichim:20181109163435p:plain

大きなプラスボタンを押すとFunctionsの定義画面が表示されます。

f:id:junichim:20181109163558p:plain

とりあえず、 Blank を選択して、Create ボタンを押します。

f:id:junichim:20181109163723p:plain

こんな感じの定義画面が出てきます。

FUNCTION NAME に関数名を入力します。 ここでは、 faxReceive としました。

下部のCODEの部分にコード(node.js)を書いていきます。 今回作ったのはこんな感じです(長くなるので、Gist に置いときます)。

Twilio FAX 受信時にメールを送信するサンプル · GitHub

(参考)

下記の記事を参考に作りました。助かりました。ありがとうございます。

qiita.com

ちなみに、上記のURL先の参考にしたサイトと違うところは、今回作ったほうは Promise をかましているところです。 (参考サイトのは、メール送信のあと、 slack への通知も行っているので大丈夫なんだと思います。)

Functions の設定

上記はnode.jsのモジュール nodemailer を使っているので、それを利用可能にする必要があります。 これは、コンソールの Runtime から Functions へ進み、設定を選択すると

f:id:junichim:20181109174055p:plain

のように、画面下部に dependencies というところが出てきます。 ここで、プラスボタンを押して、ライブラリの名前とバージョン番号を入力すればOKです。

TwiML

TwiML は上記のものを少し変えて、Functions を呼び出すようにします。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive mediaType="application/pdf" storeMedia="true"
      action="https://xxxxxxxxxxxxxxxxxx.twil.io/faxReceived">
  </Receive>
</Response>

faxReceived というのが作ったFunctionsの名前です。

試す

電話番号設定は上記のFAX受信のままであれば、変更する必要ありません。

これでFAXを送ってみます。 無事に送信後、メーラーでメールが受信できているかみると、

f:id:junichim:20181109183106p:plain

おぉ。無事に届いていますね。

注意点

Twilio 側の問題ではないのですが、今回使ったメールサーバーがさくらインターネットのものでした。それに関して送信できないのが2点ほどあったので、書いておきます。

エラーその1

Twilio でメール送信を設定しても、何度かエラーが出ます。Twilio のログを見ると

error: Error: Hostname/IP doesn't match certificate's altnames: "Host: SMTpサーバー. is not in the cert's altnames: DNS:*.sakura.ne.jp, DNS:*.180r.com, DNS:*.2-d.jp, DNS:*.achoo.jp, DNS:*.amaretto.jp, DNS:*.bona.jp, DNS:*.chew.jp, DNS:*.crap.jp, DNS:*.daynight.jp, DNS:*.deko8.jp, DNS:*.dojin.com, DNS:*.eek.jp, DNS:*.flop.jp, DNS:*.from.tv, DNS:*.fubuki.info, DNS:*.gokujou.biz, DNS:*.grats.jp, DNS:*.grrr.jp, DNS:*.halfmoon.jp, DNS:*.ivory.ne.jp, DNS:*.jeez.jp, DNS:*.jpn.org, DNS:*.kir...

メールサーバーのドメイン名とサーバー証明書のドメイン名が一致しないのが原因のようです。

回避するには、

tls: {
                rejectUnauthorized: false
            }

とすれば、とりあえずなんとかなります。でも望ましい状態ではないので、テスト用ですね。

(参考)

paulownia.hatenablog.com

エラーその2

上記の対策後もまだエラーが出ます。 Twilio のログをみるとこんな感じです。

error: Error: Mail command failed: 550 5.7.1 <username@domainname>... Command rejected

調べてみると、さくらインターネットのデフォルトの設定では、『国外IPアドレスフィルタ』というのが有効になっており、海外のサーバーからのSMTP送信をブロックします。

help.sakura.ad.jp

このため、最初はなかなかメールがこないという状況になってしまいました。 とりあえずテストの間だけ、この設定を無効にしたらちゃんと届きました。

メール周りはいろいろありますね。メールじゃなくてslackのほうがいいかもしれないなと思い始めてます。

まとめ

Twilio を試すというのをいろいろとやってみました。 留守電、FAX送受信とも問題なくできそうです。

FAXの料金表には、送受信ページ数に関する記載しかないですが、実際には通信量もかかってます。 通信費が、送信で1分5.4円(受信は1分0.6円)なので、FAX送信数が多いと当初の目論見は成立しないかもしれません。

まあ、FAXで送るのはそれほど多くないので大丈夫かな?とタカくくってます。

なんにしても、いろいろと便利なことができそうで楽しみです。

Twilio 試した(2/3):FAX 送信を試しました

Twilio 試用のその2になります。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

さて、次は FAX の送信を試してみたいと思います。

と、そのまえに、FAX API を使ったデモが公開されているので、こちらを見てみると FAX のイメージがつかめるかもしれません。

github.com

FAX 送信

最初に電話番号を購入する際、必要な機能を指定することができました。日本国内用の多くの電話番号は、通話とFAXが使えます。

前の記事で書いたように Twilio の電話番号の設定は着信時にどうするか?という形で書くので、FAX送信の場合は特に設定は必要ありません。 実際、着信時は音声を処理するようにしていても、FAXを送信することができます。

で、FAXの送信ですが、簡単に試すには REST API を curl でたたけばOKです。

jp.twilio.com

では、実際にやってみたいと思います。 まずは準備として送信するFAX(pdf)を準備します。

pdf の準備

今のところ Twilio 側には送信するFAX(pdfファイル)をアップロードする機能はなく、API のパラメータとして、PDFファイルのURLを指定するようです。

なので、まずはpdfファイルをアップロードします。 テストの段階では、別に誰が見てもいいのですが、一応FAXの文面が公開されるのはいろいろとまずいだろうと思います。 ということで、アップロード先は簡単でいいので認証が必要かなと思います。

さて、どこにアップロードするのがいいかな?と考えたのですが、今手持ちの環境で簡単にアップロード先として使えそうなのが、さくらインターネットのレンタルサーバーでした。 このレンサバ、いまのところメールサーバーとしてしか使ってなくて、空いてるのでテストには最適かと思います。

さくらインターネットだと、Basic認証の設定も簡単にできるそうです。

help.sakura.ad.jp

ということで、適当なディレクトリを切って、Basic認証の設定をしておきます。

あとは送信するpdfをアップロードしておけば、準備完了です。

送信

pdfの準備ができたら、下記のように呼び出します。

mor@DESKTOP-H6IEJF9:~$ curl -X POST https://fax.twilio.com/v1/Faxes
 --data-urlencode "From=+81送信元電話番号(Twilioのトライアル用電話番号)"
 --data-urlencode "To=+81送信先電話番号"
 --data-urlencode "MediaUrl=https://ユーザー名:パスワード@xxxxxxxx.sakura.ne.jp/xxxxx/test01.pdf"
 -u AccountSID:AuthToken

この時、Account Sid と AuthToken が必要になります。これらは

f:id:junichim:20181109111454p:plain

コンソールのダッシュボードに記載されています。

実際に試してみると、curlのレスポンスはすぐに返ってきますが、

{
     "media_sid":null
    ,"status":"queued"
    ,"direction":"outbound"
    ,"from":"+815送信元電話番号(Twilioのトライアル用電話番号)"
    ,"date_updated":"2018-11-09T02:06:06Z"
    ,"price":null
    ,"account_sid":"アカウントSID"
    ,"to":"+81送信先電話番号"
    ,"date_created":"2018-11-09T02:06:06Z"
    ,"url":"https://fax.twilio.com/v1/Faxes/・・・"
    ,"sid":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    ,"duration":null
    ,"num_pages":null
    ,"quality":"fine"
    ,"price_unit":null
    ,"api_version":"v1"
    ,"media_url":null
    ,"links":{
         "media":"https://fax.twilio.com/v1/Faxes/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Media"
    }
}

といった感じで、status が queued になっています。

しばらく待つと、この作業PCの後ろにある電話機(FAX機能付き)が動き出しました。無事に送れたようです。

とりあえずは試用としてはこれでOKですね。 実際に使うときは送信状態のステータス確認や、送信失敗時の通知などもやりたいところです。

補足

今回は さくらインターネットのレンサバを使い、pdfファイルのアップロード先を作りました。

とのとき、Basic認証のパスワードに記号をあれこれいれて作ったら、Twilio側からうまくアクセスできないことがありました。 これもおいおい確認したいところです。

とはいえ、とりあえずFAXの送信もできました。最後はFAX受信と通知を試そうと思います。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました

今の作業場から引っ越すことになりました。 新しい作業場では、新たにフレッツ光を引く予定です。それはそれでいいのですが、ふとその時、電話とFAXどうしようか?と思い立ちました。

田舎なんで会議やセミナーとかの連絡がまだまだ FAX でやってきます。 なので、 FAX なしで仕事するのは現実的に無理だと思ってます。

素直にフレッツ光にひかり電話をつけて、プリンタ複合機のFAXを使えばいいのですが、なんだかなー、と思ってしまいます(安いとはいえ出費もありますしね)。 そんなこんなことをもやもやと思っていたある日、ふとしたきっかけで、ずいぶんまえに Twilio という電話サービスのAPI(であってる?)があるよと聞いたのを思い出しました。

twilio.kddi-web.com

「FAXも使えるならいいかもねー」と軽い気持ちで調べると、なんと、β扱いですが、FAXが使えるではありませんか!

俄然、試してみたくなりました。もっと調べると、電話番号一つが月額 100円(税抜)なので、FAXと電話で2つ電話番号を持っても、ひかり電話よりも安い! 仕事用の電話番号は一度公開してみたかったのですが、いままでは自宅兼用なので公開するわけにもいかなかったこともあり、電話番号もお安く持てるかも。 Twilio の電話(音声通話)も魅力がありますねー。

ということで、 Twilio を試す理由ができました 。何をやりたいのか整理して、試してみたので、いろいろとメモっときます。今回は3本立てです。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

やりたいこと

そんなこんなで、あれこれ思案すると、とりあえず下記のようなことがやりたいことだなとなりました。

  • Twilio で FAX と電話(音声通話)用に電話番号を二つ契約する
  • 電話は常に留守電にしておいて、必要があれば用件を入れてもらう
  • 電話に着信があったら通知(メール?slack?)を飛ばす
  • 留守電聞いて、必要に応じてこちらから折り返し電話する
  • FAXは受信したら、通知を飛ばす
  • FAXの送信は多少手間かかっても送れればOK

いまでも、仕事の電話のやり取りはほぼ携帯でやってるので、大事な電話は基本的に携帯にかかってきます。 で、仕事場にかかってくるのは一時的な電話がほとんどなので、こういう運用でも問題ないかなと思います。 このあたりの事情は個人個人で違うところだと思います。

まずは、電話(音声通話)から試していきます。

Twilio の無料アカウントにサインアップ

一番最初に Twilio の無料アカウントを申し込みます。

この無料アカウントがあると、トライアル用に電話番号が一つ使えるようになり、普通の家の電話や携帯電話に電話を掛けたり、FAXを流したりできます。 まあ、トライアルアカウントなので、事前に通話先の電話番号を登録しておかないといけないとか制限はありますが、テストには十分です。

ということで、無料アカウントを申し込んで、電話番号を一つ発行します。

実は、この電話番号の発行の部分で最初ずいぶんと躓きました。 結論から言うと、無料アカウント申し込み後、コンソールにログインした直後は、何もない状態なので、ここで最初にプロジェクトを作成して、そのプロジェクト内で電話番号を取得する、という作業になります。

ですが、Twilio のチュートリアル的な資料では、そのプロジェクトを作る、という部分が抜けていました。

jp.twilio.com

ま、タイミングが悪かったんでしょうかね。 電話番号を取得して、気を取り直して試していきます。あ、電話番号の取得の説明などはあちこちにあるので省いときます。

(補足)

Twilio さんの名誉のために補足です。無料サインアップのページにある動画を見たら、プロジェクトを作るという話が出てきてました。 先にこっち見てれば気づいたのになー。

電話の着信

Twilio の電話番号は、着信があった場合にどういう動作をするのか?というのをいくつかの方法で指定することができます。 今回は、 TwiML という XML 形式で動作を定義できるものがあるので、それを使います。

TwiML の作成

コンソールから、Runtimeを選び、下のほうにある TwiML Bins を選びます。

f:id:junichim:20181109104927p:plain

表示された画面の+(プラス)のボタンを押すと、TwiMLの作成画面が表示されます。

f:id:junichim:20181109104945p:plain

まずは、FRIENDLY NAME にこの TwiML の名前を入れます。 そして、下側のTwiMLの部分に、着信があったら音声で応答するように動作を書きます。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-JP"> こんにちは </Say>
</Response>

これでOKです。 画面下部に『create』のボタンがあるので、これを押して TwiML の完成です。

電話番号の設定

次に、取得した電話番号にたいして着信があったときに、上記で定義した TwiML が実行されるように指定します。

Phone Numbers を選び、 Active Numbers を選択すると、購入している電話番号の一覧が表示されます。

f:id:junichim:20181109105018p:plain

電話番号をクリックすると設定画面が表示されます。

f:id:junichim:20181109105036p:plain

次のように設定します。

  • 受け付ける着信』:『Voice Calls』
  • 構成内容:『Webhooks, TwiML Bins, Functions, ・・・』
  • 通話着信時:『TwiML』、隣のドロップダウンリストより、さきほど作成した TwiML の名前を指定

簡単ですね。これで準備OKです。

電話をかけてみる

さっそく、電話をかけてみると、着信後『Twilio をご利用いただきありがとうございます。・・・』とういトライアルアカウントですよ、ということを知らせるメッセージが流れます。

そのあと、『こんにちは』とTwiMLで指定した文字が読み上げられます。 音声は合成なので、若干不自然ですがまあ十分かと思います。

着信を録音する

これで TwiMLを使って着信時に動作させる要領がわかったので、次に電話の着信があったら、録音してみたいと思います。

TwiML を下記のようにします。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-JP">録音します。録音が終了したらシャープを押してください。</Say>
  <Record action="https://handler.twilio.com/twiml/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
</Response>

録音の場合、気をつけない点があります。 録音が終了すると、自動的に指定されたURLにリクエストが飛びます(上記の action属性です)。 actionが指定されていない場合のデフォルトは、同じ TwiML です。で、呼び出し後も通話は継続されます。 ということで、同じ録音のTwiMLが呼ばれるため、こちらから切らない限り、何度も録音が繰り返されることになります。

ドキュメントにもしっかり書いてありました。

TwiML™ Voice: <Record> - Twilio

ということで、今回は録音が終わったら電話を切るという TwiML を呼び出すという方法をとります。

こういう電話を切るための TwiML を作成し

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Hangup/>
</Response>

このURLを さきほどの録音用の TwiML のactionで指定しておきます。

録音させてみる

実際に電話をかけると、メッセージがながれます。適当に話してシャープを押すと録音されます。

録音した音声は、コンソールから『Programable Voices』、『通話』、『コールログ』とたどると

f:id:junichim:20181109101839p:plain

のように、ログのところに、メッセージを再生するボタンがあるので、確認できます。 ここをクリックすると、録音メッセージがちゃんと再生され、さきほど録音した自分の声が流れました。

ここまでできれば、あとはactionの先を通知処理のURLにすればよいだけです。 こちらは後述するFAX受信時の通知を流用しようと思うので、まずはそちらを試します。

ということで、FAXのお試しの記事へ続きます。