本文是在上一篇文章 使用Python自动化发布文章:(一) 基础上加以改进而来的. 可以完成自动化发布文章。
操作演示:
我先说说文章怎么发布.
- 首先准备一个你要发布的文章. 文章第一行是要发布文章的标题,第二行是要发布文章的类型.第二行以后都是文章的正文部分,最好是用Markdown,因为开源中国默认是markdown。
- 在下面代码的
read_file
方法中修改文件名.这里注意调整一下. - 运行代码就可以了 文章发布后效果图如下
完整代码
代码语言:javascript复制# coding:utf-8
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class autoWrite(object):
def __init__(self):
'''
初始化
'''
self.sysType = {}
self.title = ''
self.articleType = ''
self.content = ''
self.init_type()
self.read_file()
pass
def init_type(self):
'''
初始化文件类型
:return:
'''
self.sysType["移动开发"] = "428602"
self.sysType["前端开发"] = "428612"
self.sysType["人工智能"] = "5611447"
self.sysType["服务端开发/管理"] = "428640"
self.sysType["游戏开发"] = "429511"
self.sysType["编程语言"] = "428609"
self.sysType["数据库"] = "428610"
self.sysType["企业开发"] = "428611"
self.sysType["图像/多媒体"] = "428647"
self.sysType["系统运维"] = "428613"
self.sysType["软件工程"] = "428638"
self.sysType["大数据"] = "5593654"
self.sysType["云计算"] = "428639"
self.sysType["开源硬件"] = "430884"
self.sysType["其他类型"] = "430381"
pass
def read_file(self):
'''
读取文件部分
:return:
'''
with open('english.txt', 'r') as f:
# 读取文件的前两行
for i in range(2):
if i == 0:
self.title = f.readline()
else:
self.articleType = f.readline()
self.content = f.read()
pass
def publish_file(self):
'''
文件发布
:return:
'''
user_main_url = 'https://my.oschina.net/u'
username = 'xxx' # 改成你自己的账号与密码
password = 'xxx'
url = 'https://www.oschina.net/home/login'
driver = webdriver.Firefox()
driver.get(url)
# 浏览器窗口最大化
driver.maximize_window()
driver.find_element_by_id('userMail').send_keys(username)
driver.find_element_by_id('userPassword').send_keys(password)
driver.find_element_by_xpath('//*[@id="account_login"]/form/div/div[5]/button').click()
time.sleep(2)
# 点击进入我的博客
# 悬停时,出现新的块
hoverControl = driver.find_element_by_xpath('//*[@id="MySpace"]')
ActionChains(driver).move_to_element(hoverControl).perform()
# 点击进入我的博客
driver.find_element_by_xpath('/html/body/header/div/div[2]/div/div[2]/div/ul/li[4]/a').click()
time.sleep(2)
# print driver.page_source
# 点击进入写作页。
driver.find_element_by_xpath('/html/body/div/div/div/div/div[1]/div[1]/div[4]/a').click()
time.sleep(1)
# 填写标题
titleInput = driver.find_element_by_xpath('//*[@id="title"]')
# 这里需要对文字进行重新编码
title = unicode(self.title, 'utf8')
titleInput.send_keys(title)
# 填写内容
contentInput = driver.find_element_by_id('mdeditor')
content = unicode(self.content, 'utf8')
contentInput.send_keys(content)
#注意这里取的文章文章类型,刚才有换行了,所以需要去掉n
articleType = self.articleType.strip('n')
# 选择文章的类型值,
js = 'document.getElementById("sys_sort").value="{}";'.format(self.sysType[articleType])
print js
driver.execute_script(js)
# 修改选择的类型文本
js = 'document.getElementsByClassName("select-show")[2].innerText="{}";'.format(articleType)
print js
driver.execute_script(js)
# 点击提交
submit = driver.find_element_by_xpath('//*[@id="blog-form"]/div[3]/div/button[2]')
submit.click()
print '发布成功!'
pass
if __name__ == '__main__':
auto = autoWrite()
auto.publish_file()
虽然目前已经可以自运货发布文章了,但离商业应用还是有比较大的差距!后续我会继续改进
需要解决以下几个问题.
- GUI 操作肯定是要有的,不然发布的时候操作不便
- 图片上传问题
- selenium稳定性不好,容易出错.
- 突破登录问题
- 多平台发布问题