LoginSignup
23
22

More than 5 years have passed since last update.

MicrosoftBotFrameworkのRestAPIを使ったTimerBot

Last updated at Posted at 2016-08-27

業務のチャットツールとして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に統合されるようです。

  1. 「Register a bot」メニューを選択
  2. IconとNameがほかの人から見えるものになるのでBotのキャラにあったものにする
  3. MicrosoftAppIdとPasswordを生成する(これは後で使うので重要)
  4. Publisher profileは公開しない前提で適当に
  5. その他もエラーが出ないように適当に記入して登録 (登録しても公開しなければ他の人からは見えない
  6. MyBotの登録が完了したら、ChannelsのSkypeのEditで「Group messaging」をONにしておく
  7. ChannelsのSkypeの「Add to Skype」でBotとつながる
  8. 通知したいチャットルームにBotを招待する
  9. 通知したいチャットルームで「/get name」というコマンドをたたき、conversationIDを取得しておく

Skypeへのメッセージ投稿

Skypeへのメッセージ投稿を行うためには、

  1. OAuthの認証APIを叩き、access_tokenを取得する
  2. 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

これで投稿はできますが、以下の制限があることを確認済です。「まあいいか」と思って考えていないだけなのですが、対策などご存じの方がいればコメントいただけるとうれしいです。

  1. **で文字列を囲むことでSkype上では太字になるはずがならない
  2. &を含む文字列を投稿しようとするとエラーになる

2016/11/17追記
nohi様より解決策を教えていただきましたので追記しておきます
1.について

& ⇒ &に変換したところうまくいきました。

2.について

sqliteに格納されているデータに合わせて送ったところ、
太字でメッセージを送ることができました。
<b raw_pre="*" raw_post="*">太字</b>

まとめ

アカウント作成をどうやるのかで少しはまりましたが、RESTAPIの部分は比較的簡単に動き、メッセージ投稿することができました。pythonにできたことでAWS lambdaを使って定期実行を仕込んでつかっています(Azureではないですが・・w

次は、話しかけると何らかの返事をする形式のbotにも挑戦してみようと思います。

23
22
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
22