Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ConversationUpdate在发布后不触发

ConversationUpdate在发布后不触发
EN

Stack Overflow用户
提问于 2017-08-21 00:42:02
回答 2查看 225关注 0票数 0

嗨,我用C#中的微软BotFramework创建了我的第一个测试机器人。在if (message.Type == ActivityTypes.ConversationUpdate)private async Task< Activity > HandleSystemMessage(Activity message)中,通常应该通知新成员加入群或有人在Telegram Messenger中点击了机器人的start按钮。当我使用BotFramework模拟器在调试模式下测试它时,一切都运行得很好,但是在我发布它之后,我发现在Telegram messenger中点击start按钮后,我的代码不能运行。我在ActivationType.ConversationUpdate中的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach (var item in message.MembersAdded)
                {
    try
    {
        using (var dbcontext = new WatermarkBotDBEntities())
        {
            dbcontext.BotUsers.Add(new BotUser()
            {
               AddedFriends = 0,
               ConversationID = message.Conversation.Id,
               ServiceUrl = message.ServiceUrl,
               UserID = message.From.Id
            });
         dbcontext.SaveChanges();
         if (Request.RequestUri.Query != "")
         {
             var u = dbcontext.BotUsers.Where(x => x.BotSalCode == Request.RequestUri.Query.Replace("?start=", string.Empty)).FirstOrDefault();
             u.AddedFriends++;
             dbcontext.Entry(u).State = System.Data.Entity.EntityState.Modified;
             if (u != null)
             {
                 var connector = new ConnectorClient(new Uri(u.ServiceUrl));
                 IMessageActivity newMessage = Activity.CreateMessageActivity();
                 newMessage.Type = ActivityTypes.Message;
                //newMessage.From = new ChannelAccount("<BotId>", "<BotName>");
                newMessage.From = new ChannelAccount("c3e7mhdafcecn7ng3", "Bot");
                newMessage.Conversation = new ConversationAccount(false, u.ConversationID);
                newMessage.Recipient = new ChannelAccount(u.UserID);
                if (u.AddedFriends <= 2)
                    newMessage.Text = $"SomeText.";
                else newMessage.Text = "SomeTex";
                await connector.Conversations.SendToConversationAsync((Activity)newMessage);
                 dbcontext.SaveChanges();
           }
        }
    }
}
catch (Exception ex)
{
}

那么,如何检测电报中的点击开始呢?问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-24 21:50:17

这是我在经过大量测试后找到的问题的答案:在BotFramework应用程序中默认定义的public async Task<HttpResponseMessage> Post([FromBody]Activity activity)函数的MessagesController类中,您必须执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (activity.Type == ActivityTypes.Message)
{
    if (activity.Text.StartsWith("/start"))
    {
        //This will return you the start parameter of a link like : http://telegram.me/botname?start=Parameter
        var Parameter = activity.Text.Replace("/start ", "");
    }
}

如果你想发送欢迎信息,那么你可以使用@JasonSowers告诉你的方式,并使用他的代码来发送你的信息。诚挚的问候

票数 0
EN

Stack Overflow用户

发布于 2017-08-21 20:00:13

我知道这不是一个完整的答案,但我想与您分享这段代码,以防对您有所帮助。下面是发送欢迎消息的推荐方式,您可以重新调整代码的用途以供使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
else if (message.Type == ActivityTypes.ConversationUpdate || message.Type == ActivityTypes.Message)
            {
                IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;
                if (iConversationUpdated != null)
                {
                    ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));

                    foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
                    {
                        // if the bot is added, then
                        if (member.Id == iConversationUpdated.Recipient.Id)
                        {
                            var reply = ((Activity)iConversationUpdated).CreateReply(
                            $"Hi! I'm Botty McBot.");
                            await connector.Conversations.ReplyToActivityAsync(reply);
                        }
                    }
                }
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45788067

