業務のチャットツールとしてSkypeを使っているため、MicrosoftBotFrameworkには興味はあったのですが、node.jsとC#でしか使えないという認識でしたが、どうやらRESTAPIというインターフェースもあるようです。
下記の記事参照。
BUILD BOT with Microsoft Bot Framework Rest Api
pythonでtimer botを作ったので、試行錯誤した点も含めてまとめておきます
Botアカウントの作成
まずは https://dev.botframework.com/ にアクセスして、bot用アカウントを作成します。
※SkypeBotFrameworkというものもあるのですが、これはMicrosoftBotFrameworkに統合されるようです。
- 「Register a bot」メニューを選択
- IconとNameがほかの人から見えるものになるのでBotのキャラにあったものにする
- MicrosoftAppIdとPasswordを生成する(これは後で使うので重要)
- Publisher profileは公開しない前提で適当に
- その他もエラーが出ないように適当に記入して登録 (登録しても公開しなければ他の人からは見えない)
- MyBotの登録が完了したら、ChannelsのSkypeのEditで「Group messaging」をONにしておく
- ChannelsのSkypeの「Add to Skype」でBotとつながる
- 通知したいチャットルームにBotを招待する
- 通知したいチャットルームで「/get name」というコマンドをたたき、conversationIDを取得しておく
Skypeへのメッセージ投稿
Skypeへのメッセージ投稿を行うためには、
- OAuthの認証APIを叩き、access_tokenを取得する
- access_tokenを用いて、メッセージ投稿APIを叩く
といった流れとなります。
認証部分のpythonコードサンプル
import requests
import json
def __auth(self):
""" MicrosoftBotFrameworkのOAuthClient認証を行いaccess_tokenを取得する """
headers = { 'Content-Type' : 'application/x-www-form-urlencoded' }
data = {
'grant_type' : 'client_credentials',
'client_id' : '** YOUR CLIENT_ID **',
'client_secret' : '** YOUR CLIENT_SECRET **',
'scope' : 'https://graph.microsoft.com/.default'
}
access_token_response = requests.post( 'https://login.microsoftonline.com/common/oauth2/v2.0/token', headers=headers, data=data )
if access_token_response.status_code != 200 :
print access_token_response.headers
print access_token_response.text
raise StandardError('Skype OAuth Failed')
tokens = json.loads(access_token_response.text)
return tokens['access_token']
メッセージ投稿部分のpythonコードサンプル
import requests
import json
TARGET_CHAT = '** TARGET CONVERSATION ID **'
def __post(self, token, message):
""" MicrosoftBotFrameworkのチャット投稿用RESTAPIを叩く """
headers = {
'Authorization' : 'Bearer ' + token,
'Content-Type' : 'application/json'
}
data = {
'type' : 'message/text',
'text' : message
}
response = requests.post( 'https://api.skype.net/v3/conversations/' + TARGET_CHAT + '/activities/', headers=headers, json=data)
if response.status_code != 201 :
print response.status_code
print response.headers
print response.text
raise StandardError('Skype Post Failed')
return
これで投稿はできますが、以下の制限があることを確認済です。「まあいいか」と思って考えていないだけなのですが、対策などご存じの方がいればコメントいただけるとうれしいです。
- **で文字列を囲むことでSkype上では太字になるはずがならない
- &を含む文字列を投稿しようとするとエラーになる
2016/11/17追記
nohi様より解決策を教えていただきましたので追記しておきます
1.について
& ⇒ &
に変換したところうまくいきました。
2.について
sqliteに格納されているデータに合わせて送ったところ、
太字でメッセージを送ることができました。
<b raw_pre="*" raw_post="*">太字</b>
まとめ
アカウント作成をどうやるのかで少しはまりましたが、RESTAPIの部分は比較的簡単に動き、メッセージ投稿することができました。pythonにできたことでAWS lambdaを使って定期実行を仕込んでつかっています(Azureではないですが・・w
次は、話しかけると何らかの返事をする形式のbotにも挑戦してみようと思います。