見出し画像

Twilioアドベントカレンダー 12月19日 パスワードは電話で

twilio Advent Calendar 2020の12月19日の記事を担当させて頂きます。
Hiroshima Motion Control Networkの尾石です。

まず、はじめにお詫びがございます。
今回作った仕組みの醍醐味な機能であるTwilio SendGridのユーザ登録が間に合わず(営業日しかアカウント発行されないんですね・・・)、なんと、添付ファイルを送信する機能が抜けています・・・

何を作ったか?

すごくシンプルに

メールの宛先、相手の電話番号、件名、メッセージを入力する

添付ファイルをつける

添付ファイルがパスワード付きZIPに変換されて、入力された電話番号にパスワードがお知らせさせるものですw

デモ動画はこちら。

どう作ったか?

もう半日も手を動かす時間がなかったので、

①PythonでWeb(Django)とZIP圧縮を行う

②PythonからIBM CloudのNode Redのフローをコールする

③Node-RedからTwilio Studioで定義している電話をかけるフローをREST APIで呼び出す

というシンプルな作りです。

①PythonでWeb(Django)とZIP圧縮を行うは、Viewで添付されたファイルをcontrollerに引き渡します。controllerの中でパスワード生成、ZIP圧縮を行い、Viewにパスワード付きZIPファイルとパスワードを返却します。

        
fileobject = FileSystemStorage()
       filedata = fileobject.save(file.name, file )
       path = handle_uploaded_file(request.FILES['file'])
       temp_file,password = zipAndEncryption(file.name,filedata,path)
       payload = {"tel":tel, "pass":password}
       r = requests.get(API_URL, params=payload)
   

次に、controllerの中の処理ですが、とてもシンプルで

10桁くらいのパスワードをsecretsを使って生成し、pyminizipでパスワード付きのZIPします。

def zipAndEncryption(filename,received_file,path):
   logger = logging.getLogger(__name__)
   chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
   password = ''.join(secrets.choice(chars) for x in range(10))
   
   with TemporaryDirectory() as temp_dir:
       zip_path = os.path.join(temp_dir, filename + '.zip')
       logger.debug("zip_path>" + zip_path)
       temp_path = os.path.join(temp_dir, filename)
       pyminizip.compress(path,'png',zip_path, password, 5)
       temp_zip = open(zip_path, "rb")
       return temp_zip,password

うん、すごく汚いコード。

その後、ViewからIBM CloudのNode-REDを呼び出します。

②PythonからIBM CloudのNode Redのフローをコールする、はとてもシンプルで、相手の電話番号とパスワードがPOSTされてきたら、電話番号とパスワードのパラメータをセットしてTwilioをREST APIで呼び出すのみです。

画像1


③Node-RedからTwilio Studioで定義している電話をかけるフローをREST APIで呼び出す、はREST API経由で設定された電話番号にまずは電話を発信し、パスワードをText to speechで読み上げます。

1回しか言わないし、電話を取り逃がしたり、聞き逃したら、もう二度と添付ファイルは開けられないでしょう。

画像2

本来であれば、SendGridまで実装したかったのですが、すみません、すみません。。。。

いいなと思ったら応援しよう!