Skypeにメッセージを投稿するSkypeボットをGoogle Apps Scriptで作成する手順

公開日:2018/10/05 更新日:2018/10/05
Skypeにメッセージを投稿するSkypeボットをGoogle Apps Scriptで作成する手順のサムネイル

はじめに

Skypeは世界で最も使われているチャットアプリの1つです。最近ではSlackがビジネスシーンで良く使われていますが、それでもSkypeのユーザ数はまだまだ多いです。SlackはわからないけどSkypeならわかるという方が多いと思います。最近Skypeユーザが圧倒的に多い現場でSkypeボットを導入する機会があり、その時に作成したSkype上の指定したチャットに任意のメッセージを投稿するSkypeボットをGoogle Apps Scriptで作成する手順をメモします。

できるようになること

ユーザが投稿したメッセージに対して応答するのではなく、ボットから一方的に好きなタイミングでSkypeのグループチャットにメッセージを投稿します。このようなユーザの投稿に応答する形ではなく、ボットが主体となって投稿するメッセージをプロアクティブメッセージと呼びます。この記事では、プロアクティブメッセージを任意のSkypeチャットに送信するSkypeボットをGoogle Apps Scriptで作成します。わかりにくいですが、例えば以下のように適当なメッセージをGoogle Apps ScriptからSkype上のチャットに送ります。動作イメージ図は後述します。

sample-bot-image-1024x97.png

なお、ユーザのメッセージ応答してメッセージを返すボットを作成したい場合は、以下にまとめたのでご覧ください。

www.virment.com

ユーザの投稿メッセージに応答するSkypeボットをGoogle Apps Scriptで作成する手順をメモします。

動作イメージ図

今回作成するSkypeボットの動作イメージ図になります。

skypebot-gas.png

上記の動作イメージ図に登場する要素は以下の3つです。

  • ボット:Google Apps Scriptで作成
  • MSA Login Service:後述のBot Connectorに接続するためのアクセストークンを発行するサービス
  • Bot Connector:作成したボットとチャットサービス(ここではSkype)を繋げるサービス。例えば、今回はGoogle Apps ScritpからこのBot Connectorにメッセージを送ると、そのメッセージをBot ConnectorがSkypeに転送してくれます。

前提と環境と必要となるもの

以下を前提としています。
  • Googleアカウントは取得済とする。Google Apps Script使用のため。
  • Microsoftアカウントは取得済とする。Microsoft Azure使用のため。
  • Microsoft Azure上でエコーボットの作成が完了していることを前提としてます。エコーボットは、Microsoft Azure上に標準で用意されているボットテンプレートの中の「Basic」を使用すれば簡単に作成できます。詳しくはMicrosoft Bot FrameworkでSkypeのエコーボットを作成する手順にまとめていますのでまだ作成していない場合はご覧ください。この記事での作業が前提となっています。
そしてGoogle Apps Scriptからそれぞれのサービスとやり取りするには、いくつかの情報を把握する必要があります。

準備

まず、Google Apps ScriptからSkypeボットとしてのメッセージを投稿するには、以下を事前に取得、設定しておく必要があります。それぞれの取得、設定手順は少し画像が多くなるため別記事にまとめています。なお、いずれも作業自体は難しいものではなく簡単です。

以降の作業は、上記の情報が取得済、設定済として進めます。

Skypeボットとしてメッセージを投稿するGoogle Apps Scriptコード

以下が適当なメッセージを投稿するSkypeボットのGoogle Apps Scriptのコードになります。
function postMessage(){
  var token = getAccessToken();
  postToSkype(token);
}

// アクセストークン取得用関数 動作イメージ図の①、②を担当
function getAccessToken(){
  
  var url        = 'https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token';
  var APPID      = 'Microsoft APP ID';
  var APP_PASS   = 'Microsoft APP IDのパスワード';
  var requestBody = 'grant_type=client_credentials&client_id=' + APPID + '&client_secret=' + APP_PASS + '&scope=https%3A%2F%2Fapi.botframework.com%2F.default';

  var options = {
      'method' : 'post',
      'contentType': 'application/x-www-form-urlencoded',
      'payload' : requestBody
  };
  
  var accesstoken = '';
 
  try {
         var response = UrlFetchApp.fetch(url, options);
         accesstoken = (JSON.parse(response.getContentText())).access_token;
         addLog(accesstoken);
    
       } catch (er) { //エラー発生時にログを記録
         var logText = "エラー : line - " + er.lineNumber + '\n Error: ' + er.message;
         addLog(logText);
       }
  
  return accesstoken;
}

// Skypeにメッセージ投稿用関数 動作イメージ図の③を担当
function postToSkype(accesstoken){
  
  var CONVERSATION_ID = 'SkypeのConversation ID'; 
  // Bot ConnectorのURL
  var url     = 'https://skype.botframework.com/v3/conversations/' + CONVERSATION_ID  + '/activities';
    
  var messageData= {
    "type": "message",
    "text": "Hello from GAS!!!" // 投稿するメッセージ
  };
    
  var options = {
    'method': 'post',
    'Content-Type': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + accesstoken
    },
    'payload':  JSON.stringify(messageData)
  };

  // Skypeに投稿
  try {
         var response = UrlFetchApp.fetch(url, options);
             addLog("message posted to Skype");
    
       } catch (er) { //エラー発生時にログを記録
         var logText = "エラー : line - " + er.lineNumber + '\n Error: ' + er.message;
         addLog(logText);
     }
  
}

// ログ取得用関数
function addLog(text) {
  var spreadsheetId = "スプレッドシートID";
  var sheetName = "スプレッドシート名";
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  sheet.appendRow([new Date()/*タイムスタンプ*/,text]);
}

上記を見てわかるとおり、以下の4つの関数に分かれています。

  • postMessage():メイン関数
  • getAccessToken():アクセストークンを取得するための関数
  • 冒頭の動作イメージ図にもあるように、まずBot Connectorにアクセスするためアクセストークンを取得する必要があります。そのために、ここではgetAccessToken()という関数を作成して取得しています。公式ドキュメントにあるように、以下のHTTPリクエストを指定されたURLに送信し、それに対する応答としてアクセストークンを取得しています。動作イメージ図の①、②の処理を行います。
  • postToSkype(accesstoken):アクセストークンを引数として、実際にメッセージを投稿する関数
  • アクセストークンが取得できたら、後は実際にSkypeにメッセージを投稿します。なお、厳密にはBot Connector宛にメッセージを送信し(urlがBot ConnectorのURL)、それをBot ConnectorがSkypeに転送するなどよしなに処理してくれます。取得したアクセストークンを認証用に使用しています。動作イメージ図の③の処理を行います。
  • addLog(text) :ログを記録するための関数です。

まとめ

公式ドキュメントの情報が多すぎて最初は困惑しましたが、必要な情報を見つけられればすんなりと実装できました。ここに載せたコードそのままでは、固定のメッセージしか送信できませんが、例えばGoogleカレンダーやGmailなど他のGoogleのサービスをGoogle Apps Scriptで操作し、それに関してSkypeボットにメッセージを投稿させることができ、色々な応用が考えられます。また応用例はまとめたいと思います。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。