用 Python 在朋友圈中游遍全球
閱讀文本大概需要 10 分鐘。
1
目 標(biāo) 場 景
十一長假,相信大部分的朋友這會應(yīng)該是在全國各地浪或者是在浪的路上,朋友圈成為你們表演的場所。
當(dāng)然,也有一小戳朋友是選擇家里蹲,你們是否感覺到無聊?是否想出去浪,參加朋友圈攝影比賽?
本篇文章的目的是利用?Python?帶我們實(shí)現(xiàn)一次?說走就走的環(huán)球旅行,完勝這次的朋友圈攝影比賽。2
準(zhǔn) 備 工 作
在開始編寫腳本之前,需要做如下準(zhǔn)備工作:
1、一部 Root 后的 Android 手機(jī)
2、配置好 Android ADB 開發(fā)環(huán)境
3、Python 虛擬環(huán)境內(nèi)安裝?pocoui 依賴庫
4、虛擬定位應(yīng)用 FackLocation
5、選好一個景點(diǎn),下載對應(yīng)景點(diǎn)的一些照片,并準(zhǔn)備一段裝逼的文字
3
編 寫 代 碼
一共分6?個步驟來完成這次操作,分別是:通過位置拿到經(jīng)度和緯度、開啟虛擬定位服務(wù)、導(dǎo)入圖片到手機(jī)相冊、打開朋友圈、選擇相冊圖片、編輯內(nèi)容和選擇地理位置、發(fā)布朋友圈。
首先,利用 adb 命令拿到 FackLocation 和微信的應(yīng)用包名和 LaunchActivity。
adb?shell?dumpsys?activity?|?grep?-i?run拿到應(yīng)用包名和 LaunchActivity 之后,利用Airtest和Monitor工具可以非常方便的打開 FackLocation 應(yīng)用、添加地理位置。
到達(dá)搜索界面之后,由于搜索的結(jié)果在 Monitor 下找不到。
因此,這里借助開發(fā)者選項(xiàng)內(nèi)的?指針位置,拿到列表第一項(xiàng)的坐標(biāo),利用 adb 執(zhí)行點(diǎn)擊操作,既可以完成選擇經(jīng)緯度的操作。
def?__mock_location(self):"""模擬定位:return:"""home()stop_app(package_name_location)start_my_app(package_name_location,?activity_location)#?點(diǎn)擊添加位置self.poco('com.lerist.fakelocation:id/fab').click()#?點(diǎn)擊搜索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()#?由于選擇結(jié)果UI樹查找不到,這里使用坐標(biāo)來執(zhí)行點(diǎn)擊操作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步,通過元素文字內(nèi)容來判斷服務(wù)是否開啟,如果沒有開啟,就通過一次點(diǎn)擊操作,完成定位服務(wù)的開啟。
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('模擬已經(jīng)開啟')第3步,把 PC 端的圖片利用 adb push 命令導(dǎo)入到?手機(jī)相冊目錄?下。
#?本地等待發(fā)送的圖片 files?=?get_all_files('./image/')#?一共待發(fā)送的圖片數(shù)目 self.image_num?=?9?if?len(files)?>?9?else?len(files)#?手機(jī)相冊目錄 phone_image_path?=?'sdcard/DCIM/Camera/'#?一張一張圖片導(dǎo)入到手機(jī)相冊內(nèi) for?file?in?files[:self.image_num]:exec_cmd('adb?push?%s?%s'?%?(file,?phone_image_path))需要注意的是,導(dǎo)入圖片后需要再?發(fā)送一次刷新廣播,相冊中才能找到這些圖片。
#?更新手機(jī)相冊 exec_cmd('adb?shell?am?broadcast?-a?android.intent.action.MEDIA_SCANNER_SCAN_FILE?-d?file:///%s'?%?phone_image_path)第?4?步,同樣是利用 Airtest 打開微信客戶端,然后自動化跳轉(zhuǎn)到朋友圈界面。
def?__open_friend_circle(self):"""打開朋友圈:return:"""#?等待完全打開微信Appself.poco(text='微信').wait_for_appearance()self.poco(text='通訊錄').wait_for_appearance()self.poco(text='發(fā)現(xiàn)').wait_for_appearance()self.poco(text='我').wait_for_appearance()print('微信完全打開')#?點(diǎn)擊【發(fā)現(xiàn)】Tabself.poco('com.tencent.mm:id/djv',?text='發(fā)現(xiàn)').parent().click()#?打開朋友圈self.poco('android:id/title',?text='朋友圈').click()#?等待朋友圈動態(tài)加載完全self.poco('com.tencent.mm:id/eyx').wait_for_appearance()第5步,從手機(jī)相冊內(nèi)選擇圖片。
手機(jī)相冊的照片是按時間進(jìn)行排序的,根據(jù)上面推送的圖片數(shù)目,選擇相冊的前面的?具體數(shù)目?的照片即可。
#?選擇指定數(shù)目的照片 cbs?=?self.poco('com.tencent.mm:id/ek8').offspring('com.tencent.mm:id/bwn')index?=?0#?選中固定數(shù)目的照片 for?cb?in?cbs:if?index?<?self.image_num:cb.click()else:breakindex?+=?1#?確認(rèn)選擇圖片 self.poco('com.tencent.mm:id/lm').click()第6步,輸入文字內(nèi)容,并選擇具體的位置。
由于虛擬定位刷新的不及時,為了保證位置的準(zhǔn)確性,連續(xù)進(jìn)行兩次定位。
def?__put_content_and_gps(self):"""輸入內(nèi)容和定位:return:"""#?輸入朋友圈內(nèi)容self.poco('com.tencent.mm:id/d3k').set_text(self.msg)#?定位的次數(shù),一般需要兩次location_count?=?0#?點(diǎn)擊定位圖標(biāo)while?True:self.poco('com.tencent.mm:id/d0a',?text='所在位置').click()#?等待搜索列表中有結(jié)果出現(xiàn)self.poco('com.tencent.mm:id/du7').wait_for_appearance()if?location_count?==?0:#?返回keyevent('BACK')location_count?+=?1else:#?排除ListView的前兩項(xiàng)(不顯示、市區(qū)),直接點(diǎn)擊第三項(xiàng)(具體位置)self.poco('com.tencent.mm:id/dul').children()[2].click()break第?7?步,拿到頂部的發(fā)布按鈕,就可以?一鍵發(fā)布動態(tài)了。
比如,我在深圳就發(fā)了一條在北京 TAM 看 YB 的朋友圈。
4
結(jié) 果 結(jié) 論
跟著上面的操作,就能實(shí)現(xiàn)全國任意一個景點(diǎn),隨時隨地去玩這一騷操作。
我已經(jīng)將全部源碼上傳到后臺上,點(diǎn)擊閱讀原文,即可獲得下載鏈接。
如果你覺得文章還不錯,請大家點(diǎn)贊分享下。你的肯定是我最大的鼓勵和支持。
THANDKS
- End -
推薦閱讀:(點(diǎn)擊下方標(biāo)題即可跳轉(zhuǎn))總結(jié)
以上是生活随笔為你收集整理的用 Python 在朋友圈中游遍全球的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12 款 Linux 终端推荐
- 下一篇: 机器学习领域必知必会的12种概率分布(附