<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daizen Ikehara</title>
    <description>The latest articles on DEV Community by Daizen Ikehara (@neri78).</description>
    <link>https://dev.to/neri78</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F358642%2F1f6d80f5-7b09-4d56-b357-bd95e7d683c4.png</url>
      <title>DEV Community: Daizen Ikehara</title>
      <link>https://dev.to/neri78</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neri78"/>
    <language>en</language>
    <item>
      <title>TwilioQuestオペレーター養成キャンペーン開催</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Tue, 06 Jul 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-4h9j</link>
      <guid>https://dev.to/twilio/twilioquest-4h9j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fv_eKiSE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/iSYGJh_yu0kts-Smzz0IRscHiRDFXuZ_b2EwbyA5eOc89z.width-808.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fv_eKiSE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/iSYGJh_yu0kts-Smzz0IRscHiRDFXuZ_b2EwbyA5eOc89z.width-808.png" alt="TQ JP contest" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twilio Developer Evangelistの&lt;a href="https://www.twitter.com/neri78"&gt;池原&lt;/a&gt;です。昨日、&lt;a href="https://dev.to/twilio/twilioquest-3-13od"&gt;TwilioQuest 3 日本語プレビュー版のリリース&lt;/a&gt;をアナウンスしましたが、このリリースを記念し、 &lt;strong&gt;「TwilioQuestオペレーター養成キャンペーン」&lt;/strong&gt; を実施します!&lt;/p&gt;

&lt;p&gt;このキャンペーンではTwilioQuest 3日本語プレビュー版をインストールし、特定のミッションをクリアしたプレイヤーを対象として毎週2名の方に&lt;a href="https://www.apple.com/jp/airpods-pro/"&gt;Apple AirPods Pro&lt;/a&gt;を進呈します。また、最終週には「TwilioQuestグランドチャンピオンシップ 2021 Summer」を開催します。この、「TwilioQuestグランドチャンピオンシップ 2021 Summer」では制限時間内に獲得した経験値を競うハイスコアチャレンジを実施し、優勝者には&lt;a href="https://www.apple.com/jp/macbook-pro-13/"&gt;Apple M1 Macbook Pro(13インチ)&lt;/a&gt;を進呈します!&lt;/p&gt;

&lt;h2&gt;
  
  
  イベントスケジュールおよび賞品について
&lt;/h2&gt;

&lt;p&gt;各ラウンドのスケジュール、ならびに賞品については下記の通りとなります。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;日程 (日本時間)&lt;/th&gt;
&lt;th&gt;賞品&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ラウンド1: 2021年07月12日(月) - 2021年07月18日(日)&lt;br&gt;抽選日: 2021年07月19日(月)12:00&lt;/td&gt;
&lt;td&gt;AirPods Pro x 2名様&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ラウンド2: 2021年07月19日(月) - 2021年07月25日(日)&lt;br&gt;抽選日: 2021年07月26日(月)12:00&lt;/td&gt;
&lt;td&gt;AirPods Pro x 2名様&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ラウンド3: 2021年07月26日(月) - 2021年08月01日(日)&lt;br&gt;抽選日: 2021年08月02日(月)12:00&lt;/td&gt;
&lt;td&gt;AirPods Pro x 2名様&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TwilioQuestグランドチャンピオンシップ 2021 Summer&lt;br&gt;開催日: 2021年08月06日(金)15:00 - 18:00&lt;/td&gt;
&lt;td&gt;M1 macbook pro x 1名様&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  キャンペーン・イベントへの参加方法
&lt;/h2&gt;

&lt;p&gt;次の手順に従い、キャンペーンにご参加ください。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;下記ページからキャンペーン・イベントに登録
&lt;a href="https://www.twilio.com/go/twilioquest-grand-championship-2021-summer-japan-1"&gt;TwilioQuestオペレーター養成キャンペーン参加申し込みページ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TwilioQuest日本語プレビュー版をダウンロードし、インストール
&lt;a href="https://www.twilio.com/quest/ja"&gt;TwilioQuest日本語版ページ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TwilioQuestを起動し、登録後にメールアドレスあてに送られるラウンド1-3共通の &lt;strong&gt;「Operation」コード&lt;/strong&gt; を手順に沿って適用

&lt;ol&gt;
&lt;li&gt;TwilioQuestを起動し、&lt;code&gt;3&lt;/code&gt;キーで&lt;code&gt;Settings&lt;/code&gt;画面を表示。その後、画面左のナビゲーションから&lt;code&gt;Operations&lt;/code&gt;を選択&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Join Code&lt;/code&gt;ラベル下のテキストフィールドに&lt;code&gt;Operation&lt;/code&gt;コードを入力し、&lt;code&gt;Join&lt;/code&gt; ボタンをクリック。 &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tb2W06B9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Tpp7JSUXioZVI5a0giO0g3JaOjxK6R-_w9wIsKbpG1E3PG.width-500.png" alt="TQ - apply the Operation Code" width="500" height="327"&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Voice: マラカイト鉱山&lt;/code&gt; ミッション&lt;/strong&gt; を最後までクリア&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  応募にあたっての注意点
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Email欄には必ず &lt;strong&gt;TwilioQuestで使用するTwilioアカウントのメールアドレス&lt;/strong&gt; を入力してください。情報が異なっている場合、キャンペーン条件の達成を確認できないため、抽選の対象外となります。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;キャンペーンは&lt;strong&gt;日本時間2021年7月12日(月) 00:00:00 から2021年8月1日(日) 23:59:59まで&lt;/strong&gt;の期間となります。この期間外にクリアした場合は &lt;strong&gt;抽選の対象外&lt;/strong&gt; となります。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;「TwilioQuestグランドチャンピオンシップ 2021 Summer」は2021年8月6日(金)15:00 - 18:00に実施される &lt;strong&gt;限定&lt;/strong&gt; イベントです。登録後にお送りさせていただくURLに当日参加し、オープニングでアナウンスされる &lt;strong&gt;グランドチャンピオンシップ専用の「Operationコード」を別途利用いただくことになります。&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;その他の留意点やよくある質問については&lt;a href="https://www.twilio.com/go/twilioquest-grand-championship-2021-summer-japan-1"&gt;イベントページ&lt;/a&gt;をご確認ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  キャンペーンやTwilioQuestについての質問
&lt;/h2&gt;

&lt;p&gt;キャンペーンやTwilioQuestについて質問がある場合はぜひ、こちらのTwitchチャンネルに登録ください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twitch.tv/neri78"&gt;Twitch - Neri78&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;このチャンネルでは下記の日程でTwilioQuest Q&amp;amp;Aストリーミングを開催します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;期間: 7月12日(月) - 8月2日(月)&lt;/li&gt;
&lt;li&gt;月曜日(抽選結果発表含む)12:00 - 13:00&lt;/li&gt;
&lt;li&gt;水曜日 12:00 - 13:00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;あるいは&lt;a href="https://twil.io/tq-discord"&gt;TwilioQuest Discordサーバー&lt;/a&gt;でも質問いただけます。&lt;/p&gt;

&lt;p&gt;さあ、TwilioQuestプログラムのオペレーターとなってクラウドの平和を守りましょう!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s Hack!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fJXbqpkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/CaeWpniOcDnda34Fs6sWG0gp6cEjEaNcu8ymxa64Hy6FDj.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fJXbqpkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/CaeWpniOcDnda34Fs6sWG0gp6cEjEaNcu8ymxa64Hy6FDj.width-500.png" alt="TwilioQuest - Cedric" width="500" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>twilio</category>
      <category>twilioquest</category>
      <category>contest</category>
    </item>
    <item>
      <title>TwilioQuest 3 日本語プレビュー版リリース!</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Mon, 05 Jul 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-3-13od</link>
      <guid>https://dev.to/twilio/twilioquest-3-13od</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IVDPZUyg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/TwilioQuest-JP-WebSite.width-1616.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IVDPZUyg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/TwilioQuest-JP-WebSite.width-1616.png" alt="TQ - JP preview version" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twilio Developer Evangelistの&lt;a href="https://www.twilio.com/blog/author/dikehara"&gt;池原&lt;/a&gt;です。ゲームを遊びながらTwilio製品の利用方法に加えGitHubやPythonを学習できる&lt;a href="https://www.twilio.com/quest/ja"&gt;TwilioQuest 3の日本語プレビュー版をリリース&lt;/a&gt;しました。&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuestとは?
&lt;/h2&gt;

&lt;p&gt;TwilioQuestはゲームをプレイするようにさまざまな開発スキルを向上できるチュートリアルです。2019年に最新バージョンである「TwilioQuest 3」がリリースされました。Twilio製品の利用方法だけでなく、Pythonのようなプログラミング言語や、GitHubの使い方などを学習できます。&lt;/p&gt;

&lt;p&gt;より詳しい説明やミッションの進め方については以前こちらの記事で取り上げていますので、こちらもぜひご覧ください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/twilio/game-tutorial-twilioquest3-40cb"&gt;Game + Tutorial = TwilioQuest3のはじめかた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/twilio/twilioquest-3-basic-training-1-68b"&gt;TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/twilio/twilioquest-3-basic-training-2-twilio-m28"&gt;TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/twilio/twilioquest-3-basic-training-3-ida"&gt;TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全編英語で作成されていますが、ゲーム好きな開発者には非常に人気のコンテンツです。日本でも多くのみなさんにプレイいただいていますが、「日本語版が欲しい」という要望を多くいただいたため今回、日本語版を開発しました。&lt;/p&gt;

&lt;h2&gt;
  
  
  日本語プレビュー版について
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rMF5fvFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/tkpUrdSf2WZc10W11P23Lag1kMgGyd7M7kuQ5R4mD52sdk.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rMF5fvFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/tkpUrdSf2WZc10W11P23Lag1kMgGyd7M7kuQ5R4mD52sdk.width-800.png" alt="TQ - JP preview version" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回のリリースでは下記4つのミッションコンテンツと &lt;strong&gt;一部のUIを日本語化&lt;/strong&gt; しています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;基本トレーニング&lt;/code&gt; - TwilioQuestのプレイ方法、ならびにTwilio製品の基本を学べるミッション&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Voice: マラカイト鉱山&lt;/code&gt; - Twilio Programmable Voice入門ミッション&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pythonic Templeの謎&lt;/code&gt; - Python入門ミッション&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;オープンソースの炎&lt;/code&gt; - Git、GitHub入門ミッション&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;基本的なプレイ方法については英語版と同じですが、ミッション内容については単純な翻訳だけではなく日本の皆さんに向けて加筆・修正を加えています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--antHuZz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Us7eG1miwxjs8oxB5YFLl809wBFkZtJu5tPw-Jj8tEMq0F.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--antHuZz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Us7eG1miwxjs8oxB5YFLl809wBFkZtJu5tPw-Jj8tEMq0F.width-800.png" alt="TQJP - Fog Owl" width="800" height="601"&gt;&lt;/a&gt; &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3evQ-VCd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/trBmHPHVFoj3hyYZu1LTyLonyGUMW8x-q588nuVFse6J8c.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3evQ-VCd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/trBmHPHVFoj3hyYZu1LTyLonyGUMW8x-q588nuVFse6J8c.width-800.png" alt="TQJP - voice" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ダウンロードおよびインストール方法
&lt;/h2&gt;

&lt;p&gt;TwilioQuestは下記よりダウンロードいただけます。英語版をすでにお持ちの方は改めてダウンロードいただく必要はありません。過去にプレイされた記録はそのまま保持されます。  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/quest/ja/download"&gt;TwilioQuest - ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;日本語プレビュー版の起動方法については&lt;a href="https://youtu.be/N9ySG7QiM-g"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Hack!
&lt;/h2&gt;

&lt;p&gt;ぜひ、日本語版をプレイしてみてください!今後も日本語ミッションの追加、アップデートを予定しています。&lt;/p&gt;

&lt;p&gt;日本語版の不具合や質問については下記までお問い合わせください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter: &lt;a href="https://www.twitter.com/neri78"&gt;@neri78&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: dikehara [@] twilio.com&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>twilio</category>
      <category>twilioquest</category>
      <category>japanese</category>
    </item>
    <item>
      <title>Twilio FunctionsでGETおよびPOSTを1つのハンドラーメソッドで処理するには</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilio-functions-get-post-1-4ipc</link>
      <guid>https://dev.to/twilio/twilio-functions-get-post-1-4ipc</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EvQSLqIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/GET_POST.width-808.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EvQSLqIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/GET_POST.width-808.jpg" alt="Twilio Functions Header" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jp.twilio.com/docs/runtime/functions"&gt;Twilio Functions&lt;/a&gt;はNode.jsで動作するサーバレス実行環境です。この環境には&lt;a href="https://jp.twilio.com/docs/libraries/node"&gt;Twilio Node ヘルパーライブラリー&lt;/a&gt;があらかじめて組み込まれているためすぐ利用できます。また、オートスケール機能やセキュリティ機能などプロダクション向けのサーバレスアプリケーションを簡単かつ迅速に構築できます。&lt;/p&gt;

&lt;p&gt;参考: &lt;a href="https://jp.twilio.com/docs/runtime/functions/request-flow"&gt;Functionリクエストのフロー&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5SJ_C3Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/CZAVnJDiEi-MleKIm-niNikWJZx_SNLrSbG_2IOFuqW9JQ.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5SJ_C3Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/CZAVnJDiEi-MleKIm-niNikWJZx_SNLrSbG_2IOFuqW9JQ.width-800.png" alt="Twilio Functions Request Flow" width="800" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilio FunctionsでGETとPOSTを判断する方法
&lt;/h2&gt;

&lt;p&gt;このTwilio Functionsは&lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;POST&lt;/code&gt;、&lt;code&gt;OPTIONS&lt;/code&gt;メソッドに対応しています。ただし、Functionsで呼び出されるハンドラーメソッドではリクエストヘッダにアクセスできないため、どのメソッドか判断できません。そのため、GETとPOSTでハンドルするFunctionを明示的に別にするという運用が考えられます。ただし、外部APIによっては1つのエンドポイントで両方のメソッドに対応しなければいけない場合があります。たとえば&lt;a href="https://dev.twitch.tv/docs/api/webhooks-guide"&gt;Twitch Webhook&lt;/a&gt;は1つのエンドポイントに対してイベントの購読確認（Subscription Verify）と通知（Notification）を、それぞれGET、POSTで行います。そのため、1つのエンドポイントで両方に対応しなければなりません。&lt;/p&gt;

&lt;p&gt;将来的には改善されることを期待しますが、現時点ではリクエストで渡されるパラメータから判断し、それぞれに対応した処理を行う方法が考えられます。&lt;/p&gt;

&lt;h3&gt;
  
  
  Twitch Webhookの場合
&lt;/h3&gt;

&lt;p&gt;Subscription Verify (&lt;code&gt;GET&lt;/code&gt;)の場合は、&lt;code&gt;hub.challenge&lt;/code&gt;という名前のパラメータが &lt;code&gt;text/plain&lt;/code&gt;で渡されます。一方、Notification (&lt;code&gt;POST&lt;/code&gt;) の場合はサブスクライブしたTopic（イベント）に合わせたパラメータが&lt;code&gt;json&lt;/code&gt;で渡されます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.twitch.tv/docs/api/webhooks-reference"&gt;Stream Changed&lt;/a&gt; (ストリーミングの配信開始や配信タイトルの変更が発生したイベント)の場合は下記のようになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "data": [
    {
      "id": "0123456789",
      "user_id": "5678",
      "user_name": "wjdtkdqhs",
      "game_id": "21779",
      "community_ids": [],
      "type": "live",
      "title": "Best Stream Ever",
      "viewer_count": 417,
      "started_at": "2017-12-01T10:09:45Z",
      "language": "en",
      "thumbnail_url": "https://link/to/thumbnail.jpg"
    }
  ]
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これらのパラメータはハンドラーメソッドに渡される&lt;code&gt;event&lt;/code&gt;引数に格納されるため、GET用のパラメータなのか、POST用パラメータなのかを判断し、処理を分岐させることになります。&lt;/p&gt;

&lt;h2&gt;
  
  
  試してみる
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;必要な環境

