python pywinauto 自动控制微信, 关键字回复、收款、定时任务, 代替人工成为微信客服
最近在给朋友做个工作用的软件,需要和微信配套使用且需要实现一些自动操作。
- 通过好友请求并随机备注。
- 根据关键字自动回复,包括文字、图片及文件。
- 定时发送信息,包括单次、隔日、每周末及每日。
- 处理转账,根据金额及备注进行相应操作,包括接收转账后一系列操作或退回转账。
- 处理扫码付款,同上一条相类似。
- 手动批量发送信息
- 保存所有好友信息
上诉功能可以很容易实现,但是还存在几个不足点,例如
- 不能够后台操作,也就是说微信在工作期间,在一些操作过程中,电脑不能正常使用,其他时间无影响。针对这个情况,有一个解决方案,即将任务设置放在本地,将微信放在服务器,天翼云的低配虚拟主机,八十元/年。
- 处理转账较慢,大概最短需要3秒,最长需要5秒。这一过程暂时没有找到更合适的解决办法。
以上就是本篇文章的简要介绍,下面来具体谈一谈。
目录
- 1. 工具说明
- 1.1 微信版本
- 1.2 python 版本
- 2. 总览
- 2.1 好友信息列表
- 2.2 自动回复设置
- 2.3 好友转账及二维码付款
- 2.4 定时信息
- 3. 实现过程
- 3.1 获取微信PID
- 3.2 获取好友信息
- 3.3 包装点击控件
- 3.4 获取信息列表
- 3.5 点击或搜索好友
- 3.6 删除好友聊天框
- 3.7 通过好友申请
- 3.8 修改用户名
- 3.9 发送文本信息
- 3.10 发送图片
- 3.11 处理转账
- 3.12 确认收款及退回
- 4. 总说明
1. 工具说明
1.1 微信版本
我一直使用的是2.9.5版本。最新版本和更旧的版本我都使用过,在所有可用的版本中,这个版本是运行最合适的一个版本,旧版本有些功能不全,而最新版本过于臃肿,所以建议找到这个版本使用。
1.2 python 版本
我是用的是 python3.5,在 pycharm 中建立虚拟环境,对于库包,随用随装。
2. 总览
设置端是按照朋友需求写的,方法都是写好的,直接调用就可以。设置端可以根据自己的需求写。在此我只是介绍一下代码能够实现的功能。
2.1 好友信息列表
2.2 自动回复设置
2.3 好友转账及二维码付款
2.4 定时信息
3. 实现过程
from pywinauto.application import Applicationclass WeChat:PID = get_pid()if not self.PID:print('未检测到微信运行')return 0else:# 在这里要设置应用后端,即 uia 或 win32,这里微信要设置为 uia,具体方法可参考文末链接self.app = Application(backend='uia')self.app.connect(process=self.PID)self.win = self.app[u'微信']print('已建立与微信链接')
整个包装成类,方便在写设置端的时候直接继承,方便使用
3.1 获取微信PID
from psutil import process_iterdef get_pid(self):PID = process_iter()for pid_temp in PID :pid_dic = pid_temp .as_dict(attrs=['pid','name'])if pid_dic['name'] == 'WeChat.exe':return pid_dic['pid']else:return 0
3.2 获取好友信息
def get_text(self):try:# 在这里如此定位控件是最快的,逐级定位思路清晰,定位精准return self.win.child_window(title="消息", control_type="List").child_window(control_type="Edit", found_index=0).window_text()except:return ''
3.3 包装点击控件
from pywinauto import mouse# 左键点击某个控件
def click_one(self, title='', control_type='', button='left', found_index=0, left=10, top=10, times=1):""":param title: 控件名称:param control_type: 控件类型:param button: left right middle 对应左、右、中三个键:param times: 点击次数:param found_index: 选择同名同类型多个控件中的第几个:param left: X 正方向修正:param top: Y 正方向修正:return:"""# 在这里控件名称和类型,可以只选择一个,不过定位精准度不高if title == '' and control_type == '':raise ValueError('控件名和控件类型不可为空!')position = self.win.child_window(title=title, control_type=control_type, found_index=found_index).rectangle()for i in range(times):mouse.click(button=button, coords=(position.left + left, position.top + top))if times > 1:sleep(0.2)
3.4 获取信息列表
def get_users(self):user_lis = []try:# 列表中添加的是发来新信息的好友名称users = self.win.child_window(title="会话", control_type="List").children()for user in users:user_lis.append(user.window_text())except:print('获取好友列表失败')passreturn user_lis
3.5 点击或搜索好友
# user 为需要找到的好友名称,如果信息列表中存在,则直接点击,不存在则搜索
def find_user(self, user=''):if user== '':raise ValueError('好友名称不可为空!')if self.win.child_window(title=user, control_type='Text').exists(timeout=0.2):self.click_one(title=user, control_type='Text')else:self.click_one(title='搜索', control_type='Edit', times=2)# 这里必须要等待一定时间,等待搜索框加载出来,时间可以自行尝试着缩短sleep(0.5)self.win.type_keys(user)sleep(0.5)self.win.type_keys('{ENTER}')self.click_one(title='输入', control_type='Edit')
定位到好友有两种情况,第一种是存在于聊天界面中,第二种是不在聊天列表中,所以为了方便,先判断好友是否在当前聊天框中,如果没有,再搜索,毕竟搜索有些浪费时间
3.6 删除好友聊天框
def delete_user(self, user=''):try:self.click_one(title=user, control_type='Text', button='right')# 这里我提供了两种删除聊天的方式,速度两者相差无几self.app.PopupMenu['删除聊天'].click_input('left')# self.app['Menu'].child_window(title='删除聊天', control_type='Text').click_input('left')except:return None
3.7 通过好友申请
from pyautogui import hotkey
from pywinauto import mouse# 添加指定好友有瑕疵,名称仅限字母、汉字、一般符号
def add_new_amigo(self, user=''):self.click_one(title='通讯录', control_type='Button')self.click_one(title='新的朋友', control_type='ListItem')hotkey('down')hotkey('up')# 这里定位有一些烦琐,我尝试了较为简便的代码,但是速度都没这样繁琐的快,这里就不张贴其他方法了address_list = self.win.child_window(title=user, control_type="Text").parent().parent().parent().children()[2]cords = address_list.rectangle()mouse.click(button='left', coords=(cords.left + 10, cords.top + 10))hotkey('esc')hotkey('esc')self.click_one(title='通讯录', control_type='Button')
3.8 修改用户名
# 修改用户姓名
def fix_user(self, old_name='', new_name=''):self.find_user(user=old_name)remark = self.win.child_window(title="备 注", control_type="Text").parent().children()[1]remark.type_keys(new_name)
3.9 发送文本信息
from pyperclip import copy
from pyautogui import hotkeydef send_message_to_user(self, user='', text=''):self.find_user(user)copy(text.replace('|', '\n').strip())hotkey('ctrl', 'v')hotkey('enter')
发送文本这里建议不要使用 pywinauto 自有的 type_keys() 方法,使用这一方法会无法保证缩进格式,我尝试过以 type_keys() 为前提的多种方式来保证缩进,但是效果都不太明显,所以说我采用了粘贴的方法,即代码中的 copy() 方法
3.10 发送图片
import win32clipboard as clip
from win32con import CF_DIB
from io import BytesIO
from PIL import Image
from pyautogui import hotkeydef send_image_to_user(self, user='', image_path=''):self.find_user(user=user)img = Image.open(image_path)output = BytesIO()img.convert("RGB").save(output, "BMP")data = output.getvalue()[14:]output.close()clip.OpenClipboard()clip.EmptyClipboard()clip.SetClipboardData(CF_DIB, data)clip.CloseClipboard()sleep(0.5)hotkey('ctrl', 'v')hotkey('enter')remove(image_path)
发送图片较为繁琐,如果是采用微信带的发送文件功能,那样速度就慢了很多,所以就将图片储存到剪切板中,再粘贴到聊天框中,以此加快速度。同样,发送文件也是这样的思路,不过发送文件需要先判断一下文件是否在100MB内,因为微信发送文件有大小限制。
3.11 处理转账
def payment_values(self):if not self.win.child_window(title="微信转账", control_type="Text", found_index=0).exists(timeout=0.1):if not self.win.child_window(title="微信转账", control_type="ListItem", found_index=0).exists(timeout=0.1):return 0# 获取转账备注, 见下方注释1remark = self.win.child_window(title="微信转账", control_type="Text", found_index=0).parent().parent().children()[0].children()[1].children()[0].window_text()# 获取转账的金额,只取整数money = self.win.child_window(title="微信转账", control_type="Text", found_index=0).parent().parent().children()[0].children()[1].children()[1].window_text()money = int(float(money.replace('¥', '')))return {'remark': remark, 'money': money}
- 因为要获取转账备注,所以说定位方式看着很繁琐。如果不需要对方转账填写备注内容,则定位就很简单,只需要定位到 title = ‘确认收款’ 就可以。
3.12 确认收款及退回
from pyautogui import hotkey#收钱, 收成功 1, 失败 0
def payment_receive(self):# 在这里之所以要遍历寻找控件,是因为转账这一项,在不同版本微信中有不一样的控件类型,这我已经试验过数个版本for control_type in ['Text', 'ListItem']:if self.win.child_window(title="微信转账", control_type=control_type, found_index=0).exists(timeout=0.1):self.click_one(title='微信转账', control_type=control_type, times=2)self.click_one(title='确认收钱', control_type='Button')if self.win.child_window(title="已收钱", control_type="Text", found_index=0).exists(timeout=5):hotkey('esc')return 1else:return 0else:return 0# 退钱, 退成功 1, 失败 0
def payment_refuse(self):for control_type in ['Text', 'ListItem']:if self.win.child_window(title="微信转账", control_type=control_type, found_index=0).exists(timeout=0.1):self.click_one(title='微信转账', control_type=control_type)self.click_one(title='立即退还', control_type='Button')self.click_one(title='退还', control_type='Button')hotkey('esc')return 1else:return 0
4. 总说明
上述代码块就是实现文章开头功能的相应代码,为了解释方便,我把代码拆分开来加上注释。当然,每个功能模块都有不太合适的地方,只是提供了一个较为方便的思路,对于控制微信,还有其他更为先进的方法,比如说很热门的 hook,这个就相对高深了,有兴趣的可以自己尝试了解一下。
python pywinauto 自动控制微信, 关键字回复、收款、定时任务, 代替人工成为微信客服相关推荐
- php微信公众号向指定客服发信息,微信公众号给用户发送一条消息 客服消息
可以用客服消息接口或模板消息接口实现.但是需要认证公众号才能有权限. 认证服务号可以发送客服接口消息[需要对应openid24小时内有互动]和模板消息,订阅号则没有模板消息权限. 下面是发送客服消息的 ...
- 微信公众号、小程序开发——1、客服消息+简易自开发回复平台
一.客服消息"咨询-回复"方式 1.咨询方式 公众号:公众号主页发送各类型消息后,会在公众号后台收到用户消息. 小程序:在小程序网页中添加"客服按钮",进入客服 ...
- 微信公众号最佳实践 ( 4.4)客服接口
当用户和公众号产生特定动作的交互时(具体动作请见下方列表),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户 ...
- java微信多客服_怎么实现微信多公众号管理?有哪些多客服系统?
互联网信息时代,很多企业的客户咨询渠道众多,微信多个公众号却无法进行统一管理,同一个问题,客服可能需要回答5遍甚至更多,不仅效率极低,客户体验也很不好. 研究表明,服务速度是客户满意度的首要影响因素, ...
- 微信小程序收款手续费_小程序微信支付收款流程
大家都知道,小程序具备微信支付功能,但是,很多商家还不知道具体的收款流程是什么?用户在小程序下单支付的款项究竟到了哪里?或者找第三方公司开发担心资金安全问题? 今天给大家详细的讲解一下: 在实现微信小 ...
- 微信公众平台开发(92) 多客服(转)
关键字:微信公众平台开发 多客服 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-transfer-customer-service.html ...
- 暗潮:微信小程序第三弹:关于微信小程序吸粉方式的可行性分析
2019独角兽企业重金招聘Python工程师标准>>> 今天龙哥说了,小程序上没有关注量粉丝量这回事了,只有浏览量. 可是,粉丝数只是一个指标,小程序只要打开,用户的信息咱们就可以获 ...
- 旺旺机器人的快捷短语_聊天宝_快捷回复_客服宝_智能客服是万能的吗?
面对无处不在的机器人客服,聊天宝还能做什么? 最新更新:2017年2月16日 曾几何时,机器人客服成了一个非常火爆的概念,仿佛没有智能回复,客服系统就是一个过时的系统. 事实真是如此么? 坦率的说,智 ...
- 【微信公众号】微信集成功能--接入多客服系统
目录 需求来源 实现思路 1.邀请指定人员成为客服角色: 2.用户在公众号发送信息,通过关键字触发事件:通知客服: 3.客服角色接入会话,与用户对话沟通交流解决疑问,完成对话: 代码实现(基于Lara ...
- 微信小程序客服介绍:如何设置小程序在线客服?
其实只需要解决2个问题 第一步,在微信小程序中添加联系在线客服按钮 第二步,接入在线客服功能,设置[自动/人工/转人工]回复等 一.添加小程序客服按钮 ① 在小程序中添加客服按钮功能,点此参考官方文档 ...
最新文章
- c语言矩阵的乘积,c语言矩阵相乘
- 嵌入式实时系统程序开发一:按键程序编写
- SAP MM/FI 自动过账实现 OBYC 接口执行
- 大数据时代:数据质量逐渐成关注焦点
- python解析html的库_python自带的用于解析HTML的库HtmlParser
- 随手记:Ubuntu16.04.1安装Chrome浏览器以及解决root下无法启动的问题
- php 生成电话名片二维码
- canvas 生成图片模糊
- 爬虫碰到状态码412的解决办法
- 怎样了解存在---辩证唯物主义认识论
- 豆瓣电影详情数据爬取
- mysql中如何统计数据_mysql中的数据统计方法
- Codeforces 582B Once Again...【思维YY+Dp(LIS)】好题~
- Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理
- 基于冲突的搜索算法(CBS)个人笔记
- Spring个人深入学习路线图
- 1.amdahl定律(加速比)
- 画属于自己的STM32C8T6PCB电路板
- 【故障处理】ORA-12545: Connect failed because target host or object does not exist
- opencv 安装 opencv_contrib 出现的几个问题和解决方法