功能
- 朋友工作中的需求,向特定群体发送信息,需要多人反馈是否收到
- 脚本实现设定好确认所用的关键字,回复后能过查询字段能够获取哪些人已收到,哪些人未确认
程序代码
功能实现依赖于itchat,很简单,注释应该写得挺全的;小脚本所以都丢一个文件里了
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: CK
# CreateTime: 2020/1/9 20:01
import time
import itchat, os
from itchat.content import *
folder_path = os.path.join(os.path.abspath('.'), '配置文件')
file_names = ['查询关键字.txt', '回复关键字.txt', '目标人员名单(可不设置).txt', '结果.txt']
# 相关配置文件创建
def create_file():
if not os.path.exists(folder_path):
os.mkdir(folder_path)
for i in file_names:
file_path = os.path.join(folder_path, i)
if not os.path.exists(file_path):
make_file = open(file_path, 'w', encoding='utf-8')
make_file.close()
# 检查配置文件是否满足要求
def check_config_file():
flag = 0
for i in file_names:
# 过滤下列数据
if i == '目标人员名单(可不设置).txt' or i == '结果.txt':
continue
with open(os.path.join(folder_path, i)) as f:
lines = f.readlines()
for j in lines:
if j.strip() != '':
flag += 1
if j.strip() == '退出':
input("关键词不允许使用“退出”,请回车后修改")
exit()
if flag == 0:
input("%s 未设置,请设置完成后重试,现在请回车退出" % i) # 用于打包exe后能够显示
exit()
else:
flag = 0
# 从文件中提取元素
def get_words(path):
result = []
with open(path) as f:
lines = f.readlines()
for i in lines:
if i.strip() != '':
result.append(i.strip())
return result
# 结果名单列表获取
def get_feedback_list():
feedback_list = []
result_file = os.path.join(folder_path, '结果.txt')
with open(result_file) as f:
temp_list = f.readlines()
for i in temp_list:
feedback_list.append(i.strip().split(',')[0])
return feedback_list
# 对比已经回复与未回复的消息
def compare():
# 将已确认从目标名单中移除
guys_list = get_words(os.path.join(folder_path, '目标人员名单(可不设置).txt'))
for i in get_feedback_list():
if i in guys_list:
guys_list.remove(i)
return guys_list
# 格式化输出列表
def list_format_output(lis):
result = ''
for i in lis:
result += str(i) + ','
return result[: -1]
# @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
@itchat.msg_register([TEXT])
def text_reply(msg):
result_file = os.path.join(folder_path, '结果.txt')
# 获得目标人员列表
guys_list = get_words(os.path.join(folder_path, '目标人员名单(可不设置).txt'))
# 查询:关键词如何定义,是写死还是每次输入或单独存一个文件?建议单独存一个文件,写上自定义的密码什么的,每次输入密码就能查询结果
search_words = get_words(os.path.join(folder_path, '查询关键字.txt'))
# 回复:通过文件设置回复字段,每行写一条,只要收到好友此类消息即会将结果存入文件
reply_words = get_words(os.path.join(folder_path, '回复关键字.txt'))
# 获取回复者信息,有备注返回备注,否则为昵称
name = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']
if name.strip() == '':
name = itchat.search_friends(userName=msg['FromUserName'])['NickName']
# 直接把获取到的人员名放入结果文件
if msg.text in reply_words and name not in get_feedback_list():
with open(result_file, 'a') as rf:
rf.write(name + ',' + time.strftime("%m-%d,%H:%M", time.localtime(time.time())) + '\n')
# 结果:查询部分,如果设定了好友接收名单,则可以实现对比输出,如果没有则打印所有已收到的人员名单
elif msg.text in search_words:
# 未设置目标清单
if len(guys_list) == 0:
message = '暂无人确认' if len(get_feedback_list()) == 0 \
else list_format_output(get_feedback_list()) + ',共计%d人已经收到' % len(get_feedback_list())
msg.user.send(message)
# 设置了目标清单
else:
if len(get_feedback_list()) == 0:
message = '暂无人确认'
elif len(compare()) == 0:
message = '全部确认完成'
else:
message = list_format_output(get_feedback_list()) + ',共计%d人已经收到;\n' % len(get_feedback_list()) + \
list_format_output(compare()) + ',共计%d人还未回复' % len(compare())
msg.user.send(message)
elif msg.text == '退出':
itchat.logout()
if __name__ == '__main__':
# 函数调用
create_file()
check_config_file()
itchat.auto_login(hotReload=True) # 短时间内热登录
itchat.run()
使用步骤
- 运行脚本,会检查当前文件目录下是否有配置文件,没有会创建
- 如果配置正确,直接弹出二维码,微信必须能够登录网页版
- 保证程序后台运行,否则无法记录所有回复者
- 使用方法只需要回复“配置文件/回复关键字.txt”中设定好的词其中一个
- 查询方法只需要回复“配置文件/查询关键字.txt”中设定好的词其中一个
- 结果保存在“配置文件/结果.txt”中,有时间后缀,使用前需要手动删除上一次的统计结果
- 程序意外挂掉,不需要更改任何配置,重启即可,但挂掉期间回复者不会被记录
- 推荐输入“退出”关闭程序
设置步骤
- 默认获取备注名称,但如果没有才会获取目标昵称,所以在设置目标人员名单时设置成自己微信列表里对应的名字
- 所有配置文件的设定都以行为单位,如下所示:
- 张三
- 李四
- 王二
- 查询关键字设定后谁都可以通过这个词查询到结果,自己依情况设定,可以为多个词,亦需换行
- 回复关键字同上,也可以为多个,需要换行
- 输入的关键字只要在范围内的任一个
脚本打包
如果需要将脚本打包成exe,需要安装python环境后依次使用如下命令
pip install itchat
pip install pyinstaller
cd whereYourPYFileIs
# -F是将程序打包为单个文件,-i是给包加上图标
pyinstaller -F -i yourIcon.ico PYFile.py