&lt;ul&gt;
&lt;li&gt;Node.js / npmがローカル環境にインストールされていること&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jp.twilio.com/docs/twilio-cli/quickstart"&gt;Twilio CLI&lt;/a&gt;および&lt;a href="https://jp.twilio.com/docs/labs/serverless-toolkit/getting-started"&gt;Serverless Toolkit&lt;/a&gt;をインストールし、プロファイルを作成していること
&lt;a href="https://neri78.github.io/Twilio-HandsOn-CLI-JP/"&gt;参考: Twilio CLIハンズオン&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt;などの&lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;POST&lt;/code&gt;リクエストを送信できるツール、または、&lt;code&gt;curl&lt;/code&gt;コマンドを使用&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;次のコマンドで余計なファイルが存在しないTwilio Functionsプロジェクトを作成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;twilio serverless:init &amp;lt;プロジェクト名&amp;gt; --empty

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;プロジェクトフォルダに移動し、続けて次のコマンドで&lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;POST&lt;/code&gt;両方に対応するためのハンドラーメソッドを作成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;twilio serverless:new twitch --template=blank

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Blank.js&lt;/code&gt;を開き次のように変更します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exports.handler = function(context, event, callback) {

 let body = 'パラメータがなければこのメッセージが表示されます。';
 //パラメータが存在するかを確認
 if (event) {

   // Subscription Verify (GET)用のパラメータがセットされているかを確認
   if (event['hub.challenge']) {
     // GETリクエスト用の処理
     body = 'GET';
   }
   // Notification (POST)用のパラメータがセットされているかを確認
   else if (event.data) {
     // POSTリクエスト用の処理
     body = 'POST';
   }
 }
 //コールバック関数に結果を渡す
 callback(null, body);
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;次のコマンドを実行し、ローカルホストで動作させます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;twilio serverless:start

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;http://localhost:3000/twitch/blank&lt;/code&gt;に条件を変えてアクセスしてみましょう。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;何もパラメータを付与せずに&lt;code&gt;GET&lt;/code&gt;メソッドでアクセスした場合&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z5d3RCXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/6yzwogZl_vFBqydxokg4x9zeyuP7_DkJklmNfcMr1yqVvx.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z5d3RCXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/6yzwogZl_vFBqydxokg4x9zeyuP7_DkJklmNfcMr1yqVvx.width-800.png" alt="Postman - No param" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hub.challenge&lt;/code&gt;をtext/plain形式でパラメータに設定し、&lt;code&gt;GET&lt;/code&gt;メソッドを使った場合&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nlu3qiI3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/oSLNJebu2FV4vDGet6s6CiSROIxMVtUmbWpZrAc4ABHiPs.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nlu3qiI3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/oSLNJebu2FV4vDGet6s6CiSROIxMVtUmbWpZrAc4ABHiPs.width-800.png" alt="Postman - GET" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;data&lt;/code&gt;をjson形式でBodyに設定し、&lt;code&gt;POST&lt;/code&gt;メソッドを使った場合&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OOnsjlF1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/_n2RTRh-aL7JCuRj7pqp5w41FgyOv10Ikjlcp5zmIWBdqk.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OOnsjlF1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/_n2RTRh-aL7JCuRj7pqp5w41FgyOv10Ikjlcp5zmIWBdqk.width-800.png" alt="Postman - POST" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;サンプルは&lt;a href="https://github.com/neri78/functions-gp"&gt;こちら&lt;/a&gt;からアクセスできます。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;今回の方法はパラメータから判定しているので厳密にはリクエストメソッドの判定ではありませんが、１つのハンドラーメソッドでGET/POSTリクエストを処理しなければいけない場合に利用できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  このエントリについての問い合わせ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/neri78"&gt;https://github.com/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitch: &lt;a href="https://twitch.tv/neri78"&gt;https://twitch.tv/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>twilio</category>
      <category>functions</category>
      <category>japanese</category>
    </item>
    <item>
      <title>TwilioQuest 24時間チャレンジ開催のおしらせ</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Tue, 11 Aug 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-24-cfg</link>
      <guid>https://dev.to/twilio/twilioquest-24-cfg</guid>
      <description>&lt;p&gt;こんにちは！猛暑が続いていますが、お元気でしょうか？私は夏の暑さとCOVID-19感染者数の増加により、すっかり引きこもっている毎日です。&lt;/p&gt;

&lt;p&gt;さて、先日7月4日にTwilioJP-UG岡山さん主催によるTwilioQuest Nightがオンラインで開催されました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://takeshi.furusato.blog/2020/07/10/twiliojp-ug4.html"&gt;takeshi.furusato.blog - TwilioJP-UG Okayama #4 TwilioQuest Night を開催しました。&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回はこのイベントをもとにTwilio Japanとして2020年8月28日（金）〜 29日（土）にかけて獲得経験値を競う「TwilioQuest 24時間チャレンジ」を開催します。&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuestとは
&lt;/h2&gt;

&lt;p&gt;TwilioQuestは、Twilioが提供する製品の利用方法やJavaScript、PHP、Python、GitHubについてゲームをプレイするように学べるチュートリアルです。最新バージョンではMac/Windows/Linuxそれぞれにインストールでき、自分自身のペースでミッションに挑戦できます。&lt;/p&gt;

&lt;p&gt;参考記事 - &lt;a href="https://dev.to/twilio/game-tutorial-twilioquest3-40cb"&gt;Game + Tutorial = TwilioQuest3のはじめかた&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  24時間チャレンジについて
&lt;/h2&gt;

&lt;p&gt;今回のTwilioQuest 24時間チャレンジは制限時間内にどれだけ経験値を獲得できるかを競うイベントとなります。ご自身が興味のあるミッションを好きな時間にプレイできるため、これまで使ったことのないプロダクトや言語などに挑戦することができます。&lt;/p&gt;

&lt;p&gt;参加者および高得点者には豪華賞品をご用意しています！例えば...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TwilioQuest Tシャツ（参加者全員に進呈）
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1TUqNeb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/MS0nFh6SlYK6KyCZzfx0PVnD-B485HWracoqKIg64krrFc.width-500.png" alt="TQ - T-shirts" width="441" height="500"&gt;
&lt;/li&gt;
&lt;li&gt;TwilioQuest DevBox（上位2名に進呈）
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IL0o_zba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/lGZdoKOFkMp9V9kqIYhhz8XDHDPoliF6ErCCltKz7JaX0K.width-500.png" alt="TQ - DevBox" width="500" height="434"&gt;
&lt;/li&gt;
&lt;li&gt;さらに豪華賞品を追加予定（後日アナウンス）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  参加条件
&lt;/h2&gt;

&lt;p&gt;こちらは至ってシンプルです。&lt;a href="https://connpass.com/event/185412"&gt;イベントに登録いただく&lt;/a&gt;こと、&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;をダウンロードし、インストール、プレイできる環境をご用意いただくことと、賞品を受け取る場合は&lt;a href="https://twilioquest242020.splashthat.com/"&gt;弊社の登録フォーム&lt;/a&gt;にも別途登録いただくことが条件となります。&lt;/p&gt;

&lt;h2&gt;
  
  
  イベント期間中のサポートについて
&lt;/h2&gt;

&lt;p&gt;イベント期間中は、次の予定（日本標準時）でTechnical Assistantによるサポートを提供します。Twilio社員やTwilio ChampionsがTwilioQuestのプレイ方法やミッションについての質問などを日本語でお答えします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2020/08/28 16:30 - 18:00
Ask the TA (オープニングイベント内)&lt;/li&gt;
&lt;li&gt;2020/08/28 18:00 - 20:00
Slackチャンネル内での非同期Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/28 20:00 - 22:00
&lt;a href="https://www.twitch.tv/neri78"&gt;Twitch配信&lt;/a&gt;: 途中経過発表ならびにリアルタイムQ&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/28 22:00 - 08/29 05:00
Slackチャンネル内での非同期Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/29 05:00 - 07:00
&lt;a href="https://www.twitch.tv/neri78"&gt;Twitch配信&lt;/a&gt;: 途中経過発表ならびにリアルタイムQ&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/29 07:00 - 12:00
Slackチャンネル内での非同期Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/29 12:00 - 14:00
&lt;a href="https://www.twitch.tv/neri78"&gt;Twitch配信&lt;/a&gt;: 途中経過発表ならびにリアルタイムQ&amp;amp;A&lt;/li&gt;
&lt;li&gt;2020/08/29 14:00 - 17:00
Slackチャンネル内での非同期Q&amp;amp;A&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*ストリーミングについては予定が変更になる可能性があります。&lt;/p&gt;

&lt;h2&gt;
  
  
  参加方法
&lt;/h2&gt;

&lt;p&gt;下記イベントページよりご登録ください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://connpass.com/event/185412"&gt;TwilioQuest 24時間チャレンジイベントページ&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  この記事についての問い合わせ
&lt;/h2&gt;

&lt;p&gt;イベントについての質問がありましたらぜひお問い合わせください。みなさんの参加をお待ちしています！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/neri78"&gt;https://github.com/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitch: &lt;a href="https://twitch.tv/neri78"&gt;https://twitch.tv/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>event</category>
      <category>twilioquest</category>
      <category>rpg</category>
      <category>japanese</category>
    </item>
    <item>
      <title>Googleスプレッドシートのシフト表を使ってTwilio Studioフローの転送先をNode.jsから更新する方法</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Wed, 20 May 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/google-twilio-studio-node-js-4ebd</link>
      <guid>https://dev.to/twilio/google-twilio-studio-node-js-4ebd</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--43Kfl8AP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/bequajswJOH0AUI_wEGCzYL1tE1Lk7xoDRK3nmBGdPsuLw.width-808.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--43Kfl8AP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/bequajswJOH0AUI_wEGCzYL1tE1Lk7xoDRK3nmBGdPsuLw.width-808.png" alt="Header"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/twilio/twilio-studio-3a0g"&gt;以前の記事&lt;/a&gt;で、在宅勤務に伴う電話問い合わせの一時休止を解決する方法として、Twilio Studioを利用し個人電話に転送する方法を紹介しました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EBpd_Hiv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/n6KNulbJGD3QxKIb-krEiNGnVjw963EqHHcaTmPpBLYAER.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EBpd_Hiv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/n6KNulbJGD3QxKIb-krEiNGnVjw963EqHHcaTmPpBLYAER.width-800.png" alt="Twilio Studio - Flow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回は&lt;a href="https://dev.to/neri78/google-node-js-3k6d-temp-slug-8514028"&gt;別の記事&lt;/a&gt;で紹介したGoogleスプレッドシートのシフトデータをもとに転送先となる個人をNode.jsで変更する方法を紹介します。&lt;/p&gt;

&lt;p&gt;前提条件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilioアカウントを持っていること（&lt;a href="https://www.twilio.com/blog/how-to-create-twilio-account-jp"&gt;無料トライアルのサインアップ方法&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;期間限定の問い合わせ番号となる&lt;a href="https://support.twilio.com/hc/en-us/articles/360044841214-Twilio-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6#h_167b5625-0036-44e6-936f-108ed091cb80"&gt;電話番号を購入&lt;/a&gt;していること
（&lt;a href="https://support.twilio.com/hc/en-us/articles/360044400214-%E8%A6%8F%E5%88%B6%E6%83%85%E5%A0%B1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E6%9B%B8%E9%A1%9E%E3%81%AE%E6%8F%90%E5%87%BA%E6%96%B9%E6%B3%95"&gt;日本の番号を取得する場合&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/twilio/twilio-studio-3a0g"&gt;こちらの記事&lt;/a&gt;に則りフローを作成、公開済みであること&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/twilio/google-node-js-1ap1"&gt;こちらの記事&lt;/a&gt;に則りGoogleスプレッドシートからデータを取得するNode.jsアプリケーションを作成済みであること&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Node.jsプロジェクトの作成とパッケージのインストール
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/twilio/google-node-js-1ap1"&gt;以前の記事&lt;/a&gt;に沿って作成したNode.jsアプリケーションのフォルダーに移動し、&lt;a href="https://www.npmjs.com/package/twilio"&gt;twilio-node&lt;/a&gt;パッケージをインストールします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i twilio
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;次に.envファイルにTwilioへの接続情報やStudioフローのIDを保存する環境変数を追加します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPREADSHEET_ID=
STAFF_WORKSHEET_ID=
SHIFT_WORKSHEET_ID=
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_STUDIO_FLOW_SID=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Twilio Studio REST API v2を使ったフローの取得と更新
&lt;/h2&gt;

&lt;p&gt;今回利用するTwilio Studio REST API v2は4月末に&lt;a href="https://www.twilio.com/blog/automate-flow-deployments-studio-rest-api-v2-beta"&gt;パブリックベータとしてアナウンス&lt;/a&gt;されたばかりの機能です。この新しいAPIを使って定義済みのフロー設定を外部から更新できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/console"&gt;Twilioコンソール&lt;/a&gt;を開きACCOUNT SIDと、AUTH TOKENをそれぞれ.envファイルの &lt;code&gt;TWILIO_ACCOUNT_SID&lt;/code&gt;ならびに &lt;code&gt;TWILIO_STUDIO_FLOW_SID&lt;/code&gt; の値として設定します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G0C2x8Ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/cfc6YMp-DykS55Rahs24kn2759AIZSMNsfhTto3dnHBibZ.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G0C2x8Ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/cfc6YMp-DykS55Rahs24kn2759AIZSMNsfhTto3dnHBibZ.width-800.png" alt="AccountSid &amp;amp; AuthToken"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;次に、&lt;a href="https://www.twilio.com/console/studio/dashboard"&gt;Studioコンソール&lt;/a&gt;を開き、call forwardingフローのSIDを &lt;code&gt;TWILIO_STUDIO_FLOW_SID&lt;/code&gt; の値として設定します。&lt;/p&gt;

&lt;p&gt;index.jsを開き、&lt;a href="https://dev.to/twilio/google-node-js-1ap1"&gt;前回の記事&lt;/a&gt;でテストに使用したコードを変更します。このコードでは、シフト担当者の電話番号を取得した状態で、Twilio Nodeクライアントを利用しStudioフローを取得します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loadShiftPhoneNumbers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// twilio client&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twilio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_ACCOUNTSID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Studioのフローを取得&lt;/span&gt;
        &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;studio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_STUDIO_FLOW_SID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flow&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;フローの定義情報は、definitionというプロパティに保持されているため、そちらを取得します。また、各ウィジェットについては、statesというプロパティに配列として定義されています。このstates配列からウィジェットの名前をキーとして着信を転送するウィジェットを取得し、更に転送先番号を更新します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loadShiftPhoneNumbers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// twilio client&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twilio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_ACCOUNTSID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Studioのフローを取得&lt;/span&gt;
        &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;studio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_STUDIO_FLOW_SID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flow&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// フローの定義を取得&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="c1"&gt;// forward_callウィジェットを取得&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;callForwardWidget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forward_call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="c1"&gt;// 転送先番号をシフトの電話番号で更新&lt;/span&gt;
                &lt;span class="nx"&gt;callForwardWidget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;後は更新した定義をStudio REST API v2を使い、反映させます。この際、statusプロパティで反映したフローを下書き状態（draft）にしておくことも、即座に公開（published）にすることもできます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loadShiftPhoneNumbers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// twilio client&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twilio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_ACCOUNTSID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Studioのフローを取得&lt;/span&gt;
        &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;studio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_STUDIO_FLOW_SID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flow&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// フローの定義を取得&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="c1"&gt;// forward_callウィジェットを取得&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;callForwardWidget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forward_call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="c1"&gt;// 転送先番号をシフトの電話番号で更新&lt;/span&gt;
                &lt;span class="nx"&gt;callForwardWidget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="c1"&gt;// 更新した定義を反映し、即座に公開&lt;/span&gt;
                &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;studio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TWILIO_STUDIO_FLOW_SID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                        &lt;span class="na"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;commitMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;シフトの更新 - 2020/05/15&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;published&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;index.jsを実行し、ログにエラーが含まれていないこと、Studioのフローが実際に変更されていることを確認しましょう。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;ご覧いただいたように、パブリックベータとして公開されたREST API v2を活用することで、外部のデータやシステムと連携した上でTwilio Studioのフローを更新することができるようになりました。非常に強力なAPIなので、ぜひご活用ください。&lt;/p&gt;

&lt;p&gt;今回のサンプルはこちらの&lt;a href="https://github.com/neri78/twilio-studio-google-spreadsheet"&gt;GitHubリポジトリ&lt;/a&gt;からクローンし、環境変数にそれぞれ値を設定することで確認することも可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  新型コロナウイルス感染症への支援策について
&lt;/h2&gt;

&lt;p&gt;Twilioでは新型コロナウィルス感染症により引き起こされるさまざまな社会問題を解決する会社、団体、開発者グループに向けて無料クレジットの進呈など支援を行なっています。詳しくは&lt;a href="https://www.twilio.com/blog/covid-19-response-japan"&gt;こちらの記事&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;p&gt;また、Twilioを自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、&lt;a href="https://www.twilio.com/japan/help/sales"&gt;営業部までお問い合わせ&lt;/a&gt;ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  このエントリについての問い合わせ
&lt;/h2&gt;

&lt;p&gt;不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/neri78"&gt;https://github.com/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitch: &lt;a href="https://twitch.tv/neri78"&gt;https://twitch.tv/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>studio</category>
      <category>googlespreadsheet</category>
      <category>node</category>
      <category>japanese</category>
    </item>
    <item>
      <title>GoogleスプレッドシートからNode.jsでシフトデータを読み出す方法</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Tue, 19 May 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/google-node-js-1ap1</link>
      <guid>https://dev.to/twilio/google-node-js-1ap1</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J0Hjj9Sq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JfSEBIrPI4CAu3k18bqViRLlvPl1fZIbJ9LpKwl1J86O0d.width-808.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J0Hjj9Sq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JfSEBIrPI4CAu3k18bqViRLlvPl1fZIbJ9LpKwl1J86O0d.width-808.png" alt="Header Image"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://console.cloud.google.com/?hl=ja"&gt;Google Cloud Platform（GCP）&lt;/a&gt;には&lt;a href="https://developers.google.com/sheets/api"&gt;Google Sheets API&lt;/a&gt;が提供されており、このAPIを利用してGoogleスプレッドシートのデータにアクセスすることができます。今回はGoogleスプレッドシートのスタッフ、シフトデータをNode.jsで読み込む方法を紹介します。&lt;/p&gt;

&lt;p&gt;前提条件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://console.cloud.google.com/?hl=ja"&gt;Google Cloud Platform （GCP）のアカウント&lt;/a&gt;の作成、ならびに有効な支払い方法が登録されていること&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.google.com/intl/ja_jp/sheets/about/"&gt;Googleスプレッドシート&lt;/a&gt;を利用できること&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  シフトを管理するGoogleスプレッドシート
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1KHozXisufSbldqeTtkTO3-fRT9McdVxrzVz7YyCWSqM/edit?usp=sharing"&gt;こちら&lt;/a&gt;にスプレッドシートのサンプルを用意しました。ファイルメニューからこのスプレッドシートを自分のGoogleアカウントで利用できるようにコピーします。スプレッドシートの中身をみてみましょう。Shiftシートには日ごとの担当者を4名まで設定しています。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ruXhOmcV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JTcbF8FiG0AyceVQcR4FQNszfxEwj5zwFtf9w0KPLfcwJj.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ruXhOmcV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JTcbF8FiG0AyceVQcR4FQNszfxEwj5zwFtf9w0KPLfcwJj.width-800.png" alt="Google Spreadsheet - Shift"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;また、Staffシートには担当者ごとの連絡先電話番号が&lt;a href="https://www.twilio.com/docs/glossary/what-e164"&gt;E.164フォーマット&lt;/a&gt;で登録されています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wsDt19wU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/-ke-JpIzwIkEdVu41E8aa4OsC8YPLq9zHavppvy7FuI04C.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wsDt19wU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/-ke-JpIzwIkEdVu41E8aa4OsC8YPLq9zHavppvy7FuI04C.width-800.png" alt="Google Spreadsheet - Staff"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  GCPでSheets APIを有効化
&lt;/h2&gt;

&lt;p&gt;はじめてGCPを利用する場合は、&lt;a href="https://console.cloud.google.com/cloud-resource-manager"&gt;コンソール&lt;/a&gt;からプロジェクトを作成します。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K1Rqovn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/ooE7wJ3JEVutwUGFPfuZC9JorRaxWpFOD4K4DS9syz0L99.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K1Rqovn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/ooE7wJ3JEVutwUGFPfuZC9JorRaxWpFOD4K4DS9syz0L99.width-800.png" alt="GCP - Create a project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;例ではプロジェクト名を &lt;code&gt;google-sheet-studio&lt;/code&gt; としましたが、任意のプロジェクト名で構いません。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BGxOYwT3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/AfZdHBVKjtKyGBsHpFbVGErsr-LOfmrkXp5xIYYN0hLnU0.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BGxOYwT3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/AfZdHBVKjtKyGBsHpFbVGErsr-LOfmrkXp5xIYYN0hLnU0.width-800.png" alt="GCP - project name"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作成ボタンをクリックするとリソースの管理画面に戻り、プロジェクトの作成が開始されます。数十秒〜数分程度で作成が完了します。&lt;/p&gt;

&lt;p&gt;次に&lt;a href="https://console.cloud.google.com/apis/library"&gt;API ライブラリ&lt;/a&gt;を開きます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XDQ24ndu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/GDhetd6rJRyWJZNxq1leRhhn7bwz3hqWkj74w0eeSCHQhv.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XDQ24ndu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/GDhetd6rJRyWJZNxq1leRhhn7bwz3hqWkj74w0eeSCHQhv.width-800.png" alt="GCP - Open API Library"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;先ほど作成したプロジェクトが選択されていることを確認します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ6QHeCv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/F085blQIr1lxDfm7NuuO1Om1XrHR8RUZazZMvc0CRydar-.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ6QHeCv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/F085blQIr1lxDfm7NuuO1Om1XrHR8RUZazZMvc0CRydar-.width-800.png" alt="GCP - API Library with a project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google Sheets APIを検索し、プロジェクトに追加します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XXzxBPjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/5QjQstd86zQXHcCP_oPQVO5uIvSOipkjGwBqZjTQyKcEpL.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XXzxBPjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/5QjQstd86zQXHcCP_oPQVO5uIvSOipkjGwBqZjTQyKcEpL.width-800.png" alt="GCP - search sheets API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;詳細画面から &lt;code&gt;有効にする&lt;/code&gt; ボタンをクリックするとGoogle Sheets APIが有効になります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--amoyZbRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/iHS-ff4E5U65OLwx-Hz52VM2VCeCDb14rjwmseU2cb3C1W.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--amoyZbRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/iHS-ff4E5U65OLwx-Hz52VM2VCeCDb14rjwmseU2cb3C1W.width-800.png" alt="GCP - enable sheets API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;APIが有効化されると、概要画面に遷移します。次に &lt;code&gt;認証情報を作成&lt;/code&gt; ボタンをクリックし、このAPIを使用するための認証情報を作成します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NwDWNODL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/mdPFFkjpFUewRvZtgR4HhhwNtONnuvGvs4o3Mbb8YWXGnT.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NwDWNODL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/mdPFFkjpFUewRvZtgR4HhhwNtONnuvGvs4o3Mbb8YWXGnT.width-800.png" alt="GCP - Add auth info"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;認証情報の追加画面において次の設定を行い、&lt;code&gt;必要な認証情報&lt;/code&gt; ボタンをクリックします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用する API - Google Sheets API&lt;/li&gt;
&lt;li&gt;API を呼び出す場所 - ウェブサーバー（node.js、Tomcat など）&lt;/li&gt;
&lt;li&gt;アクセスするデータの種類 - アプリケーション データ&lt;/li&gt;
&lt;li&gt;App Engine または Compute Engine でこの API を使用する予定はありますか？ - いいえ、使用していません&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LbElWgPf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/d7DzQucz1snBQJBnUZ8AxaWun3kguQxe8_xf6HS2NrjFgr.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LbElWgPf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/d7DzQucz1snBQJBnUZ8AxaWun3kguQxe8_xf6HS2NrjFgr.width-800.png" alt="GCP - Create a service account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;続けてサービスアカウント名とロールを設定します。例では、&lt;code&gt;test&lt;/code&gt; およびロールを &lt;code&gt;Project&lt;/code&gt; の &lt;code&gt;閲覧者&lt;/code&gt; とし、キーのタイプを &lt;code&gt;JSON&lt;/code&gt; としました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6kKtaOOi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/y-iIsGp2LwAvFexgqbUx_lANXcg-bhKlka14JOcK1sb97D.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6kKtaOOi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/y-iIsGp2LwAvFexgqbUx_lANXcg-bhKlka14JOcK1sb97D.width-800.png" alt="GCP - Create a service account - name"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;次へ&lt;/code&gt; ボタンをクリックすると認証情報を含んだJSONファイルが作成されダウンロードされます。このファイルはGoogle Sheets APIを利用するために必要になります。作成されたJSONファイルを開くと &lt;code&gt;client_email&lt;/code&gt; という名前のキーの値に先ほど作成したサービス アカウント IDが記載されています。Googleスプレッドシートを共有する際にこの情報が必要になります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BfFb6JHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JgW7p51hA5u-4yggqHymFjLMI_rGBvu0wAHDCpVJXsZeJq.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BfFb6JHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/JgW7p51hA5u-4yggqHymFjLMI_rGBvu0wAHDCpVJXsZeJq.width-800.png" alt="gcp - service account"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Googleスプレッドシートの共有とURLや情報の確認
&lt;/h2&gt;

&lt;p&gt;次に、Google Sheets APIからアクセスをできるようにGoogleスプレッドシートをサービス アカウントに共有します。先ほど複製したGoogleスプレッドシートを開き、右上の &lt;code&gt;共有&lt;/code&gt; ボタンをクリックします。表示された共有ダイアログに先ほどのサービス アカウント IDを入力します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TyRLEzgh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/eNfWeKahkSszuRfCxD4PgtaVRVJm-vLmfv19RvvXM4xgxb.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TyRLEzgh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/eNfWeKahkSszuRfCxD4PgtaVRVJm-vLmfv19RvvXM4xgxb.width-800.png" alt="Google Spreadsheet - share the sheet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enterキーを押すと、権限の設定を行えます。書き込み権限は必要ないため閲覧者としました。&lt;code&gt;共有&lt;/code&gt; ボタンをクリックし、共有を完了します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8HQJdAwQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/z5tAPOALrfoTztQVwEDWn1fmusPZP25PbsepJd8VsMp8P7.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8HQJdAwQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://twilio-cms-prod.s3.amazonaws.com/images/z5tAPOALrfoTztQVwEDWn1fmusPZP25PbsepJd8VsMp8P7.width-800.png" alt="Google Spreadsheet - share as a viewer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;更に、このGoogleスプレッドシートから次の情報を控えておきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;スプレッドシートID（&lt;a href="https://docs.google.com/spreadsheets/d/"&gt;https://docs.google.com/spreadsheets/d/&lt;/a&gt; の後に表示されている英数文字列のうち、次の’/’ の前の値。例: &lt;a href="https://docs.google.com/spreadsheets/d/"&gt;https://docs.google.com/spreadsheets/d/&lt;/a&gt; &lt;strong&gt;12312321xxx21232131212&lt;/strong&gt; /edit#gid=0 の太字部分）&lt;/li&gt;
&lt;li&gt;Shift、StaffそれぞれのワークシートのID（URLが &lt;strong&gt;#gid=0&lt;/strong&gt;  の場合は、 &lt;strong&gt;0&lt;/strong&gt; となる ）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これでシートから情報を取得する前準備が整いました。&lt;/p&gt;
&lt;h2&gt;
  
  
  Node.jsプロジェクトの作成とパッケージのインストール
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/sheets/api"&gt;Google Sheets API&lt;/a&gt;を利用することでGoogleスプレッドシートのデータにアクセスすることができます。このAPIに対応する&lt;a href="https://github.com/googleapis/google-api-nodejs-client/tree/master/src/apis/sheets"&gt;Node.jsクライアントライブラリ&lt;/a&gt;も用意されており、&lt;a href="https://developers.google.com/sheets/api/quickstart/nodejs"&gt;クイックスタート&lt;/a&gt;のようにセルの値を取得することもできるのですが、取得するセルの範囲を指定する必要があり、使いにくいと感じるかもしれません。そのため、今回はGoogle Sheets APIを使いやすくラップした&lt;a href="https://developers.google.com/sheets/api/quickstart/nodejs"&gt;google-spreadsheet&lt;/a&gt;パッケージを利用します。このパッケージを利用すると、セルの範囲を指定することなく、ワークシートから行オブジェクトとしてデータを読み込むことができます。&lt;/p&gt;

&lt;p&gt;Node.jsアプリケーションを作成し、&lt;a href="https://www.npmjs.com/package/google-spreadsheet"&gt;google-spreadsheet&lt;/a&gt;と環境変数を.envファイルからロードできる&lt;a href="https://www.npmjs.com/package/dotenv"&gt;dotenv&lt;/a&gt;パッケージをインストールします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i google-spreadsheet dotenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;次にGoogleスプレッドシートやシートのIDを記録しておく.envファイルを作成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch .env
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;.envファイルには次の環境変数を追加しておきます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPREADSHEET_ID=
SHIFT_WORKSHEET_ID=
STAFF_WORKSHEET_ID=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SPREADSHEET_ID&lt;/code&gt;、&lt;code&gt;STAFF_WORKSHEET_ID&lt;/code&gt;、&lt;code&gt;SHIFT_WORKSHEET_ID&lt;/code&gt; には先ほど控えておいたGoogleスプレッドシートのIDやそれぞれのシートのIDを追加します。&lt;/p&gt;

&lt;p&gt;最後にGCPからダウンロードしたJSONファイルをプロジェクトフォルダーにコピーし、わかりやすいように名前を &lt;code&gt;credentials.json&lt;/code&gt; と変更します。これで準備完了です。&lt;/p&gt;

&lt;h2&gt;
  
  
  Googleスプレッドシートからシフト表を取得
&lt;/h2&gt;

&lt;p&gt;ここからはGoogleスプレッドシートからシフト表を取得するコードを実装します。Node.jsアプリケーションに新しくjsファイルを追加します。&lt;code&gt;index.js&lt;/code&gt; という名前で作成しました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch index.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;index.jsをエディタで開き、環境変数の読み込みや必要なパッケージをインポートします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'use strict';
require('dotenv').config();
const { GoogleSpreadsheet } = require('google-spreadsheet');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;次にGoogleスプレッドシートからシフトデータを読み取り、担当者の電話番号を返す非同期関数を実装します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得
async function loadShiftPhoneNumbers() {
    // 処理を実装
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;この &lt;code&gt;loadShiftPhoneNumbers&lt;/code&gt; 関数でGoogleスプレッドシートをロードします。ここでGCPへの接続に必要になるのが先ほどコピーし、名前を変更した &lt;code&gt;credentials.json&lt;/code&gt; です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得
async function loadShiftPhoneNumbers() {
    // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード
    const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID);
    const credentials = require('./credentials.json');
    await doc.useServiceAccountAuth(credentials);
    await doc.loadInfo();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ワークシートを取得する場合は、&lt;a href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet?id=worksheets"&gt;GoogleSpreadsheet.sheetsById、またはGoogleSpreadsheet.sheetsbyIndex&lt;/a&gt;を利用できます。さらに、&lt;a href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet?id=fn-getrows"&gt;GoogleSpreadsheetWorksheet.getRows&lt;/a&gt;メソッドを使用し、ワークシートの行を取得できます。残念ながら特定の列の値をキーにフィルタリングはできないようなので全ての行を取得します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得
async function loadShiftPhoneNumbers() {
    // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード
    const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID);
    const credentials = require('./credentials.json');
    await doc.useServiceAccountAuth(credentials);
    await doc.loadInfo();

    //シフト情報を取得
    const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID];
    const shiftRows = await shiftSheet.getRows();
    // 従業員情報を取得const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID];
    const staffRows = await staffSheet.getRows();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet?id=fn-getrows"&gt;GoogleSpreadsheetWorksheet.getRows&lt;/a&gt;メソッドはGoogleSpreadsheetRowの配列を返します。また、この&lt;a href="https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-row"&gt;GoogleSpreadsheetRow&lt;/a&gt;オブジェクトは最初の行をプロパティのキーとしてアクセスできるため、&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find"&gt;Array.prototype.find()&lt;/a&gt;メソッドを利用し、Date列をキーとして特定の日付のデータを抜き出すことができます。この記事では、2020年5月15日を例として取得します。実際のアプリケーションでは &lt;code&gt;new Date()&lt;/code&gt; などを利用し、当日のデータを取得することになるでしょう。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得
async function loadShiftPhoneNumbers() {
    // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード
    const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID);
    const credentials = require('./credentials.json');
    await doc.useServiceAccountAuth(credentials);
    await doc.loadInfo();

    //シフト情報を取得
    const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID];
    const shiftRows = await shiftSheet.getRows();
    // 従業員情報を取得const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID];
    const staffRows = await staffSheet.getRows();

    // シフト情報からDate列の値と指定した日付をロケール情報に基づいて取得
    let shiftRow = shiftRows.find(row =&amp;gt;
        new Date(row.Date).toLocaleDateString() ===
        new Date('2020/5/15').toLocaleDateString());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;あとは、取得した行から必要なデータを読み取り、アプリケーションで使用できます。&lt;/p&gt;