复制
相关文章
python中的reduce函数
在python3中,内置函数中已经没有reduce了。要使用reduce,需要从functools模块里引入
Python学习者
2023/09/09
1580
python中reduce函数的用法
reduce:将一个可以迭代的对象应用到两个带有参数的方法上,我们称这个方法为fun,遍历这个可迭代的对象,将其中元素依次作为fun的参数,但是这个函数有两个参数,那些作为参数呢?
用户7886150
2021/01/12
5900
python的reduce()函数
reduce()函数是Python内置的一个高阶函数。 reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。 例如,编写一个f函数,接收x和y,返回x和y的和: 1 2 def f(x, y): return x + y 调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做
用户1214487
2018/01/24
6570
[Python]reduce() 函数
Python reduce() 函数 reduce() 函数会对参数序列中元素进行累积。 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
唯一Chat
2020/02/25
6470
python: reduce函数
python3 中,reduce()函数已经被从 全局名字空间 里移除了。 转而被放置到了 fucntools模块里 。
JNingWei
2018/09/28
6100
Python reduce()函数
MapReduce: Simplified Data Processing on Large Clusters Jeffrey Dean and Sanjay Ghemawat https://research.google.com/archive/mapreduce.html 这篇来自谷歌的论文介绍了map/reduce,摘录如下: Abstract MapReduce is a programming model and an associated implementation for
Steve Wang
2018/02/05
7030
python reduce函数
python内置函数reduce 和 map/filter等函数有点类似,都是通过函数对迭代器中的元素进行遍历操作,唯一区别是reduce函数是返回计算结果是一个值,而map/filter是返回一个序列或者迭代器,下面在做详细解释
猿说编程[Python和C]
2020/03/12
8620
【Python】列表 List ① ( 数据容器简介 | 列表 List 定义语法 | 列表中存储类型相同的元素 | 列表中存储类型不同的元素 | 列表嵌套 )
Python 中的 数据容器 数据类型 可以 存放多个数据 , 每个数据都称为 元素 , 容器 的 元素 类型可以是任意类型 ;
韩曙亮
2023/10/11
2820
【Python】列表 List ① ( 数据容器简介 | 列表 List 定义语法 | 列表中存储类型相同的元素 | 列表中存储类型不同的元素 | 列表嵌套 )
Python 列表中的sort函数
列表中的sort函数 功能 对当前列表按照一定规律排序 用法 list.sort(key=None, reverse=False) 参数 key - 参数比较 reverse –排序规则 reverse = True 降序 reverse = False 升序 ( 默认 ) key涉及函数学习,我们在日后讲解当前默认不传即可 注意事项 列表中的元素类型必须相同 , 否则无法排序(报错) 字典也可以排序, key或者value排序 代码 # coding:utf-8 shu = '01老鼠' niu =
Zkeq
2022/05/18
2.4K0
绑定事件中 如可控制函数的执行次数
var flag = true; function onlyOne() { if(flag) { "这里是要执行的代码"; } flag = false//该方法是控制函数仅执行一次 因为flag是全局变量 onlyOne()函数执行一次后flag就变成false了 函数就执行不了了
大当家
2018/06/28
2.3K0
JS的内建函数reduce
@(js) reduce函数,是ECMAScript5规范中出现的数组方法。在平时的工作中,相信大家使用的场景并不多,一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实现,虽然不清楚浏览器的js引擎是如何在C++层面实现这两个方法,但是可以肯定的是reduce方法肯定也存在数组的遍历,在具体实现细节上是否针对数组项的操作和存储做了什么优化,则不得而知。 ---- [TOC] 数组的reduce方法的应用 reduce方法有两个参数,第一个参数是一个callback,用于针对数
欲休
2018/03/15
1.5K0
【说站】python迭代中删除列表项目
2、通过分配给slice somelist[:],改变现有列表以仅包含想要的项目。
很酷的站长
2022/11/24
1.6K0
【说站】python迭代中删除列表项目
PHP array_reduce() 函数
array_reduce() 函数向用户自定义函数发送数组中的值,并返回一个字符串。
用户1448800
2021/08/19
4470
如何在环境中存储配置
关于「在环境中存储配置」,是 The Twelve-Factor App 倡导的方法论之一。通常,应用的配置在不同环境(预发布、生产环境、开发环境等等)间会有很大差异,比如说数据库的用户名密码等等配置,通过把配置和代码分离,我们可以保证部署在不同环境的代码完全一致,如何把配置和代码分离呢?最佳实战是把配置存储到环境变量中,它可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;此外环境变量与语言和系统无关。
LA0WAN9
2021/12/14
1.2K0
Python 3.x中reduce()函数完整用法
在Python 3.x中,reduce()不再是内置函数,而是移到了标准库functools中,需要先导入再使用,其官方解释如图所示:
Python小屋屋主
2018/07/23
7190
Python 3.x中reduce()函数完整用法
如何在Dart中合并列表
在 Dart 编程中,List 数据类型类似于其他编程语言中的数组。列表用于表示对象的集合。它是一组有序的对象。Dart 中的核心库负责 List 类的存在、创建和操作。有 5 种方法可以组合两个或多个列表:
徐建国
2021/12/01
2.1K0
点击加载更多

相似问题

如何在PHP中退出数组迭代函数(array_reduce)

58

迭代器中reduce和reduce的区别

22

如何在reduce函数中填充新列表- Kotlin

213

如何在C#中迭代列表中的每个列表?

12

对列表中的每个项目进行迭代的函数

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文