脚本实现思路
使用selenium模拟浏览器+cookie实现登录、模拟点击
初始化selenium
def __init__(self):
# v:JackLi_1900
self.t1 = time.time()
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
s = Service("chromedriver.exe")
self.browser = webdriver.Chrome(service=s, options=option)
self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'
}) # 去掉selenium的驱动设置
self.browser.set_window_size(1400, 1000)
self.browser.set_page_load_timeout(10)
return
这里固定了浏览器窗口大小,是因为下面会有一个根据窗口坐标做点击的一个步骤。
访问贴吧主页
def main_page(self):
try:
try:
self.browser.get(f"https://tieba.baidu.com/f?ie=utf-8&kw={kw}&fr=search")
except:
pass
x_offset = 925 # 点击的横坐标
y_offset = 338 # 点击的纵坐标
# 将鼠标移动到当前位置的偏移量上,并进行点击
# 创建 ActionChains 对象
actions = ActionChains(self.browser)
actions.move_by_offset(x_offset, y_offset).click().perform()
try:
self.browser.get(f"https://tieba.baidu.com/f?ie=utf-8&kw={kw}&fr=search")
except:
pass
except:
pass
直接访问对应贴吧的主页,kw参数是传进来的贴吧名称,访问页面后会弹出登录框,实际我们并不是通过登录框来登录,所以在这里把它点掉,不然会影响下面的操作。
准备cookie及内容
cookie.png
准备大量cookie做成ck池随机抽取使用,内容表格准备标题及内容,图片可带可不带。
cookie格式转换
def parse_cookie_string(cookie_string):
cookies = []
cookie_list = str(cookie_string).split('; ')
for cookie_item in cookie_list:
name, value = cookie_item.split("=", 1)
if name in ['STOKEN', 'USER_JUMP', 'st_key_id', 'wise_device', 'XFI', 'st_data', 'st_sign', 'XFCS', 'XFT']:
cookies.append({
"name": name,
"value": value,
"domain": ".tieba.baidu.com"
})
else:
cookies.append({
"name": name,
"value": value,
"domain": ".baidu.com"
})
return cookies
把cookie转换成平台cookie的格式
替换cookie并提交发表
def add_commit(self, username, cookies, title, content, image, kw, ck):
try:
h = self.browser.page_source
self.browser.delete_all_cookies()
for cookie in cookies:
self.browser.add_cookie(cookie)
self.browser.refresh()
time.sleep(1)
self.browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
html = self.browser.page_source
time.sleep(1)
self.browser.find_element(By.XPATH, '//input[@name="title"]').send_keys(title)
time.sleep(1)
self.browser.find_element(By.XPATH, '//div[@id="ueditor_replace"]').send_keys(content + '\n')
time.sleep(1)
if image is not None:
self.browser.find_element(By.XPATH, '//div[@class="edui-icon-image edui-icon"]').click()
time.sleep(1)
self.browser.find_element(By.XPATH, '//li[@class="from_web"]').click()
time.sleep(1)
self.browser.find_element(By.XPATH, '//input[@class="l_netpic_input j_input form-control"]').send_keys(image)
time.sleep(1)
self.browser.find_element(By.XPATH, '//a[@class="btn_default btn_middle j_addpic"]').click()
time.sleep(3)
self.browser.find_element(By.XPATH, '//a[@class="btn_default btn_middle"]').click()
time.sleep(2)
self.browser.find_element(By.XPATH, '//button[@class="btn_default btn_middle j_submit poster_submit"]').click()
print('发表成功!')
except Exception as e:
print(e.__traceback__.tb_lineno, e)
```
最后用installer打包完成。