&lt;p&gt;データの活用例として、このシフトデータから担当者の電話番号をカンマ区切りの文字列で取得する方法も実装します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shiftRow.Employee1&lt;/code&gt;のように各列のキーを指定してデータを取得することもできますが、&lt;code&gt;shiftRow._rawData shiftRow&lt;/code&gt; には、行のデータが配列として保持されています。2020年5月15日のデータは、&lt;code&gt;['5/15/2020', 'Mitsuharu', 'Yoshihiro']&lt;/code&gt; となります。この配列を&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice"&gt;Array.prototype.slice()&lt;/a&gt;メソッドで最初の日付データを除外した配列とし、さらに、&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map"&gt;Array.prototype.map()&lt;/a&gt;メソッドでシフト担当の従業員の電話番号の配列へと変換します。そして、最後に、&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join"&gt;Array.prototype.join()&lt;/a&gt;メソッドで文字列として返すという処理を実装しました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Googleスプレッドシートからシフト情報をロードし、担当者の電話番号を取得
async function loadShiftPhoneNumbers() {
    // スプレッドシートIDと資格情報を用いてGoogleスプレッドシートをロード
    const doc = new GoogleSpreadsheet(process.env.SPREADSHEET\_ID);
    const credentials = require('./credentials.json');
    await doc.useServiceAccountAuth(credentials);
    await doc.loadInfo();

    //シフト情報を取得
    const shiftSheet = await doc.sheetsById[process.env.SHIFT_WORKSHEET_ID];
    const shiftRows = await shiftSheet.getRows();
    // 従業員情報を取得const staffSheet = await doc.sheetsById[process.env.STAFF_WORKSHEET_ID];
    const staffRows = await staffSheet.getRows();

    // シフト情報からDate列の値と指定した日付をロケール情報に基づいて取得
    let shiftRow = shiftRows.find(row =&amp;gt;
        new Date(row.Date).toLocaleDateString() ===
        new Date('2020/5/15').toLocaleDateString());

        // 元データ['5/15/2020', 'Mitsuharu', 'Yoshihiro']
        // Date列(最初の列)を取り除き、シフト担当の従業員を含む配列を取得する
        let employeesOnDuty = shiftRow._rawData.slice(1); 
        // ['Mitsuharu', 'Yoshihiro']
        // 名前から電話番号の配列に置換
        employeesOnDuty = employeesOnDuty.map(m =&amp;gt; 
            staffRows.find(row =&amp;gt; row.Name === m).PhoneNumber); 
        // ['+815012341235', '+815012341237']

        return employeesOnDuty.join(',');}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ここまで実装を終えた段階で、きちんとデータを読み込めるかどうかを確認しましょう。&lt;br&gt;
