Programmatic Access to Salesforce Article Properties in Confluence Cloud
Knowledge:Bridge stores Salesforce Article metadata data in Confluence Content Properties which can be accessed through the Confluence Rest API (through the “Get content properties for page“ or “Search content” endpoints).
Two entity properties are stored for each Confluence Page that has been published to Salesforce:
salesforce_publications_property
: This property stores information about the last publish of the Confluence page.

Attributes:
lastModifiedDate: Timestamp of last published date.
articleNumber: Unique number automatically assigned to Articles in Salesforce.
publishedBy: The latest Confluence User Account Id that published the article to Salesforce.
lastPublishedVersion: The latest Confluence version that was published to Salesforce.
salesforce_history_property
: This property stores an entry for each publish, unpublish and update metadata operation that was performed on the Page.

Attributes:
version: Confluence page version published to Salesforce.
user: Confluence user who published the Page.
action: The following values are possible.
PUBLISH
: Article was published as draft.PUBLISH_ONLINE
: Article was published as online.UPDATE_METADATA
: Article Metadata (categories, channels, custom fields, etc.) was updated as draft. More information can be extracted from oldMetadata and newMetadata.MAKE_ONLINE
: Draft article was update to online.UNPUBLISH
: Article was deleted from Salesforce.
Atlassian provides some tutorials about how to access the Confluence Rest API.
Example:
The following script is a sample python code to get a list of Published Pages that needs update in Salesforce (Page was updated in Confluence but that update was not send to Salesforce yet).
Example.py
# This code sample uses the 'requests' library:
# http://docs.python-requests.org
import optparse
import requests
from requests.auth import HTTPBasicAuth
import json
"""This script logins to the specified Confluence Cloud and retrieves a list of Published Pages that
needs update in Salesforce"""
def getRequestConfluence(url, user, api_token, query):
auth = HTTPBasicAuth(user, api_token)
headers = {
"Accept": "application/json"
}
response = requests.request(
"GET",
url,
headers=headers,
params=query,
auth=auth
)
return json.loads(response.text)
def getPublishedPages(user, api_token, cnf_url, space_key):
""" Get pages from a space"""
url = f"{cnf_url}/wiki/rest/api/search"
query = {
'cql': f"Type=page and space={space_key}",
'expand': "content.metadata.properties.salesforce_publications_property,content.version",
'limit': 100
}
pages = getRequestConfluence(url, user, api_token, query)
nextUrl = pages['_links']['next'] if 'next' in pages['_links'] else ''
return pages['results'], nextUrl
def getPublishedPagesUsingNextCursor(user, api_token, cnf_url, next_url):
""" Get pages from a space using next with cursor"""
url = f"{cnf_url}/wiki/{next_url}"
pagesCursor = getRequestConfluence(url, user, api_token,{})
nextUrlCursor = pagesCursor['_links']['next'] if 'next' in pagesCursor['_links'] else ''
return pagesCursor['results'], nextUrlCursor
def parse_args():
"""Generates command line arguments for the script."""
parser = optparse.OptionParser()
parser.add_option('-u', '--user', dest='user',
help='Username to access Confluence')
parser.add_option('-a', '--api_token', dest='api_token',
help='API TOKEN to access Confluence')
parser.add_option('-c', '--cnf', dest='cnf_url',
help='Confluence URL')
parser.add_option('-s', '--space_key', dest='space_key',
help='Space Key')
return parser.parse_args()
if __name__ == '__main__':
(options, args) = parse_args()
pages, nextUrl = getPublishedPages(options.user, options.api_token, options.cnf_url, options.space_key)
while nextUrl!= '':
pagesCursor, nextUrlCursor =getPublishedPagesUsingNextCursor(options.user, options.api_token, options.cnf_url, nextUrl)
nextUrl = nextUrlCursor
pages = pages + pagesCursor
print('Pages Published that needs update in Salesforce')
for page in pages:
titlePage = page['content']['title']
if not 'salesforce_publications_property' in page['content']['metadata']['properties']:
continue
articleNumber = page['content']['metadata']['properties']['salesforce_publications_property']['value']['sfdcFields']['articleNumber']
cnfVersion = page['content']['version']['number']
lastPublishedVersion = page['content']['metadata']['properties']['salesforce_publications_property']['value']['lastPublishedVersion']
if cnfVersion != lastPublishedVersion :
print('* Title: ' + titlePage + ', ArticleNumber: ' + articleNumber + ', Page Version: ' + str(cnfVersion) + ', Last Published Version: ' + str(lastPublishedVersion))
Example Output
python example.py --user xxxx --api_token xxxxxx --cnf xxx --space_key xxx
Pages Published that needs update in Salesforce
* Title: Page 2, ArticleNumber: 000001001, Page Version: 3, Last Published Version: 1