wp.uploadFile xmlrpc из Python кодирует base64 - PullRequest
1 голос
/ 16 февраля 2012

Я пытаюсь загрузить файл, используя xmlrpc на WordPress.Я сделал это с помощью php, но на этот раз я должен использовать python, и что-то не работает.

Чтобы быть более точным, способ сделать это - вызвать функцию xmlrpc wp.uploadFile, которая описана в кодексездесь 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, desktop и web, которые делают возможной загрузку этого файла с xmlrpc.

Из того, что я исследовалPython с модулем base64 обеспечивает кодирование и декодирование данных, как указано в RFC 3548, в то время как php с base64_encode использует RFC 2045, раздел 6.8. На данный момент я застрял.Я перепробовал все, но пока ничего не работает.Я просто получаю поврежденные файлы на моей медиа-странице в WordPress.

пожалуйста, помогите, если можете.

1 Ответ

4 голосов
/ 17 февраля 2012

хорошо, ответ лежит в классе xmlrpclib.Чтобы отправить биты base64 в wordpress из python, вам нужно использовать класс xmlrpclib следующим образом:

base64bits = xmlrpclib.Binary(file_content)

, затем вы просто добавляете переменную base64bits к параметру bits в запросе xmlrpc wp.uploadFile.

Чтобы быть немного точнее, вот полный код на 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
...