loadShiftNumbers関数のスコープ外に次のコードを追加します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 実装した関数が正しく動作するかテスト
loadShiftPhoneNumbers()
    .then (numbers =&amp;gt; console.log(numbers))
    .catch(error =&amp;gt; console.error(error));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;index.jsを実行し、次のような結果がコンソールに出力されていれば成功です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;実行結果&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+815012341235,+815012341237
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;想定した結果が得られない場合は、出力されたエラーを参考にGCPの設定や、JSONファイルの読み込みなどを確認してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;ご覧いただいたように、Google Sheets APIを使うことでGoogleスプレッドシートをデータソースとしたアプリケーションを構築することができます。ぜひご活用ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  このエントリについての問い合わせ
&lt;/h2&gt;

&lt;p&gt;不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/neri78"&gt;https://github.com/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitch: &lt;a href="https://twitch.tv/neri78"&gt;https://twitch.tv/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googlespreadsheet</category>
      <category>sheetapi</category>
      <category>node</category>
      <category>japanese</category>
    </item>
    <item>
      <title>Twilio Studioを使って問い合わせ番号への着信を複数の番号に転送する方法</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Fri, 17 Apr 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilio-studio-3a0g</link>
      <guid>https://dev.to/twilio/twilio-studio-3a0g</guid>
      <description>&lt;h2&gt;
  
  
  在宅勤務と電話応対の難しさ
&lt;/h2&gt;

&lt;p&gt;新型コロナウイルス感染症（COVID-19）の拡大に伴う緊急事態宣言が東京、大阪、福岡を含む7都道府県を対象として発出されました。（2020年4月14日現在）この宣言を受けて在宅勤務の開始とそれに伴う電話対応の一時休止が多くの企業から&lt;a href="https://www.google.com/search?q=%E7%B7%8A%E6%80%A5%E4%BA%8B%E6%85%8B%E5%AE%A3%E8%A8%80+%E9%9B%BB%E8%A9%B1+%E4%B8%80%E6%99%82%E4%BC%91%E6%AD%A2&amp;amp;oq=%E7%B7%8A%E6%80%A5%E4%BA%8B%E6%85%8B%E5%AE%A3%E8%A8%80%E3%80%80%E9%9B%BB%E8%A9%B1%E3%80%80%E4%B8%80%E6%99%82%E4%BC%91%E6%AD%A2&amp;amp;aqs=chrome..69i57.9317j0j7&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;アナウンス&lt;/a&gt;されています。チャットやSMSを活用することでこれまでの顧客対応を一部担うことはできるものの、利用できるコミュニケーションチャネルが電話のみという場合、お客様への対応に頭を悩ます場合も多いのではないでしょうか。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V5u0k8za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/SQ3HmQXlEPyk02wHmwS2iARE3idp8tHj-rk09QIvLotML4.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V5u0k8za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/SQ3HmQXlEPyk02wHmwS2iARE3idp8tHj-rk09QIvLotML4.width-500.png" alt="no-phone-operation" width="500" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;もちろん、各事業者が提供する電話転送サービスなどを利用することで、代表番号からの転送を設定することは可能です。しかし、担当者の欠勤や休暇への対応など、転送設定を柔軟に運用するためには課題が残ります。また、リモートで設定ができない場合は、リスクを取って事業所まで外出し、設定を行うということも考えられます。特に中小規模の組織にとっては頭の痛い問題ではないでしょうか。&lt;/p&gt;

&lt;p&gt;今回は、電話番号をTwilioから取得し、Twilio Studioを使って期間限定の問い合わせ窓口を開設し、着信を複数の担当者の電話回線に転送する方法を紹介します。ポイントは手軽さと設定の柔軟性です。&lt;/p&gt;

&lt;h2&gt;
  
  
  前提条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Twilioアカウントを持っていること（&lt;a href="https://www.twilio.com/blog/how-to-create-twilio-account-jp"&gt;無料トライアルのサインアップ方法&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;期間限定の問い合わせ番号となる&lt;a href="https://support.twilio.com/hc/en-us/articles/360044841214-Twilio-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6#h_167b5625-0036-44e6-936f-108ed091cb80"&gt;電話番号を購入&lt;/a&gt;していること
（&lt;a href="https://support.twilio.com/hc/en-us/articles/360044400214-%E8%A6%8F%E5%88%B6%E6%83%85%E5%A0%B1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E6%9B%B8%E9%A1%9E%E3%81%AE%E6%8F%90%E5%87%BA%E6%96%B9%E6%B3%95"&gt;日本の番号を取得する場合&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Twilio Studioを使った電話転送
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/studio"&gt;Twilio Studio&lt;/a&gt;は電話やSMSなどの着信応答を設定することができるノンコーディーングツールです。今回のような転送設定を行う場合はプログラミングの知識を必要としません。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/console/"&gt;Twilioコンソール&lt;/a&gt;から&lt;a href="https://www.twilio.com/console/studio/dashboard"&gt;Studioダッシュボード&lt;/a&gt;を開き、赤色の &lt;code&gt;Create a flow&lt;/code&gt; ボタンをクリックし、新しいFlowの作成を開始します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NDAgYoY3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/HnJ8FCupyTmRI73nucAniFO5x2ccUx5vgeJ60gDZYQuNLj.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NDAgYoY3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/HnJ8FCupyTmRI73nucAniFO5x2ccUx5vgeJ60gDZYQuNLj.width-800.png" alt="Studio Dashboard" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flowの名前はCall Forwardingとしました。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ePSBrf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/pUTnjlCe5tMmuB-kSRFWB7pw_MblotSRuditek_0Sv3LKu.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ePSBrf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/pUTnjlCe5tMmuB-kSRFWB7pw_MblotSRuditek_0Sv3LKu.width-500.png" alt="Flow name" width="500" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Studioにはいくつかテンプレートが用意されているため、目的に合えば最小限の項目設定で運用を開始できます。少しスクロールすると表示される &lt;code&gt;Call Forwarding&lt;/code&gt; テンプレートを選択し、&lt;code&gt;Next&lt;/code&gt; ボタンをクリックします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XLNmDJEN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Eiyw7Un8tFz_ELhIOH5CRlDHKV5UdEXsc0IX1P8AqHBXsI.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XLNmDJEN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Eiyw7Un8tFz_ELhIOH5CRlDHKV5UdEXsc0IX1P8AqHBXsI.width-500.png" alt="Flow template" width="500" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;あらかじめ、&lt;code&gt;Connect Call To&lt;/code&gt; というウィジェットが配置されたデザイン画面が表示されます。このデザイン画面では右側の &lt;code&gt;WIDGET LIBRARY&lt;/code&gt; からウィジェットをドラッグ&amp;amp;ドロップし、複雑なコールフローを設定できます。&lt;/p&gt;

&lt;p&gt;今回の記事では特にウィジェットを追加しないまま進めます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---YnblECr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/47Q77dMKvOPmkeTbMRMC-963vP_3abPlEbmQ_lsJ5iZFZB.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---YnblECr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/47Q77dMKvOPmkeTbMRMC-963vP_3abPlEbmQ_lsJ5iZFZB.width-800.png" alt="Studio Designer" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;次に &lt;code&gt;forward_call&lt;/code&gt; と名前がつけられているウィジェットをクリックしましょう。WIDGET LIBRARYが表示されていたパネルが、選択したウィジェットの設定項目表示パネルに切り替わります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r4-KP9v_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/kCSo93QknPRiCSwsH8yjdNVAEuhB59efcquAsS_lUZSmmO.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r4-KP9v_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/kCSo93QknPRiCSwsH8yjdNVAEuhB59efcquAsS_lUZSmmO.width-800.png" alt="Widget properties" width="800" height="623"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;このウィジェットは現在の通話を別の番号（単数、複数）や、Client User（別のTwilio Client）、SIM、SIPエンドポイント、あるいはカンファレンスコールに接続させることができます。今回は複数の番号に転送したいため、&lt;code&gt;CONNECT CALL TO&lt;/code&gt; を&lt;code&gt;Multiple Numbers (Simulring)&lt;/code&gt; に、&lt;code&gt;PHONE NUMBERS OR CLIENTS&lt;/code&gt; に複数の電話番号をカンマ（,）区切りで設定しました。この際、電話番号はE.&lt;a href="https://www.twilio.com/docs/glossary/what-e164"&gt;164フォーマット&lt;/a&gt;で指定する必要があります。&lt;/p&gt;

&lt;p&gt;（例）050-3196-5549 → +815031965549&lt;/p&gt;

&lt;p&gt;また、複数の番号に転送する場合は、同時に転送するわけでなく、Call Per Second（CPS）と呼ばれる１秒間あたりの発信数に則り転送されます。現在の設定は&lt;a href="https://www.twilio.com/console/voice/settings"&gt;コンソール&lt;/a&gt;で確認できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rI4SGaNM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/sMJnJ-5r19sErMZNxfAAyYdREQ2DYUXMkbddlTNE-lv_yT.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rI4SGaNM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/sMJnJ-5r19sErMZNxfAAyYdREQ2DYUXMkbddlTNE-lv_yT.width-500.png" alt="Connecting call to" width="342" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;つぎに発信者ID（CALLER ID）を設定しましょう。この項目は転送先の携帯電話等に表示される発信元の番号になります。本来であれば 電話をかけてきたお客様の番号を表示できれば良いのですが、一般電話回線にTwilio Studioを用いた電話の転送を行なった場合、発信者の偽装になりかねないため、残念ながら「非通知」と表示されてしまいます。&lt;/p&gt;

&lt;p&gt;これでは本当に非通知なのか、Twilio Studioで転送された着信かどうかがわからず不便ですよね。そのため、代替策として、&lt;code&gt;{{trigger.call.To}}&lt;/code&gt; と指定し、期間限定の問い合わせ番号として設定する番号、すなわち転送に利用したTwilioの電話番号が表示されるようにします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwymU5cE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/vqsgIEHHpNYsIWhVeClQ0SVqRYiN-irI2NLN9FQVgcG8RX.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwymU5cE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/vqsgIEHHpNYsIWhVeClQ0SVqRYiN-irI2NLN9FQVgcG8RX.width-500.png" alt="caller ID" width="342" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これでStudioの設定は完了です。ウィジェットの &lt;code&gt;Save&lt;/code&gt; ボタンで変更を保存するとともに、画面上の &lt;code&gt;Publish&lt;/code&gt; ボタンでフローを公開できます。忘れないように &lt;strong&gt;Publish&lt;/strong&gt; してください。&lt;/p&gt;

&lt;p&gt;さて、残るは電話番号の設定です。事前に購入している電話番号の詳細画面を&lt;a href="https://www.twilio.com/console/phone-numbers/incoming"&gt;電話番号コンソール&lt;/a&gt;から開き、Voice &lt;code&gt;A CALL COMES IN&lt;/code&gt; で &lt;code&gt;Studio Flow&lt;/code&gt; を選択します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eFyieK2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Screen_Shot_2020-04-16_at_11.59.23.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eFyieK2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Screen_Shot_2020-04-16_at_11.59.23.width-800.png" alt="number console choose studio as voice incoming" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;続けて先ほど設定したフローを選択します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bi73hNeX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/MCU5qg0Ca3tQ3G3L9FiXKmUnD2Nb3XflO7Go4smaEArT7s.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bi73hNeX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/MCU5qg0Ca3tQ3G3L9FiXKmUnD2Nb3XflO7Go4smaEArT7s.width-800.png" alt="choose studio flow" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;おっと、忘れずに &lt;code&gt;Save&lt;/code&gt; ボタンを押しましょう。この番号に転送先でない番号から電話をかけて動作を確かめたら、Webサイトの更新ですね！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ItJaMBoF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/IUKn_nlsgm9ZqQDfPcJD3sRxymcmkczubLI4jsW-_KVlXU.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ItJaMBoF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/IUKn_nlsgm9ZqQDfPcJD3sRxymcmkczubLI4jsW-_KVlXU.width-500.png" alt="limited number offering" width="500" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Twilio Studioを利用すれば期間限定の問い合わせ番号の設置と電話転送をリモートで設定できます。スタッフの休暇やシフトに合わせて転送先をStudioを利用し手動で簡単に変更できます。また、&lt;a href="https://www.twilio.com/docs/studio/rest-api"&gt;Studio API&lt;/a&gt;も提供されているので外部のプログラムからフローを制御できます。&lt;/p&gt;

