微信文章自动采集软件( 2.3好友转账及二维码付款2.4定时信息发送文本信息)
优采云 发布时间: 2022-01-11 23:15微信文章自动采集软件(
2.3好友转账及二维码付款2.4定时信息发送文本信息)
2.3好友转账和二维码支付
2.4 时序信息
3. 实现过程
from pywinauto.application import Application
class WeChat:
PID = get_pid()
if not self.PID:
print('未检测到微信运行')
return 0
else:
# 在这里要设置应用后端,即 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_iter
def 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('获取好友列表失败')
pass
return 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 hotkey
def 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 发送图片
发送图片很麻烦。如果使用微信文件发送功能,速度会慢很多,可以将图片保存到剪贴板,粘贴到聊天框中,加快速度。同样的,发送文件也是同样的思路,但是发送文件的时候需要先判断文件是否在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
# 获取转账备注, 见下方注释1
remark = 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='Confirm payment'即可。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 1
else:
return 0
else:
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 1
else:
return 0
4. 一般说明
上面的代码块就是实现文章开头的功能的对应代码。为了解释方便,我将代码拆分并添加注释。当然,每个功能模块都有其不合适的地方,但它只是提供了一种更方便的思维方式。控制微信还有其他更高级的方法,比如很流行的hook,比较高级。如果你有兴趣,你可以自己试试。