微信文章自动采集软件( 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,比较高级。如果你有兴趣,你可以自己试试。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线