Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

The Python code listed below are examples on how to extract Confluence users to CSV or XLSX export format via REST API and servlets.

The steps to create a CSV file are as follows:

  1. Search and extract Confluence users via search endpoint.

  2. Send search result to file generation endpoint.

  3. Download file from Confluence via download servlet.

The Python code examples listed below can be saved as a file and executed via Python.

These scripts should be executed with credentials from a Confluence user with administrator or system administrator global permissions.

Please change the following variables to match custom Confluence setup:

  • CONFLUENCE_USERNAME = Confluence username

  • CONFLUENCE_PASSWORD = Confluence password

  • CONFLUENCE_BASEURL = Confluence url eg. https://jira.yourdomain.com

  • CONFLUENCE_CSV_FILE_NAME = Name of the file to generate

To alter the search change these variables:

  • CONFLUENCE_USER_EXPORT_SEARCH_TERM

  • CONFLUENCE_USER_EXPORT_ACTIVE_USERS

  • CONFLUENCE_USER_EXPORT_INACTIVE_USERS

  • CONFLUENCE_USER_EXPORT_OFFSET

  • CONFLUENCE_USER_EXPORT_PAGESIZE

It possible to use Python 2.7 or Python 3 so please use the Python code that will suite your needs.

CSV files

 Create CSV file with Python 2...

# -*- coding: utf-8 -*-
'''
Creates a full Confluence user export as CSV
1. IMPORTANT: should be executed with Python 2.7 interpreter
2. Change the username, password and baseurl variables to match custom Confluence
3. Execution from terminal: python create_full_export_csv_python2_7.py
4. A new file named confluence-users.csv will be created in this directory
'''
import urllib
import urllib2
import json
import base64

# CHANGE THESE VARIABLES
CONFLUENCE_USERNAME = "admin"
CONFLUENCE_PASSWORD = "admin"
CONFLUENCE_BASEURL = "http://localhost:1990/confluence"
CONFLUENCE_CSV_FILE_NAME = "confluence-users.csv"

# SEARCH VARIABLES
# eg. "admin" or "admin@admin.com"
CONFLUENCE_USER_EXPORT_SEARCH_TERM = ""
# True if enabled users is to be searched
CONFLUENCE_USER_EXPORT_ACTIVE_USERS = True
# True if disabled users is to be searched
CONFLUENCE_USER_EXPORT_INACTIVE_USERS = True
# Starting offset is 0
CONFLUENCE_USER_EXPORT_OFFSET = 0
# Pagesize. 100 is max page size
CONFLUENCE_USER_EXPORT_PAGESIZE = 50

CONFLUENCE_USER_EXPORT_SEARCH = "/rest/confluenceuserexport/1.0/search"
CONFLUENCE_USER_EXPORT_CSV = "/rest/confluenceuserexport/1.0/file/csv"
CONFLUENCE_USER_EXPORT_DOWNLOAD = "/plugins/servlet/confluenceuserexport/admin/download"
JSON_MIME_TYPE = "application/json"
BASIC_AUTH = "Basic " + base64.b64encode('%s:%s' % (CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD))

all_users = []


def search_users(search_string, active_users, inactive_users, page_size, offset):
    '''
    Search for Confluence user with the given parameters
    :param search_string: the given search string
    :param active_users: true if active users
    :param inactive_users: true if inactive users 
    :param page_size: the given page size eg. 20
    :param offset: the given offset eg. 0
    :return: None
    '''''
    header = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_SEARCH
    body = {"searchString":search_string,
            "activeUsers":active_users,
            "inActiveUsers":inactive_users,
            "pageSize":page_size,
            "offset":offset
            }
    json_body = json.dumps(body)
    post_request = urllib2.Request(url, json_body, header)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = urllib2.urlopen(post_request)
        post_response = post_request_open.read()
        if post_response:
            json_response = json.loads(s=post_response)
            if json_response:
                found_users = json_response.get("users")
                # Check for next page of users in order to search for more users
                has_next_page = json_response.get("hasNextPage")
                for found_user in found_users:
                    all_users.append(found_user)
                if has_next_page:
                    search_users(search_string, active_users, inactive_users, page_size, (offset + page_size))
    except urllib2.HTTPError as e:
        print(e.getcode())