&lt;p&gt;さらに、色々な手法を組み合わせることで単純な転送だけではなくより複雑なフローも設定できます。Qiitaにもいろいろと記事が公開されていますので参考になれば幸いです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiita.com/Hsu_86/items/874abef2125194f2c462"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;a href="https://qiita.com/Hsu_86/items/874abef2125194f2c462"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/Hsu_86/items/874abef2125194f2c462"&gt; ワークショップ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/c2c766fb9c3da9693ca0"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/c2c766fb9c3da9693ca0"&gt; Functionから&lt;/a&gt;&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/c2c766fb9c3da9693ca0"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/c2c766fb9c3da9693ca0"&gt; Flowを呼び出す&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a"&gt;Clova Extensions Kit（CEK）と&lt;/a&gt;&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a"&gt; Functionsを連携して、Clovaから&lt;/a&gt;&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/f1d6cf55c1f544c9bd7a"&gt;を呼び出す&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiita.com/friendtree16/items/7c733c6d7343e6be9c0f"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;a href="https://qiita.com/friendtree16/items/7c733c6d7343e6be9c0f"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/friendtree16/items/7c733c6d7343e6be9c0f"&gt;で作ったIVRフローでサーバーのレスポンスを使って流してみた&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/mobilebiz/items/a40ec9ae19546deb2b51"&gt;モーニングコールをノンコーディングで作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/afddab8bd873008307ca"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/afddab8bd873008307ca"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/afddab8bd873008307ca"&gt;内で変数を扱う方法&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://qiita.com/ko2a/items/c70f539e1e43709c3147"&gt;Wio Node と&lt;/a&gt;&lt;strong&gt;&lt;a href="https://qiita.com/ko2a/items/c70f539e1e43709c3147"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;a href="https://qiita.com/ko2a/items/c70f539e1e43709c3147"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/ko2a/items/c70f539e1e43709c3147"&gt; で簡単な IoT システムを組んでみる&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/su-bell/items/cdc9c044af03118eb412"&gt;TwilioStudioで留守中に電話があったらslackに通知する仕組みを作ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d"&gt;Twilio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d"&gt; Functionsと&lt;/a&gt;&lt;strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d"&gt;Studio&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d"&gt;を使って連続架電を行う&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  新型コロナウイルス感染症への支援策について
&lt;/h2&gt;

&lt;p&gt;Twilioでは新型コロナウィルス感染症により引き起こされるさまざまな社会問題を解決する会社、団体、開発者グループに向けて無料クレジットの進呈など支援を行なっています。詳しくは&lt;a href="https://www.google.com/url?q=https://www.twilio.com/blog/covid-19-response-japan&amp;amp;sa=D&amp;amp;ust=1587010851685000&amp;amp;usg=AFQjCNEUKsh1oWBFks3USg4zxBLqZzzVwA"&gt;こちらの記事&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;p&gt;また、Twilioを自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、&lt;a href="https://www.twilio.com/japan/help/sales"&gt;営業部までお問い合わせ&lt;/a&gt;ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  このエントリについての問い合わせ
&lt;/h2&gt;

&lt;p&gt;不明点があればぜひ、お問い合わせください。オンラインでの登壇依頼等もお待ちしてます♪&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/neri78"&gt;https://github.com/neri78&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>twilio</category>
      <category>studio</category>
      <category>japanese</category>
    </item>
    <item>
      <title>TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Mon, 06 Apr 2020 00:02:17 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-3-basic-training-1-68b</link>
      <guid>https://dev.to/twilio/twilioquest-3-basic-training-1-68b</guid>
      <description>&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;には、Twilio製品やプログラミング言語、GitHubの利用方法についてなど数多くのミッションが用意されています。各チュートリアルをクリアすると経験値やアイテムを獲得できます。獲得したアイテムはアバター（キャラクター）に装備させることができ、自分だけのアバターをデザインできるゲームを模したチュートリアルとなっています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/neri78/game-tutorial-twilioquest3-oon-temp-slug-6065485"&gt;前回のブログ&lt;/a&gt;ではTwilioQuestと最新バージョンについての解説と、ゲームのダウンロード方法や初期設定、基本的な操作方法を解説しました。また、クラウド探査船 &lt;strong&gt;Fog Owl&lt;/strong&gt; やアシスタントロボット &lt;strong&gt;Cedric&lt;/strong&gt; についても理解が深まったのではないでしょうか？&lt;/p&gt;

&lt;p&gt;さて、今回はオペレーターのスキルやナレッジを「レベルアップ」するためのさまざまなトレーニングミッションと、最初にやるべきトレーニングとして用意されている「Basic Training」の進め方について解説します。&lt;br&gt;&lt;br&gt;
では、はじめましょう！&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TsRLVlg7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/rIuO9kQYNy0VpTcwH5lOh3pp-YjZ4oO9V_8Jed1F-bELTM.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TsRLVlg7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/rIuO9kQYNy0VpTcwH5lOh3pp-YjZ4oO9V_8Jed1F-bELTM.width-800.png" alt="TwilioQuest3 - Cedric - LevelingUp" width="660" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  トレーニングミッションの開始方法
&lt;/h2&gt;

&lt;p&gt;Fog Owlの右下半分にはオペレーターがトレーニングミッションにダイブできるVRポッドが4つ用意されています。赤色のライトが点灯しているポッドはすでに他のオペレーターが使用していますので、緑色のライトがついているポッドに入りましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--deQ1iZJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/8GHpX1-VxWCLH6SMHnzrRhJml-quk1ZVY0GOwP4-rw0rL1.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--deQ1iZJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/8GHpX1-VxWCLH6SMHnzrRhJml-quk1ZVY0GOwP4-rw0rL1.width-800.png" alt="TwilioQuest3 - FogOwl - VR Pod" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;それぞれのポッドの中には、Twilioの製品やJavaScript、TypeScriptといったプログラミング言語、 さらにGitHubを使ったオープンソースへの貢献方法など開発者としてのスキルをレベルアップできるようなトレーニングミッションが用意されています。各ミッションを選択すると進捗具合がランクで表示されます。 (S, A, B, Cなど)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xl2ecriK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/fBf5-nE4BfJucN7lFSahI8-pmaX8AeLis3A_dZJCcKaSnH.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xl2ecriK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/fBf5-nE4BfJucN7lFSahI8-pmaX8AeLis3A_dZJCcKaSnH.width-800.png" alt="TwilioQuest3 - Training Missions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;このブログの執筆時点では次のトレーニングミッションが用意されています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Training&lt;/li&gt;
&lt;li&gt;Twilio Messaging: A Walk in the Park&lt;/li&gt;
&lt;li&gt;Twilio Voice: Malachite Mine&lt;/li&gt;
&lt;li&gt;Twilio Studio: The Widget Foundry&lt;/li&gt;
&lt;li&gt;Twilio CLI: CLI Steamworks&lt;/li&gt;
&lt;li&gt;Twilio Flex: Academy of Contact Center Arts&lt;/li&gt;
&lt;li&gt;Twilio IoT: Hardware Spacedock&lt;/li&gt;
&lt;li&gt;Twilio SendGrid: Ocean of Email&lt;/li&gt;
&lt;li&gt;Twilio Video: That Belongs in a Museum&lt;/li&gt;
&lt;li&gt;The Flame of Open Source&lt;/li&gt;
&lt;li&gt;Advent of Code&lt;/li&gt;
&lt;li&gt;JavaScript Test Lab (最近更新されたミッション)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Twilio&lt;/strong&gt; からはじまるトレーニングミッションに参加するには、事前にBasic Trainingの特定チュートリアルを完了している必要があります。それ以外のトレーニングミッションにはそのまま参加できます。特にこれからJavaScriptを学習したい、あるいは最近TwilioQuestをインストールした方はぜひ、更新された &lt;strong&gt;JavaScript Test Lab&lt;/strong&gt; をプレイしてください。こちらの&lt;a href="https://twitter.com/kevinwhinnery/status/1234877905345355776"&gt;Blog&lt;/a&gt;でアナウンスされたように、Basic TrainingやJavaScript Test Labで用意されている特定のチュートリアルを完了すると、オーストラリアでの大規模森林火災復興のための植樹プロジェクトに貢献できます（１プレイヤーあたり最大2本）。&lt;/p&gt;

&lt;p&gt;さて、まずはBasic Trainingミッションを選択し、 &lt;code&gt;LAUNCH MISSION&lt;/code&gt;ボタンをクリックしましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mTv9Ua9f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/OrzUp5iTAygTeu5Enrm-U_HbHScmrO2V5F-ZHcr6LaM6Ss.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mTv9Ua9f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/OrzUp5iTAygTeu5Enrm-U_HbHScmrO2V5F-ZHcr6LaM6Ss.width-800.png" alt="TwilioQuest3 - Basic Mission" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basic MissionではTwilioQuest 3の利用方法を学べるチュートリアルが用意されています。はじめてこのミッションに挑戦した場合、Cedricが目的や操作方法をガイドしてくれます。もしFog Owlに戻りたい場合はスタート地点へと戻るか、&lt;code&gt;5&lt;/code&gt;キーを押すと船へと戻れます。&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 101 - バリアや宝箱のセキュリティを解除せよ！
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3の全てのトレーニングミッションはスタート地点から出口までさまざまなチュートリアルをクリアし、たどり着くようにデザインされています。その道中には行く手を遮るバリア、経験値やアイテムを取得できる宝箱などが配置されています。それぞれに強固なセキュリティがかかっており、そのままでは通過・開放ができません。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Zgc5OTi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Dde-xxPJPLHgbQKPPKJV_UilPu1GtiVlU5R4dIAR5YyLPQ.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Zgc5OTi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Dde-xxPJPLHgbQKPPKJV_UilPu1GtiVlU5R4dIAR5YyLPQ.width-500.png" alt="TwilioQuest3 - Basic Mission - Barrier" width="500" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;オペレーターはセキュリティをハッキングするためのデバイスを装備しています。バリア、宝箱の前でスペースバーを押してみましょう。ハッキング装置の画面が表示されます。&lt;/p&gt;

&lt;p&gt;ハッキング装置は2つの画面エリアで構成されています。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;青枠: チュートリアルの内容や手順、コードエディタの表示エリア&lt;/li&gt;
&lt;li&gt;赤枠: セキュリティの状態と解除コードの入力フィールドをするエリア&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QyRXQiQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/qz3qgcYeaPNKpCnRFe4g8cg4QZhP7sDW7-CEzrReYTyKZv.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QyRXQiQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/qz3qgcYeaPNKpCnRFe4g8cg4QZhP7sDW7-CEzrReYTyKZv.width-800.png" alt="TwilioQuest3 - Basic Mission - Hacking Device" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;青枠のエリアにはチュートリアルに関する情報や手順を表示できます。最初のミッションを例に見ていきましょう。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Overviewタブ&lt;br&gt;&lt;br&gt;
Overviewタブではチュートリアルと報酬が表示されます。今回はこのハッキング装置の使い方を学ぶ、というチュートリアルです。 達成すると経験値を100ポイント、さらにOperator Bootsを手に入れることができます。&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PI4qcME0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/nUE-zSqEorVgedKR6hoMrcdLvx5qdSN6laUXDu-9YePSX_.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PI4qcME0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/nUE-zSqEorVgedKR6hoMrcdLvx5qdSN6laUXDu-9YePSX_.width-500.png" alt="TwilioQuest3 - Hacking Device - Overview Tab" width="500" height="366"&gt;&lt;/a&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Objectiveタブ&lt;br&gt;&lt;br&gt;
Objectiveタブはセキュリティを解除するためのチュートリアルのゴールが記されています。今回はテキストフィールドに解除コードを記入し、 &lt;code&gt;HACK&lt;/code&gt;ボタンを押す、というゴールです。また、解除コードは &lt;code&gt;Help&lt;/code&gt;タブ内で見つけられるため&lt;code&gt;Show Help&lt;/code&gt;ボタンを押すようにという指令も記載されています。その通りに押してみましょう。&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2SOYGA69--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/0pFIzvXb7xOqnf7HZCij0eN1SEPeB6cAB_ZsP0apDqsgyL.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2SOYGA69--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/0pFIzvXb7xOqnf7HZCij0eN1SEPeB6cAB_ZsP0apDqsgyL.width-500.png" alt="TwilioQuest3 - Hacking Device - Objective Tab" width="500" height="366"&gt;&lt;/a&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helpタブ&lt;br&gt;&lt;br&gt;
Helpタブにはこのチュートリアルを完了するための詳細な手順が記載されています。進め方がわからない場合はまずこのタブを見ましょう。今回は黒塗りの部分に解除コードが記されていますので実際のゲーム画面で確認してください。そのコードを右側のテキストフィールドに入力します。&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wtawuzi7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/SQX3qnMj2e3IV_JzXg467dw0Wlxo5mN5YD9lS0fEAF_hvQ.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wtawuzi7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/SQX3qnMj2e3IV_JzXg467dw0Wlxo5mN5YD9lS0fEAF_hvQ.width-500.png" alt="TwilioQuest3 - Hacking Device - Help Tab" width="500" height="366"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hack it!
&lt;/h3&gt;

&lt;p&gt;解除コードは入力しましたか？準備完了であれば &lt;code&gt;HACK&lt;/code&gt;ボタンをクリックしましょう。解除コードが検証され、正しければハッキング完了です。無事に経験値を100ポイント、Operator Bootsを手に入れることができました!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j7Nqs-yo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/POe8ho6XHgNKQ06hYeoNPRlPJlCIhj2igtm3Fevm313rEN.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j7Nqs-yo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/POe8ho6XHgNKQ06hYeoNPRlPJlCIhj2igtm3Fevm313rEN.width-800.png" alt="TwilioQuest3 - Basic Mission - Success" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;マップ画面に戻ると先ほどのバリアが解除されています。続けて宝箱にも挑戦しましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--riCdL033--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Wkgl1SYlwABqL2j_RstRCxircd-LZy4W539uPlXY-FxFvQ.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--riCdL033--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Wkgl1SYlwABqL2j_RstRCxircd-LZy4W539uPlXY-FxFvQ.width-800.png" alt="TwilioQuest3 - Basic Mission - Hack Barrier" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3が提供するコードエディター
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3が実行される環境は一定ではありません。Windows、Mac、LinuxといったOSの違いやユーザーごとに好みとする開発環境も異なります。はたまた、これからプログラミングを学ぼうという場合は開発環境すらインストールされていない可能性もあります。でも、大丈夫です。TwilioQuest 3は簡易コードエディターおよび実行環境を提供します。次のチュートリアルに進んでみましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eJ3Lqri5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/B8vpLtPX00VJQq0uzTaGPu9WTSFSCTJIRLZiuvNnWglXVh.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eJ3Lqri5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/B8vpLtPX00VJQq0uzTaGPu9WTSFSCTJIRLZiuvNnWglXVh.width-800.png" alt="TwilioQuest3 - Basic Mission - Next Tutorial" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the Code EditorチュートリアルではTwilioQuest 3が提供するコードエディターの使い方を学びます。Objectiveタブに記載されているように、画面右側の &lt;code&gt;&amp;lt;/&amp;gt; Show Code Editor&lt;/code&gt;ボタンをクリックするとコードエディター画面に切り替わります。また、コードエディター画面で同じボタンをクリックするとチュートリアル画面に戻ることができます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pBT_0lR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/x2_nwzvW1ao4KG0ioyZy0Ihv11qWp2FZckyoY1zG6bRyED.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pBT_0lR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/x2_nwzvW1ao4KG0ioyZy0Ihv11qWp2FZckyoY1zG6bRyED.width-800.png" alt="TwilioQuest3 - Basic Mission - Code Editor Mission" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;コードエディターには3つのボタンが用意されています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fBZfERcG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/lC-0_pyJSRKdGXnmM6nT0ZUHEEx3jC5RnF_BLqotQcxY6D.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fBZfERcG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/lC-0_pyJSRKdGXnmM6nT0ZUHEEx3jC5RnF_BLqotQcxY6D.width-800.png" alt="TwilioQuest3 - Basic Mission - Code Editor" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Run the code editor&lt;/code&gt;ボタン: このボタンをクリックするとコードがNode.js環境下で実行されます。再度ボタンを押すか、ハッキング装置画面を閉じるまでコードが実行され続けます。つまり、チュートリアル画面に切り替えたとしても実行が続く形になります。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Trash&lt;/code&gt;ボタン: このボタンをクリックするとコードが初期状態に戻り全ての変更が破棄されます。最初からやり直したい、既存コードが消えてしまいどうにもならない場合に利用できます。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Hide Code Editor&lt;/code&gt;ボタンをクリックするとチュートリアル画面へと戻ります。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;このチャレンジでは既に必要な実装が完了していますが、Windows PCを利用する場合や、Node.js以外でこのチュートリアルを進めたい場合は&lt;code&gt;Help&lt;/code&gt;タブの説明を読み進めてください。&lt;/p&gt;

