我无法通过wordpress_xmlrpc从python发布到我的wordpress站点,但我得到ExpatError:格式不正确(无效的令牌):第1行,第222列

时间:2018-11-14 17:51:34

标签: python wordpress xml-rpc

我无法通过wordpress_xmlrpc从python发布到我的wordpress网站,我得到ExpatError:格式不正确(无效的令牌):第1行,第222列

当我尝试运行此代码时

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo

wp = Client('http://mysite.wordpress.com/xmlrpc.php', 'username', 'password')

我收到此错误ExpatError:格式不正确(令牌无效):第1行,第222列

2 个答案:

答案 0 :(得分:0)

我在GitHub上回复了我,我认为,如果我们将它移出GitHub,对其他订阅者来说会更好,因为这似乎是WordPress问题。

每个最大值,这似乎是特定于您的WordPress网站的。由于我们无权访问您的网站,因此无法具体告诉您正在发生的事情。根据我们的谈话,以下是常见的故障排除提示:

  
      
  1. 禁用您的插件并交换为默认主题,然后尝试   连接
  2.   
  3. 如果可以,请重新启用主题并检查
  4.   
  5. 如果仍然有效,请重新启用1个插件并再次检查。
  6.   
  7. 为所有插件重复步骤3。
  8.   

在GitHub上,您提到即使禁用所有插件,问题仍然存在。您是否尝试过将其交换为默认值(例如WordPress 2017)并再次尝试?

我知道您不想在此处发布有关您网站的敏感信息,但是您能告诉我们一些信息吗?

  • 您的WordPress版本
  • 您网站上的插件
  • 您正在使用什么主题

希望这可以帮助我们缩小问题的范围。

答案 1 :(得分:0)

显然问题在于 Wordpress 的 XMLRPC 返回编码为 Python 称为“utf8-sig”而不是“utf8”的 XML,并且 xmlrpc.client.Transport 不检查初始 BOM,这会导致失败.

我解决了monkeypatching Transport.parse_response 的问题如下:

from xmlrpc import client
from xmlrpc.client import GzipDecodedResponse

def parse_response_(self, response):
    # Monkeypatching of xmlrpc
    # xmlrpc.client -> Transport.parse_response doesn't check for starting BOM
    # Code lifted directly from xmlrpc.client except as noted

    # read response data from httpresponse, and parse it
    # Check for new http response object, otherwise it is a file object.
    if hasattr(response, 'getheader'):
        if response.getheader("Content-Encoding", "") == "gzip":
            stream = GzipDecodedResponse(response)
        else:
            stream = response
    else:
        stream = response

    p, u = self.getparser()

    start = True # added
    bom = b'\xef\xbb\xbf\xef\xbb\xbf' # added
    while 1:
        data = stream.read(1024)
        if not data:
            break
        if self.verbose:
            print("body:", repr(data))

        # start addition
        if start:
            if data.startswith(bom):
                data = data[len(bom):]
                start = False
        # end addition

        p.feed(data)

    if stream is not response:
        stream.close()
    p.close()

    return u.close()

client.Transport.parse_response = parse_response_