天天看点

用python程序自动更新wordpress网站文章

仅需200多行代码,网站变成机器人儿。用wordpress搭建的网站可以用程序控制完成自动采集信息,并自动上传更新。如果外部条件不变化(比如数据来源),理论上wordpress制作的网站可以在无人值守的状态下一直自转下去。程序用python写成,需要安装第三方包wordpress_xmlrpc。

以下是我们为某网站定制的自更新程序代码,仅是数据上传部分。供参考.

#coding:utf-8  本程序实现在www.okinawa-newlife.com网站自动发帖,别的wordpress网站可套用。
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo
from wordpress_xmlrpc.methods import posts
from wordpress_xmlrpc.methods import taxonomies
from wordpress_xmlrpc import WordPressTerm
from wordpress_xmlrpc.compat import xmlrpc_client
from wordpress_xmlrpc.methods import media, posts
import sys
import os

def picksn(): # 查找本地编号文件,
    # 本函数取得所有待处理房产编号,和已处理房产编号 作为list返回给调用函数。没有返回空
    global path
    wfname = path + '房产编号.txt'      #未处理的房产编号
    yfname = path + '房产编号已传.txt'     #已处理的房产编号
    if not os.path.isfile(wfname):  # 判断本地是否存在文件是否存在,不存在就退出
        print("房产编号文件不存在。")
        wlist = [""]
    else:
        with open(wfname, 'r',encoding='utf-8') as wfile:  # 从文件读,如文中有汉字,encoding 参数必须有,否则报错 UnicodeDecodeError。。。
            wlist = wfile.readlines()  # 整个文件读出放到列表中
    if not os.path.isfile(yfname):  # 判断本地是否存在已处理编号的文件
        ylist = [""]
    else:
        with open(yfname, 'r', encoding='utf-8') as yfile:  # 从文件读,如文中有汉字,encoding 参数必须有,否则报错 UnicodeDecodeError。。。
            ylist = yfile.readlines()  # 整个文件读出放到列表中
    sns = [wlist[0],ylist[0]]    #把待处理编号和已处理编号都返回给调用函数
    return sns

def sendpost(sn):
    para = getinfo(sn)
    wp = Client('http://www.okinawa-newlife.com/xmlrpc.php', '用户名', '密码')
    post = WordPressPost()
    post.title = para[0]
    post.content = para[1]+para[2]+para[3]+para[4]+para[5]+para[6]
    post.post_status = 'publish' #文章状态,不写默认是草稿,private表示私密的,draft表示草稿,publish表示发布
    post.terms_names = {
       'post_tag': ['冲绳房产', '日本房产','冲绳投资',para[1]], #文章所属标签,没有则自动创建
       'category': ['冲绳房产',para[1] ] #文章所属分类,没有则自动创建
    }

    # 以下代码添加特色图像
    imgfname = path+sn+'.jpg'  # 上传的图片文件路径
    if os.path.isfile(imgfname):  # 判断文件名是否存在,有才上传图片
        # prepare metadata
        data = {
            'name': 'picture.jpg',
            'type': 'image/jpeg',  # mimetype
        }
        # read the binary file and let the XMLRPC library encode it into base64
        with open(imgfname, 'rb') as img:
            data['bits'] = xmlrpc_client.Binary(img.read())
        response = wp.call(media.UploadFile(data))
        attachment_id = response['id']
        post.thumbnail = attachment_id  # 缩略图的id

    post.id = wp.call(posts.NewPost(post))
    print(sn+"号物业已上传")

def getinfo(sn):
    # 按编号从之前保存的本地文件读取信息
    #para= []   # 保存参数的list
    filename = path+sn+'-有用信息.txt'
    with open(filename, 'r', encoding='utf-8') as f:  # 从文件读,如文中有汉字,encoding 参数必须有,否则报错 UnicodeDecodeError。。。
        para = f.readlines()  # 整个文件读出放到列表中
        return para
    #sns = filestr.split(",")  # str转为list, 逗号分隔

#程序起点在此
path = r'C:\20200714\房产素材\\'  # 指定一个保存文件的文件夹
sns = picksn()  # 获取编号列表,sns是嵌套list,他的值一个是待处理编号的list, 一个是已处理编号的list
wsns = sns[0].split(',')    #待处理编号list
ysns = sns[1].split(',')    #已处理编号list
#wsns = ['42779','42708']
#ysns = [""]
nsns = [""]   #本次程序执行处理的编号list
yfname = path + '房产编号已传.txt'    #保存已上传编号的文件名
for i in wsns:   #把待处理编号中的值逐个处理
    if i not in ysns:   #判断下是否在已处理编号中,没有才继续下边的post程序
      #  ctn = input("将要上传"+i+",继续按回车,按n退出程序")   #人工干预是否继续,按回车值为空,继续
#        if ctn == '':
            filename = path+i+'-有用信息.txt'
            if os.path.isfile(filename):  # 判断文件名是否存在,如不存在就处理下一个编号
                sendpost(i)
            # 把更新过的编号做个记录,保存本地文件中,避免重复更新
            with open(yfname, 'a', encoding='utf-8') as f:
                 f.write(","+i)
 #       else:
  #          sys.exit()   #退出程序

print("上传完成!")