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で呼び出すのみです。
③Node-RedからTwilio Studioで定義している電話をかけるフローをREST APIで呼び出す、はREST API経由で設定された電話番号にまずは電話を発信し、パスワードをText to speechで読み上げます。
1回しか言わないし、電話を取り逃がしたり、聞き逃したら、もう二度と添付ファイルは開けられないでしょう。
本来であれば、SendGridまで実装したかったのですが、すみません、すみません。。。。