Python 帶你來一次說走就走的環球旅行

圖片描述

一、目 標 場 景

十一長假,相信大部分的朋友這會應該是在全國各地浪或者是在浪的路上,朋友圈成爲大家表演的場所。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」我已經將所有源碼上傳到後臺上,關注公衆號後回覆「環球旅行」便可得到下載連接。

若是你以爲文章還不錯,請你們點贊分享下。你的確定是我最大的鼓勵和支持。

相關文章
相關標籤/搜索