def get_csv_file(file_name):
    '''
    Get CSV file by file name from Confluence temp directory
    :param file_name: the name of the file to get from Confluence temp directory
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_DOWNLOAD
    request_parameters = {'fileName':file_name}
    get_request = urllib2.Request(url=request_url + "?" + urllib.urlencode(request_parameters),
                                   headers=request_headers)
    get_request.get_method = lambda: 'GET'
    try:
        get_request_open = urllib2.urlopen(get_request)
        get_response = get_request_open.read()
        if (get_response):
            with open(CONFLUENCE_CSV_FILE_NAME, 'wb') as csv_file:
                csv_file.write(get_response)
    except urllib2.HTTPError as e:
        print(e.getcode())


def create_csv_file(users_as_json):
    '''
    Send JSON content to CSV REST endpoint
    :param users_as_json: the Confluence users as JSON
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_CSV
    post_request = urllib2.Request(url=request_url,
                                   data=users_as_json,
                                   headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = urllib2.urlopen(post_request)
        post_response = post_request_open.read()
        if post_response:
            json_data = json.loads(post_response)
            if json_data and json_data.get("fileName"):
                get_csv_file(file_name=json_data.get("fileName"))
    except urllib2.HTTPError as e:
        print(e.getcode())


# Start searching
search_users(search_string=CONFLUENCE_USER_EXPORT_SEARCH_TERM,
             active_users=CONFLUENCE_USER_EXPORT_ACTIVE_USERS,
             inactive_users=CONFLUENCE_USER_EXPORT_INACTIVE_USERS,
             page_size=CONFLUENCE_USER_EXPORT_PAGESIZE,
             offset=CONFLUENCE_USER_EXPORT_OFFSET)


all_users_json = json.dumps(all_users)
# Create CSV file with users
create_csv_file(users_as_json=all_users_json)
 Create CSV file with Python 3...

# -*- coding: utf-8 -*-
'''
Creates a full Confluence user export as CSV
1. IMPORTANT: should be executed with Python 3 interpreter
2. Change the username, password and baseurl variables to match custom Confluence
3. Execution from terminal: python3 create_full_export_csv_python3.py
4. A new file named confluence_users.csv is now available in current directory
'''
from urllib import request, parse, error
import json
import base64

# CHANGE THESE VARIABLES
CONFLUENCE_USERNAME = "admin"
CONFLUENCE_PASSWORD = "admin"
CONFLUENCE_BASEURL = "http://localhost:1990/confluence"
CONFLUENCE_CSV_FILE_NAME = "confluence-users.csv"

# Search variables
# eg. "admin" or "admin@admin.com"
CONFLUENCE_USER_EXPORT_SEARCH_TERM = ""
# True if enabled users is to be searched
CONFLUENCE_USER_EXPORT_ACTIVE_USERS = True
# True if disabled users is to be searched
CONFLUENCE_USER_EXPORT_INACTIVE_USERS = True
# Starting offset is 0
CONFLUENCE_USER_EXPORT_OFFSET = 0
# Pagesize. 100 is max page size
CONFLUENCE_USER_EXPORT_PAGESIZE = 20

CONFLUENCE_USER_EXPORT_SEARCH = "/rest/confluenceuserexport/1.0/search"
CONFLUENCE_USER_EXPORT_CSV_SERVLET = "/rest/confluenceuserexport/1.0/file/csv"
CONFLUENCE_USER_EXPORT_DOWNLOAD = "/plugins/servlet/confluenceuserexport/admin/download"
JSON_MIME_TYPE = "application/json"
BASIC_AUTH = "Basic " + base64.b64encode(bytes('%s:%s' % (CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD), 'utf-8')).decode('utf-8')
all_users = []


def search_users(search_string, active_users, inactive_users, page_size, offset):
    '''
    Search for Confluence user with the given parameters
    :param search_string: the given search string
    :param active_users: true if active users
    :param inactive_users: true if inactive users
    :param page_size: the given page size eg. 20
    :param offset: the given offset eg. 0
    :return: None
    '''''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_SEARCH
    request_body = {"searchString":search_string,
            "activeUsers":active_users,
            "inActiveUsers":inactive_users,
            "pageSize":page_size,
            "offset":offset
            }
    post_request_json_bytes = json.dumps(request_body).encode("utf-8")
    post_request = request.Request(request_url, headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = request.urlopen(post_request, data=post_request_json_bytes)
        post_response = post_request_open.read()
        if post_response:
            json_response = json.loads(s=post_response)
            if json_response:
                found_users = json_response.get("users")
                # Check for next page of users in order to search for more users
                has_next_page = json_response.get("hasNextPage")
                for found_user in found_users:
                    all_users.append(found_user)
                if has_next_page:
                    # Recursive search if next page
                    search_users(search_string, active_users, inactive_users, page_size, (offset + page_size))
    except error.HTTPError as e:
        print(e.getcode())


def get_csv_file(file_name):
    '''
    Get CSV file by file name from Confluence temp directory
    :param file_name: the name of the file to get from Confluence temp directory
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_DOWNLOAD
    request_parameters = {'fileName':file_name}
    get_request = request.Request(url=request_url + "?" + parse.urlencode(request_parameters),
                                  headers=request_headers)
    get_request.get_method = lambda: 'GET'
    try:
        get_request_open = request.urlopen(get_request)
        get_response = get_request_open.read()
        if (get_response):
            with open(CONFLUENCE_CSV_FILE_NAME, 'wb') as csv_file:
                csv_file.write(get_response)
    except error.HTTPError as e:
        print(e.getcode())


def create_csv_file(users_as_json):
    '''
    Send JSON content to CSV servlet for file generation
    :param users_as_json: the Confluence users as JSON
    :return: None
    '''
    users_as_json = users_as_json.encode("utf-8")
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_CSV_SERVLET
    post_request = request.Request(url=request_url, headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = request.urlopen(post_request, data=users_as_json)
        post_response = post_request_open.read()
        if post_response:
            json_data = json.loads(post_response)
            if json_data and json_data.get("fileName"):
                get_csv_file(file_name=json_data.get("fileName"))
    except error.HTTPError as e:
        print(e.getcode())


# Start searching
search_users(search_string=CONFLUENCE_USER_EXPORT_SEARCH_TERM,
             active_users=CONFLUENCE_USER_EXPORT_ACTIVE_USERS,
             inactive_users=CONFLUENCE_USER_EXPORT_INACTIVE_USERS,
             page_size=CONFLUENCE_USER_EXPORT_PAGESIZE,
             offset=CONFLUENCE_USER_EXPORT_OFFSET)


# Call CSV servlet for conversion
all_users_json = json.dumps(all_users)
create_csv_file(users_as_json=all_users_json)

XLSX files

 Create XLSX file with Python 2...

# -*- coding: utf-8 -*-
'''
Creates a full Confluence user export as XLSX
1. IMPORTANT: should be executed with Python 2.7 interpreter
2. Change the username, password and baseurl variables to match custom Confluence
3. Execution from terminal: python create_full_export_xlsx_python2_7.py
4. A new file named confluence-users.xlsx will be created in this directory
'''
import urllib
import urllib2
import json
import base64

# CHANGE THESE VARIABLES
CONFLUENCE_USERNAME = "admin"
CONFLUENCE_PASSWORD = "admin"
CONFLUENCE_BASEURL = "http://localhost:1990/confluence"
CONFLUENCE_XLSX_FILE_NAME = "confluence-users.xlsx"

# SEARCH VARIABLES
# eg. "admin" or "admin@admin.com"
CONFLUENCE_USER_EXPORT_SEARCH_TERM = ""
# True if enabled users is to be searched
CONFLUENCE_USER_EXPORT_ACTIVE_USERS = True
# True if disabled users is to be searched
CONFLUENCE_USER_EXPORT_INACTIVE_USERS = True
# Starting offset is 0
CONFLUENCE_USER_EXPORT_OFFSET = 0
# Pagesize. 100 is max page size
CONFLUENCE_USER_EXPORT_PAGESIZE = 50

CONFLUENCE_USER_EXPORT_SEARCH = "/rest/confluenceuserexport/1.0/search"
CONFLUENCE_USER_EXPORT_XLSX = "/rest/confluenceuserexport/1.0/file/xlsx"
CONFLUENCE_USER_EXPORT_DOWNLOAD = "/plugins/servlet/confluenceuserexport/admin/download"
JSON_MIME_TYPE = "application/json"
BASIC_AUTH = "Basic " + base64.b64encode('%s:%s' % (CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD))

all_users = []


def search_users(search_string, active_users, inactive_users, page_size, offset):
    '''
    Search for Confluence user with the given parameters
    :param search_string: the given search string
    :param active_users: true if active users
    :param inactive_users: true if inactive users 
    :param page_size: the given page size eg. 20
    :param offset: the given offset eg. 0
    :return: None
    '''''
    header = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_SEARCH
    body = {"searchString":search_string,
            "activeUsers":active_users,
            "inActiveUsers":inactive_users,
            "pageSize":page_size,
            "offset":offset
            }
    json_body = json.dumps(body)
    post_request = urllib2.Request(url, json_body, header)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = urllib2.urlopen(post_request)
        post_response = post_request_open.read()
        if post_response:
            json_response = json.loads(s=post_response)
            if json_response:
                found_users = json_response.get("users")
                # Check for next page of users in order to search for more users
                has_next_page = json_response.get("hasNextPage")
                for found_user in found_users:
                    all_users.append(found_user)
                if has_next_page:
                    search_users(search_string, active_users, inactive_users, page_size, (offset + page_size))
    except urllib2.HTTPError as e:
        print(e.getcode())


def get_xlsx_file(file_name):
    '''
    Get XLSX file by file name from Confluence temp directory
    :param file_name: the name of the file to get from Confluence temp directory
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_DOWNLOAD
    request_parameters = {'fileName':file_name}
    get_request = urllib2.Request(url=request_url + "?" + urllib.urlencode(request_parameters),
                                  headers=request_headers)
    get_request.get_method = lambda: 'GET'
    try:
        get_request_open = urllib2.urlopen(get_request)
        get_response = get_request_open.read()
        if (get_response):
            with open(CONFLUENCE_XLSX_FILE_NAME, 'wb') as xlsx_file:
                xlsx_file.write(get_response)
    except urllib2.HTTPError as e:
        print(e.getcode())


def create_xlsx_file(users_as_json):
    '''
    Send JSON content to XLSX REST endpoint
    :param users_as_json: the Confluence users as JSON
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_XLSX
    post_request = urllib2.Request(url=request_url,
                                   data=users_as_json,
                                   headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = urllib2.urlopen(post_request)
        post_response = post_request_open.read()
        if post_response:
            json_data = json.loads(post_response)
            if json_data and json_data.get("fileName"):
                get_xlsx_file(file_name=json_data.get("fileName"))
    except urllib2.HTTPError as e:
        print(e.getcode())


# Start searching
search_users(search_string=CONFLUENCE_USER_EXPORT_SEARCH_TERM,
             active_users=CONFLUENCE_USER_EXPORT_ACTIVE_USERS,
             inactive_users=CONFLUENCE_USER_EXPORT_INACTIVE_USERS,
             page_size=CONFLUENCE_USER_EXPORT_PAGESIZE,
             offset=CONFLUENCE_USER_EXPORT_OFFSET)


all_users_json = json.dumps(all_users)
# Create CSV file with users
create_xlsx_file(users_as_json=all_users_json)
 Create XLSX file with Python 3...

# -*- coding: utf-8 -*-
'''
Creates a full Confluence user export as XLSX
1. IMPORTANT: should be executed with Python 3 interpreter
2. Change the username, password and baseurl variables to match custom Confluence
3. Execution from terminal: python3 create_full_export_xlsx_python3.py
4. A new file named confluence_users.xlsx is now available in current directory
'''
from urllib import request, parse, error
import json
import base64

# CHANGE THESE VARIABLES
CONFLUENCE_USERNAME = "admin"
CONFLUENCE_PASSWORD = "admin"
CONFLUENCE_BASEURL = "http://localhost:1990/confluence"
CONFLUENCE_XLSX_FILE_NAME = "confluence-users.xlsx"

# Search variables
# eg. "admin" or "admin@admin.com"
CONFLUENCE_USER_EXPORT_SEARCH_TERM = ""
# True if enabled users is to be searched
CONFLUENCE_USER_EXPORT_ACTIVE_USERS = True
# True if disabled users is to be searched
CONFLUENCE_USER_EXPORT_INACTIVE_USERS = True
# Starting offset is 0
CONFLUENCE_USER_EXPORT_OFFSET = 0
# Pagesize. 100 is max page size
CONFLUENCE_USER_EXPORT_PAGESIZE = 20

CONFLUENCE_USER_EXPORT_SEARCH = "/rest/confluenceuserexport/1.0/search"
CONFLUENCE_USER_EXPORT_XLSX_SERVLET = "/rest/confluenceuserexport/1.0/file/xlsx"
CONFLUENCE_USER_EXPORT_DOWNLOAD = "/plugins/servlet/confluenceuserexport/admin/download"
JSON_MIME_TYPE = "application/json"
BASIC_AUTH = "Basic " + base64.b64encode(bytes('%s:%s' % (CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD), 'utf-8')).decode('utf-8')
all_users = []


def search_users(search_string, active_users, inactive_users, page_size, offset):
    '''
    Search for Confluence user with the given parameters
    :param search_string: the given search string
    :param active_users: true if active users
    :param inactive_users: true if inactive users
    :param page_size: the given page size eg. 20
    :param offset: the given offset eg. 0
    :return: None
    '''''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_SEARCH
    request_body = {"searchString":search_string,
                    "activeUsers":active_users,
                    "inActiveUsers":inactive_users,
                    "pageSize":page_size,
                    "offset":offset
                    }
    post_request_json_bytes = json.dumps(request_body).encode("utf-8")
    post_request = request.Request(request_url, headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = request.urlopen(post_request, data=post_request_json_bytes)
        post_response = post_request_open.read()
        if post_response:
            json_response = json.loads(s=post_response)
            if json_response:
                found_users = json_response.get("users")
                # Check for next page of users in order to search for more users
                has_next_page = json_response.get("hasNextPage")
                for found_user in found_users:
                    all_users.append(found_user)
                if has_next_page:
                    # Recursive search if next page
                    search_users(search_string, active_users, inactive_users, page_size, (offset + page_size))
    except error.HTTPError as e:
        print(e.getcode())


def get_xlsx_file(file_name):
    '''
    Get XLSX file by file name from Confluence temp directory
    :param file_name: the name of the file to get from Confluence temp directory
    :return: None
    '''
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_DOWNLOAD
    request_parameters = {'fileName':file_name}
    get_request = request.Request(url=request_url + "?" + parse.urlencode(request_parameters),
                                  headers=request_headers)
    get_request.get_method = lambda: 'GET'
    try:
        get_request_open = request.urlopen(get_request)
        get_response = get_request_open.read()
        if (get_response):
            with open(CONFLUENCE_XLSX_FILE_NAME, 'wb') as xlsx_file:
                xlsx_file.write(get_response)
    except error.HTTPError as e:
        print(e.getcode())


def create_xlsx_file(users_as_json):
    '''
    Send JSON content to XLSX servlet for file generation
    :param users_as_json: the Confluence users as JSON
    :return: None
    '''
    users_as_json = users_as_json.encode("utf-8")
    request_headers = {"Content-type": JSON_MIME_TYPE, "Accept": JSON_MIME_TYPE, "Authorization": BASIC_AUTH}
    request_url = CONFLUENCE_BASEURL + CONFLUENCE_USER_EXPORT_XLSX_SERVLET
    post_request = request.Request(url=request_url, headers=request_headers)
    post_request.get_method = lambda: 'POST'
    try:
        post_request_open = request.urlopen(post_request, data=users_as_json)
        post_response = post_request_open.read()
        if post_response:
            json_data = json.loads(post_response)
            if json_data and json_data.get("fileName"):
                get_xlsx_file(file_name=json_data.get("fileName"))
    except error.HTTPError as e:
        print(e.getcode())


# Start searching
search_users(search_string=CONFLUENCE_USER_EXPORT_SEARCH_TERM,
             active_users=CONFLUENCE_USER_EXPORT_ACTIVE_USERS,
             inactive_users=CONFLUENCE_USER_EXPORT_INACTIVE_USERS,
             page_size=CONFLUENCE_USER_EXPORT_PAGESIZE,
             offset=CONFLUENCE_USER_EXPORT_OFFSET)


# Call XLSX servlet for conversion
all_users_json = json.dumps(all_users)
create_xlsx_file(users_as_json=all_users_json)

  • No labels