web-dev-qa-db-ja.com

Teamsのチャネルにプロアクティブメッセージを送信する

そう、

私は広範囲に検索し、トピックで見つけたすべてを読んでも、まだ失敗しています。プロアクティブメッセージをユーザーに送信したり、チームのトピックに返信したりできましたが、チームチャネルでプロアクティブメッセージを送信(新しい投稿を作成)できません。

利用可能な例はありますか(見つけられませんでした)? NodeJSのMS Docsは、チーム内の各ユーザーにメッセージを送る例を示しているようですが、チャネル自体は示していません。

私はソースコードを調査しましたが、channelDatabotFrameworkAdapter.js内でnullにハードコード化されているため、混乱を招くだけです。

したがって、基本的なコードは次のとおりです。

const builder = require('botbuilder');
const adapter = new builder.BotFrameworkAdapter({
    appId: 'XXX',
    appPassword: 'YYY'
});

const conversation = {
  channelData: {
    //I have all this (saved from event when bot joined the Team)
  },
  ...
  // WHAT THIS OBJECT NEEDS TO BE TO SEND A SIMPLE "HELLO" TO A CHANNEL?
  // I have all the d
};

adapter.createConversation(conversation, async (turnContext) => {
  turnContext.sendActivity('HELLO'); //This may or may not be needed?
});

Node?を使用してこれを行った人はいますか?その場合、誰でも私に(適切に構築されたconversationオブジェクトを使用して)作業例を示すことができますか?

*編集*

ヒルトンが以下の回答で示唆したように、ConnectorClientを直接使用してみましたが、リソースが利用できません(/v3/conversations)が返されます

ここに私が使用しているコードがあります(文字通りそれだけで、デモメッセージを送信しようとしています):

const path = require('path');
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

const serviceUrl = 'https://smba.trafficmanager.net/emea/';

async function sendToChannel() {
    MicrosoftAppCredentials.trustServiceUrl(serviceUrl);

    var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    var client = new ConnectorClient(credentials, { baseUri: serviceUrl });

    var conversationResponse = await client.conversations.createConversation({
        bot: {
            id: process.env.MicrosoftAppId,
            name: process.env.BotName
        },
        isGroup: true,
        conversationType: "channel",
        id: "19:[email protected]"
    });

    var acivityResponse = await client.conversations.sendToConversation(conversationResponse.id, {
        type: 'message',
        from: { id: process.env.MicrosoftAppId },
        text: 'This a message from Bot Connector Client (NodeJS)'
    });

}

sendToChannel();

何が悪いのですか?

3
dkasipovic

さて、これが私がそれを機能させた方法です。今後の参考のためにここに掲載しています。

[〜#〜] disclaimer [〜#〜]botbuilderは最初の質問で尋ねたとおりです。この回答ではConnectorClientを使用しますが、これは許容範囲です(少なくとも私にとっては)。ヒルトンの指示と以前に見たGitHubの問題( https://github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162#issuecomment-434978847 )に基づいて、ようやく動作させました。 MSドキュメントはそれほど役に立ちません。ボットがメッセージまたはアクティビティに応答しているときに利用可能なcontext変数を常に使用し、ボットの実行中にこれらのコンテキストの記録を内部的に保持するためです。ただし、何らかの理由でボットが再起動された場合、または後で使用するためにデータベースにデータを保存する場合は、これが適切な方法です。

したがって、コード(NodeJS):

const path = require('path');
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

const serviceUrl = 'https://smba.trafficmanager.net/emea/';

async function sendToChannel() {
    MicrosoftAppCredentials.trustServiceUrl(serviceUrl);

    var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    var client = new ConnectorClient(credentials, { baseUri: serviceUrl });

    var conversationResponse = await client.conversations.createConversation({
        bot: {
            id: process.env.MicrosoftAppId,
            name: process.env.BotName
        },
        isGroup: true,
        conversationType: "channel",
        channelData: {
            channel: { id: "19:[email protected]" }
        },
        activity: {
            type: 'message',
            text: 'This a message from Bot Connector Client (NodeJS)'
        }
    });

}

sendToChannel();

[〜#〜] note [〜#〜]:ヒルトンが指摘したように、serviceUrlも必要ですチャンネルIDとともにデータベースからロードされます。これは、ボットがチーム/チャネル/グループにchannelIdとともに追加されたときに最初に受け取るアクティビティ内でも利用できます。また、将来参照するためにそれらを保存する必要があります(次のようにハードコードしないでください)例では)。

したがって、個別のcreateConversationsendActivityはなく、すべて1回の呼び出しで実行されます。

お時間をいただき、ありがとうございました。MS-Docsにぼやけた私の手

これが他の誰かを助けることを願っています

2
dkasipovic

(これは状況により適していると思うので、以前の答えを置き換えます)。

私はこれをさらに詳しく調べ、フィドラーのトレースを行って、より完全な答えを得ました。私はNode男ではないので、これが100%に変換されるかどうかはわかりませんが、見てみましょう。

基本的に、次のエンドポイントに送信したいとします: https://smba.trafficmanager.net/emea/v3/conversations/19:[RestOfYourChannelId]/activities

次のようなメッセージを投稿します。

_{
  "type": "message",
  "from": {
    "id": "28:[rest of bot user id]",
    "name": "[bot name]"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:[RestOfYourChannelId]"
  },
  "text": "Test Message"
}
_

ただし、そのエンドポイントに投稿するには、適切に認証する必要があります。そのようにしてエンドポイントと直接通信することは可能ですが、実際には組み込みのメカニズムを使用する方が簡単です。これは、ボットが最初にチャネルにインストールされたときにconversationreferenceを取得して保存することを意味します。 このファイル は、その方法を示しています(_this.onConversationUpdate_関数でconversationReferenceを取得して保存する方法を参照してください)。同じサンプルで、別のファイルに、その会話参照を使用して実際にプロアクティブメッセージを送信する方法を示しています-_adapter.continueConversation_を使用する here を参照してください。

Microsoftボットチームメンバーの1人も、これを here と同様に詳細に示しています。また、特定の状況で必要になる可能性があるMicrosoftAppCredentials.trustServiceUrl(ref.serviceUrl);を追加します(セキュリティの問題がある場合は、試してみてください)。

必要なものをカバーする必要がありますので、試してみてください。それでも問題が解決しない場合はお知らせください。

1
Hilton Giesenow