# -*- coding: utf-8 -*- # @Author: wangkun # @Time: 2023/7/26 import datetime import json import os import sys import time from datetime import date, timedelta from hashlib import md5 from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKey from appium.webdriver.webdriver import WebDriver from selenium.common import NoSuchElementException from selenium.webdriver.common.by import By sys.path.append(os.getcwd()) def start_wechat(): chromedriverExecutable = r'/opt/homebrew/bin/chromedriver' caps = { "platformName": "Android", # 手机操作系统 Android / iOS "deviceName": "Android", # 连接的设备名(模拟器或真机),安卓可以随便写 "platforVersion": "13", # 手机对应的系统版本(Android 13) "appPackage": "com.tencent.mm", # 被测APP的包名,乐活圈 Android "appActivity": ".ui.LauncherUI", # 启动的Activity名 "autoGrantPermissions": True, # 让 appium 自动授权 base 权限, # 如果 noReset 为 True,则该条不生效(该参数为 Android 独有),对应的值为 True 或 False "unicodekeyboard": True, # 使用自带输入法,输入中文时填True "resetkeyboard": True, # 执行完程序恢复原来输入法 "noReset": True, # 不重置APP "recreateChromeDriverSessions": True, # 切换到非 chrome-Driver 会 kill 掉 session,就不需要手动 kill 了 "printPageSourceOnFailure": True, # 找不到元素时,appium log 会完整记录当前页面的 pagesource "newCommandTimeout": 6000, # 初始等待时间 "automationName": "UiAutomator2", # 使用引擎,默认为 Appium, # 其中 Appium、UiAutomator2、Selendroid、Espresso 用于 Android,XCUITest 用于 iOS "showChromedriverLog": True, # "chromeOptions": {"androidProcess": "com.tencent.mm:appbrand0"}, "chromeOptions": {"androidProcess": "com.tencent.mm:tools"}, # "chromeOptions": {"androidProcess": "com.tencent.mm:toolsmp"}, # "chromeOptions": {"androidProcess": "com.tencent.mm"}, "enableWebviewDetailsCollection": True, "setWebContentsDebuggingEnabled": True, "chromedriverExecutable": chromedriverExecutable, } driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) driver.implicitly_wait(10) tabs = driver.find_elements(By.ID, "com.tencent.mm:id/f2s") for tab in tabs: if tab.text == "发现": tab.click() time.sleep(0.5) break tabs = driver.find_elements(By.ID, "com.tencent.mm:id/f2s") for tab in tabs: if tab.text == "发现": tab.click() time.sleep(0.5) break textviews = driver.find_elements(By.ID, "android:id/title") for textview in textviews: if textview.text == "视频号": textview.click() time.sleep(0.5) break try: driver.find_element(By.ID, "com.tencent.mm:id/lqz").click() except NoSuchElementException: pass for i in range(100): try: if len(driver.find_elements(By.ID, "com.tencent.mm:id/dkf")) != 0: driver.swipe(10, 1600, 10, 300, 200) continue # video_dict = cls.get_video_info(driver) # for k, v in video_dict.items(): # Common.logger(log_type, crawler).info(f"{k}:{v}") # Common.logging(log_type, crawler, env, f"video_dict:{video_dict}") # # if video_dict["video_title"] is None: # Common.logger(log_type, crawler).info("无效视频") # Common.logging(log_type, crawler, env, "无效视频") # elif ( # download_rule( # log_type=log_type, # crawler=crawler, # video_dict=video_dict, # rule_dict=rule_dict, # ) # is False # ): # Common.logger(log_type, crawler).info("不满足抓取规则") # Common.logging(log_type, crawler, env, "不满足抓取规则\n") # elif ( # cls.repeat_out_video_id( # log_type, crawler, video_dict["video_id"], env # ) # != 0 # ): # Common.logger(log_type, crawler).info("视频已下载") # Common.logging(log_type, crawler, env, "视频已下载\n") # else: # cls.download_video_list.append(video_dict) # if i + 1 == scan_count: # Common.logger(log_type, crawler).info("扫描一轮结束\n") # Common.logging(log_type, crawler, env, "扫描一轮结束\n") # return # Common.logger(log_type, crawler).info( # f"已抓取符合规则视频{len(cls.download_video_list)}条,滑动至下一个视频\n" # ) # Common.logging( # log_type, # crawler, # env, # f"已抓取符合规则视频{len(cls.download_video_list)}条,滑动至下一个视频\n", # ) # driver.swipe(10, 1600, 10, 300, 200) except Exception as e: print(123) # Common.logger(log_type, crawler).info(f"扫描单条视频时异常:{e}\n") # Common.logging(log_type, crawler, env, f"扫描单条视频时异常:{e}\n") time.sleep(50) driver.quit() # cls.search_video( # log_type=log_type, # crawler=crawler, # rule_dict=rule_dict, # user_dict=user_dict, # driver=driver, # env=env, # ) # cls.close_wechat(log_type=log_type, crawler=crawler, env=env, driver=driver) def get_recommend_list(cls, log_type, crawler, rule_dict, scan_count, env): try: driver = cls.start_wechat(log_type, crawler, env) cls.get_videoList( log_type=log_type, crawler=crawler, rule_dict=rule_dict, env=env, scan_count=scan_count, driver=driver, ) driver.quit() print("退出微信成功") except Exception as e: print("扫描异常", e) def main(): while True: scan_count = 20 rule_dict = { "period": {"min": 365, "max": 365}, "duration": {"min": 10, "max": 1800}, "favorite_cnt": {"min": 5000, "max": 0}, "share_cnt": {"min": 1000, "max": 0}, } if __name__ == "__main__": can_count = 20 rule_dict = { "period": {"min": 365, "max": 365}, "duration": {"min": 10, "max": 1800}, "favorite_cnt": {"min": 5000, "max": 0}, "share_cnt": {"min": 1000, "max": 0}, } start_wechat()