&lt;p&gt;コードエディタ画面の下に出力されるローカルホストのアドレスをテキストフィールドに入力し&lt;code&gt;HACK&lt;/code&gt;ボタンをクリックするとこのチュートリアルを完了できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  アイテムの使い方
&lt;/h2&gt;

&lt;p&gt;ここまでのチュートリアルで現在2つ、または3つのアイテムを手に入れました。これらを装備するには、&lt;code&gt;1&lt;/code&gt;または&lt;code&gt;i&lt;/code&gt;キーを押し、インベントリ画面を表示します。この画面アイテムをアバターにドラッグ＆ドロップし装備します。アバターがどのように変化するか確かめてみましょう。TwilioQuest 3では数多くのアイテムが用意されています。ぜひ世界に一つだけのアバターをデザインしてみてください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NQGxKPYr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/_-uKAv0AyhyJY0nayv_TptPRnhQOz-Jbuf6jvN-1D5RJl7.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NQGxKPYr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/_-uKAv0AyhyJY0nayv_TptPRnhQOz-Jbuf6jvN-1D5RJl7.width-800.png" alt="TwilioQuest3 - Inventory" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  次回予告
&lt;/h2&gt;

&lt;p&gt;さて、これでTwilioQuest 3の基本的な操作方法やチュートリアルの進め方の紹介が終わりました。次の記事ではBasic Missionに用意されているTwilioアカウントの基礎チュートリアルを解説します。お楽しみに。それではLet’s HACK!&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3をダウンロード
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3は無料でダウンロード、プレイ可能です。App内課金もありません！ぜひ！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3 - ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3 Blogシリーズ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/game-tutorial-twilioquest3-oon-temp-slug-6065485"&gt;Game + Tutorial = TwilioQuest3のはじめかた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ (この記事）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-part2-set-up-your-twilio-account"&gt;TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-part3-get-a-free-credit"&gt;TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3について質問があるんだけど？
&lt;/h2&gt;

&lt;p&gt;進め方がわからない。そんな時はぜひご連絡ください！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>code</category>
      <category>tutorials</category>
      <category>twilioquest</category>
      <category>japanese</category>
    </item>
    <item>
      <title>Game + Tutorial = TwilioQuest3のはじめかた</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Wed, 01 Apr 2020 01:56:55 +0000</pubDate>
      <link>https://dev.to/twilio/game-tutorial-twilioquest3-40cb</link>
      <guid>https://dev.to/twilio/game-tutorial-twilioquest3-40cb</guid>
      <description>&lt;p&gt;こんにちは、Twilioのデベロッパー エバンジェリストの&lt;a href="https://www.twilio.com/blog/introducing-twilio-developer-evangelist-daizen-ikehara-jp"&gt;池原&lt;/a&gt;です。2月13日、14日に開催された開発者カンファレンスDevelopers Summit 2020にTwilio Japanはスポンサーとして参加させていただきました。今回、ゲームを遊びながらTwilio製品の利用方法に加えJavaScript、Pythonも学習できる&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;を題材にセッション登壇や、ブース展示を行いました。セッション資料は&lt;a href="https://www.slideshare.net/DaizenIkehara"&gt;こちら&lt;/a&gt;で公開中です。&lt;/p&gt;

&lt;p&gt;Blogでは、今回から複数回に分けてこのTwilioQuest 3の特長やはじめ方、Basic Trainingの進め方などを解説します。また、TwilioQuestについてより詳しく知りたいという方は、ぜひ、作者のBlog記事（英語）を読んでみてください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/author/kwhinnery"&gt;Twilio Blog - Kevin Whinnery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TwilioQuest = ゲームとチュートリアルのいいとこ取り
&lt;/h2&gt;

&lt;p&gt;TwilioQuestはTwilioの製品やプログラミング言語、GitHubの利用方法についてなど数多くのチャレンジが用意されています。各チャレンジをクリアすると経験値やアイテムが取得できます。取得したアイテムはアバター（キャラクター）に装備し、自分だけの見た目をデザインできるゲームを模したチュートリアルです。日本語の解説記事もありますので、ぜひ、こちらもご覧ください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/takeshifurusato/items/dcf718734cb0d95898dc"&gt;Twilio Quest 3 をやってみよう！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/etc/twilioquest_play/"&gt;ゲームでコードが学べる！TwilioQuestで遊んでみよう&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;作者である&lt;a href="https://dev.to/twilio/operator-s-manual-1-welcome-to-the-twilioquest-program-283g-temp-slug-5080152"&gt;Kevin&lt;/a&gt;によると、最初のバージョンは2013年にリリースされています。そして、2019年の夏に最新バージョンである、&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;がリリースされました。私自身は前バージョンであるTwilioQuest 2を以前にプレイしたことがあったのですが、3はユーザー体験という意味では特に次の2点が大きく変わっています。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;これまでのWebベースアプリケーションからローカル環境にインストールする形態に変更されました。ローカル化することで、コードエディターやローカルホストへのトンネリングツール、ngrokなど、必要なツールが同時にインストールできるため、ユーザーが開発環境を準備せずとも、TwilioQuest 3さえインストールすればゲームを進められるという形になりました。&lt;/li&gt;
&lt;li&gt;自分の分身であるアバターを2次元のマップ上で自由に動かすことができるようになりました。障害物をよけて隠されたオブジェクトを見つけ出すというようなマップもあります。このためゲーム性が高まり飽きにくくなっています。
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SlYBX1f3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/jHZYvh9BkNLKIFAQ6GEbpR1VQB505V0mR4bb9n8PeBeTjI.width-500.png" alt="TwilioQuest3 - OSS" width="500" height="281"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ファイナルファンタジーやドラゴンクエストの初期シリーズをプレイした経験があれば感慨深いものになることうけあいです。もちろん、そのほかのロールプレイングゲームが好きだという方にもおすすめです。&lt;/p&gt;

&lt;h3&gt;
  
  
  TwilioQuest 3プロモーションビデオ:
&lt;/h3&gt;

&lt;p&gt;TwilioQuestでは「レガシーシステム」として知られる影の組織がクラウドを活用する人々を支配しようと陰謀を張り巡らせている状況に立ち向かうエリート部隊のために作成された秘密訓練プログラムです。このトレーニングミッションを受ける隊員は「オペレーター」と呼ばれており、オペレーターは神経インターフェースを利用しクラウドの世界を実世界のように移動する...というSF映画やアニメでありそうなシチュエーションですね。&lt;/p&gt;

