From 16134fa5f1e7209afeb64768ce8fdbdf11227a11 Mon Sep 17 00:00:00 2001 From: "michele.ferretti" Date: Sat, 29 Jul 2006 08:00:50 +0000 Subject: [PATCH] git-svn-id: http://wordpress-library.googlecode.com/svn/trunk@3 c225be49-b319-0410-8457-91322dc61715 --- azzo.py | 8 --- prove.py | 90 -------------------------------- prove.py.bak | 90 -------------------------------- start_proxy.bat | 1 - wordpresslib.py.old | 77 --------------------------- wordpresslib.pyc | Bin 12233 -> 0 bytes wordpresslib.zip | Bin 33965 -> 0 bytes xmlrpc-debug-proxy.py | 141 -------------------------------------------------- 8 files changed, 407 deletions(-) delete mode 100644 azzo.py delete mode 100644 prove.py delete mode 100644 prove.py.bak delete mode 100644 start_proxy.bat delete mode 100644 wordpresslib.py.old delete mode 100644 wordpresslib.pyc delete mode 100644 wordpresslib.zip delete mode 100644 xmlrpc-debug-proxy.py diff --git a/azzo.py b/azzo.py deleted file mode 100644 index a635907..0000000 --- a/azzo.py +++ /dev/null @@ -1,8 +0,0 @@ -import wordpresslib -url = 'http://www.miosito.it/wordpress/xmlrpc.php' -wp = wordpresslib.WordPressClient(url, 'username', 'password') -wp.selectBlog(0) -post = wordpresslib.WordPressPost() -post.title = 'Titolo del post' -post.description = 'Testo del post' -idPost = wp.newPost(post, True) diff --git a/prove.py b/prove.py deleted file mode 100644 index 5be3e12..0000000 --- a/prove.py +++ /dev/null @@ -1,90 +0,0 @@ - -import wordpresslib - -import sys, time -import datetime - -wp = wordpresslib.WordPressClient('http://localhost:16081/blog/xmlrpc.php', 'michele', '010779') -wp.selectBlog(0) - -print '========================= newPost =========================' -p = wordpresslib.WordPressPost() -p.categories = (wp.getCategoryIdFromName('Progetti'),) -print p.categories - -""" -print '========================= getUserInfo =========================' -user = wp.getUserInfo() -print 'userid:', user.id -print 'firstName:', user.firstName -print 'lastName:', user.lastName -print 'nickname:', user.nickname -print 'email:', user.email - -print '========================= getUsersBlogs =========================' -blogs = wp.getUsersBlogs() -for blog in blogs: - print 'blogId:', blog.id - print 'name:', blog.name - print 'url:', blog.url - print 'isAdmin:', blog.isAdmin - print - -print '========================= getRecentPosts =========================' -for post in wp.getRecentPosts(3): - print '%d => %s' % (post.id, post.title) - -print '========================= getCategoryList =========================' -categories = list(wp.getCategoryList()) -for i in categories: - print '%d , %s , %d' % (i.id, i.name, i.isPrimary) - -print '========================= newPost =========================' -p = WordPressPost() -p.title = 'Azzo' -p.description = 'Testo prova del gatto !!!!' -p.categories = (wp.getCategoryIdFromName('Progetti'),) -idNewPost = wp.newPost(p, False) -if not idNewPost: - sys.exit() -print idNewPost - -print '========================= publishPost =========================' -print wp.publishPost(idNewPost) - -print '========================= getPost =========================' -post = wp.getPost(idNewPost) -print '%d %s %s' % (post.id, post.title, post.date) - -print '========================= editPost =========================' -p = WordPressPost() -p.title = 'Azzo (modificato)' - -now = datetime.datetime.now() -p.date = (now + datetime.timedelta(days=1)).timetuple() -print p.date - -p.description = 'Testo prova del gatto !!!!' -p.categories = map(wp.getCategoryIdFromName, ('Python', 'Progetti')) -wp.editPost(idNewPost, p, True) - -print '========================= getPost =========================' -post = wp.getPost(idNewPost) -print '%d %s %s' % (post.id, post.title, post.date) - - -print '========================= getPostCategories =========================' -for i in wp.getPostCategories(idNewPost): - print '%d , %s , %d' % (i.id, i.name, i.isPrimary) - -print '========================= getTrackbackPings =========================' -print wp.getTrackbackPings(idNewPost) - -#print '========================= deletePost =========================' -print wp.deletePost(idNewPost) - -print '========================= getLastPost =========================' -post = wp.getLastPost() -print '%d %s %s' % (post.id, post.title, post.date) - -""" diff --git a/prove.py.bak b/prove.py.bak deleted file mode 100644 index 8051816..0000000 --- a/prove.py.bak +++ /dev/null @@ -1,90 +0,0 @@ - -import wordpresslib - -import sys, time -import datetime - -wp = wordpresslib.WordPressClient('http://localhost:16081/blog/xmlrpc.php', 'michele', '010779') -wp.selectBlog(0) - -print '========================= newPost =========================' -p = wordpresslib.WordPressPost() -p.categories = (wp.getCategoryIdFromName('Progetti-'),) -print p.categories - -""" -print '========================= getUserInfo =========================' -user = wp.getUserInfo() -print 'userid:', user.id -print 'firstName:', user.firstName -print 'lastName:', user.lastName -print 'nickname:', user.nickname -print 'email:', user.email - -print '========================= getUsersBlogs =========================' -blogs = wp.getUsersBlogs() -for blog in blogs: - print 'blogId:', blog.id - print 'name:', blog.name - print 'url:', blog.url - print 'isAdmin:', blog.isAdmin - print - -print '========================= getRecentPosts =========================' -for post in wp.getRecentPosts(3): - print '%d => %s' % (post.id, post.title) - -print '========================= getCategoryList =========================' -categories = list(wp.getCategoryList()) -for i in categories: - print '%d , %s , %d' % (i.id, i.name, i.isPrimary) - -print '========================= newPost =========================' -p = WordPressPost() -p.title = 'Azzo' -p.description = 'Testo prova del gatto !!!!' -p.categories = (wp.getCategoryIdFromName('Progetti'),) -idNewPost = wp.newPost(p, False) -if not idNewPost: - sys.exit() -print idNewPost - -print '========================= publishPost =========================' -print wp.publishPost(idNewPost) - -print '========================= getPost =========================' -post = wp.getPost(idNewPost) -print '%d %s %s' % (post.id, post.title, post.date) - -print '========================= editPost =========================' -p = WordPressPost() -p.title = 'Azzo (modificato)' - -now = datetime.datetime.now() -p.date = (now + datetime.timedelta(days=1)).timetuple() -print p.date - -p.description = 'Testo prova del gatto !!!!' -p.categories = map(wp.getCategoryIdFromName, ('Python', 'Progetti')) -wp.editPost(idNewPost, p, True) - -print '========================= getPost =========================' -post = wp.getPost(idNewPost) -print '%d %s %s' % (post.id, post.title, post.date) - - -print '========================= getPostCategories =========================' -for i in wp.getPostCategories(idNewPost): - print '%d , %s , %d' % (i.id, i.name, i.isPrimary) - -print '========================= getTrackbackPings =========================' -print wp.getTrackbackPings(idNewPost) - -#print '========================= deletePost =========================' -print wp.deletePost(idNewPost) - -print '========================= getLastPost =========================' -post = wp.getLastPost() -print '%d %s %s' % (post.id, post.title, post.date) - -""" diff --git a/start_proxy.bat b/start_proxy.bat deleted file mode 100644 index 7eb1a55..0000000 --- a/start_proxy.bat +++ /dev/null @@ -1 +0,0 @@ -python xmlrpc-debug-proxy.py localhost 8081 \ No newline at end of file diff --git a/wordpresslib.py.old b/wordpresslib.py.old deleted file mode 100644 index 0073d9a..0000000 --- a/wordpresslib.py.old +++ /dev/null @@ -1,77 +0,0 @@ - -import xmlrpclib - -class WordPress: - """WordPress XML-RPC client""" - - def __init__(self, xmlrpc_url, userid, password): - self.xmlrpc_url = xmlrpc_url - self.server = xmlrpclib.ServerProxy(self.xmlrpc_url) - self.userid = userid - self.password = password - - def getBlog(self, blog_id): - return Blog(self, str(blog_id)) - - def listMethods(self): - return self.server.system.listMethods() - - def helpMethods(self): - for i in self.server.system.listMethods(): - print '%s => %s' % (i, self.server.system.methodSignature(i)) - - -class Blog: - """WordPress XML-RPC client""" - - def __init__(self, wp, blog_id): - self.wp = wp - self.blog_id = blog_id - - def getCategoryList(self): - cats_list = self.wp.server.mt.getCategoryList(self.blog_id, - self.wp.userid, self.wp.password) - categories = {} - for cat in cats_list: - categories[cat['categoryName']] = int(cat['categoryId']) - return categories - - def newPost(self, categories, title, description, publish): - blogcontent = {'title':title, 'description':description} - - i = 0 - blogcategories = [] - for n in categories: - if i == 0: - blogcategories.append({'categoryId':n, 'isPrimary':1}) - else: - blogcategories.append({'categoryId':n, 'isPrimary':0}) - i += 1 - - blogpost = self.wp.server.metaWeblog.newPost(self.blog_id, self.wp.userid, - self.wp.password, blogcontent, publish) - - self.setPostCategories(blogpost, blogcategories) - return blogpost - - def setPostCategories(self, postID, categories): - return self.wp.server.mt.setPostCategories(postID, self.wp.userid, - self.wp.password, categories) - - - -if __name__ == '__main__': - - try: - wp = WordPress('http://localhost:8081/wordpress/xmlrpc.php', 'michele', '010779') - b = wp.getBlog(1) - - # lista categorie - cats = b.getCategoryList() - print cats - - # nuovo post - print b.newPost([cats['Questo sito']], 'Titolo', 'Testo', True) - - except Exception, e: - print e diff --git a/wordpresslib.pyc b/wordpresslib.pyc deleted file mode 100644 index ab1bf83ca8cbaa00874c7c472382efc7701808fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 12233 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 diff --git a/wordpresslib.zip b/wordpresslib.zip deleted file mode 100644 index 140c29ce25d1b54a407086011c47c78d0e4e734f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 33965 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 jBc&L_wL?d#x3h-tHdz~E!8-eP@nn64O+_>94 diff --git a/xmlrpc-debug-proxy.py b/xmlrpc-debug-proxy.py deleted file mode 100644 index d7d7450..0000000 --- a/xmlrpc-debug-proxy.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/python - -"""HTTP debugging proxy - -(Presumably) originally by Sam Rushing - http://www.nightmare.com/medusa/programming.html - -Modified by Phillip Pearson - http://www.myelin.co.nz/notes/xmlrpc-debug-proxy.html - (Changes placed in the public domain; do what you will) - - -A very small proxy for HTTP that dumps out what it sees, so you can debug your -XML-RPC without having to decipher the output from a packet sniffer. - -This is basically the proxy used in the Medusa asynchronous sockets tutorial -(available on http://www.nightmare.com/medusa/programming.html) with a minor -adjustment to make it flush its buffers before closing any connections. Without -that it will drop off important things like :) - -Syntax: xmlrpc-debug-proxy.py - -This will listen on port 8000+ and proxy through to : - -e.g. 'aproxy.py localhost 80' listens on localhost:8080 and proxies through to - the local web server on port 80. - -To debug stuff connecting to Radio, run 'xmlrpc-debug-proxy.py localhost 5335' -and point your scripts at http://localhost:13335/RPC2 (instead of -http://localhost:5335/RPC2) - -""" - -import asynchat -import asyncore -import socket -import string - -class proxy_server (asyncore.dispatcher): - - def __init__ (self, host, port): - asyncore.dispatcher.__init__ (self) - self.create_socket (socket.AF_INET, socket.SOCK_STREAM) - self.set_reuse_addr() - self.there = (host, port) - here = ('', port + 8000) - self.bind (here) - self.listen (5) - - def handle_accept (self): - print 'New connection' - proxy_receiver (self, self.accept()) - -class proxy_sender (asynchat.async_chat): - - "Sends data to the server" - - def __init__ (self, receiver, address): - asynchat.async_chat.__init__ (self) - self.receiver = receiver - self.set_terminator (None) - self.create_socket (socket.AF_INET, socket.SOCK_STREAM) - self.buffer = '' - self.set_terminator ('\n') - self.connect (address) - - def handle_connect (self): - print 'Sender connected' - - def collect_incoming_data (self, data): - self.buffer = self.buffer + data - - def found_terminator (self): - data = self.buffer - self.buffer = '' - print '==> (%d) %s' % (self.id, repr(data)) - self.receiver.push (data + '\n') - - def handle_close (self): - print 'Sender closing (inbuf len %d (%s), ac_in %d, ac_out %d )' % ( - len( self.buffer ), - self.buffer, - len( self.ac_in_buffer ), - len( self.ac_out_buffer ) - ) - - if len( self.buffer ): - self.found_terminator() - - self.receiver.close_when_done() - self.close() - -class proxy_receiver (asynchat.async_chat): - - "Receives data from the caller" - - channel_counter = 0 - - def __init__ (self, server, (conn, addr)): - asynchat.async_chat.__init__ (self, conn) - self.set_terminator ('\n') - self.server = server - self.id = self.channel_counter - self.channel_counter = self.channel_counter + 1 - self.sender = proxy_sender (self, server.there) - self.sender.id = self.id - self.buffer = '' - - def collect_incoming_data (self, data): - self.buffer = self.buffer + data - - def found_terminator (self): - import re - data = re.sub( r'\:8080', '', self.buffer ) - data = re.sub( r'localhost', self.server.there[0], data ) - self.buffer = '' - print '<== (%d) %s' % (self.id, repr(data)) - self.sender.push (data + '\n') - - def handle_close (self): - print 'Receiver closing (inbuf len %d (%s), ac_in %d, ac_out %d )' % ( - len( self.buffer ), - self.buffer, - len( self.ac_in_buffer ), - len( self.ac_out_buffer ) - ) - - if len( self.buffer ): - self.found_terminator() - - self.sender.close_when_done() - self.close() - -if __name__ == '__main__': - import sys - import string - if len(sys.argv) < 3: - print 'Usage: %s ' % sys.argv[0] - else: - ps = proxy_server (sys.argv[1], string.atoi (sys.argv[2])) - asyncore.loop() -- 2.11.4.GIT