一、需求背景
需要獲取微信鏈接卡片的鏈接地址,正常情況下 點開卡片 -- 復制鏈接 -- 讀取剪切板 就好了
但是有些鏈接卡片沒有復制鏈接按鈕,也不允許轉發:
經過調研,可以通過點擊 “在默認瀏覽器打開” 按鈕在谷歌瀏覽器中獲取
首先想到的是用selenium來讀取url,后來考慮到還要下載webdriver,對瀏覽器版本也有要求,很麻煩,不如使用pywinauto來得快
二、技術實現
只需要定位到這個地址欄,然后獲取他的值就可以了,但是實現起來有幾個問題:
1.最外面的一層直接就是 窗格 ,不像微信一樣是 窗口 ,可以用app.window.child_window獲取
2.地址欄獲取到的地址缺少缺少'https://'https://,或者 'https://www,還有http的這些開頭
3.谷歌瀏覽器打開后進程號有一大堆
解決如下:

def get_pid(pname): pid_lis = [] for proc in psutil.process_iter(): #print(“pid-%d,name:%s” % (proc.pid,proc.name())) if proc.name() == pname: pid_lis.append(proc.pid) # return proc.pid return pid_lis pid_list = get_pid('chrome.exe') for pid in pid_list: chrome = ChromeAuto(pid) link = chrome.get_url() if link: chrome.quit() os.system(f"taskkill /t /f /im chrome.exe") print(link) break else: logger.info(f'url get none')
class ChromeAuto: """鏈接點開默認瀏覽器打開后的谷歌界面 """ def __init__(self, process=None): self.app = None self._start(process=process) def _start(self, process=None): if process: self.app = Application(backend='uia').connect(process=process) else: logger.debug(f'IeAuto _start err') return def quit(self): if self.app: self.app.kill() self.app = None def get_url(self): try: # print(self.app.top_window()) # pywinauto.application.WindowSpecification # print(self.app.window()) # pywinauto.application.WindowSpecification # print(self.app.windows()) # [<uiawrapper.UIAWrapper - '李渝的早報 - Google Chrome', Pane, -2064264099699444098>] 不能再往下進行查找操作了 for i in self.app.windows(): # 下面的流程比較耗時,進程號不對的沒有self.app.windows()不會走下面的邏輯,優化速度 edit_ctrl = self.app.top_window().child_window(title='地址和搜索欄', control_type='Edit') # print(edit_ctrl.texts) # 控件信息:<bound method EditWrapper.texts of <uia_controls.EditWrapper - '地址和搜索欄', Edit, -4396731174032345438>> # print(edit_ctrl.get_value()) edit_ctrl.double_click_input() # 地址欄顯示的不是全鏈接,缺少'https://'https://,或者 'https://www,還有http的等等,雙擊后顯示全鏈接 time.sleep(0.5) url = edit_ctrl.get_value() # uia_controls.py中有各種類型的控件類,可查看各自的方法屬性 if url: # if not 'url'.startswith('https://'): # url = 'https://' + url return url except: logger.info(f'ChromeAuto get_url err')