freks blog

about

Bot Framework REST APIでBotと通信してみる(マルチテナント)

created: 2024-06-05
おすすめ記事: 出会ってよかったプログラマー本

Bot Framework REST APIでBotと通信してみる でシングルテナントでAzure Botを動かしました
マルチテナントで動かしてみます

Azure AI Bot Serviceを作成

元の記事と同じくAzure Botを作ります

Azure portal で Azure Bot リソースを作成する - Bot Service | Microsoft Learn
を参考にAzure Botを用意

リソースの管理のところで、マルチテナントにします

REST APIを呼ぶサーバーを準備

元の記事と同じですが、Sinatraのコードをマルチテナントで動かすように変更します

app.rb

require 'net/http'
require 'sinatra/base'

def fetch_access_token
  resp = Net::HTTP.post_form(
    URI("https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token"),
    {
      'grant_type' => 'client_credentials',
      'client_id' => ENV['CLIENT_ID'],
      'client_secret' => ENV['CLIENT_SECRET'],
      'scope' => 'https://api.botframework.com/.default',
    }
  )
  JSON.parse(resp.body)['access_token']
end

class App < Sinatra::Base
  get '/' do
    'It works!'
  end

  post '/webhook' do
    json_body = JSON.parse(request.body.read)
    puts "Parameter: #{json_body}"

    if json_body['type'] == 'message'
      Thread.new(json_body) do |params|
        service_url = params['serviceUrl']
        conversation_id = params['conversation']['id']
        access_token = fetch_access_token

        reply = {
          "type": "message",
          "from": {
            "id": "echobot-dev-xxxxx", # BotのID、Azure Bot > ボットプロファイル
            "name": "test bot"
          },
          "text": "Reply for #{params['text']}",
        }
        res = Net::HTTP.post(
          URI("#{service_url}v3/conversations/#{conversation_id}/activities"),
          reply.to_json,
          {
            'Content-Type' => 'application/json',
            'Authorization' => "Bearer #{access_token}"
          }
        )
        puts res.code
        puts res.body
      end
    end

    status 200
    content_type :json
    { status: 200 }.to_json
  end
end

fetch_access_token のエンドポイントがマルチテナント用になってます

Bot Connector API を使用した承認要求 - Bot Service | Microsoft Learn
に情報があります

Sinatraを立ち上げます

今回はマルチテナントなので、TENANT_IDは不要

CLIENT_IDは(Microsoft App ID)とCLIENT_SECRET(パスワードの値)を環境変数に設定してSinatraを立ち上げます

CLIENT_ID=a3d1532e-xxxxx CLIENT_SECRET=53H8Q~xxxxx bundle exec rackup -p 3000

あとは元記事と同じです

まとめ

やりたいことへの道のりが長いです

PR

Microsoft Copilot for Microsoft 365活用大全

Microsoft Copilot for Microsoft 365活用大全

このリンクは、アフィリエイトリンクです


Amazonのアソシエイトとして、blog.freks.jp は適格販売により収入を得ています。
This site is managed by freks