使用Python自动化发布文章(二)

2018-10-22 14:22:54 浏览数 (1)

本文是在上一篇文章 使用Python自动化发布文章:(一) 基础上加以改进而来的. 可以完成自动化发布文章。

操作演示:

视频内容
我先说说文章怎么发布.
  1. 首先准备一个你要发布的文章. 文章第一行是要发布文章的标题,第二行是要发布文章的类型.第二行以后都是文章的正文部分,最好是用Markdown,因为开源中国默认是markdown。
  1. 在下面代码的 read_file 方法中修改文件名.这里注意调整一下.
  2. 运行代码就可以了 文章发布后效果图如下

完整代码

代码语言: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()

虽然目前已经可以自运货发布文章了,但离商业应用还是有比较大的差距!后续我会继续改进

需要解决以下几个问题.

  1. GUI 操作肯定是要有的,不然发布的时候操作不便
  2. 图片上传问题
  3. selenium稳定性不好,容易出错.
  4. 突破登录问题
  5. 多平台发布问题

0 人点赞