Python使用Selenium库实现CSDN自动化发帖

发布于:2024-10-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

        虽然CSDN上有很多优秀的作品,但也不乏很多很水的文章,我也不知道这种有什么意义。不过发这么水的文章多没意思,让浏览器自动化发帖就行了。以下程序能够实现CSDN自动化发帖,同时附自动给关注的人的文章点赞的程序。因为也有很多作者之间互赞,但不看文章的质量,评论区也都是水军,不说该文章具体的问题,而只是泛泛的夸赞。

        以下给出完整代码,需要自己调试。我就不详细介绍程序了,比较简单。主要难点是iframe和window不断切换,需要检查HTML源代码检查。

 完整代码

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains
# from selenium.webdriver.edge.options import Options
class Config:
    def __init__(self):
        # 账号
        self.username = ''
        # 密码
        self.password = ''
        

def get(conf, driver, url):
    driver.maximize_window()
    driver.get(url)
    # 最多等待5秒使页面加载进来,隐式等待
    driver.implicitly_wait(5)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='登录']"))).click()
    WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(0))
    # driver.switch_to.frame(0)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[text()='密码登录']"))).click()
    username = driver.find_element(By.XPATH, "//input[@autocomplete='username']")
    username.send_keys(conf.username)
    # time.sleep(1)
    passwd = driver.find_element(By.XPATH, "//input[@autocomplete='current-password']")
    passwd.send_keys(conf.password)
    div = driver.find_element(By.CLASS_NAME,'inform-title')
    div.find_element(By.TAG_NAME, "i").click()
    driver.find_element(By.XPATH, "//*[text()='登录']").click()
    time.sleep(1)
    driver.switch_to.window(driver.window_handles[0])
    # time.sleep(1)
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(0))
    # driver.switch_to.frame(0)
    time.sleep(1)
    driver.find_element(By.CLASS_NAME, "btn-skip").click()
    # WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "btn-skip"))).click()

    driver.switch_to.window(driver.window_handles[0])
    # time.sleep(1)
    
    driver.find_element(By.CSS_SELECTOR, "a[href='https://mp.csdn.net']").click()
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "btn-close"))).click()
    driver.find_element(By.CSS_SELECTOR, "a.content").click()
    time.sleep(1)
    
    driver.find_element(By.XPATH, "//span[text()='创作助手']").click()
    time.sleep(1)
    driver.switch_to.frame(1)
    box = driver.find_element(By.CLASS_NAME, "i-ai-chat-welcome-questions")
    # print(list.get_attribute("outerHTML"))
    list = box.find_elements(By.TAG_NAME, "button")
    writetest(driver,list)
    # list = driver.find_elements(By.CLASS_NAME,"sub-people-list-box" )
    # print(len(list))
    # thumbs_up(driver,list)



i = 0
def writetest(driver,list):
    global i
    li = list[i]
    i = i + 1
    title_tag = li.find_element(By.CSS_SELECTOR, "span.ivu-typography")
    title_text = title_tag.text
    li.click()
    WebDriverWait(driver,15).until(EC.presence_of_element_located((By.CSS_SELECTOR,"button.ivu-btn.ivu-btn-text.ivu-mr-32")))
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "svg[width='12'][height='12']"))).click()
    # text_1 = '"重新生成 "'
    # WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH,f"//span[text()='{text_1}']")))
    # text_2 = '"复制"'
    # WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,f"//p[text()='{text_2}']]"))).click()
    
    # driver.find_element(By.XPATH, "//img[@src='https://mp-blog.csdn.net/mp_blog/img/ceditlose.12eeb4a2.png']").click()
    driver.switch_to.window(driver.window_handles[0])
    driver.find_element(By.CSS_SELECTOR,"img.edit-title-close").click()
    title = driver.find_element(By.TAG_NAME,"textarea")
    title.send_keys(title_text)
    WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(0))
    # driver.switch_to.frame(0)
    content = driver.find_element(By.TAG_NAME,"p")
    # content.click()
    content.send_keys(Keys.CONTROL, 'v')
    driver.switch_to.window(driver.window_handles[0])
    # box = driver.find_element(By.CSS_SELECTOR, "div.btn-box")
    # buttons = box.find_elements(By.TAG_NAME,"button")
    # buttons[1].click()
    driver.find_element(By.XPATH,"//span[text()=' 发布博客']").click()
    # for li in list:
        # li.find_element(By.CSS_SELECTOR, "span.ivu-typography")
    
    
def thumbs_up(driver,list):
    i = 3
    n = 1
    j = 0
    for people in list:
        driver.switch_to.window(driver.window_handles[0])

        if i > 0:
            
            img = people.find_element(By.TAG_NAME, "img")
            img.click()
            time.sleep(2)  # 等待页面加载
            if driver is None:
                print("Driver is None. Exiting.")
            driver.switch_to.window(driver.window_handles[n+j])

            n = n + 1
            time.sleep(2)  # 等待页面加载
            try:
                article = driver.find_element(By.TAG_NAME, "article")

                article.find_element(By.TAG_NAME, "img").click()
                j = j + 1
                time.sleep(2)
                driver.switch_to.window(driver.window_handles[-1])
                # 找到要操作的元素
                element = driver.find_element(By.ID, "is-like-imgactive-new")
                tag = driver.find_element(By.ID, "blog-digg-num")
                # 初始显示状态
                print(f"初始 display 属性: {element.value_of_css_property('display')}")

                if element.value_of_css_property('display') == 'none':
                    tag.click()
                    # driver.execute_script("arguments[0].style.display = 'block';", element)
                # else:
                #     driver.execute_script("arguments[0].style.display = 'none';", element)
                time.sleep(2)
                print(f" display 属性: {element.value_of_css_property('display')}")
            except:
                pass
                
            i -= 1

if __name__ == '__main__':
    conf = Config()

    url = 'https://blog.csdn.net/2301_80892630?type=sub&spm=1010.2135.3001.5348'
    driver = webdriver.Edge()
    get(conf, driver, url)
    time.sleep(10)
    driver.quit()