2019年9月28日土曜日

LotusScript で携帯電話へSMSを送信

NDS2019 も折り返し地点を回り、残り2か所となりました。

ご来場されたお客様より伺ったお話から「やってみたい」と思うことがあって、早速試したことがありますので、ここに残しておこうと思います。

現状の最新版 Notes/Domino V10 には HTTP Request を送信できる新機能があります。

9.0.1 までは Windows の HTTP Request を呼び出したり Java でプログラムを組んだりしていましたが、これらは iOS 上のクライアント(HCL Nomad) では使えません。

また Notes クライアントは Windows のほか、Mac、iOS (現在は iPad のみ) で動くクライアントがありますが、OS依存の部分など多少考慮しなければならない場合があるものの、LotusScript のコードはどのクライアントでも動くようです。

V10 の新機能を使うことで、より Web サービスとの連携が容易になりました。


さて、やってみたいこととは、携帯電話への SMS (Short Message Service)の送信です。

Twilio (トゥイリオ)というサービスをご存知でしょうか。

詳しくは上のリンクをご覧いただくとして、Twilio は SMS や自動音声通話といった、電話番号を用いたサービスと連携するための API を提供しています。

電話をかけて、文章を日本語で読み上げたり、音声ファイルを再生したりといったようなことが可能なようです。

今回はこの API を使い、私のスマートフォンへ SMS を送信してみます。

SMS を送信する場合は、場合にもよるかもしれませんが料金が発生します。

Twilio の API は Free Trial が可能です。
Sign up を済ませて初回ログインすると、表示された Console Dashboard には 500円分の TRIAL BALANCE が付与されていました。

この Dashboard には、テストに使用する発信用の電話番号(TRIAL NUMBER = Twilio電話番号)を取得できるボタンがあったり、API を使う際に必要となる「アカウント SID」と「AUTH TOKEN」もあります。

なお、私が TRIAL NUMBER を取得したところ +1 で始まる米国の電話番号が取得できました。

次のコードは、サンプルとして作成したエージェントです。

Dim ss As NotesSession
Const accountSid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Const authToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Const phoneFrom = "+11231231234" '発信用電話番号(Twilio電話番号)

Sub Initialize
 Set ss = New NotesSession
 sendSMS "LotusScript から初めての  SMS 送信。ドキドキ...", "+819012345678"
End Sub

Function base64Encode( textString As String ) As String
 Dim stream As NotesStream 
 Dim db As NotesDatabase 
 Dim doc As NotesDocument 
 Dim body As NotesMIMEEntity
 
 Set stream = ss.CreateStream 
 Call stream.WriteText ( textString ) 
 
 Set db = ss.CurrentDatabase
 Set doc = db.CreateDocument
 Set body  = doc.CreateMIMEEntity
 
 Call body.SetContentFromText ( stream, "", ENC_NONE )
 Call body.EncodeContent ( ENC_BASE64 )
 
 base64encode = Replace( Replace( body.ContentAsText, Chr( 13 ), ""), Chr( 10 ), "" )
 
 Call stream.Close
End Function

Sub sendSMS( message As String, phoneTo As String )
 Dim req As NotesHTTPRequest
 Dim url$, body$, res As Variant

 url = "https://api.twilio.com/2010-04-01/Accounts/" & accountSid & "/Messages.json"

 body = |From=| & urlEncode( phoneFrom ) & _
 |&To=| & urlEncode( phoneTo ) & _
 |&Body=| & urlEncode( message )

 Set req = ss.Createhttprequest()
 req.Preferstrings = True
 req.Setheaderfield "Content-Type", "application/x-www-form-urlencoded"
 req.Setheaderfield "Accept", "application/json"
 req.Setheaderfield "Authorization", "Basic " & base64Encode( accountSid & ":" & authToken )
 res = req.Post( url, body )
End Sub

Function urlEncode( textString ) As String
 Dim notesmacro As String, res As Variant

 notesmacro = |@URLEncode( "Domino";"| & textString & |" )|
 res = Evaluate( notesmacro )
 urlEncode = res( 0 )
End Function

以下、上のコードを補足します。

2~4行目
実行に必要なアカウントSID、AUTH TOKEN、発信者番号(Twilio電話番号)を定数(Const)で設定していますが、実行時は Console Dashboard のもので置換します。
※本番で使う場合、認証情報のハードコーディングはお勧めしません

4行目、8行目
このサービスのすばらしい点のひとつは、対応する国が日本だけではないことです。ここでは私のスマホの電話番号を指定したいので、最初のゼロを除いた番号の頭に日本の番号を示す +81 を付けました。たとえば電話番号が 090-1234-5678 の場合、発信先番号へは +819012345678 と指定します。

36行目
API の URL ですが、最後を .json とすると、レスポンス(47行目)が JSON 形式で返ります。このコードではレスポンスをほぼ無視していますが、SMSが送信されない理由を調べたい場合はコードの追加が必要です。※ res を messagebox で表示するだけでも、レスポンスにあるエラーコード等がなんとなく見えます

38行目、39行目
From(発信者番号)と To(受信者番号)と Body(メッセージ)は、URLエンコードが必要です。

46行目
API は Basic 認証をサポートしています。認証情報として
アカウントSID + ":" + AUTH TOKEN
の文字列を Base64 エンコードした値を "Authorization" ヘッダーへ追加しています。

そして、エージェントを実行して、実際に iPhone で受信したところが下図です。




今回はトライアルのアカウントを使用したからでしょうか、メッセージの冒頭には "Sent from your Twilio trial account - " と追加されてしまいました。まあ、仕方ありませんね...

SMS の料金などを調べずに3回 API をコールしてしまいましたが、Dashboard を覗いてみると、まだ 500円以内に収まっていました。
もう少し楽しめそうです..

もし「私も試してみたい!」と思った方は、Qiita に「[最新版]Twilioのサインアップ」という記事がありますので、ご参考まで。

0 件のコメント:

コメントを投稿