当前位置: 首页 > news >正文

一个简单有趣的微信聊天机器人

微信已经成了中国人生活中基本的通讯工具(除了那些自由开源人士以外),前两天发现微信机器人的项目,其实早就有了。想着自己也做一个吧,顺便加了一些小小的功能。

释放我的机器人

微信扫一扫加他,跟他尬聊吧,把他拽到群里调戏他。

img_1d542e6df9998b6fcb497f64b732e858.jpe
qrcode.jpg

具体功能下面会介绍。

工具

  • 手机

    微信登陆必须得有手机端登陆才能使用网页登陆,因为要扫一扫

  • Python 平台

    该项目基于 Python 开发,所以至少得来个嵌入式的开发板,或者电脑,或者...云服务器 ;-),如果要保证长时间开启与话,最好使用云服务器。

开发微信机器人

该项目基于 Github 上的 wxpy,使用文档在 这里。中文版的,所以我就不介绍这个怎么使用了。简单描述一下

创建机器人

from wxpy import *
bot = Bot()

注册消息回复

机器人对好友、群聊中 at 他的人进行回复,在群聊中同时统计每个人的发言次数和第一次发言的时间,将这些信息实时存储在本地,以防程序错误导致数据丢失。

消息回复中的机器人使用 图灵机器人, 可免费申请 API,调用他。也可以使用 小 I 机器人。这两个都是深度整合在项目里的。

@bot.register([Friend, Group])
def reply_friend(msg):
    """
    消息自动回复
    """
    print(msg)
    if isinstance(msg.chat, Group):
        group = msg.chat.name
        name = msg.member.name
        if group in stat:
            if name in stat[group]['count']:
                stat[group]['count'][name] += 1
            else:
                stat[group]['count'][name] = 1
            flag = True
            for rank in stat[group]['rank']:
                if name == rank['name']:
                    flag = False
                    break
            if flag:
                stat[group]['rank'].append({'name': name, 'time': time.strftime("%H:%M:%S", time.localtime())})
        else:
            stat[group] = {"count": {name: 1}, 'rank': [{'name': name, 'time': time.strftime("%H:%M:%S", time.localtime())}, ]}
        if msg.text == "发言排行榜":
            g = bot.groups().search(group)[0]
            if not stat[g.name]:
                return
            msg_text = ""
            index = 1
            count = stat[g.name]['count']
            for name in sorted(count, key=lambda x: count[x], reverse=True):
                # print("{}: {} {}".format(index, rank['name'], rank['time']))
                msg_text += "{}: {} 发言了 {} 次\n".format(index, name, count[name])
                index += 1
            if msg_text:
                msg_text = "发言排行榜:\n" + msg_text
                g.send(msg_text)
        if msg.text == "起床排行榜":
            g = bot.groups().search(group)[0]
            if not stat[g.name]:
                return
            msg_text = ""
            index = 1
            for rank in stat[g.name]['rank']:
                # print("{}: {} {}".format(index, rank['name'], rank['time']))
                msg_text += "{}: {} {}\n".format(index, rank['name'], rank['time'])
                index += 1
            if msg_text:
                msg_text = "起床排行榜:\n" + msg_text
                g.send(msg_text)
        with open('stat.json', 'w') as fh:
            fh.write(json.dumps(stat))
        if not msg.is_at:
            return
    return tuling_auto_reply(msg)

自动接受好友申请

@bot.register(msg_types=FRIENDS)
def auto_accept_friends(msg):
    """
    自动接受好友请求
    """
    # 接受好友请求
    new_friend = msg.card.accept()
    # 向新的好友发送消息
    new_friend.send('哈哈,我们现在是超级好的好朋友了呢~~')

添加计划任务

光回复怎么够,还要做一些小小的有趣的功能,我这里添加了两个统计,一个是起床时间统计,另一个是发言统计。

当天群聊的用户第一次发言作为起床时间,虽然有些不严谨,但毕竟功能是受限制的。

然后每天的 9 点发布一次起床排行榜, 20 点发布一次发言排行榜。当然其实主动发送 “起床排行榜”、“发言排行榜” 也会回复当前的排行。

起床排行榜

img_40b4f30495c38d5eff1cc9e423504797.jpe
rank_getup.jpg

发言排行榜

