I am using a code which is present as a solution for updating Confluence Page in one of the discussions. The code which I am using is -
import argparse import getpass import sys import json import keyring import requests #----------------------------------------------------------------------------- # Globals BASE_URL = "http://confluence.XXXXX.com/rest/api/content" VIEW_URL = "http://confluence.XXXXX.com/pages/viewpage.action?pageId=" def pprint(data): ''' Pretty prints json data. ''' print json.dumps( data, sort_keys = True, indent = 4, separators = (', ', ' : ')) def get_page_ancestors(auth, pageid): # Get basic page information plus the ancestors property url = '{base}/{pageid}?expand=ancestors'.format( base = BASE_URL, pageid = pageid) r = requests.get(url, auth = auth) r.raise_for_status() return r.json()['ancestors'] def get_page_info(auth, pageid): url = '{base}/{pageid}'.format( base = BASE_URL, pageid = pageid) r = requests.get(url, auth = auth) r.raise_for_status() return r.json() def write_data(auth, html, pageid, title = None): info = get_page_info(auth, pageid) ver = int(info['version']['number']) + 1 ancestors = get_page_ancestors(auth, pageid) anc = ancestors[-1] del anc['_links'] del anc['_expandable'] del anc['extensions'] if title is not None: info['title'] = title data = { 'id' : str(pageid), 'type' : 'page', 'title' : info['title'], 'version' : {'number' : ver}, 'ancestors' : [anc], 'body' : { 'storage' : { 'representation' : 'storage', 'value' : str(html), } } } data = json.dumps(data) url = '{base}/{pageid}'.format(base = BASE_URL, pageid = pageid) r = requests.put( url, data = data, auth = auth, headers = { 'Content-Type' : 'application/json' } ) r.raise_for_status() print "Wrote '%s' version %d" % (info['title'], ver) print "URL: %s%d" % (VIEW_URL, pageid) def get_login(username = None): ''' Get the password for username out of the keyring. ''' if username is None: username = getpass.getuser() passwd = keyring.get_password('confluence_script', username) if passwd is None: passwd = getpass.getpass() keyring.set_password('confluence_script', username, passwd) return (username, passwd) def main(): parser = argparse.ArgumentParser() parser.add_argument( "-u", "--user", default = getpass.getuser(), help = "Specify the username to log into Confluence") parser.add_argument( "-t", "--title", default = None, type = str, help = "Specify a new title") parser.add_argument( "-f", "--file", default = None, type = str, help = "Write the contents of FILE to the confluence page") parser.add_argument( "pageid", type = int, help = "Specify the Conflunce page id to overwrite") parser.add_argument( "html", type = str, default = None, nargs = '?', help = "Write the immediate html string to confluence page") options = parser.parse_args() auth = get_login(options.user) if options.html is not None and options.file is not None: raise RuntimeError( "Can't specify both a file and immediate html to write to page!") if options.html: html = options.html else: with open(options.file, 'r') as fd: html = fd.read() write_data(auth, html, options.pageid, options.title) if __name__ == "__main__" : main()
Everything is working fine .I am creating a text file which contains the content that I want to update on Confluence page and then converting this file in the html format explicitly for posting on Confluence. But whenever there is any string like - "<scode>" in the html file I am getting requests.exceptions.HTTPError: 400 Client Error. My assumption is may be the API is not able to distinguish between the actual tags of html and string of this type(<scode>) and hence it is giving this error (Excuse me if I am wrong). But I can think of no other reason. Is there someone who can help me with this? I am juggling with this problem from so many days but can't find a solution
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.