草庐IT

看到chatgpt这么火,我也做了个微信聊天机器人

我只有三天不想上班 2023-04-18 原文

听说最近ChatGPT很火,我也做了个自动跟女朋友聊天的机器人

这两天ChatGPT火得很,各种报道ChatGPT可以聊天、可以写代码、甚至还写出了毁灭人类计划书!

真是看的我心痒痒啊,但是因为某些原因国内没法试用,加上这两天想讨女朋友开心,所以打算写个自动回复女朋友消息的聊天机器人,也算是一举两得。

思路也很简单,首先实现调用微信api进行消息接收和回复,其次实现一个简单的聊天机器人,能逗女朋友开心。

微信消息接收和回复

这里使用lich0821大佬WeChatFerry项目的代码,WeChatFerry通过hook的方式拦截了微信消息,并实现了python/c++/java的api调用。

安装方法是:

  1. 去下载github项目中最新的release文件,
  2. 解压后按照 readme.md文档进行安装

注意的点有

  • 微信版本和python版本需要匹配
  • 执行 python -m grpc_tools时填写的路径需要改成绝对路径

聊天机器人

聊天机器人我们也不需要太复杂的逻辑,只要能逗女朋友开心就行了,所以我们自己实现。

逻辑如下

  1. 聊天第一句一般都是问"你在干嘛?",我们反客为主,直接将"?"替换成"!",反问对方。
  2. 当对方说"我xxxx你"时,你需要表达跟对方相同的感受,所以需要回复"我也xxxx你"。
  3. 当对方进行询问"你xxxx?"的时候,你需要做出肯定的回复,所以我们回复"对啊!"。
  4. 当"你"和"我"同时在句子中时, 我们需要传递相同的感受,所以把"你"改成"我",把"我"改成"你"。
  5. 遇到疑问句或感叹句时,我们直接改变句意,把"!"和"?"互换。
  6. 最后做一个兜底回答,从"噢噢""这样啊""好吧"中选一个此进行回答。

具体代码如下

    def handle_recv_msg(msg: wcf.WxMsg):

        def replace(d):
            for i in range(len(msg_list)):
                for old, new in d.items():
                    if msg_list[i] == old:
                        send_msg[i] = new
                        continue

        if msg.sender != target_wxid:
            return
        msg_list = list(msg.content)
        send_msg = msg_list[:]

        if "你在" == "".join(msg_list[:2]):
            mapping = {
                "!""?",
                "?""!",
                "!""?",
                "?""!"
            }
            replace(mapping)
        elif "我" == msg_list[0] and "你" in msg_list:
            mapping = {
                "我""我也",
            }
            replace(mapping)
        elif "你" == msg_list[0] and ("?" == msg_list[-1] or "?" == msg_list[-1]):
            send_msg = "对啊!"
        elif "你" in msg_list and "我" in msg_list:
            mapping = {
                "我""你",
                "你""我"
            }
            replace(mapping)
        elif any([(i in msg_list) for i in ["?""?""!""!"]]):
            mapping = {
                "!""?",
                "?""!",
                "!""?",
                "?""!"
            }
            replace(mapping)
        else:
            send_msg = [random.choice(["噢噢""这样啊""好吧"])]
        time.sleep(0.5)
        print("收到消息:", msg.content, "发送消息:""".join(send_msg))
        wcf.send_text("".join(send_msg), target_wxid)

这样我们的微信哄女友开心机器人就写好啦,试一试效果

怎么样,很不错吧,不过这是我实验的一段对话,真正的对话,刚才也试过了,给大家展示一下

额。。。

看来女朋友是门外汉,还需要对女朋友做优化才能让这段程序正确运行啊,有女朋友的小伙伴也赶紧去试试吧。

需要源代码的请在评论区回复噢。

不说了,走廊里太冷了,我去消防通道睡觉去了。

end

本文由 mdnice 多平台发布

有关看到chatgpt这么火,我也做了个微信聊天机器人的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

  3. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  6. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby - 为什么 Ruby 返回 `str[-1..1]` 它做了什么? - 2

    假设我们有一个字符串str。如果str仅包含一个字符,例如str="1",则str[-1..1]返回1.但是如果str的size(length)比一个长,比如str="anythingelse",然后str[-1..1]返回""(空字符串)。为什么Ruby会这样解释字符串切片? 最佳答案 这种行为正是字符范围的工作方式。范围开始是-1,这是字符串中的最后一个字符。范围结束为1,即从开始算起的第二个位置。所以对于单字符字符串,这相当于0..1,也就是那个单个字符。对于双字符字符串,这是1..1,即第二个字符。对于三个字符的字符串,这是

  9. ruby-on-rails - expect() 在 rspec/cucumber 中做了什么? - 2

    在MichaelHartl的RailsTutorial中,许多示例使用expect()方法。这是cucumber步骤定义中的一个这样的例子:Then/^sheshouldseeherprofilepage$/doexpect(page).tohave_title(@user.name)end同样的例子可以写成同样的效果:Then/^sheshouldseeherprofilepage$/dopage.shouldhave_title(@user.name)end为什么要使用expect()?它增加了什么值(value)? 最佳答案

  10. ruby-on-rails - % 在下面的代码中做了什么? - 2

    我正在阅读“Rails3Way”,在第39页,它显示了匹配:to=>重定向方法的代码示例。在该方法中存在以下代码。虽然我知道模对数字有什么作用,但我不确定下面的%是做什么的,因为路径和参数显然都不是数字。如果有人能帮助我理解%在这种情况下的用法,我将不胜感激。proc{|params|path%params} 最佳答案 这可能是String#%与其他语言中的sprintf非常相似的方法:'%05d'%10#=>"00010"它可以接受单个参数或数组:'%.3f%s'%[10.341412,'samples']#=>"10.341sa

随机推荐