&lt;p&gt;我々プレイヤーは一人一人がレガシーシステムに立ち向かうためのオペレーターとして訓練するところからゲームがはじまります。それでは早速TwilioQuest 3をはじめましょう！&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3のはじめかた
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3はMac、Windows、Linux (Debian/Ubuntu) で動作するように作られています。&lt;a href="https://www.twilio.com/quest/download"&gt;こちらのダウンロードページ&lt;/a&gt;から、それぞれのOSに対応したインストーラーを選択しダウンロードしましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WL2NQ_9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/pEMg3CnKDtVgjlT2O4M0AuUUSnqDzuyLAlDfjzkf3lIyne.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WL2NQ_9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/pEMg3CnKDtVgjlT2O4M0AuUUSnqDzuyLAlDfjzkf3lIyne.width-500.png" alt="TwilioQuest3 - Download" width="500" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;インストールを終えた後、アイコンをクリックするとTwilioQuest 3が起動します。最初にランチャーが起動し、インストールされているバージョンの確認と必要に応じてコンテンツが自動的にダウンロードされます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lUmIJxe3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/7ttXhbKyAmBCEIyezHva2KkzOGFEIztg9Y6EmK4GQvgiXY.width-500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lUmIJxe3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/7ttXhbKyAmBCEIyezHva2KkzOGFEIztg9Y6EmK4GQvgiXY.width-500.png" alt="TwilioQuest3 - Launcher" width="500" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ランチャーの準備が完了したら「PLAY TWILIOQUEST」ボタンをクリックしゲームを開始しましょう。&lt;br&gt;&lt;br&gt;
初めてプレイする際にはオペレーターの名前やアバターの外観を設定し、イベント参加の有無を設定します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hC43uipk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/original_images/Por0KreLUgOL9psjLcVETwGABDyAmaeMMu2i3vs7rJQ3IsltXI8nbWBZgMMAbI_84J4C-whVqcHx_5QQLsss" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hC43uipk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/original_images/Por0KreLUgOL9psjLcVETwGABDyAmaeMMu2i3vs7rJQ3IsltXI8nbWBZgMMAbI_84J4C-whVqcHx_5QQLsss" alt="TwilioQuest3 - CharacterCreation" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twilioでは自社イベントや外部イベントの開催時にTwilioQuest上で同時にイベントを実施する場合があります。それらのイベントでは一定期間内に参加者が取得した経験値の総数を集計する機能や、トッププレイヤーを表示するランキング機能が用意されています。こちらの先ほどの表示名が使用されます。(例: &lt;a href="https://www.twilio.com/quest/events/DevSumi2020"&gt;Developers Summit 2020イベント参加者一覧&lt;/a&gt; / &lt;a href="https://www.twilio.com/quest/events/DevSumi2020/high_scores"&gt;スコアランキング&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;全ての準備を終えると &lt;strong&gt;Fog Owl&lt;/strong&gt; へと転移します。&lt;/p&gt;

&lt;h2&gt;
  
  
  Fog Owlとは？
&lt;/h2&gt;

&lt;p&gt;Fog Owlはこの訓練の基地となるクラウド探査船です。実際にクラウドを行き来しているわけではないのですが、神経インターフェースでクラウドに接続したオペレーターが理解しやすいよう擬似的に再現されています。オペレーターはこのFog Owlからクラウドに存在するさまざまな仮想世界に接続しミッションをこなしていきます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t9j4ETxP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/TQ3_-_FogOwl.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t9j4ETxP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/TQ3_-_FogOwl.width-800.png" alt="TwilioQuest3 - FogOwl" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fog Owlに降り立つと、「Cedric」と呼ばれているロボットとの会話がはじまり、なぜ、ここにいるのか、どのように他のオブジェクトを調べるのかなど説明を聞くことができます。Cedricが話す内容は、Text to Speech (文字からの音声合成）サービスを使用した音声再生が行われます。そのため、TwilioQuest 3を英語のトレーニングにも利用できそうです。&lt;/p&gt;

&lt;p&gt;このFog Owl内でまずはオペレーターの操作方法を学習しましょう。一般的なゲームと同じように下記の各キーで操作できます。&lt;/p&gt;

&lt;p&gt;←, A 左に移動&lt;br&gt;
↑, W 上に移動&lt;br&gt;
→, D 右に移動&lt;br&gt;
↓, S 下に移動&lt;br&gt;
スペースバー 人との会話やオブジェクトを調査&lt;/p&gt;

&lt;p&gt;Cedricとの会話を終えた後、FogOwlを探検しいろいろなオブジェクトの前でスペースバーを押してみましょう！&lt;/p&gt;

&lt;h2&gt;
  
  
  次回予告
&lt;/h2&gt;

&lt;p&gt;今回はTwilioQuestと最新バージョンについての解説とゲームのダウンロードや初期設定、基本的な操作方法を解説しました。さて、次回からはFowOwlに降り立ったオペレーターが最初に受ける訓練である「Basic Training」について詳しく解説します。重要だと思われるチャレンジについて詳しく解説していきますので、英語がちょっと苦手と言う方も大丈夫です。お楽しみに！&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3をダウンロード
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3は無料でダウンロード、プレイ可能です。App内課金もありません！ぜひ！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3 - ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3 Blogシリーズ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Game + Tutorial = TwilioQuest3のはじめかた (この記事)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-hack-security"&gt;TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-part2-set-up-your-twilio-account"&gt;TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-part3-get-a-free-credit"&gt;TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3について質問があるんだけど？
&lt;/h2&gt;

&lt;p&gt;進め方がわからない。そんな時はぜひご連絡ください！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>code</category>
      <category>tutorials</category>
      <category>twilioquest</category>
      <category>japanese</category>
    </item>
    <item>
      <title>Programmable VoiceとAITalkのWeb APIを使って表現力豊かな自動音声で着信電話に応答してみた</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Tue, 31 Mar 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/programmable-voice-aitalk-web-api-1298</link>
      <guid>https://dev.to/twilio/programmable-voice-aitalk-web-api-1298</guid>
      <description>&lt;p&gt;Twilioが提供するProgrammable Voiceを利用すると、電話の自動応答や発信をアプリケーションから制御することができます。 着信に応答する場合は、Twimlと呼ばれるマークアップ言語を用いることで、応答する言語や音声を設定することができます。 またこのProgrammable Voiceでは、2018年から標準の音声合成エンジン以外にもAmazon Pollyが使えるようになりました。&lt;/p&gt;

&lt;p&gt;Amazon Pollyの合成音声は標準の合成音声に比べてとても滑らかなのですが、他の音声をリアルタイムで利用したいという声もよくいただきます。今回は株式会社エーアイ様が提供する日本語に特化した音声合成サービス、&lt;a href="https://www.ai-j.jp/cloud/webapi/"&gt;AITalk® Web API&lt;/a&gt;（以下 AITalk Web API）と連携してみました。&lt;/p&gt;

&lt;p&gt;AITalk Web APIは &lt;strong&gt;感情表現や自然な音声、豊富な話者ラインナップ&lt;/strong&gt; を提供する音声合成エンジンAITalkをSaaS型で利用できるサービスです。サーバーを自前で構築する必要がないため、他のSaaSやクラウドサービスと素早く連携できます。これまでは評価版の申し込みから利用開始まで少し時間がかかっていましたが、最近、Webから評価用アカウントを即時取得し利用できるようになりました。&lt;/p&gt;

&lt;h2&gt;
  
  
  必要なもの
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.jsおよびnpm&lt;/li&gt;
&lt;li&gt;AITalk Web API評価アカウント&lt;/li&gt;
&lt;li&gt;TwilioアカウントとTwilio電話番号&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;今回の記事で解説するサンプルプロジェクトはこちらのGitHubリポジトリから取得できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/neri78/Twilio-Voice-AiTalkWebAPI"&gt;GitHub - Neri78: Twilio-Voice-AiTalkWebAPI&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  AITalk Web API評価アカウントの作成方法
&lt;/h3&gt;

&lt;p&gt;冒頭でも記載しましたが、AITalk Web APIでは評価を目的としてサービスを2週間利用できる評価アカウントをWebサイトから申し込めるようになりました。&lt;a href="https://aitalk-webapi-trial.aitalk.jp/"&gt;AITalk WebAPI 評価アカウント申込みページ&lt;/a&gt;で必要な情報を入力し利用規約に同意すると、評価用APIのエンドポイントや接続情報、APIの仕様に関する情報がメールで送られてきます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---TTHZBNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/vrWy2JQbtoNVtUjMd_NNYFH_X_2HsKf2gBJZEw2s_R6muO.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---TTHZBNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/vrWy2JQbtoNVtUjMd_NNYFH_X_2HsKf2gBJZEw2s_R6muO.width-800.png" alt="AiTalk-WebAPI-Trial-SignUp" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Twilioアカウントのサインアップと電話番号の取得
&lt;/h3&gt;

&lt;p&gt;Twilioアカウントのサインアップと電話番号の取得方法についてはこちらで確認できます。&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;というゲームチュートリアルを題材にしていますが、サインアップと電話番号の購入方法は通常のフローと同じです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-2-twilio-27hl-temp-slug-8407111"&gt;Twilioアカウントの作成と電話番号の取得&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AITalk Web APIを用いた音声応答の構築
&lt;/h2&gt;

&lt;p&gt;サンプルでは、下記の図のようにTwilio電話番号に着信した際に、Webhookを経由し、 &lt;strong&gt;AITalk Web API&lt;/strong&gt; にリクエストを送信し、合成された音声データをレスポンスとして受け取ります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fyBCePtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/W2kMIxudgeI3Lwm_BJHYdv5cMmvsUZELixRzNW-w-HspHy.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fyBCePtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/W2kMIxudgeI3Lwm_BJHYdv5cMmvsUZELixRzNW-w-HspHy.width-800.png" alt="Prog-voice-AiTalk" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;サンプルプロジェクトをローカル開発環境に展開し、必要なパッケージをインストールします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;次に、&lt;code&gt;.env.sample&lt;/code&gt;ファイルをコピーし、&lt;code&gt;.env&lt;/code&gt;とリネームします。このファイルにはアカウント登録時に送られてきたAITalk Web APIのエンドポイント、ユーザー名、パスワードを保存します。これらの情報はサンプルコード内で利用されます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI_TALK_BASE_URL=https://api.example.com
AI_TALK_USERNAME=username
AI_TALK_PASSWORD=password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  着信時の応答を返すAPIを実装
&lt;/h2&gt;

&lt;p&gt;次に&lt;code&gt;index.js&lt;/code&gt;を開いてください。必要なパッケージの宣言と、生成した音声ファイルを保存しておくフォルダを設定しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fsp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;got&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;got&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//着信に対して応答を返すVoice用TwiMLを作成するクラス&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VoiceResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twilio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;twiml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VoiceResponse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VOICE_FOLDER_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;voice&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;files&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="c1"&gt;// 生成したファイルを保存しておくフォルダを設定&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;VOICE_FOLDER_NAME&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twilioで取得した電話番号に着信があった際に呼び出すWebhookはこちらになります。内部で非同期メソッドを使用するため&lt;code&gt;async&lt;/code&gt;キーワードを指定しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Twilioから着信リクエストを受け取るWebhook&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/incoming&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;//処理を実装});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AITalk Web APIへのリクエストを送信し生成されたファイルを保存
&lt;/h2&gt;

&lt;p&gt;さて、&lt;code&gt;/incoming&lt;/code&gt;内部の実装は次のようになっています。&lt;/p&gt;

&lt;p&gt;応答テキストと &lt;strong&gt;AITalk Web API&lt;/strong&gt; に送信するリクエストパラメーターを構築します。さまざまな設定が可能ですが、最低限、ユーザー名、合成文字列、話者名が必要になります。このサンプルでは感情対応話者である「のぞみ」さん（&lt;code&gt;'speaker_name' : 'nozomi_emo'&lt;/code&gt;）、最大限の喜びを（&lt;code&gt;'style' : { 'j': '1.0'}&lt;/code&gt;）抑揚（&lt;code&gt;'range' : 2.00&lt;/code&gt;）をつけてmp3で出力（&lt;code&gt;'ext' : 'mp3'&lt;/code&gt;）するように設定しました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 音声合成するテキストを設定。実際はAIエンジンなどから生成される。&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;今日はお電話ありがとう!エーアイトークとTwilioを連携した音声合成デモだよ! あなたの電話番号は&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;From&lt;/span&gt; 
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;だよね?ぜひ、両方のサービスを試してみてね。&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// AITalk Web API用のパラメーターを作成&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aiTalkOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AI_TALK_USERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AI_TALK_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;speaker&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;_name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nozomi_emo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;j&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;range&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mp3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AITalk Web APIのパラメータを含んだリクエストを送信し、レスポンスに含まれるバイナリデータをmp3ファイルとして保存します。今回のサンプルではNode.js用のHTTPライブラリー&lt;a href="https://www.npmjs.com/package/got"&gt;got&lt;/a&gt;を利用しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// リクエストオプション&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;aiTalkOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;binary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="c1"&gt;//AITalk Web APIにリクエスト&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AI_TALK_API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//現在のCallSidから出力ファイル名を生成&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputFileName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CallSid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.mp3`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// mp3ファイルを保存&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;VOICE_FOLDER_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputFileName&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                                &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;binary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// TwiMLを作成(次のコードブロック)}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  保存したmp3ファイルを再生するTwiMLを作成
&lt;/h2&gt;

&lt;p&gt;Twilio Programming Voiceは電話への着信時の応答を __TwiML__ と呼ばれているマークアップ言語でプログラミングできます。&lt;code&gt;Play句&lt;/code&gt;を使用し、先ほど保存したmp3ファイルを再生するというTwiMLを生成します。このTwiMLをレスポンスとして返しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TwiMLを初期化&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;twiml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;VoiceResponse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// 生成した音声を再生させる。&lt;/span&gt;
&lt;span class="nx"&gt;twiml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputFileName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;//作成したTwiMLをレスポンスとして送信&lt;/span&gt;
&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;twiml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  （追加）通話が終了した段階でmp3ファイルを削除
&lt;/h2&gt;

&lt;p&gt;さて、このままでは通話終了後も生成された音声ファイルが残ってしまいます。不要なファイルを削除するため、通話状態を取得できるWebhookを実装します。  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;/statuschanged&lt;/code&gt;では、リクエストのbodyに含まれている&lt;code&gt;CallStatus&lt;/code&gt;で現在の通話状態を確認できます。今回のサンプルでは、通話が完了した&lt;code&gt;completed&lt;/code&gt;となった時点で、通話IDを表す&lt;code&gt;CallSid&lt;/code&gt;を基にmp3ファイルを削除しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/statuschanged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 通話が完了したかどうかを確認&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CallStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// CallSidからファイルパスを構築し、削除&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nx"&gt;VOICE_FOLDER_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CallSid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.mp3`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;を削除しました`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;全ての実装を終え、Port3000でサーバーを起動します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Listening on port 3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで実装は完了です。&lt;/p&gt;

&lt;h3&gt;
  
  
  ローカル環境でサンプルを実行する場合
&lt;/h3&gt;

&lt;p&gt;ローカル環境でサンプルを実行する場合は、localhostのポート3000番に外部からアクセスできるようにします。&lt;/p&gt;

&lt;p&gt;その場合は、&lt;a href="https://ngrok.com/"&gt;ngrok&lt;/a&gt;などのツールが利用できます。&lt;/p&gt;

&lt;p&gt;ngrokをインストール後、別のターミナルを開き、下記のコマンドを実行します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RlOrS83---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/xkXb-1RlnXRChZbBClXTZTvprxsBpe4Ndk5TaKh8sYn618.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RlOrS83---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/xkXb-1RlnXRChZbBClXTZTvprxsBpe4Ndk5TaKh8sYn618.width-800.png" alt="ngrok - daizen" width="640" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ここで生成されたURLをメモしておきます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilioコンソールで着信応答と、通話ステータスのWebhookをそれぞれ設定
&lt;/h2&gt;

&lt;p&gt;最後に&lt;a href="https://jp.twilio.com/console/phone-numbers"&gt;Twilioコンソール&lt;/a&gt;で取得した電話番号の設定画面を表示し、作成したNode.jsアプリケーションのUrlを着信応答と通話ステータスのWebhookをそれぞれ指定します。&lt;/p&gt;

&lt;p&gt;この例では&lt;code&gt;https://2c2a973d.ngrok.io&lt;/code&gt;なので下記のスクリーンショットのようになります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wNc_Lkyw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/bxoieoYzvQTRbf0gfS14-FsCC3aROLkgfk08dY-WCrMM95.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wNc_Lkyw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/bxoieoYzvQTRbf0gfS14-FsCC3aROLkgfk08dY-WCrMM95.width-800.png" alt="Twilio Console Incoming Status Webhook" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ターミナルからアプリケーションを起動し動作を確認
&lt;/h2&gt;

&lt;p&gt;ローカル環境の場合は、ターミナルからアプリケーションを起動します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twilioから取得した番号に電話をかけてみてください。前回同様に電話番号を数字として解釈してしまっているので少し変ですが、__動的にリアルタイムで感情と抑揚が設定された__ 合成音声を応答として利用することを確認できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;今回はTwilio Programmable VoiceとAITalk Web APIを連携してみました。AITalk Web APIでは、感情表現対応話者だけでなく、&lt;strong&gt;関西弁&lt;/strong&gt; 対応話者も設定されているので話者を(&lt;code&gt;'speaker_name' : 'miyabi_west'&lt;/code&gt;)に変更して違いをくらべてみるのも面白いかもしれません。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.ai-j.jp/cloud/webapi/"&gt;AITalk Web API&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neri78/Twilio-Voice-AiTalkWebAPI"&gt;Github - Neri78: Twilio-Voice-AiTalkWebAPI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  質問についてはこちらまで
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>twilio</category>
      <category>aitalk</category>
      <category>code</category>
      <category>japanese</category>
    </item>
    <item>
      <title>TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Tue, 24 Mar 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-3-basic-training-3-ida</link>
      <guid>https://dev.to/twilio/twilioquest-3-basic-training-3-ida</guid>
      <description>&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;には、Twilio製品やプログラミング言語、GitHubの利用方法について学べるトレーニングミッションが用意されています。各チュートリアルをクリアすると経験値やアイテムを獲得できます。獲得したアイテムはアバター（キャラクター）に装備させることができ、自分だけのアバターをデザインできるゲームを模したチュートリアルとなっています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-2-twilio-27hl-temp-slug-8407111"&gt;前回のブログ&lt;/a&gt;ではTwilioアカウントのセットアップ方法と電話番号の購入方法を解説しました。Twilioはこの購入した電話番号への入電に対する応答をプログラミングできます。またアプリケーションから電話の発信やSMSも送信できます。&lt;br&gt;&lt;br&gt;
今回はTwilioQuest 3をプレイするみなさんに提供されるプロモーションコードについて取得方法と適用方法について解説します。&lt;/p&gt;

&lt;p&gt;Twilioから電話番号を購入するチュートリアルを終え、さらに通路を進むと宝箱が二つ並んでいます。プロモーションコードはこの左側の宝箱に隠されています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fhrDpbZx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/PObBfTpvTd-AsqRqNsoDKCVshJr1H0JP8dhkcXovt1EmoJ.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fhrDpbZx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/PObBfTpvTd-AsqRqNsoDKCVshJr1H0JP8dhkcXovt1EmoJ.width-800.png" alt="TwilioQuest3 - Basic Mission - PromoCode Chest" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  プロモーションコードとその適用方法
&lt;/h2&gt;

&lt;p&gt;Twilioはカンファレンスやミートアップなでプロモーションコードを配ることがあります。このコードを利用するとTwilioアカウントに無料でクレジット追加できます。ただし、プロモーションコードを利用するにはクレジットカード情報を登録し、アカウントをアップグレードする必要があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  Twilioアカウントのアップグレードはすべき？
&lt;/h3&gt;

&lt;p&gt;もちろんのことながら&lt;code&gt;YES&lt;/code&gt;です。トライアルアカウントにはいくつかの&lt;a href="https://support.twilio.com/hc/en-us/articles/360036052753-Twilio-Free-Trial-Limitations"&gt;制限&lt;/a&gt;があるため、全ての機能を活用するためにはアップグレードが必要になります。例えば、トライアルアカウントでは、電話番号の購入が1番号のみに限定されており、さらにTwilio番号からの発信が認証済みの自分の携帯番号のみに制限されています。そのため、強くアカウントのアップグレードをおすすめしています。&lt;/p&gt;

&lt;p&gt;注意点として、アカウントのアップグレードは&lt;code&gt;プロジェクト単位&lt;/code&gt;で行われ、アカウントをアップグレードした場合は、トライアルアカウントに付与されている無料クレジットが0円（0ドル）になってしまいます。たま、アップグレード時に初期クレジットを追加する必要があります。ここでアップグレード時に利用できるプロモーションコードを適用することで、初期コストをゼロにできます。&lt;/p&gt;

&lt;h3&gt;
  
  
  プロモーションコードを使用したアカウントのアップグレード方法
&lt;/h3&gt;

&lt;p&gt;左側の宝箱をまずは開きましょう。Objectiveタブには米国ドル（USD）用のプロモーションコードが表示されています。日本円（JPY）のコードや他の通貨用のコードはHelpタブに隠されています。ぜひ皆さんの目で確かめてください。既にアップグレードされているプロジェクトではこのコードを利用できません。ご注意ください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m0CIimL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/13IYX-Xb28fMAKlmpLNfmg-F9MYj0zsLajcaHlWI0Sj7_x.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m0CIimL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/13IYX-Xb28fMAKlmpLNfmg-F9MYj0zsLajcaHlWI0Sj7_x.width-800.png" alt="TwilioQuest3 - Basic Mission - PromoCode Chest - Help" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;次に、&lt;a href="https://www.twilio.com/console"&gt;Twilioコンソール&lt;/a&gt;を開き、&lt;a href="https://www.twilio.com/console/billing/upgrade"&gt;Upgrade Project&lt;/a&gt;をクリックします。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E0WcDtbv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/ktgKwtuzUm1jqZ_E81FevuS-JL3Nm5s5wUDlO5VdHE6ncQ.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E0WcDtbv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/ktgKwtuzUm1jqZ_E81FevuS-JL3Nm5s5wUDlO5VdHE6ncQ.width-800.png" alt="Twilio Console Upgrade Project" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;電話番号の認証に続いて、Add Company Addressに自分または会社の住所情報を入力します。必須入力フィールドは必ず入力する必要があります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AxCuhvBC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/4PiEHhr6xhA3A9jGaWMd_iNxtwW4ADiLCx0spK3M2IgwR6.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AxCuhvBC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/4PiEHhr6xhA3A9jGaWMd_iNxtwW4ADiLCx0spK3M2IgwR6.width-800.png" alt="Twilio Console Upgrade Project - Company Address" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;続けてAdd Billing Address（請求先住所）を入力します。先ほど入力した住所と同じであれば、Same as Company Addressにチェックを入れます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9n3sirMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/3ATaJ3gRc1qU0hPl0hN8WuBjXwN-1RL51RPZxXWBTEqpda.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9n3sirMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/3ATaJ3gRc1qU0hPl0hN8WuBjXwN-1RL51RPZxXWBTEqpda.width-800.png" alt="Twilio Console Upgrade Project - Billing Address" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;さて、ここからが本番です。間違えないように気合いを入れましょう！&lt;/p&gt;

&lt;p&gt;Add Payment Information and Fundsにクレジットカード情報を入力し、&lt;code&gt;USE PROMO CODE&lt;/code&gt;をクリックします。Twilioは電話機能を提供しているため通常のWebサービスよりも認証を強化しています。そのため、カード情報をはじめてとして本人確認のための情報登録が必要になります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r8EEKFtL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/p90YFDyRp6vetg4IyTlhES8yzgp874iPlCM71OO37ge5I3.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r8EEKFtL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/p90YFDyRp6vetg4IyTlhES8yzgp874iPlCM71OO37ge5I3.width-800.png" alt="Twilio Console Upgrade Project - Payment Information" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PROMO CODE&lt;/code&gt;欄に先ほど確認したプロモーションコードを入力します。ここでAutomatic RechargeをEnableにすると自動チャージが有効になってしまうため &lt;strong&gt;注意しましょう。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qtV9eVUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/KpxoVSIee94DvTkFcR0oAKjzik-zZk68yajS2Gmo3Lo6gi.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qtV9eVUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/KpxoVSIee94DvTkFcR0oAKjzik-zZk68yajS2Gmo3Lo6gi.width-800.png" alt="Twilio Console Upgrade Project - Apply Promo Code" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最後に&lt;code&gt;Upgrade Account&lt;/code&gt;ボタンをクリックするとプロジェクトがアップグレードされ、プロモーションコードに設定されたクレジットが適用されます。&lt;/p&gt;

&lt;p&gt;おめでとうございます！これでアカウントを無料でアップグレードすることができました。トライアルの制限も全て解除されています。おっと、忘れずにチュートリアルもHACKしておきましょう。先ほど入力したプロモコードを入力し&lt;code&gt;HACK&lt;/code&gt;ボタンをクリックすると宝箱が開きます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uMcM4pSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/LlVFnxwQIFr97g3cAOpOtTJ8l_98RhC2PVnZbfVmS8eu2R.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uMcM4pSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/LlVFnxwQIFr97g3cAOpOtTJ8l_98RhC2PVnZbfVmS8eu2R.width-800.png" alt="TwilioQuest3 - Basic Mission - PromoCode Chest - Success" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  最終関門:Basic Trainingミッションをクリアせよ！
&lt;/h2&gt;

&lt;p&gt;今回まで、複数回に渡ってBasic Trainingミッションを解説しました。ここまでで連載と共にTwilioQuest 3をプレイいただくと、ハッキング装置やコードエディターの使い方を理解し、Twilio電話番号を取得した5,000円分クレジット付きTwilioアカウントを持っていることになります。他にも必須ではありませんがローカル開発環境のセットアップ方法などを確認できるチュートリアルが用意されています。また、TwilioQuest 3には電話、SMS、CLIなどTwilioが提供するサービスを一つ一つ学習できるトレーニングミッションが用意されています。&lt;/p&gt;

&lt;p&gt;他のミッションに向かう前にこのBasic Trainingミッションをクリアしておきましょう。このマップの出口へは、分岐まで戻り、上に進んだ緑色のエリアになります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WU5O3YuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/dm_XE7fgLtM-h7WkRdmKB6ciRTE-syvCGwkTEqywUWfWiT.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WU5O3YuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/dm_XE7fgLtM-h7WkRdmKB6ciRTE-syvCGwkTEqywUWfWiT.width-800.png" alt="TwilioQuest3 - Basic Mission - The Final Tutorial" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basic Trainingミッションでの最後のチュートリアルは、文字列を入力値として受け取り、大文字に変換、&lt;code&gt;!&lt;/code&gt;を三つ付け加え、戻り値として返すJavascript関数を実装するというものです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RY_0Uc95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/fyM-CpEMUltIBWPQALhBY4tNVkhTSSH5hcZ3F_jZ4S_QOb.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RY_0Uc95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/fyM-CpEMUltIBWPQALhBY4tNVkhTSSH5hcZ3F_jZ4S_QOb.width-800.png" alt="TwilioQuest3 - Basic Mission - The Final Tutorial - Objective" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ここまでチュートリアルを進めてきた皆さんには説明の必要はないでしょう。チャレンジしてみてください。&lt;/p&gt;

&lt;p&gt;最後に、Let’s HACK!&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3をダウンロード
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3は無料でダウンロード、プレイ可能です。App内課金もありません！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3 - ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3 Blogシリーズ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/game-tutorial-twilioquest3-oon-temp-slug-6065485"&gt;Game + Tutorial = TwilioQuest3のはじめかた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-1-12pd-temp-slug-8730960"&gt;TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-2-twilio-27hl-temp-slug-8407111"&gt;TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット（この記事）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3について質問があるんだけど？
&lt;/h2&gt;

&lt;p&gt;進め方がわからない。そんな時はぜひご連絡ください！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>code</category>
      <category>tutorials</category>
      <category>twilioquest</category>
      <category>japanese</category>
    </item>
    <item>
      <title>TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得</title>
      <dc:creator>Daizen Ikehara</dc:creator>
      <pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/twilio/twilioquest-3-basic-training-2-twilio-m28</link>
      <guid>https://dev.to/twilio/twilioquest-3-basic-training-2-twilio-m28</guid>
      <description>&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3&lt;/a&gt;には、Twilio製品やプログラミング言語、GitHubの利用方法について学べるトレーニングミッションが用意されています。各チュートリアルをクリアすると経験値やアイテムを獲得できます。獲得したアイテムはアバター（キャラクター）に装備させることができ、自分だけのアバターをデザインできるゲームを模したチュートリアルとなっています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-1-12pd-temp-slug-8730960"&gt;前回のブログ&lt;/a&gt;ではBasic Trainingを実際に見ながらゲームの進め方を説明しました。ハッキング装置や、ビルトインで提供されているコードエディターの使い方についてはもう大丈夫ですよね？&lt;br&gt;&lt;br&gt;
今回は今後、他のミッションを進める上で必須となるTwilioアカウントの取得方法や電話番号の購入方法についてゲームを進めながら解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  すべてはアカウント作成からはじまる...
&lt;/h2&gt;

&lt;p&gt;前回までのチュートリアルを終えると、上方向に進む道と、Twilioロゴを模したタイルが設置されている道に分岐します。TwilioQuest 3では必ずしもチュートリアルを順番通りに進める必要はなく、自分のペースや好みに合わせて何を学ぶかを選択できます。今回は右側に進み、Twilioロゴの上に設置されているバリアをHackしましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jv9mOmyY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/v2UFiOlKwH4iHc18zUSUC2tu7lGvwRBrbzpyUzEUIox4yo.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jv9mOmyY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/v2UFiOlKwH4iHc18zUSUC2tu7lGvwRBrbzpyUzEUIox4yo.width-800.png" alt="TwilioQuest3 - Basic Mission-Logo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;このチュートリアルは、今後のトレーニングミッションで必要となる &lt;strong&gt;Twilioアカウント&lt;/strong&gt; の作成と、 &lt;strong&gt;Account SID&lt;/strong&gt; 、 &lt;strong&gt;Auth Token&lt;/strong&gt; の入力が必要です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zrDkISRo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/jwNNxLPE4gJAxpx_MzmMDEUkwDJt-EJotPvl4RFr72sNQb.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zrDkISRo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/jwNNxLPE4gJAxpx_MzmMDEUkwDJt-EJotPvl4RFr72sNQb.width-800.png" alt="TwilioQuest3 - Basic Mission - Account Setup" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;まだアカウントを作成していない場合や、本番用アカウントのみを持っている場合は、下記のリンクから無料でトライアルアカウントを作成できます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(注意)TwilioQuest 3ではトレーニングミッションを円滑に進めるため、資格情報やフォルダー名などを内部に保存します。万が一の事故を避けるためTwilioQuest 3をプレイするアカウントは別途作成することを強くおすすめしています。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jp.twilio.com/try-twilio"&gt;Twilioアカウントの作成&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;アカウントを作成するには、氏名とメールアドレス、パスワードを設定しTwilio&lt;a href="https://jp.twilio.com/legal/tos"&gt;サービス規約&lt;/a&gt;とTwilio&lt;a href="https://jp.twilio.com/legal/privacy"&gt;プライバシーポリシー&lt;/a&gt;に同意した後、&lt;code&gt;無料トライアルを始めましょう&lt;/code&gt;ボタンをクリックします。Emailの確認に引き続きSMSの受信が可能な電話番号を入力し、認証する必要があります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vsekktF---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/PC0I754qcemz0-KzslenB7peNI2r6MamFyfCZMvUyd6hQr.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vsekktF---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/PC0I754qcemz0-KzslenB7peNI2r6MamFyfCZMvUyd6hQr.width-800.png" alt="Twilio Console Phone Verification" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;電話番号の認証を終えたのち、&lt;a href="https://jp.twilio.com/console"&gt;Twilioコンソール&lt;/a&gt;にログインすると &lt;strong&gt;Account SID&lt;/strong&gt; と &lt;strong&gt;Auth Token&lt;/strong&gt; を確認できます。&lt;/p&gt;

&lt;p&gt;これらはAPIを利用するためのID/パスワードとなるため取り扱いには十分注意しましょう。 &lt;strong&gt;Auth Token&lt;/strong&gt; は隠されているため&lt;code&gt;Show&lt;/code&gt;リンクをクリックし表示する必要があります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AiarWbwi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Hgqv32lJwpeIg199lYZTNL7U7IChJnOf9pjeGWF00i76bq.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AiarWbwi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Hgqv32lJwpeIg199lYZTNL7U7IChJnOf9pjeGWF00i76bq.width-800.png" alt="Twilio Console AccountSid AuthToken" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;それぞれの値をテキストフィールドに入力し&lt;code&gt;HACK&lt;/code&gt;ボタンをクリックしましょう。入力内容が確認され、正しい値であれば、 &lt;strong&gt;TWILIO_ACCOUNT_SID&lt;/strong&gt; および &lt;strong&gt;TWILIO_AUTH_TOKEN&lt;/strong&gt; という名前の環境変数が保存されます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZV1nkhqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/dqUNP5N8_88zNYCYDtN2J0BbwihyFfVrJo2Lij9s1DdVo2.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZV1nkhqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/dqUNP5N8_88zNYCYDtN2J0BbwihyFfVrJo2Lij9s1DdVo2.width-800.png" alt="TwilioQuest3 - Basic Mission - Account - Success" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この環境変数はマップ画面で&lt;code&gt;3&lt;/code&gt;キーを押すと表示されるSettings画面で確認や変更ができます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--elwR7wFU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/AwmYO5nhEtSIbxU_C0wbXfRG9SLTbmlq0DMstlwbevSMrg.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--elwR7wFU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/AwmYO5nhEtSIbxU_C0wbXfRG9SLTbmlq0DMstlwbevSMrg.width-800.png" alt="TwilioQuest3 - Environment Variables" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilioと言えばクラウド電話
&lt;/h2&gt;

&lt;p&gt;さて、Account SIDとAuth Tokenは入力できたでしょうか？続けて次のバリアまで進み、&lt;code&gt;スペースバー&lt;/code&gt;を押しましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4XzLgE4h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Q1hsxjcIihxAmSS-lyTd2uyT53pYC1EgEwbzpep0uA7Zsw.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4XzLgE4h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/Q1hsxjcIihxAmSS-lyTd2uyT53pYC1EgEwbzpep0uA7Zsw.width-800.png" alt="TwilioQuest3 - BasicMission - Phone Number" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twilioが提供する最も有名で強力なサービスはAPIを経由した電話の発着信、SMSの送受信機能です。既存・新規システムから電話を発信したり、着信に対してどのように応答するかを自由にプログラミングできます。 &lt;strong&gt;Get a Twilio Number&lt;/strong&gt; チュートリアルではこれらの機能を利用するために必要な電話番号を取得できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b7dF0oCb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/oJh0uaW9_Xy_NPoGKni_k1bdIuHC_gT6BLlfUVr_M8sNBf.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b7dF0oCb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/oJh0uaW9_Xy_NPoGKni_k1bdIuHC_gT6BLlfUVr_M8sNBf.width-800.png" alt="TwilioQuest3 - Basic Mission - Phone Number - Objective" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;電話番号を取得するにはTwilioコンソールの&lt;a href="https://www.twilio.com/console/phone-numbers/search"&gt;電話番号購入ページ&lt;/a&gt;を開きます。このページではTwilioがサービスを提供する世界各国の電話番号を購入できます。国や番号によってサポートする機能が異なりますのでアイコンで対応している機能を確認しましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sDmne-RZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/JozPbFK83AkBRWyNyx_eL6VgeWA3g-3QOHL09AOObKnIz2.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sDmne-RZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/JozPbFK83AkBRWyNyx_eL6VgeWA3g-3QOHL09AOObKnIz2.width-800.png" alt="Twilio Console Purchase Phone Number" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;残念ながら現在日本向けに提供している番号ではSMS送受信機能をサポートしていないため、TwilioQuest 3で提供している一部のトレーニングミッションを遂行することができません。ただし、SMS機能は非常に強力なため、ここではぜひ米国の番号（SMSのサポートあり）を購入することをおすすめします。この米国番号については別の記事を予定しており、その中で日本の携帯電話を利用せずに米国番号を用いてSMS機能を体験する方法を紹介予定です。&lt;/p&gt;

&lt;p&gt;購入する番号を選択し&lt;code&gt;Buy&lt;/code&gt;ボタンをクリックすると確認画面へと移ります。電話番号は購入した直後から通話料とは別に月額で一定額（国によって異なります）が課金されます。ただし心配する必要はありません。トライアルアカウントを作成した場合、初期クレジットとして15USドルがチャージされています。米国の番号を1つ購入したとしてもサービスを体験するには十分すぎるほどのクレジットが残っていますし、トライアル期間は使いすぎて課金されるということもありません。&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XNTWXeIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/qSMRHYSO58034SyYiH7RaudardxExR6u1KmZsyyJRS59IS.width-800.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XNTWXeIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://twilio-cms-prod.s3.amazonaws.com/images/qSMRHYSO58034SyYiH7RaudardxExR6u1KmZsyyJRS59IS.width-800.png" alt="Twilio Console Purchase Phone Number - Confirmation" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回のチュートリアルでは購入した番号を&lt;a href="https://www.twilio.com/docs/glossary/what-e164"&gt;E.164フォーマット&lt;/a&gt;でテキストフィールドに入力する必要があります。例えば米国番号の&lt;code&gt;(123)123-1234&lt;/code&gt;を購入した場合は国番号（+1）を付け加え、&lt;code&gt;+11231231234&lt;/code&gt;となります。日本番号の&lt;code&gt;(050)xxxx-yyyy&lt;/code&gt;の場合は、国番号（+81）を付け加え、最初の0を取った値である&lt;code&gt;+8150xxxxyyyy&lt;/code&gt;となります。これらの値はコンソールからも確認できます。電話番号の入力を終えたら&lt;code&gt;HACK&lt;/code&gt;ボタンを押しましょう。TwilioQuest 3は先ほどの環境変数を使い、入力された電話番号が対象アカウントに存在していることを確認します。&lt;/p&gt;

&lt;p&gt;おめでとうございます。これで電話番号が購入できました！&lt;/p&gt;

&lt;h3&gt;
  
  
  やっぱり日本番号が欲しい！
&lt;/h3&gt;

&lt;p&gt;もちろん日本の電話番号も購入できます。この場合、本人確認が必要になるため&lt;a href="https://www.twilio.com/docs/phone-numbers/regulatory/getting-started/console-create-new-bundle"&gt;Regulatory Bundles&lt;/a&gt;を登録する必要があります。本人確認には &lt;strong&gt;2営業日程度&lt;/strong&gt; を要するため、日本番号の取得を予定している場合はあらかじめ本人確認書類を登録しておきましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  次回予告
&lt;/h2&gt;

&lt;p&gt;これで今後のトレーニングミッションを進めるために必要なTwilioアカウントとTwilio電話番号が取得できました。Basic Trainingとして必須なチュートリアルはここまでで大丈夫ですが、次回はおまちかね（？）TwilioQuest 3プレイヤーを対象としたプロモーションコードの取得方法および適用方法を紹介します。このチュートリアル3で提供されるプロモーションコードを使うと5,000円分のクレジットが無料で付与されますので、Twilioを使い倒すにはもってこいですね。ぜひお楽しみに。&lt;br&gt;&lt;br&gt;
それではLet’s HACK!&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3をダウンロード
&lt;/h2&gt;

&lt;p&gt;TwilioQuest 3は無料でダウンロード、プレイ可能です。App内課金もありません！ぜひ！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/quest"&gt;TwilioQuest 3 - ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3 Blogシリーズ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/game-tutorial-twilioquest3-oon-temp-slug-6065485"&gt;Game + Tutorial = TwilioQuest3のはじめかた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/neri78/twilioquest-3-basic-training-1-12pd-temp-slug-8730960"&gt;TwilioQuest 3: Basic Training その1 - ハッキングデバイスを活用しセキュリティを解除せよ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TwilioQuest 3: Basic Training その2 - Twilioアカウントの作成と電話番号の取得（この記事）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/twilioquest-3-basic-training-part3-get-a-free-credit"&gt;TwilioQuest 3: Basic Training その3 - プロモーションコードを適用し無料クレジットをゲット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TwilioQuest 3について質問があるんだけど？
&lt;/h2&gt;

&lt;p&gt;進め方がわからない。そんな時はぜひご連絡ください！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (&lt;a href="https://twitter.com/neri78"&gt;@Neri78&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="//mailto:dikehara@twilio.com"&gt;dikehara@twilio.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>code</category>
      <category>tutorials</category>
      <category>twilioquest</category>
      <category>japanese</category>
    </item>
  </channel>
</rss>
