`
famoushz
  • 浏览: 2870883 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Python的xmlrpc调试

阅读更多

Python的xmlrpc 调 试 --------------------------------cnblogs调试:首先遇到:
pyblog.BlogError: request contains array value where string expected [request :
parameter 1]
修改xmlrpc 模 块代码,client.py中的编码类Marshaller增加一个array2方法,并且把tuple的处理改成它。(修改后向WordPress新发 布文章仍然正常。)    def dump_array2(self, value, write):
        i = id(value)
        if i in self.memo:
            raise TypeError("cannot marshal recursive sequences")
        self.memo[i] = None
        dump = self.__dump
        write("<value><data>\n")
        for v in value:
            dump(v, write)
        write("</data></value>\n")
        del self.memo[i]
     def dump_array(self, value, write):
        i = id(value)
        if i in self.memo:
            raise TypeError("cannot marshal recursive sequences")
        self.memo[i] = None
        dump = self.__dump
        write("<value><array><data>\n")
        for v in value:
            dump(v, write)
        write("</data></array></value>\n")
        del self.memo[i]
    dispatch[tuple] = dump_array2
    dispatch[list] = dump_array2
<!-- WizHtmlContent-->则,参数类型不匹配的告警没了,但是有参数个数不匹配告警。
pyblog.BlogError: Parameter count mismatch.---------------------------------------------------------
cnblogs:
print(blog.method_signature('metaWeblog.newPost'))[['string', 'string', 'string', 'string', 'struct', 'boolean']]
drupal:
['string', 'string', 'string', 'string', 'struct', 'boolean']
pyblog.BlogError: Server error. Wrong number of method parameters.
而实际上传输的内容:
cnblogs:
POST /sinojelly/services/metablogapi.aspx HTTP/1.1
Host: www.cnblogs.
com
Accept-Encoding: identity
Content-Length: 518
Content-Type: text/xm
l
User-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com)
 <?xml version
='1.0'?>
<methodCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<
param>
<value><data>
<value><int>1</int></value>
<value><string>sinojelly</st
ring></value>
<value><string>87345465</string></value>
<value><struct>
<membe
r>
<name>description</name>
<value><string>Test description4</string></value>n</member>
<member>
<name>title</name>
<value><string>Test article3</string><
/value>
</member>
</struct></value>
<value><boolean>1</boolean></value>
</da
ta></value>
</param>
</params>
</methodCall>
向 drupal发送的数据:
POST /xmlrpc .php HTTP/1.1
Host: sinojelly.dreamhosters.com
Accept-
Encoding: identity
Content-Length: 514
Content-Type: text/xml
User-Agen
t: xmlrpclib.py/1.0.1 (by www.pythonware.com)
 <?xml version='1.0'?>
<met
hodCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<param>
<value
><data>
<value><int>1</int></value>
<value><string>admin</string></value>
<va
lue><string>87345465</string></value>
<value><struct>
<member>
<name>descript
ion</name>
<value><string>Test description4</string></value>
</member>
<membe
r>
<name>title</name>
<value><string>Test article3</string></value>
</member>
 </struct></value>
<value><boolean>1</boolean></value>
</data></value>
</par
am>
</params>
</methodCall>
向 51CTO发送的数据:
POST /xmlrpc .php HTTP/1.1
Host: sinojelly.blog.51cto.com
Accept-En
coding: identity
Content-Length: 518
Content-Type: text/xml
User-Agent:
 xmlrpclib.py/1.0.1 (by www.pythonware.com)
 <?xml version='1.0'?>
<metho
dCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<param>
<value><
data>
<value><int>1</int></value>
<value><string>sinojelly</string></value>
<
value><string>87345465</string></value>
<value><struct>
<member>
<name>descri
ption</name>
<value><string>Test description4</string></value>
</member>
<mem
ber>
<name>title</name>
<value><string>Test article3</string></value>
</membe
r>
</struct></value>
<value><boolean>1</boolean></value>
</data></value>
</p
aram>
</params>
</methodCall>
WLW 向51CTO发布成功的报文:
POST http://sinojelly.blog.51cto.com/xmlrpc .php HTTP/1.1
Accept: */*
Accept-Language: zh-CN, en-US, en, *
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Windows Live Writer 1.0)
Content-Type: text/xml
Host: sinojelly.blog.51cto.com
Content-Length: 950
Connection: Close
 <?xml version="1.0" encoding="gb2312"?>
<methodCall>
 <methodName>metaWeblog.newPost</methodName>
 <params>
  <param>
   <value>
    <string>479153</string>
   </value>
  </param>
  <param>
   <value>
    <string>sinojelly</string>
   </value>
  </param>
  <param>
   <value>
    <string>87345465</string>
   </value>
  </param>
  <param>
   <value>
    <struct>
     <member>
      <name>title</name>
      <value>
       <string>Just Test.</string>
      </value>
     </member>
     <member>
      <name>description</name>
      <value>
       <string>&lt;p&gt;Just Test wlw post.&lt;/p&gt;</string>
      </value>
     </member>
     <member>
      <name>categories</name>
      <value>
       <array>
        <data />
       </array>
      </value>
     </member>
    </struct>
   </value>
  </param>
  <param>
   <value>
    <boolean>1</boolean>
   </value>
  </param>
 </params>
</methodCall>
---------------------------------
修 改了xmlrpc 库 的client.py,改变了参数组织方式,使之像WLW捕获的那样有规律。
然后就已经支持:WordPress、cnblogs
注意:
1、 cnblogs必须指定blogid为字符串参数。如:blogid = "1"
---------------------------------51CTO 的xmlrpc 做 得很不标准,而且附加要求多。暂时还不能支持。调试中发现51CTO的几个问题:
1、经常会报告密码错误。(其实可能不是密码问题,当然也许与 blogid正确指定有关。通过wlw发布可以得到正确的blogid。)
2、发布后返回中文的错误码。中文打印的是UTF8编码。抽时间把打印 改下也许可以看到。估计是原创类型等未选择所致。3、查询分类列表也返回中文,而python对中文解析有问题,就报告xml不是良结构错误。 -----------------------------------vshare发布的时候有奇怪错误:
    r = getattr(self.server, methodname)(args)
  File "C:\Python31\lib\xmlrpc \client.py", line 1027, in __call__
    return self.__send(self.__name, args)
  File "C:\Python31\lib\xmlrpc \client.py", line 1269, in __request
    verbose=self.__verbose
  File "C:\Python31\lib\xmlrpc \client.py", line 1068, in request
    return self.parse_response(resp)
  File "C:\Python31\lib\xmlrpc \client.py", line 1167, in parse_response
    return u.close()
  File "C:\Python31\lib\xmlrpc \client.py", line 671, in close
    raise Fault(**self._stack[0])
xmlrpc .client.Fault: <Fault 0: '未将对象引用设置到对象的实例。'>
----------------------------------------
csdn:
xmlrpc .client.Fault: <Fault 0: '春节期间暂时关闭MetaAPI服务。'>
-----------------------------------------
cnblogs:
目 前不能支持category的文章发布。会遇到下面问题。
能够支持WordPress带category的发布,但是category不能生效。

cnblogs: 带上categories。
blog = pyblog.WordPress(posturl, username, password)
content = {"description":'Test description5', "title":'Test article5', "categories": u.split_to_list('【创作类型】:原创;IT生活-休闲', ';', '')}
blog.new_post(content, blogid = "1") #blogid = "479153")#

xmlrpc .client.Fault: <Fault 0: 'request contains struct member categories with m
issing value [request : parameter 4 : struct mapped to type Post]'>
categories 不应该再有param标签:<member>
<name>categories</name>
<param>
<value><string>??????????xb1???????:??????</string></value>
</param>
<param>
<value><string>IT????′?-???é?2
</string></value>
</param>
</member>
-------------------------------------------
图 片有格式的可能无法上传。
修改正则表达式,多加了一个.*?,问题解决。看起来无须匹配后面的>,可以再去掉一个.*?。顺手优化掉了。
如 下这种图片不能上传:
target=_blank><IMG 
style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" 
title=nothing alt="" 
src="WizDocument_53ecc76c3e3b661e1f9491be46d2e51d_files/nothing_550x477[1].jpg" 
width=550 height=477></A></P>
--------------------------------------------
支 持cnblogs修改的xmlrpc 位置:
        write("<value><array><data>\n")
        for v in value:
            dump(v, write)
        write("</data></array></value>\n")
修改后:       for v in value:
            write("<param>\n")
            dump(v, write)
            write("</param>\n")
----------------------------------------------------
一 直努力的目标终于达到了,博文发布工具支持发布文章到cnblogs。
这几天,由对xmlrpc 一窍不通,Python半调子,一直为了这个目标 努力奋斗,发现Python 3.1库中若干问题,最终修改Python 3.1库的xmlrpc 库client.py文件,支持了cnblogs 的文章发布。
这个过程中也体会到了异常处理与普通错误码判断相比的优势。
----------------------------------------------------Drupal 认为11是content type。
WLW也是一样的情况,它虽然只指定博客主页地址,检测出了日志发布接口,但发布的时候设置blogid为 1,也同样出错。
估计是这个drupal版本有问题。Traceback (most recent call last):
  File "BatchBlogPost\BlogPost.py", line 378, in <module>
    blog.new_post(content, blogid = "11") #blogid = "479153")#
  File "D:\Users\Desktop\Recent\BatchBlogPost\pyblog.py", line 197, in new_post
    return self.execute('metaWeblog.newPost', blogid, self.username, self.passwo
rd, content, publish)
  File "D:\Users\Desktop\Recent\BatchBlogPost\pyblog.py", line 140, in execute
    raise BlogError(fault.faultString)
pyblog.BlogError: Blog API module is not configured to support the 11 content ty
pe, or you don't have sufficient permissions to post this type of content.
-------------------------------------------------------
解 决了WordPress分类无法生效的问题:
正确的消息交互如下:

正确代码如 下:
第一次进行参数编码时,传入的是tuple(即:“()”),categories参数是list(即:"[]"),所以它们是完全可以区分 的。xmlrpc 库 没有作区分。
    def dump_array(self, value, write):
        i = id(value)
        if i in self.memo:
            raise TypeError("cannot marshal recursive sequences")
        self.memo[i] = None
        dump = self.__dump
        for v in value:
            write("<param>\n")
            dump(v, write)
            write("</param>\n")
        del self.memo[i]
    dispatch[tuple] = dump_array
     def dump_list(self, value, write):
        i = id(value)
        if i in self.memo:
            raise TypeError("cannot marshal recursive sequences")
        self.memo[i] = None
        dump = self.__dump
        write("<value><array><data>\n")
        for v in value:
            dump(v, write)
        write("</data></array></value>\n")
        del self.memo[i]
    dispatch[list] = dump_list
-----------------------------------------------------------
分 类问题解决后,再尝试一下51CTO,同时修改了py文件支持中文(昨天不支持中文)。
必须有的分类,选取两个:【创作类型:原创】;开发技术 -Web开发
~~~~~~~~~~
代码中增加# coding=cp936之后,出现异常:
SyntaxError: encoding problem: utf-8
改为:# coding=utf-8 之后,OK了。(用记事本修改coding,保存。直接在PyScripter中改可能有问题。)
最后的测试结果,51CTO博客发布OK。
但 是有点小问题,我写的是原创,但发布后显示为转载。
-----------------------------------------------------------
Ethereal 好像只抓取了报文头,不能显示报文体。
从Fiddler能看到报文和二进制数据:
下面是WLW  editPost的结果(能看到categories信息)

下面是WLW newPost的结果(看到的categories信息为空):
     <member>
      <name>categories</name>
      <value>
       <array>
        <data />
       </array>
      </value>
     </member>
如果我在Python中发布时也使用空的 categories,必定发送不成功,返回结果我猜想是“请选择原创类型”。
后来我突然发现,
WLW中的编码是:
<?xml version="1.0" encoding="gb2312"?>
<methodCall>
 <methodName>metaWeblog.newPost</methodName>
 <params>
而 Python发布时采用的是默认的utf-8。
于是,把编码改为gb2312,果然,再使用“”分类,发布的文章就是原创的了。
xmlrpc .client.ServerProxy(serverapi, encoding='gb2312', verbose=1)
注意:.py文件编码也要改为gb2312,改之后很容易遇到下面异常。
这 是由于BOM编码引起的,新建txt文件,用记事本把正确代码贴进去,注意写上gb2312,保存,就OK乐。
D:\Users\Desktop\Recent>python BatchBlogPost\BlogPost.py
  File "BatchBlogPost\BlogPost.py", line 2
SyntaxError: encoding problem: utf-8

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics