Advertisement
Guest User

wordpresslib.py

a guest
Jul 15th, 2017
823
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.84 KB | None | 0 0
  1. """
  2.     wordpresslib.py
  3.    
  4.     WordPress xml-rpc client library
  5.     use MovableType API
  6.    
  7.     Copyright (c) 2011 Charles-Axel Dein
  8.     Copyright (c) 2005 Michele Ferretti
  9.    
  10.     This program is free software; you can redistribute it and/or
  11.     modify it under the terms of the GNU General Public License
  12.     as published by the Free Software Foundation; either version 2
  13.     of the License, or any later version.
  14.    
  15.     This program is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU General Public License for more details.
  19.    
  20.     You should have received a copy of the GNU General Public License
  21.     along with this program; if not, write to the Free Software
  22.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA   02111-1307, USA.
  23.  
  24.     XML-RPC supported methods:
  25.         * getUsersBlogs
  26.         * getUserInfo
  27.         * getPost
  28.         * getRecentPosts
  29.         * newPost
  30.         * editPost
  31.         * deletePost
  32.         * newMediaObject
  33.         * getCategoryList
  34.         * getPostCategories
  35.         * setPostCategories
  36.         * getTrackbackPings
  37.         * publishPost
  38.         * getPingbacks
  39.  
  40.     References:
  41.         * http://codex.wordpress.org/XML-RPC_Support
  42.         * http://www.sixapart.com/movabletype/docs/mtmanual_programmatic.html
  43.         * http://docs.python.org/lib/module-xmlrpclib.html
  44. """
  45.  
  46. __author__ = "Charles-Axel Dein <ca@d3in.org>"
  47. __version__ = "$Revision: 1.1 $"
  48. __date__ = "$Date: 2011/03/03 $"
  49. __copyright__ = "Copyright (c) 2005 Michele Ferretti, 2011 Charles-Axel Dein"
  50. __license__ = "LGPL"
  51.  
  52. #import exceptions
  53. import re
  54. import os
  55. from xmlrpc import client as xmlrpclib
  56. import datetime
  57. import time
  58. import mimetypes
  59. '''
  60. class WordPressException(exceptions.Exception):
  61.     """Custom exception for WordPress client operations
  62.     """
  63.     def __init__(self, obj):
  64.         if isinstance(obj, xmlrpclib.Fault):
  65.             self.id = obj.faultCode
  66.             self.message = obj.faultString
  67.         else:
  68.             self.id = 0
  69.             self.message = obj
  70.  
  71.     def __str__(self):
  72.         return '<%s %d: \'%s\'>' % (self.__class__.__name__, self.id, self.message)
  73. '''    
  74. class WordPressBlog:
  75.     """Represents blog item
  76.     """
  77.     def __init__(self):
  78.         self.id = ''
  79.         self.name = ''
  80.         self.url = ''
  81.         self.isAdmin = False
  82.        
  83. class WordPressUser:
  84.     """Represents user item
  85.     """
  86.     def __init__(self):
  87.         self.id = ''
  88.         self.firstName = ''
  89.         self.lastName = ''
  90.         self.nickname = ''
  91.         self.email = ''
  92.        
  93. class WordPressCategory:
  94.     """Represents category item
  95.     """
  96.     def __init__(self):
  97.         self.id = 0
  98.         self.name = ''
  99.         self.isPrimary = False
  100.    
  101. class WordPressPost:
  102.     """Represents post item
  103.     """
  104.     def __init__(self):
  105.         self.id = 0
  106.         self.title = ''
  107.         self.date = None
  108.         self.permaLink = ''
  109.         self.description = ''
  110.         self.textMore = ''
  111.         self.excerpt = ''
  112.         self.link = ''
  113.         self.categories = []
  114.         self.user = ''
  115.         self.allowPings = False
  116.         self.allowComments = False
  117.         self.tags = []
  118.         self.customFields = []
  119.  
  120.     def addCustomField(self, key, value):
  121.         kv = {'key':key, 'value':value}
  122.         self.customFields.append(kv)
  123.        
  124. class WordPressClient:
  125.     """Client for connect to WordPress XML-RPC interface
  126.     """
  127.    
  128.     def __init__(self, url, user, password):
  129.         self.url = url
  130.         self.user = user
  131.         self.password = password
  132.         self.blogId = 0
  133.         self.categories = None
  134.         self._server = xmlrpclib.ServerProxy(self.url)
  135.  
  136.     def _filterPost(self, post):
  137.         """Transform post struct in WordPressPost instance
  138.         """
  139.         postObj = WordPressPost()
  140.         postObj.permaLink       = post['permaLink']
  141.         postObj.description     = post['description']
  142.         postObj.title           = post['title']
  143.         postObj.excerpt         = post['mt_excerpt']
  144.         postObj.user            = post['userid']
  145.         postObj.date            = time.strptime(str(post['dateCreated']), "%Y%m%dT%H:%M:%S")
  146.         postObj.link            = post['link']
  147.         postObj.textMore        = post['mt_text_more']
  148.         postObj.allowComments   = post['mt_allow_comments'] == 1
  149.         postObj.id              = int(post['postid'])
  150.         postObj.categories      = post['categories']
  151.         postObj.allowPings      = post['mt_allow_pings'] == 1
  152.         postObj.tags            = post['mt_keywords']
  153.         postObj.customFields            = post['custom_fields']
  154.         return postObj
  155.        
  156.     def _filterCategory(self, cat):
  157.         """Transform category struct in WordPressCategory instance
  158.         """
  159.         catObj = WordPressCategory()
  160.         catObj.id           = int(cat['categoryId'])
  161.         catObj.name         = cat['categoryName']
  162.         if cat.has_key('isPrimary'):
  163.             catObj.isPrimary    = cat['isPrimary']
  164.         return catObj
  165.        
  166.     def selectBlog(self, blogId):
  167.         self.blogId = blogId
  168.        
  169.     def supportedMethods(self):
  170.         """Get supported methods list
  171.         """
  172.         return self._server.mt.supportedMethods()
  173.  
  174.     def getLastPost(self):
  175.         """Get last post
  176.         """
  177.         return tuple(self.getRecentPosts(1))[0]
  178.            
  179.     def getRecentPosts(self, numPosts=5):
  180.         """Get recent posts
  181.         """
  182.         try:
  183.             posts = self._server.metaWeblog.getRecentPosts(self.blogId, self.user,
  184.                                                     self.password, numPosts)
  185.             for post in posts:
  186.                 yield self._filterPost(post)   
  187.         except:# xmlrpclib.Fault, fault:
  188.             print("getRecentPosts failed")#None#raise WordPressException(fault)
  189.            
  190.     def getPost(self, postId):
  191.         """Get post item
  192.         """
  193.         try:
  194.             return self._filterPost(self._server.metaWeblog.getPost(str(postId), self.user, self.password))
  195.         except:# xmlrpclib.Fault, fault:
  196.             print("getPost failed")#None#raise WordPressException(fault)
  197.        
  198.     def getUserInfo(self):
  199.         """Get user info
  200.         """
  201.         try:
  202.             userinfo = self._server.blogger.getUserInfo('', self.user, self.password)
  203.             userObj = WordPressUser()
  204.             userObj.id = userinfo['userid']
  205.             userObj.firstName = userinfo['firstname']
  206.             userObj.lastName = userinfo['lastname']
  207.             userObj.nickname = userinfo['nickname']
  208.             userObj.email = userinfo['email']
  209.             return userObj
  210.         except:# xmlrpclib.Fault, fault:
  211.             print("getUserInfo failed")#None#raise WordPressException(fault)
  212.            
  213.     def getUsersBlogs(self):
  214.         """Get blog's users info
  215.         """
  216.         try:
  217.             blogs = self._server.blogger.getUsersBlogs('', self.user, self.password)
  218.             for blog in blogs:
  219.                 blogObj = WordPressBlog()
  220.                 blogObj.id = blog['blogid']
  221.                 blogObj.name = blog['blogName']
  222.                 blogObj.isAdmin = blog['isAdmin']
  223.                 blogObj.url = blog['url']
  224.                 yield blogObj
  225.         except:# xmlrpclib.Fault, fault:
  226.             print("getUsersBlogs failed")#None#raise WordPressException(fault)
  227.            
  228.     def newPost(self, post, publish):
  229.         """Insert new post
  230.         """
  231.         blogContent = {
  232.             'title' : post.title,
  233.             'description' : post.description,
  234.             'mt_keywords': post.tags,
  235.             'custom_fields': post.customFields,
  236.         }
  237.        
  238.         # add categories
  239.         i = 0
  240.         categories = []
  241.         for cat in post.categories:
  242.             if i == 0:
  243.                 categories.append({'categoryId' : cat, 'isPrimary' : 1})
  244.             else:
  245.                 categories.append({'categoryId' : cat, 'isPrimary' : 0})
  246.             i += 1
  247.        
  248.         # insert new post
  249.         idNewPost = int(self._server.metaWeblog.newPost(self.blogId, self.user, self.password, blogContent, 0))
  250.        
  251.         # set categories for new post
  252.         self.setPostCategories(idNewPost, categories)
  253.        
  254.         # publish post if publish set at True
  255.         if publish:
  256.             self.publishPost(idNewPost)
  257.            
  258.         return idNewPost
  259.        
  260.     def getPostCategories(self, postId):
  261.         """Get post's categories
  262.         """
  263.         try:
  264.             categories = self._server.mt.getPostCategories(postId, self.user,
  265.                                                     self.password)
  266.             for cat in categories:
  267.                 yield self._filterCategory(cat)
  268.         except:# xmlrpclib.Fault, fault:
  269.             print("getPostCategories failed")#None#raise WordPressException(fault)
  270.  
  271.     def setPostCategories(self, postId, categories):
  272.         """Set post's categories
  273.         """
  274.         self._server.mt.setPostCategories(postId, self.user, self.password, categories)
  275.    
  276.     def editPost(self, postId, post, publish):
  277.         """Edit post
  278.         """
  279.         blogcontent = {
  280.             'title' : post.title,
  281.             'description' : post.description,
  282.             'permaLink' : post.permaLink,
  283.             'mt_allow_pings' : post.allowPings,
  284.             'mt_text_more' : post.textMore,
  285.             'mt_excerpt' : post.excerpt
  286.         }
  287.        
  288.         if post.date:
  289.             blogcontent['dateCreated'] = xmlrpclib.DateTime(post.date)
  290.        
  291.         # add categories
  292.         i = 0
  293.         categories = []
  294.         for cat in post.categories:
  295.             if i == 0:
  296.                 categories.append({'categoryId' : cat, 'isPrimary' : 1})
  297.             else:
  298.                 categories.append({'categoryId' : cat, 'isPrimary' : 0})
  299.             i += 1               
  300.        
  301.         result = self._server.metaWeblog.editPost(postId, self.user, self.password,
  302.                                               blogcontent, 0)
  303.        
  304.         if result == 0:
  305.             print("editPost failed")#None#raise WordPressException('Post edit failed')
  306.            
  307.         # set categories for new post
  308.         self.setPostCategories(postId, categories)
  309.        
  310.         # publish new post
  311.         if publish:
  312.             self.publishPost(postId)
  313.  
  314.     def deletePost(self, postId):
  315.         """Delete post
  316.         """
  317.         try:
  318.             return self._server.blogger.deletePost('', postId, self.user,
  319.                                              self.password)
  320.         except:# xmlrpclib.Fault, fault:
  321.             print("deletePost failed")#None#raise WordPressException(fault)
  322.  
  323.     def getCategoryList(self):
  324.         """Get blog's categories list
  325.         """
  326.         try:
  327.             if not self.categories:
  328.                 self.categories = []
  329.                 categories = self._server.mt.getCategoryList(self.blogId,
  330.                                                 self.user, self.password)              
  331.                 for cat in categories:
  332.                     self.categories.append(self._filterCategory(cat))  
  333.  
  334.             return self.categories
  335.         except:# xmlrpclib.Fault, fault:
  336.             print("getCategoryList failed")#None#raise WordPressException(fault)       
  337.  
  338.     def getCategoryIdFromName(self, name):
  339.         """Get category id from category name
  340.         """
  341.         for c in self.getCategoryList():
  342.             if c.name == name:
  343.                 return c.id
  344.        
  345.     def getTrackbackPings(self, postId):
  346.         """Get trackback pings of post
  347.         """
  348.         try:
  349.             return self._server.mt.getTrackbackPings(postId)
  350.         except:# xmlrpclib.Fault, fault:
  351.             print("getTrackbackPings failed")#None#raise WordPressException(fault)
  352.            
  353.     def publishPost(self, postId):
  354.         """Publish post
  355.         """
  356.         try:
  357.             return (self._server.mt.publishPost(postId, self.user, self.password) == 1)
  358.         except:# xmlrpclib.Fault, fault:
  359.             print("publishPost failed")#None#raise WordPressException(fault)
  360.  
  361.     def getPingbacks(self, postUrl):
  362.         """Get pingbacks of post
  363.         """
  364.         try:
  365.             return self._server.pingback.extensions.getPingbacks(postUrl)
  366.         except:# xmlrpclib.Fault, fault:
  367.             print("getPingbacks failed")#None#raise WordPressException(fault)
  368.            
  369.     def newMediaObject(self, mediaFileName):
  370.         """Add new media object (image, movie, etc...)
  371.         """
  372.         try:
  373.             f = open(mediaFileName, 'rb')
  374.             mediaBits = f.read()
  375.             f.close()
  376.  
  377.             mimetype = 'unknown/unknown'
  378.             mimeguess = mimetypes.guess_type(mediaFileName)
  379.             if mimeguess and mimeguess[0]:
  380.                 mimetype = mimeguess[0]
  381.  
  382.             mediaStruct = {
  383.                 'name' : os.path.basename(mediaFileName),
  384.                 'type' : mimetype,
  385.                 'bits' : xmlrpclib.Binary(mediaBits)
  386.             }
  387.            
  388.             result = self._server.metaWeblog.newMediaObject(self.blogId,
  389.                                         self.user, self.password, mediaStruct)
  390.             return result['url']   
  391.         except:# xmlrpclib.Fault, fault:
  392.             print("newMediaObject failed")#None#raise WordPressException(fault)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement