用python贴吧自动回帖_python基于selenium实现贴吧自动发帖

说明:本文仅供学习参考;请勿用作其他用途

1.功能

已经实现:实现贴吧自动发帖功能(包括标题,内容,上传图片),标题和内容加入了简单的随机字符串,每发一次会随机等待一段时间,关注人数少于50000的不发

缺陷:自动登录需要关闭手机验证,且第一次验证码需要手动拖拽,有想法的同学可以买第三方来做验证码自动识别;发帖间隔不宜过快,否则每次发帖都会要求输入验证码

2.开始编码

以下部分直接上代码,未做较好的封装,有兴趣的朋友自己优化...

# -*- coding: utf-8 -*-

from selenium.webdriver.chrome.options import Options

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from time import sleep

import logging

import sys

import random

import uuid

from pywinauto import Application

from pywinauto.keyboard import send_keys

logging.basicConfig(level=logging.INFO,

format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s', filemode='w',

filename="log.txt")

BROWSER_URL = r'D:\program files (x86)\360chrome\Chrome\Application\360chrome.exe'

from pywinauto.application import Application

class WinAuto:

def __init__(self, class_name, title_re):

# 连接到指定应用程序,此处为连接到指定窗口

self.app = Application().connect(class_name=class_name, title_re=title_re)

# 定位窗口方法

def get_window(self, window_object, class_name="", title_re=""):

return window_object.window(class_name=class_name, title_re=title_re)

# 向编辑框输入指定信息

def file_input(self, file_path):

# 定位到标题名为“打开”对话框

window = self.get_window(self.app, "#32770", "打开")

# 定位到编辑框

window = self.get_window(window, class_name="Edit")

# 向编辑框中输入信息

window.TypeKeys(file_path)

# 点击【打开】按钮

def open_button_click(self):

# 定位到标题名为“打开”对话框

window = self.get_window(self.app, "#32770", "打开")

# 定位到【打开】按钮

button = self.get_window(window, class_name="Button", title_re="打开")

# 点击【打开】按钮

button.click()

def get_titile():

title_list = [

"双十一最强攻略,保证有惊喜,进来了解一下吧",

"双十一撸货套路,来了解一下",

"双11无敌神车已经发车,来了解一下把",

"双11最强攻略,保证你不后悔",

"双十一最强攻略,走过路过不要错过",

]

t = random.choice(title_list)

return t + str(uuid.uuid4()).split('-')[-1]

def get_content():

content = """testest{uuid}atetset{uuid}testest{uuid}test""".format(uuid=str(uuid.uuid4()).split('-')[-1])

return content

def get_datas():

with open('tieba.txt', 'r', encoding='utf-8', errors='ignore') as fp:

schools = fp.readlines()

title = get_titile()

content = get_content()

return title, content, schools

def get_sleep_time(num):

if num % 5 == 0:

t = random.choice(range(180, 300))

else:

t = random.choice(range(35, 125))

logging.info("sleep {}".format(t))

return t

def start_chrome():

chrome_options = Options()

chrome_options.binary_location = BROWSER_URL

# chrome_options.add_argument("–incognito")

driver = webdriver.Chrome(options=chrome_options)

driver.implicitly_wait(20)

if login_tieba(driver):

title, content, schools = get_datas()

num = 0

for name in schools:

url = u"https://tieba.baidu.com/f?ie=utf-8&kw=%s&fr=search" % name

logging.info("start request {}, url:{}".format(name, url))

try:

driver.get(url)

except Exception as e:

logging.error("request {} error".format(name))

continue

followers = driver.find_element_by_class_name("card_menNum").text

logging.info("followers is :{}".format(followers))

followers = followers.replace(',', "")

if int(followers) < 50000:

logging.info("Less than 50000 followers")

continue

try:

driver.find_element_by_xpath("/html/body/ul/li[2]/a").click()

sleep(1)

driver.find_element_by_xpath('//*[@id="tb_rich_poster"]/div[3]/div[1]/div[2]/input').send_keys(title)

# driver.quit()

sleep(1)

driver.find_element_by_id("ueditor_replace").send_keys(content)

sleep(1)

driver.find_element_by_class_name('edui-btn-image').click()

sleep(1)

driver.find_element_by_class_name('pic_upload_container').click()

sleep(1)

driver.find_element_by_class_name('next_step').click()

sleep(1)

# 定位打开窗口

window = WinAuto("#32770", "打开")

sleep(1)

if num % 2 == 0:

window.file_input(r'F:\py_home\selenium_auto\2.jpg')

else:

window.file_input(r'F:\py_home\selenium_auto\3.jpg')

sleep(1)

window.open_button_click()

sleep(8)

driver.find_element_by_link_text('插入图片').click()

sleep(5)

driver.find_element_by_xpath('//*[@id="tb_rich_poster"]/div[3]/div[5]/div/button[1]').click()

except Exception as e:

logging.error("post article failed,: {}".format(e))

import traceback

traceback.print_exc()

continue

num += 1

t = get_sleep_time(num)

sleep(t)

driver.quit()

def login_tieba(driver):

tieba_url = 'https://tieba.baidu.com/'

driver.get(tieba_url)

driver.find_element_by_xpath('//*[@id="com_userbar"]/ul/li[4]/div/a').click()

sleep(2)

try:

driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__footerULoginBtn"]').click()

driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__userName"]').send_keys('用户名')

driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__password"]').send_keys('密码')

driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__submitWrapper"]').click()

logging.info("login success")

except Exception:

logging.error("login failed")

sys.exit(1)

logging.info("wait for 10s")

sleep(10)

return True

if __name__ == '__main__':

start_chrome()

你可能感兴趣的:(用python贴吧自动回帖)