最近加入了一个早起打卡的微信群,里面有人提出如果每天早起打卡有个排行榜,他会更有动力早起。这种打卡进行排行榜的活动的方式在很多app都有,满足人们炫耀,攀比的一种方式。那在微信群里面能否实现这样的功能。下面讲一下我的实现思路。
实现思路
先介绍一下wxpy,实现的功能都是建立在这个基础上。可以用来做一些常见的场景如下:
- 控制路由器、智能家居等具有开放接口的玩意儿
- 运行脚本时自动把日志发送到你的微信
- 加群主为好友,自动拉进群中
- 跨号或跨群转发消息
- 自动陪人聊天
- 逗人玩
总而言之,可用来实现各种微信个人号的自动化操作
实现的思路:
监听打卡的微信群,微信群的用户在 @ 到打卡机器人(就是你登录的微信号) 并且发送“打卡”两个字,就触发监听的逻辑,计算该用户是第几名打卡的人,并发送信息到群里“xxx,打卡成功,你是第3个打卡” 类似这样的回复。
实现代码
先安装wxpy的包
pip install -U wxpy
排行版的数据是简单的存放在一个文本里面,文件的命名按日期进行存放,每一条记录为一行,下面的方法是获取文本里面行数。
1#获取文件的行数
2def get_count(file_name):
3 count = 0
4 fp = open(file_name, "r")
5 while 1:
6 buffer = fp.read(8*1024*1024)
7 if not buffer:
8 break
9 count += buffer.count('\n')
10 fp.close()
11 return count
排行榜的逻辑:
- 第2行的微信机器人的初始化,运行到这来会弹出一个二维码,需要用微信扫描进行登录。
- 第4行注册了一个监听微信群(Group),监听的内容是文本(TEXT)。处理的逻辑代码的注释已经写清楚了。
- 第24行主要作用是阻塞主线程
1#缓存登录的信息,不用每次启动都要扫描
2bot = Bot(cache_path=True)
3#注册
4@bot.register([Group], TEXT)
5def auto_reply(msg):
6 # 如果是群聊,并且被当前登录的人被@,群的名称叫打卡群
7 if isinstance(msg.chat, Group) and msg.is_at and msg.sender.name=="打卡群":
8 text=msg.text #接收到的信息
9 member_name=msg.member.name#群里发送信息的名称
10 create_time=msg.create_time#发送消息时间
11 #内容里面带有“打卡”两个字才算成功
12 if text.find("打卡")!=-1:
13 date=datetime.datetime.now().strftime('%Y-%m-%d')
14 file_name=f"排行榜_{date}.txt"
15 try:
16 count=get_count(file_name)+1
17 except Exception as e:
18 count=1
19 file=open(file_name,'a')
20 file.writelines(f"排行:{count},打卡人:{member_name},打卡时间:{create_time}\n")
21 file.close();
22 return f"{member_name},打卡成功,你是第{count}个打卡"
23#阻塞主进程
24embed()
话题延伸
以上的实现只是简单讲了一下解决问题的思路,里面还有什么没有解决呢?例如:打卡时间的范围没有限制,重复打卡的处理等。
现在已经有很多微信群的相关工具,为什么还要自己重复造轮子。因为大部分的功能只是满足基本的功能,当我们要运营某个功能的时候,不满足的情况下,就需要自己能够实现。
上面的功能还可以有这样的玩法。监控某个人发送的“放榜”指令,把今天统计的打卡前十名的名单自动发到群里。可以统计一个星期连续排行榜前十名的人。当你有了数据后,很多方式可以玩。
欢迎关注公众:sjyy_python