From 91b7ec2b67d74e4d2e41c857232414feb3cb7bfd Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期三, 02 四月 2025 18:32:10 +0800 Subject: [PATCH] 功能完善 --- comment.py | 113 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 83 insertions(+), 30 deletions(-) diff --git a/comment.py b/comment.py index cdbd18c..78365b8 100644 --- a/comment.py +++ b/comment.py @@ -1,3 +1,6 @@ +import json +import os +import random import threading import time @@ -9,6 +12,7 @@ from selenium.webdriver.support import expected_conditions as EC import comment_manager +import constant import setting from video_manager import VideoManger @@ -23,9 +27,9 @@ # driver = webdriver.Chrome(options=options) # 鍙﹀涓�绉嶆柟寮� # 璋锋瓕娴忚鍣ㄤ綅缃� - chrome_location = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' + chrome_location = setting.get_chrome_path() # 璋锋瓕娴忚鍣ㄩ┍鍔ㄥ湴鍧� - chromedriver_path = r'chromedriver.exe' + chromedriver_path = setting.get_chromedriver_path() self.options.binary_location = chrome_location # 鎸囧畾chrome鐨勮矾寰� self.service = Service(chromedriver_path) # 鑾峰彇姝e垯琛ㄨ揪寮� @@ -35,23 +39,48 @@ self.comment_templates = [(x.split("#")[0], x.split("#")[1]) for x in comment_template_str.split("\n") if x.find("#") >= 0] self.driver = None + self.break_excute = False # 涓柇鎵ц + + def break_excute(self): + """ + 涓柇鎵ц + :return: + """ + print("=====涓柇鎵ц=====") + self.break_excute = True def __init(self): + self.break_excute = False if not self.driver: self.driver = webdriver.Chrome(service=self.service, options=self.options) + self.driver.get( + "https://channels.weixin.qq.com/platform/comment?isImageMode=0") + else: + self.driver.refresh() def start_process_comment(self): """ 寮�濮嬪鐞嗚瘎璁� :return: """ + while True: + try: + self.__start_excute_task() + except: + pass + finally: + time.sleep(constant.REFRESH_TIME_SPACE) + + def __start_excute_task(self): + """ + 寮�濮嬫墽琛屼换鍔� + :return: + """ self.__init() - self.driver.get( - "https://channels.weixin.qq.com/platform/comment?isImageMode=0") # 绛夊埌宸︿晶鑿滃崟鍑虹幇鍚庢墠鑳芥墽琛屽悗缁搷浣� - wait = WebDriverWait(self.driver, 100) # 鏈�澶氱瓑寰�10绉� + wait = WebDriverWait(self.driver, 1000000) # 鏈�澶氱瓑寰�10绉� element = wait.until(EC.visibility_of_element_located((By.ID, "side-bar"))) - threading.Thread(target=lambda: self.process_videos(self.driver), daemon=True).start() + self.process_videos(self.driver) def __process_like(self, video_name, video_date, comment_element): """ @@ -83,7 +112,10 @@ """ user_name = comment_element.find_element(By.CLASS_NAME, "comment-user-name").get_attribute("innerHTML") comment_time = comment_element.find_element(By.CLASS_NAME, "comment-time").get_attribute("innerHTML") - comment_content = comment_element.find_element(By.CLASS_NAME, "comment-content").get_attribute("innerHTML") + try: + comment_content = comment_element.find_element(By.CLASS_NAME, "comment-content").get_attribute("innerHTML") + except: + comment_content = '' return user_name, comment_content, comment_time def __parse_video_info(self, video_element): @@ -96,14 +128,16 @@ comment_count = video_element.find_element(By.CLASS_NAME, "feed-comment-total").find_element(By.XPATH, "./span[2]").get_attribute( "innerHTML") - video_name = video_element.find_element(By.CLASS_NAME, "comment-content").get_attribute("innerHTML") - return video_name, video_time, comment_count + video_name = video_element.find_element(By.CLASS_NAME, "feed-title").get_attribute("innerHTML") + video_title = video_name + if video_title.find("#") >= 0: + video_title = video_title[:video_title.find("#")] + return video_name, video_time, comment_count, video_title - def __process_reply(self, video_name, video_date, comment_element): + def __process_reply(self, video_info, comment_element): """ 澶勭悊鍗曟潯璇勮鍥炲 - :param video_name: - :param video_date: + :param video_name:(video_name, video_date, comment_count, video_title) :param comment_element: :return: 鏄惁闇�瑕佺偣璧� """ @@ -112,7 +146,7 @@ if not setting.is_reply_comment(): return None # 鍐呭鏄惁绗﹀悎鏍囧噯 - return comment_manager.get_replay_content(video_name, video_date, nick_name, content) + return comment_manager.get_replay_content(video_info, nick_name, content) comment_user_name, comment_content, comment_time = self.__parse_comment_info(comment_element) @@ -124,7 +158,7 @@ except: print("杩樻病鍥炲銆傘�傘�傘��") - replay_content = get_reply_comment(comment_user_name, comment_element) + replay_content = get_reply_comment(comment_user_name, comment_content) if not replay_content: # 涓嶉渶瑕佽瘎璁� print("涓嶉渶瑕佸洖澶嶃�傘�傘�傘��") @@ -136,7 +170,7 @@ "action-item") # 鐐瑰嚮璇勮 comment_actions[1].click() - wait = WebDriverWait(self.driver, 5) # 鏈�澶氱瓑寰�10绉� + wait = WebDriverWait(self.driver, 10) # 鏈�澶氱瓑寰�10绉� wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "comment-create-content"))) time.sleep(1) self.driver.find_element(By.CLASS_NAME, @@ -146,6 +180,7 @@ self.driver.find_element(By.CLASS_NAME, "comment-create-content").find_element(By.XPATH, "div[3]/div[2]").click() time.sleep(2) + time.sleep(random.randint(constant.COMMENT_REPLY_SPACE_TIME_MIN, constant.COMMENT_REPLY_SPACE_TIME_MAX)) return False def __process_comments(self, driver, start_index=0, video_info=None): @@ -153,26 +188,30 @@ :param driver: :param start_index: - :param video_info:(瑙嗛鍐呭, 瑙嗛鏃ユ湡, 璇勮娆℃暟) + :param video_info:(瑙嗛鍐呭, 瑙嗛鏃ユ湡, 璇勮娆℃暟, 瑙嗛鏍囬) :return: """ scroll_list = driver.find_element(By.CLASS_NAME, "feed-comment__wrp") - - loadmore = scroll_list.find_element(By.CLASS_NAME, "loadmore__dot") - # 鑾峰彇鐖舵帶浠� - loadmore = loadmore.find_element(By.XPATH, "./..") - has_more = loadmore.value_of_css_property("display") == "none" + try: + loadmore = scroll_list.find_element(By.CLASS_NAME, "loadmore__dot") + # 鑾峰彇鐖舵帶浠� + loadmore = loadmore.find_element(By.XPATH, "./..") + has_more = loadmore.value_of_css_property("display") == "none" + except: + has_more = False comments = scroll_list.find_elements(By.XPATH, "div[2]/div/div/div[contains(@class,'comment-item')]") print("璇勮鏉℃暟", len(comments)) for index in range(start_index, len(comments)): + if self.break_excute: + return comment = comments[index] # 璇勮鍐呭 user_name, comment_content, comment_time = self.__parse_comment_info(comment) if not comment_content: - continue + comment_content = '' print("=======璇勮鍐呭锛�", comment_content) - need_like = self.__process_reply(video_info[0], video_info[1], comment) + need_like = self.__process_reply(video_info, comment) if need_like: print("闇�瑕佺偣璧�") self.__process_like(video_info[0], video_info[1], comment) @@ -184,9 +223,9 @@ "var __comment_scroll = document.getElementsByClassName('feed-comment__wrp')[0]; __comment_scroll.scrollTop = __comment_scroll.scrollHeight;") print("寰�涓嬫粴鍔�") time.sleep(3) - self.__process_comments(driver, start_index=len(comments)) + self.__process_comments(driver, start_index=len(comments), video_info=video_info) else: - print("娌℃湁鏇村璇勮浜�") + print("娌℃湁鏇村璇勮浜�, 璇勮鏁伴噺锛�", len(comments)) def process_videos(self, driver: webdriver.Chrome, start_index=0): wait = WebDriverWait(driver, 100) # 鏈�澶氱瓑寰�10绉� @@ -196,18 +235,20 @@ videos_root = driver.find_element(By.CLASS_NAME, "feeds-container") videos = videos_root.find_elements(By.CLASS_NAME, "comment-feed-wrap") for i in range(start_index, len(videos)): + if self.break_excute: + return # 閫夋嫨瑙嗛 video = videos[i] # 瑙f瀽瑙嗛鍐呭 - video_name, video_time, comment_count = self.__parse_video_info(video) + video_info = self.__parse_video_info(video) # 鍒ゆ柇鏄惁瑕佺偣鍑昏繘鍘� - if not VideoManger().is_need_click(video_name, video_time, comment_count): + if not VideoManger().is_need_click(video_info): continue video.click() driver.implicitly_wait(2) - self.__process_comments(driver, video_info=(video_name, video_time, comment_count)) - # 5s澶勭悊涓�涓棰� - time.sleep(5) + self.__process_comments(driver, video_info=video_info) + # 澶勭悊涓�涓棰� + time.sleep(constant.VIDEO_CLICK_SPACE_TIME) loadmore = scroll_list.find_element(By.CLASS_NAME, "loadmore__dot") # 鑾峰彇鐖舵帶浠� @@ -230,6 +271,18 @@ except: pass + def __save_cookie(self): + cookies = self.driver.get_cookies() + with open("datas/cookies.json", "w") as f: + json.dump(cookies, f) + + def __fill_cookie(self): + if os.path.exists("datas/cookies.json"): + with open("datas/cookies.json", "r") as f: + cookies = json.load(f) + for cookie in cookies: + self.driver.add_cookie(cookie) + if __name__ == "__main__": # CommentManager().start_process_comment() -- Gitblit v1.8.0