[Python] 基于itchat实现回复微信完成确认、统计、查询功能

功能

  • 朋友工作中的需求,向特定群体发送信息,需要多人反馈是否收到
  • 脚本实现设定好确认所用的关键字,回复后能过查询字段能够获取哪些人已收到,哪些人未确认

程序代码

功能实现依赖于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”中,有时间后缀,使用前需要手动删除上一次的统计结果
  • 程序意外挂掉,不需要更改任何配置,重启即可,但挂掉期间回复者不会被记录
  • 推荐输入“退出”关闭程序

设置步骤

  1. 默认获取备注名称,但如果没有才会获取目标昵称,所以在设置目标人员名单时设置成自己微信列表里对应的名字
  2. 所有配置文件的设定都以行为单位,如下所示:
    • 张三
    • 李四
    • 王二
  3. 查询关键字设定后谁都可以通过这个词查询到结果,自己依情况设定,可以为多个词,亦需换行
  4. 回复关键字同上,也可以为多个,需要换行
  5. 输入的关键字只要在范围内的任一个

脚本打包

如果需要将脚本打包成exe,需要安装python环境后依次使用如下命令

pip install itchat
pip install pyinstaller

cd whereYourPYFileIs

# -F是将程序打包为单个文件,-i是给包加上图标
pyinstaller -F -i yourIcon.ico PYFile.py
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值