python xmlrpc_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("\n")

for v in value:

dump(v, write)

write("\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("\n")

for v in value:

dump(v, write)

write("\n")

del self.memo[i]

dispatch[tuple] = dump_array2

dispatch[list] = 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)

='1.0'?>

metaWeblog.newPost

<

param>

1

sinojelly

ring>

87345465

r>

description

Test description4n

title

Test article3<

/value>

1

ta>

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

hodCall>

metaWeblog.newPost

>

1

admin

lue>87345465

descript

ion

Test description4

r>

title

Test article3

1

am>

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

dCall>

metaWeblog.newPost

<

data>

1

sinojelly

<

value>87345465

descri

ption

Test description4

ber>

title

Test article3

r>

1

aram>

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

metaWeblog.newPost

479153

sinojelly

87345465

title

Just Test.

description

<p>Just Test wlw post.</p>

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:

issing value [request : parameter 4 : struct mapped to type Post]'>

categories不应该再有param标签:

categories

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

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

-------------------------------------------

图片有格式的可能无法上传。

修改正则表达式,多加了一个.*?,问题解决。看起来无须匹配后面的>,可以再去掉一个.*?。顺手优化掉了。

如下这种图片不能上传:

target=_blank>

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>

--------------------------------------------

支持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 the11 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("\n")

dump(v, write)

write("\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("\n")

for v in value:

dump(v, write)

write("\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信息为空):

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

-----------------------------------------------------------------------------------------


版权声明:本文为weixin_39929793原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。