利用Python制作屬于自己的微信小客服
由于要以微信作一個(gè)某學(xué)習(xí)網(wǎng)站的登陸途徑,用小程序就又有一些額外的花費(fèi),所以想以微信聊天窗口做些文章,就在網(wǎng)上找了很多關(guān)于微信機(jī)器人的方法,大多數(shù)都是用的老舊并且已經(jīng)失效的wxpy,沒辦法了,放棄嗎?
整體思路:利用自動(dòng)化測試庫達(dá)到預(yù)期效果。
運(yùn)行環(huán)境:PyCharm Python
碼字流程
- 獲取微信的PID
- 連接到微信
- 微信的一些基本功能
- 獲取用戶發(fā)來的消息獲取聊天信息用戶在聊天界面找到某個(gè)用戶搜索某個(gè)用戶向某個(gè)用戶發(fā)送文本信息刪除某個(gè)用戶
- 微信的一些額外功能
- 修改備注添加指定申請好友一鍵添加所有申請好友發(fā)送圖片至指定用戶接收超級用戶指令,處理相關(guān)任務(wù)接收普通用戶指令,回復(fù)相關(guān)內(nèi)容一鍵刪除所有好友掉線通知超級用戶掉線自動(dòng)重登對接其他接口,完成相關(guān)任務(wù)收藏信息自動(dòng)收款判斷金額并通知超級用戶對接數(shù)據(jù)庫,判斷用戶是否在使用該功能的期限內(nèi)一鍵通知信息至好友指定好友消息免打擾群踢出成員轉(zhuǎn)發(fā)信息發(fā)送收藏中的內(nèi)容至用戶發(fā)送本地文件至用戶
獲取微信的PID
這里用到了psutil庫,大概意思是獲取所有的進(jìn)程,遍歷挑選出微信的進(jìn)程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
連接到微信
- # 創(chuàng)建一個(gè)實(shí)例對象,Pywinauto中backend有兩種:win32和uia,默認(rèn)為win32??墒褂胹py++和Inspect工具判斷backend適合寫哪種。在這里微信為'uia'
- self.app = Application(backend = 'uia')
- # 將 app 連接到已經(jīng)登陸成功的微信,這里可以用進(jìn)程ID、句柄、以及程序路徑進(jìn)行連接,此處采用PID
- self.app.connect(process = PID )
- # 定位到微信窗口
- self.win = app[u'微信']
微信的一些基本功能
獲取用戶發(fā)來的消息
- 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:
- # 定位到信息列表,獲取這個(gè)對象
- conunacation = self.win.child_window(title = "會(huì)話",control_type = "List")
- # 定位到這個(gè)位置
- position = conunacation.rectangle()
- mouse.click(button = 'left',coords = (position.left + 100 ,position.top + 10 ))
- # 定位到列表的位置,取他的子控件,至于為何,列表是一個(gè)總的容器,而每個(gè)用戶都存在這個(gè)容器中,固取子控件
- users = conunacation.children()
- for user in users:
- user_lis.append(user.window_text())
- except:
- pass
- return user_lis
在聊天界面找到某個(gè)用戶
- def find_user (self ,user = ''):
- # 找到指定名稱用戶的按鈕
- user = self.win.child_window(title = user, control_type = 'Text')
- # 定位到該按鈕,獲取它的相對位置
- position = user .rectangle()
- # 模擬點(diǎn)擊,coords 是點(diǎn)擊的位置
- mouse.click (button = 'left',coords = (position.left ,position.top))
- sleep(0.3)
搜索某個(gè)用戶
- def search_ueser (self ,user_name = ''):
- # 找控件的方法如上個(gè)函數(shù)中介紹,此處不再繼續(xù)介紹
- 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}')
向某個(gè)用戶發(fā)送文本信息
- def send_message (self ,texts =''):#line:64
- for text in texts .split ('\n'):#line:65
- # 這里用到了另外的一個(gè)庫,因?yàn)橛胮ywinauto 自帶的輸入模塊,表情,空格等是自動(dòng)略過或者識別不出,達(dá)不到按原有縮進(jìn)樣式縮進(jìn)的效果
- 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
刪除某個(gè)用戶
- 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))
- # 這里右鍵會(huì)彈出菜單,直接點(diǎn)擊該菜單中的刪除聊天選項(xiàng)
- self.app.Menu ['刪除聊天'].click_input('left')
微信的一些額外功能
由于此程序的使用原因,牽扯到項(xiàng)目的一些敏感內(nèi)容,不方便將這些功能全部詳細(xì)說出,只是大概寫一下已經(jīng)實(shí)現(xiàn)了哪些內(nèi)容,如有人需要相關(guān)思路,可聯(lián)系微信:Be_a_luck_dog
- 修改備注
- 添加指定申請好友
- 一鍵添加所有申請好友
- 發(fā)送圖片至指定用戶
- 接收超級用戶指令,處理相關(guān)任務(wù)
- 接收普通用戶指令,回復(fù)相關(guān)內(nèi)容
- 一鍵刪除所有好友
- 掉線通知超級用戶
- 掉線自動(dòng)重登
- 對接其他接口,完成相關(guān)任務(wù)
- 收藏信息
- 自動(dòng)收款判斷金額并通知超級用戶
- 對接數(shù)據(jù)庫,判斷用戶是否在使用該功能的期限內(nèi)
- 一鍵通知信息至好友
- 指定好友消息免打擾
- 群踢出成員
- 轉(zhuǎn)發(fā)信息
- 發(fā)送收藏中的內(nèi)容至用戶
- 發(fā)送本地文件至用戶