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上のチャットに送ります。動作イメージ図は後述します。
なお、ユーザのメッセージ応答してメッセージを返すボットを作成したい場合は、以下にまとめたのでご覧ください。
ユーザの投稿メッセージに応答するSkypeボットをGoogle Apps Scriptで作成する手順をメモします。
動作イメージ図
今回作成するSkypeボットの動作イメージ図になります。
上記の動作イメージ図に登場する要素は以下の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からSkypeボットとしてのメッセージを投稿するには、以下を事前に取得、設定しておく必要があります。それぞれの取得、設定手順は少し画像が多くなるため別記事にまとめています。なお、いずれも作業自体は難しいものではなく簡単です。- Microsoft App IDとパスワード(取得方法はこちらMicrosoft App IDとパスワードの取得手順)
- メッセージの投稿先となるConversation ID(グループチャットも含む、取得方法はこちらSkypeボットを使ってSkypeチャットのConversation IDを取得する手順)
- グループチャットに投稿したい場合は、加えてMicrosoft Azure上で作成したSkypeボットをグループへの招待を許可する(作成したボットを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にアクセスするためアクセストークンを取得する必要があります。そのために、ここでは
- postToSkype(accesstoken):アクセストークンを引数として、実際にメッセージを投稿する関数 アクセストークンが取得できたら、後は実際にSkypeにメッセージを投稿します。なお、厳密にはBot Connector宛にメッセージを送信し(
- addLog(text) :ログを記録するための関数です。
getAccessToken()
という関数を作成して取得しています。公式ドキュメントにあるように、以下のHTTPリクエストを指定されたURLに送信し、それに対する応答としてアクセストークンを取得しています。動作イメージ図の①、②の処理を行います。
url
がBot ConnectorのURL)、それをBot ConnectorがSkypeに転送するなどよしなに処理してくれます。取得したアクセストークンを認証用に使用しています。動作イメージ図の③の処理を行います。
まとめ
公式ドキュメントの情報が多すぎて最初は困惑しましたが、必要な情報を見つけられればすんなりと実装できました。ここに載せたコードそのままでは、固定のメッセージしか送信できませんが、例えばGoogleカレンダーやGmailなど他のGoogleのサービスをGoogle Apps Scriptで操作し、それに関してSkypeボットにメッセージを投稿させることができ、色々な応用が考えられます。また応用例はまとめたいと思います。関連記事
- 公開日:2019/12/19 更新日:2019/12/19
コードなしでボットを作成できるフレームワークBotfront
Botfrontは、GUIのエディタでボットに発言させたい内容やユーザのメッセージに対してどのような応答を返すかを編集してボットを作成できるフレームワークです。また、作成したボットをWebサイトやSlack上で動作させることも可能です。この記事では、Botfrontをインストールしてボットを作成するまでをまとめます。
- 公開日:2019/09/28 更新日:2019/09/28
Google Apps Scriptと連携してAmazon Alexaに次のバスの時間を教えてもらう
この記事では、ユーザーの呼びかけに応答してAlexaからGoogle Apps Scriptで公開しているスクリプトにPOSTリクエストを送信し、その応答をもとにユーザーに返答させる手順をまとめます。実際の例として、Alexaに直近のバス時間を教えてもらうシステムを構築しました。
- 公開日:2019/09/27 更新日:2019/09/27
iOSのショートカットでGoogle Apps ScriptにPOSTリクエストを送信する
iOSのショートカット機能を使って指定したGoogle Apps Scriptに任意のデータをPOSTさせたのでその手順をまとめます。
- 公開日:2019/08/07 更新日:2019/08/07
Hubotを使ってSlackに投稿されたメッセージに応答してシェルスクリプトを実行させる
HubotをSlack上で常駐させることで色々なことができます。ここでは、Hubotをインストールして実際にSlack上に常駐させ、メッセージに応答してHubotが動作するパソコン上でシェルスクリプトを実行させるまでの手順をメモします。
- 公開日:2019/06/02 更新日:2019/06/02
Google Apps Scriptを使って翻訳作業を自動化する手順
Google Apps Scriptは様々な便利な関数が使用可能であり、その中の1つにLanguageAppというクラスがあります。LanguageAppは、自動翻訳を提供するクラスです。この記事では、Google Apps ScriptとLanguageAppを使用して翻訳作業を自動化する手順をまとめます。