十一長假,相信大部分的朋友這會應該是在全國各地浪或者是在浪的路上,朋友圈成爲大家表演的場所。android
固然,也有一小戳朋友是選擇家裏蹲,大家是否感受到無聊?是否想出去浪,參加朋友圈攝影比賽?spring
本篇文章的目的是利用 Python 帶咱們實現一次 說走就走的環球旅行,完勝此次的朋友圈攝影比賽。shell
在開始編寫腳本以前,須要作以下準備工做:微信
一、一部 Root 後的 Android 手機app
二、配置好 Android ADB 開發環境工具
三、Python 虛擬環境內安裝 pocoui 依賴庫ui
四、虛擬定位應用 FackLocationspa
五、選好一個景點,下載對應景點的一些照片,並準備一段裝逼的文字指針
一共分 6 個步驟來完成此次操做,分別是:經過位置拿到經度和緯度、開啓虛擬定位服務、導入圖片到手機相冊、打開朋友圈、選擇相冊圖片、編輯內容和選擇地理位置、發佈朋友圈。code
首先,利用 adb 命令拿到 FackLocation 和微信的應用包名和 LaunchActivity。
adb shell dumpsys activity | grep -i run
拿到應用包名和 LaunchActivity 以後,利用 Airtest 和 Monitor 工具能夠很是方便的打開 FackLocation 應用、添加地理位置。
到達搜索界面以後,因爲搜索的結果在 Monitor 下找不到。
所以,這裏藉助開發者選項內的 指針位置,拿到列表第一項的座標,利用 adb 執行點擊操做,既能夠完成選擇經緯度的操做。
def __mock_location(self): """ 模擬定位 :return: """ home() stop_app(package_name_location) start_my_app(package_name_location, activity_location) # 點擊添加位置 self.poco('com.lerist.fakelocation:id/fab').click() # 點擊搜索 self.poco('com.lerist.fakelocation:id/m_item_search').click() # 輸入框輸入目的地 self.poco('com.lerist.fakelocation:id/l_search_panel_et_input').set_text(self.location) sleep(2) # 寬、高 size = self.poco.get_screen_size() # 因爲選擇結果UI樹查找不到,這裏使用座標來執行點擊操做 adb_click(500, 283) # 肯定位置 while self.poco('com.lerist.fakelocation:id/a_map_btn_done').exists(): self.poco('com.lerist.fakelocation:id/a_map_btn_done').click()
第 2 步,經過元素文字內容來判斷服務是否開啓,若是沒有開啓,就經過一次點擊操做,完成定位服務的開啓。
def __start_mock(self): """ 開啓模擬位置 :return: """ mock_element = self.poco('com.lerist.fakelocation:id/f_fakeloc_tv_service_switch') if mock_element.get_text() == '啓動模擬': mock_element.click() # 等待啓動模擬完成 self.poco('com.lerist.fakelocation:id/f_fakeloc_tv_service_switch', text='中止模擬').wait_for_appearance() else: pass print('模擬已經開啓')
第 3 步,把 PC 端的圖片利用 adb push 命令導入到 手機相冊目錄 下。
# 本地等待發送的圖片 files = get_all_files('./image/') # 一共待發送的圖片數目 self.image_num = 9 if len(files) > 9 else len(files) # 手機相冊目錄 phone_image_path = 'sdcard/DCIM/Camera/' # 一張一張圖片導入到手機相冊內 for file in files[:self.image_num]: exec_cmd('adb push %s %s' % (file, phone_image_path))
須要注意的是,導入圖片後須要再 發送一次刷新廣播,相冊中才能找到這些圖片。
# 更新手機相冊 exec_cmd('adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///%s' % phone_image_path)
第 4 步,一樣是利用 Airtest 打開微信客戶端,而後自動化跳轉到朋友圈界面。
def __open_friend_circle(self): """ 打開朋友圈 :return: """ # 等待徹底打開微信App self.poco(text='微信').wait_for_appearance() self.poco(text='通信錄').wait_for_appearance() self.poco(text='發現').wait_for_appearance() self.poco(text='我').wait_for_appearance() print('微信徹底打開') # 點擊【發現】Tab self.poco('com.tencent.mm:id/djv', text='發現').parent().click() # 打開朋友圈 self.poco('android:id/title', text='朋友圈').click() # 等待朋友圈動態加載徹底 self.poco('com.tencent.mm:id/eyx').wait_for_appearance()
第 5 步,從手機相冊內選擇圖片。
手機相冊的照片是按時間進行排序的,根據上面推送的圖片數目,選擇相冊的前面的 具體數目 的照片便可。
# 選擇指定數目的照片 cbs = self.poco('com.tencent.mm:id/ek8').offspring('com.tencent.mm:id/bwn') index = 0 # 選中固定數目的照片 for cb in cbs: if index < self.image_num: cb.click() else: break index += 1 # 確認選擇圖片 self.poco('com.tencent.mm:id/lm').click()
第 6 步,輸入文字內容,並選擇具體的位置。
因爲虛擬定位刷新的不及時,爲了保證位置的準確性,連續進行兩次定位。
def __put_content_and_gps(self): """ 輸入內容和定位 :return: """ # 輸入朋友圈內容 self.poco('com.tencent.mm:id/d3k').set_text(self.msg) # 定位的次數,通常須要兩次 location_count = 0 # 點擊定位圖標 while True: self.poco('com.tencent.mm:id/d0a', text='所在位置').click() # 等待搜索列表中有結果出現 self.poco('com.tencent.mm:id/du7').wait_for_appearance() if location_count == 0: # 返回 keyevent('BACK') location_count += 1 else: # 排除ListView的前兩項(不顯示、市區),直接點擊第三項(具體位置) self.poco('com.tencent.mm:id/dul').children()[2].click() break
第 7 步,拿到頂部的發佈按鈕,就能夠 一鍵發佈動態了。
好比,我在深圳就發了一條在北京 TAM 看 YB 的朋友圈。
跟着上面的操做,就能實現全國任意一個景點,隨時隨地去玩這一騷操做。
本文首發於微信公衆號「AirPython」我已經將所有源碼上傳到後臺上,關注公衆號後回覆「環球旅行」便可得到下載連接。
若是你以爲文章還不錯,請你們點贊分享下。你的確定是我最大的鼓勵和支持。