用 Python 在朋友圈中游遍全球
閱讀文本大概需要 10 分鐘。
1
目 標 場 景
十一長假,相信大部分的朋友這會應該是在全國各地浪或者是在浪的路上,朋友圈成為你們表演的場所。
當然,也有一小戳朋友是選擇家里蹲,你們是否感覺到無聊?是否想出去浪,參加朋友圈攝影比賽?
本篇文章的目的是利用?Python?帶我們實現一次?說走就走的環球旅行,完勝這次的朋友圈攝影比賽。2
準 備 工 作
在開始編寫腳本之前,需要做如下準備工作:
1、一部 Root 后的 Android 手機
2、配置好 Android ADB 開發環境
3、Python 虛擬環境內安裝?pocoui 依賴庫
4、虛擬定位應用 FackLocation
5、選好一個景點,下載對應景點的一些照片,并準備一段裝逼的文字
3
編 寫 代 碼
一共分6?個步驟來完成這次操作,分別是:通過位置拿到經度和緯度、開啟虛擬定位服務、導入圖片到手機相冊、打開朋友圈、選擇相冊圖片、編輯內容和選擇地理位置、發布朋友圈。
首先,利用 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:passprint('模擬已經開啟')第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:"""#?等待完全打開微信Appself.poco(text='微信').wait_for_appearance()self.poco(text='通訊錄').wait_for_appearance()self.poco(text='發現').wait_for_appearance()self.poco(text='我').wait_for_appearance()print('微信完全打開')#?點擊【發現】Tabself.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:breakindex?+=?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?+=?1else:#?排除ListView的前兩項(不顯示、市區),直接點擊第三項(具體位置)self.poco('com.tencent.mm:id/dul').children()[2].click()break第?7?步,拿到頂部的發布按鈕,就可以?一鍵發布動態了。
比如,我在深圳就發了一條在北京 TAM 看 YB 的朋友圈。
4
結 果 結 論
跟著上面的操作,就能實現全國任意一個景點,隨時隨地去玩這一騷操作。
我已經將全部源碼上傳到后臺上,點擊閱讀原文,即可獲得下載鏈接。
如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。
THANDKS
- End -
推薦閱讀:(點擊下方標題即可跳轉)總結
以上是生活随笔為你收集整理的用 Python 在朋友圈中游遍全球的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12 款 Linux 终端推荐
- 下一篇: 高校胜负欲PK合辑,看看你的母校在拼什么