来自python编码base64的wp.uploadFile xmlrpc

时间:2012-02-15 21:10:34

标签: python wordpress xml-rpc encode

我正在尝试在wordpress上使用xmlrpc上传文件。我使用php完成了这个,但这次我必须使用python,而且有些东西无效。

更具体地说,执行此操作的方法是调用xxrpc函数wp.uploadFile,该函数在codex here http://codex.wordpress.org/XML-RPC_wp#wp.uploadFile或metaWeblog.newMediaObject中进行了解释。问题是编码。从php我用了一个做脏工作的课。即ixr_base64类,显然已经成功了。在python中我尝试导入base64lib并使用它的b64encode函数,但它没有用。

更具体地说,这是我正在使用的python代码:

import xmlrpclib
import urllib2
import base64
def get_url_content(url):
    try:
        content = urllib2.urlopen(url)
        return content.read()
    except:
        print 'error!'

file = get_url_content('http://www.legaljuice.com/Fly.jpg')
file = base64.b64decode(file)
server = xmlrpclib.Server('http://localhost/xmlrpc.php')
xarr = ['1', 'admin', 'pass', {'name':'sssaaa.jpg', 'type':'image/jpeg', 'bits':file,    'overwrite':'true'}]
result = server.metaWeblog.newMediaObject(xarr)
print result

这不是诀窍。它在wordpress结束时无法正确解码。现在,我知道这不是wordpress的错,因为我之前使用php做过这一点,并且有大量的应用程序,android,ios,桌面和网络,这使得xmlrpc的文件上载成为可能。

根据我的研究,带有base64模块的python提供RFC 3548中指定的数据编码和解码,而带有base64_encode的php使用RFC 2045第6.8节 此时,我被卡住了。我已经尝试了一切但到目前为止没有任何工作。我只是在wordpress的媒体页面上得到了损坏的文件。

请尽可能帮助。

1 个答案:

答案 0 :(得分:4)

好的,答案在于xmlrpclib类。 要从python发送base64位到wordpress,你需要像这样使用xmlrpclib类:

base64bits = xmlrpclib.Binary(file_content)

然后你只需将base64bits变量添加到wp.uploadFile xmlrpc请求中的'bits'参数。

更准确一点,这里是python中完整代码应该如何完成:

import xmlrpclib
import urllib2
from datetime import date
import time

def get_url_content(url):
        try:
            content = urllib2.urlopen(url)
            return content.read()
        except:
            print 'error! NOOOOOO!!!'
file_url = 'http://the path to your picture'
extension = file_url.split(".")
leng = extension.__len__()
extension = extension[leng-1]
if (extension=='jpg'):
    xfileType = 'image/jpeg'
elif(extension=='png'):
    xfileType='image/png'
elif(extension=='bmp'):
    xfileType = 'image/bmp'

file = get_url_content(file_url)
file = xmlrpclib.Binary(file)
server = xmlrpclib.Server('http://website.com/xmlrpc.php')
filename = str(date.today())+str(time.strftime('%H:%M:%S'))
mediarray = {'name':filename+'.'+extension, 
             'type':xfileType, 
             'bits':file, 
             'overwrite':'false'}
xarr = ['1', 'USERHERE', 'PASSWORDHERE', mediarray]
result = server.wp.uploadFile(xarr)
print result