Python+appiumで美団園の自動水やりを実現

以前美団をやっていて水滴がたくさん溜まってしまったので、一気に使い切りたいと思い、手動で水やりするのは手間がかかりすぎるので、学んで楽しむという気持ちで自動水やりを書きました。

  1. Meituan を開き、コマンド ラインで adb shell dumpsys window | findstr mCurrentFocus と入力して、パッケージ名とアクティビティを取得します。
C:\Users\mmm>adb shell dumpsys window | findstr mCurrentFocus
  mCurrentFocus=Window{
    
    687f65d u0 com.sankuai.meituan/com.meituan.android.pt.homepage.activity.MainActivity}
  1. 関連情報を設定し(パッケージ名とアクティビティ以外は同じなのでコードは貼りません)、プロトコルとポップアップウィンドウを共通で閉じる判定を書き、初めて入力する場合はポップアップウィンドウは表示されません
    # 协议同意复选框
    def check_agreeBtn(self):
        logging.info("======check_agreeBtn======")
        try:
            agreeBtn = self.driver.find_element(*self.agree)
        except NoSuchElementException:
            logging.info("no_agreeBtn")
        else:
            agreeBtn.click()
    # 位置获取弹窗
    def check_pop_window(self):
        logging.info("======pop_window======")
        try:
            pop_window = self.driver.find_element(*self.no_reminder)
            close_window_button = self.driver.find_element(*self.close_window)
        except NoSuchElementException:
            logging.info("no_pop_window")
            logging.info("close_window_button")
        else:
            pop_window.click()
            close_window_button.click()

3. ログインの場合、美団が意図的に制限を加えている可能性があり、一部のページ要素は uiautomatorview では取得できません。取得可能な要素は ID 配置を使用し、取得できない要素は最も推奨されない配置方法「座標配置」を使用します。

class LogIn(Common):
    password_login = (By.ID, 'com.sankuai.meituan:id/user_password_login')  # 密码登录
    input_phone = (By.ID, 'com.sankuai.meituan:id/passport_mobile_phone')   # 输入手机号
    input_password = (By.ID, 'com.sankuai.meituan:id/edit_password')        # 输入密码
    check_agree = (By.ID, 'com.sankuai.meituan:id/passport_account_checkbox')  # 协议复选框
    ok_button = (By.ID, 'com.sankuai.meituan:id/login_button')  # 确定按钮
    
    # 登录
    def Log_in(self, phone, password, *loc):
        logging.info('======check_agreeBtn======')
        self.check_agreeBtn()         # 点击同意
        self.check_pop_window()       # 关闭获取位置权限弹窗
        logging.info("=====login======")
        self.driver.tap([(900, 2244), (1048, 2244)], 500)  # 点击立即登录按钮

4. ログイン アカウントとパスワードは、セキュリティを確保し、後でアカウントのパスワードを変更するのがより便利になるようにデータによって駆動されます。

        logging.info("=====password_login======")
        self.driver.find_element(*self.password_login).click()  # 选择密码登录
        self.driver.find_element(*self.input_phone).send_keys(phone) # 输入手机号
        self.driver.find_element(*self.input_password).send_keys(password)  # 输入密码
        self.driver.find_element(*self.check_agree).click()   # 协议复选框
        self.driver.find_element(*self.ok_button).click()     # 确定按钮

5.散水方法は以前と同じですが、見つからない場合は、座標を使用して場所を特定し、繰り返し散水アクションを追加します。初めて座標位置決めクリックサイクルを書いたとき、通常のサイクルと同じだと思っていましたが、常にエラーが報告されました。この問題を解決する情報を検索した結果、bat ファイルに座標を記述し、クリックして開く操作が必要になりますが、この方法で記述すると、開くたびにデスクトップに dos コマンドのようなウィンドウが点滅するという欠点があります。

    def watering(self):
        path = r'D:/meituan_ui/dianji.bat'
        for i in range(1, 20):
            sleep(2)
            os.startfile(path)
   # dianji.bat文件内容为:adb shell input tap 950 1990 (后面两数字为坐标)

6. ログイン部分はアカウント番号に関係するため、ここでは表示されません 最後に、自動水やり効果を見てみましょう

自動水やり

おすすめ

転載: blog.csdn.net/kldzh/article/details/126498885