img_4a9c80eb6a0089ec871aa28078817b51.jpe
rank_speak.jpg

实现

class ScheduleThread(threading.Thread):
    """
    计划任务线程
    """
    def run(self):
        global schedule_time
        global bot
        global stat
        while 1:
            time.sleep(300)
            cur_hour = time.strftime("%H", time.localtime())
            # print("cur:{}\tschedule:{}".format(cur_hour, schedule_time))
            if cur_hour == schedule_time:
                continue
            elif cur_hour == '09':
                for group in bot.groups():
                    print(group.name)
                    if not stat[group.name]:
                        continue
                    msg_text = ""
                    index = 1
                    for rank in stat[group.name]['rank']:
                        # print("{}: {} {}".format(index, rank['name'], rank['time']))
                        msg_text += "{}: {} {}\n".format(index, rank['name'], rank['time'])
                        index += 1
                    if msg_text:
                        msg_text = "排行日报\n起床排行榜:\n" + msg_text
                        group.send(msg_text)
            elif cur_hour == '20':
                for group in bot.groups():
                    print(group.name)
                    if not stat[group.name]:
                        continue
                    msg_text = ""
                    index = 1
                    count = stat[group.name]['count']
                    for name in sorted(count, key=lambda x: count[x], reverse=True):
                        # print("{}: {} {}".format(index, rank['name'], rank['time']))
                        msg_text += "{}: {} 发言了 {} 次\n".format(index, name, count[name])
                        index += 1
                    if msg_text:
                        msg_text = "排行日报\n发言排行榜:\n" + msg_text
                        group.send(msg_text)
            elif cur_hour == '00':
                stat = dict()
                with open('stat.json', 'w') as fh:
                    fh.write('')
            schedule_time = cur_hour

聊聊

展示两个机器人互相尬聊的情况是怎么样的。

img_5d3e16a003c0a50b9a70b4497f9b3a1d.jpe
chat.jpg

部署

创建机器人时添加一个 console_qr 参数, True 时表示在终端显示二维码,False 表示用图片程序打开二维码。按情况来,如果在没有界面的云服务器上,那就在终端打开,如果只能连 tty ,那最好的办法就是生成一张图片,放到指定的 FTP 或者云盘目录,然后本地打开扫描,或者建个简单的 HTTP 服务器展示图片,方法很多,根据自己情况来吧。

原文地址:一个简单有趣的微信聊天机器人
我的博客:时空路由器

相关文章:

  • windows上安装redis
  • Date类型
  • C#读写配置文件Config
  • js 简单实现隐藏和显示
  • 微软ASP.NET网站部署指南(9):部署数据库更新
  • 使用openssl配置tomcat
  • iframe在ie和firefox中的高度兼容性问题解决
  • spring boot集成mybatis
  • Bootstrap栅格系统
  • 双主模型高可用负载均衡集群的实现(keepalived+lvs-dr)
  • Google Play商店400款App藏恶意代码:手机可变监听站
  • 10.3-全栈Java笔记:常用流详解(一)
  • 不断增长的互联网威胁正在让越来越多的美国人逃离网络
  • 云计算业务的发展对数据中心有了更高的要求
  • 周鸿祎:成功是熬出来的,像阿甘坚持到最后一分钟
  • JS 中的深拷贝与浅拷贝
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Git同步原始仓库到Fork仓库中
  • Java 内存分配及垃圾回收机制初探
  • Javascript设计模式学习之Observer(观察者)模式
  • Linux快速复制或删除大量小文件
  • MaxCompute访问TableStore(OTS) 数据
  • PAT A1120
  • v-if和v-for连用出现的问题
  • Vultr 教程目录
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 自制字幕遮挡器
  • UI设计初学者应该如何入门?
  • ​queue --- 一个同步的队列类​
  • ​你们这样子,耽误我的工作进度怎么办?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)STM32单片机上位机
  • (C语言)二分查找 超详细
  • (C语言)共用体union的用法举例
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二开)Flink 修改源码拓展 SQL 语法
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (强烈推荐)移动端音视频从零到上手(下)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (万字长文)Spring的核心知识尽揽其中
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • ***原理与防范
  • .bat文件调用java类的main方法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • /bin/rm: 参数列表过长"的解决办法
  • @RequestBody的使用
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)