利用Python制作屬于自己的微信小客服
由于要以微信作一個某學習網站的登陸途徑,用小程序就又有一些額外的花費,所以想以微信聊天窗口做些文章,就在網上找了很多關于微信機器人的方法,大多數都是用的老舊并且已經失效的wxpy,沒辦法了,放棄嗎?
整體思路:利用自動化測試庫達到預期效果。
運行環境:PyCharm Python
碼字流程
- 獲取微信的PID
- 連接到微信
- 微信的一些基本功能
- 獲取用戶發來的消息獲取聊天信息用戶在聊天界面找到某個用戶搜索某個用戶向某個用戶發送文本信息刪除某個用戶
- 微信的一些額外功能
- 修改備注添加指定申請好友一鍵添加所有申請好友發送圖片至指定用戶接收超級用戶指令,處理相關任務接收普通用戶指令,回復相關內容一鍵刪除所有好友掉線通知超級用戶掉線自動重登對接其他接口,完成相關任務收藏信息自動收款判斷金額并通知超級用戶對接數據庫,判斷用戶是否在使用該功能的期限內一鍵通知信息至好友指定好友消息免打擾群踢出成員轉發信息發送收藏中的內容至用戶發送本地文件至用戶
獲取微信的PID
這里用到了psutil庫,大概意思是獲取所有的進程,遍歷挑選出微信的進程ID
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:smart_num_1
- # Blog:https://blog.csdn.net/smart_num_1
- from psutil import process_iter
- def get_pid():
- PID = process_iter()
- name = ''
- pid_num = 0
- for pid_temp in PID:
- pid_dic = pid_temp.as_dict(attrs = ['pid','name'])
- if pid_dic ['name'] == 'WeChat.exe':
- name = pid_dic ['name']
- pid_num = pid_dic ['pid']
- break
- if name =='WeChat.exe':
- return pid_num
- else :
- return False
連接到微信
- # 創建一個實例對象,Pywinauto中backend有兩種:win32和uia,默認為win32。可使用spy++和Inspect工具判斷backend適合寫哪種。在這里微信為'uia'
- self.app = Application(backend = 'uia')
- # 將 app 連接到已經登陸成功的微信,這里可以用進程ID、句柄、以及程序路徑進行連接,此處采用PID
- self.app.connect(process = PID )
- # 定位到微信窗口
- self.win = app[u'微信']
微信的一些基本功能
獲取用戶發來的消息
- def get_text(self):
- data = ''
- try:
- data = self.win.Edit2.get_value()
- with open('./temporary_text','w',encoding = 'utf-8') as f:
- f.write(data)
- except:
- pass
- return data #line:4
獲取聊天信息用戶
- def get_users(self):
- user_lis = []
- try:
- # 定位到信息列表,獲取這個對象
- conunacation = self.win.child_window(title = "會話",control_type = "List")
- # 定位到這個位置
- position = conunacation.rectangle()
- mouse.click(button = 'left',coords = (position.left + 100 ,position.top + 10 ))
- # 定位到列表的位置,取他的子控件,至于為何,列表是一個總的容器,而每個用戶都存在這個容器中,固取子控件
- users = conunacation.children()
- for user in users:
- user_lis.append(user.window_text())
- except:
- pass
- return user_lis
在聊天界面找到某個用戶
- def find_user (self ,user = ''):
- # 找到指定名稱用戶的按鈕
- user = self.win.child_window(title = user, control_type = 'Text')
- # 定位到該按鈕,獲取它的相對位置
- position = user .rectangle()
- # 模擬點擊,coords 是點擊的位置
- mouse.click (button = 'left',coords = (position.left ,position.top))
- sleep(0.3)
搜索某個用戶
- def search_ueser (self ,user_name = ''):
- # 找控件的方法如上個函數中介紹,此處不再繼續介紹
- search = self.win.child_window(title = "搜索", control_type = "Edit")
- position = search.rectangle()
- mouse.click(button = 'left', coords = (position.left + 100 ,position.top + 10))
- sleep(0.1)
- mouse.click(button = 'left', coords = (position.left + 100 ,position.top + 10))
- # 自帶的模塊,輸入該用戶的名字
- self.win.type_keys(user_name)
- sleep(0.6)
- self.win.type_keys('{ENTER}')
向某個用戶發送文本信息
- def send_message (self ,texts =''):#line:64
- for text in texts .split ('\n'):#line:65
- # 這里用到了另外的一個庫,因為用pywinauto 自帶的輸入模塊,表情,空格等是自動略過或者識別不出,達不到按原有縮進樣式縮進的效果
- if text.isalnum():
- copy(text.strip())
- hotkey ('ctrl', 'v')
- else:
- self.win.type_keys(text)
- sleep(0.1)
- hotkey ('ctrl', 'enter')#line:67
- hotkey ('enter')#line:68
刪除某個用戶
- def delete_user(self ,user =''):
- user = self.win.child_window(title = user, control_type = 'Text')
- position = user.rectangle()
- mouse.click(button = 'right', coords = (position.left - 40 ,position.top))
- # 這里右鍵會彈出菜單,直接點擊該菜單中的刪除聊天選項
- self.app.Menu ['刪除聊天'].click_input('left')
微信的一些額外功能
由于此程序的使用原因,牽扯到項目的一些敏感內容,不方便將這些功能全部詳細說出,只是大概寫一下已經實現了哪些內容,如有人需要相關思路,可聯系微信:Be_a_luck_dog
- 修改備注
- 添加指定申請好友
- 一鍵添加所有申請好友
- 發送圖片至指定用戶
- 接收超級用戶指令,處理相關任務
- 接收普通用戶指令,回復相關內容
- 一鍵刪除所有好友
- 掉線通知超級用戶
- 掉線自動重登
- 對接其他接口,完成相關任務
- 收藏信息
- 自動收款判斷金額并通知超級用戶
- 對接數據庫,判斷用戶是否在使用該功能的期限內
- 一鍵通知信息至好友
- 指定好友消息免打擾
- 群踢出成員
- 轉發信息
- 發送收藏中的內容至用戶
- 發送本地文件至用戶