设为首页 收藏本站
查看: 1164|回复: 0

[经验分享] Python的xmlrpc调试

[复制链接]

尚未签到

发表于 2015-4-22 09:08:37 | 显示全部楼层 |阅读模式
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 = None
        dump = self.__dump
        write("\n")
        for v in value:
            dump(v, write)
        write("\n")
        del self.memo

     def dump_array(self, value, write):
        i = id(value)
        if i in self.memo:
            raise TypeError("cannot marshal recursive sequences")
        self.memo = None
        dump = self.__dump
        write("\n")
        for v in value:
            dump(v, write)
        write("\n")
        del self.memo
    dispatch[tuple] = dump_array2
    dispatch
    = dump_array2
    则,参数类型不匹配的告警没了,但是有参数个数不匹配告警。
    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)



    metaWeblog.newPost

    <
    param>

    1
    sinojelly
    87345465


    description
    Test description4n

    title
    Test article3<
    /value>


    1




    向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)



    metaWeblog.newPost



    1
    admin
    87345465


    descript
    ion
    Test description4


    title
    Test article3



    1




    向51CTO发送的数据:
    POST /xmlrpc.php HTTP/1.1
    Host: sinojelly.blog.iyunv.com
    Accept-En
    coding: identity
    Content-Length: 518
    Content-Type: text/xml
    User-Agent:
    xmlrpclib.py/1.0.1 (by www.pythonware.com)



    metaWeblog.newPost


    <
    data>
    1
    sinojelly
    <
    value>87345465


    descri
    ption
    Test description4


    title
    Test article3


    1




    WLW向51CTO发布成功的报文:
    POST http://sinojelly.blog.iyunv.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.iyunv.com
    Content-Length: 950
    Connection: Close



    metaWeblog.newPost

      
       
        479153
       
      
      
       
        sinojelly
       
      
      
       
        87345465
       
      
      
       
       
         
          title
          
           Just Test.
          
         
         
          description
          
           &lt;p&gt;Just Test wlw post.&lt;/p&gt;
          
         
         
          categories
          
          
            
          
          
         
       
       
      
      
       
        1
       
      


    ---------------------------------
    修改了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:
    ----------------------------------------
    csdn:
    xmlrpc.client.Fault:
    -----------------------------------------
    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:
    categories不应该再有param标签:

    categories

    ??????????xb1???????:??????


    IT????′?-???é?2



    -------------------------------------------
    图片有格式的可能无法上传。
    修改正则表达式,多加了一个.*?,问题解决。看起来无须匹配后面的>,可以再去掉一个.*?。顺手优化掉了。
    如下这种图片不能上传:
    target=_blank>
    --------------------------------------------
    支持cnblogs修改的xmlrpc位置:
            write("\n")
            for v in value:
                dump(v, write)
            write("\n")
    修改后:
           for v in value:
                write("\n")
                dump(v, write)
                write("\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
        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分类无法生效的问题:
    正确的消息交互如下:
    DSC0000.png
    正确代码如下:
    第一次进行参数编码时,传入的是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 = None
            dump = self.__dump
            for v in value:
                write("\n")
                dump(v, write)
                write("\n")
            del self.memo
        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 = None
            dump = self.__dump
            write("\n")
            for v in value:
                dump(v, write)
            write("\n")
            del self.memo
        dispatch
      = 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信息)
      DSC0001.png
      下面是WLW newPost的结果(看到的categories信息为空):
           
            categories
            
            
              
            
            
           
      如果我在Python中发布时也使用空的categories,必定发送不成功,返回结果我猜想是“请选择原创类型”。
      后来我突然发现,
      WLW中的编码是:


      metaWeblog.newPost

      而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
      -----------------------------------------------------------------------------------------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59473-1-1.html 上篇帖子: Python数据结构与算法--数据类型 下篇帖子: C++使用ffpython嵌入和扩展python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表