List broken macros in Confluence
Asked by m.w:

Hi,

I'd like to clean up our instance of Confluence, removing some of the plugins we don't need. I want to remove the plugins in the test environment, then try and get a list of pages with broken macros..

Is there any plugins / user macros that can obtain such a list?

Thanks,

m.w


Answers:
author: Nic Brough -Adaptavist-
body: You can use macroName: in the search to find pages using a specific macro.

Listing pages with broken macros is a bit harder though.

comments: author: Andy
body: Thank you - that was enough for me to find what I needed.


author: Stephen Deutsch
body: Hi Mark,

I thought something like this would be useful, so I whipped up a short python script:

```
import xmlrpclibimport codecsconfluenceUrl = "https://&lt;your-server&gt;"server = xmlrpclib.ServerProxy(confluenceUrl + '/rpc/xmlrpc')username = 'username'password = 'password'token = server.confluence2.login(username, password)spaceSummary = server.confluence2.getSpaces(token)for space in spaceSummary:    log = ""    log += "&lt;hr&gt;\n"    log += "&lt;p&gt;Searching in space " + space["name"] + " - " + space["key"] + "&lt;/p&gt;\n"    log += "&lt;hr&gt;\n"    print log        with codecs.open('logfile.html', 'a', encoding='utf-8') as f:         f.write(log)        f.close()        spacePages = server.confluence2.getPages(token, space["key"])    for page in spacePages:        pageContent = server.confluence2.renderContent(token, "", page["id"], "", {'style': 'clean'})                if '&lt;span class="error"&gt;Unknown macro:' in pageContent:            log = ""            log += "&lt;p&gt;Page " + page["title"] + " has broken macros!&lt;/p&gt;\n"            log += "&lt;p&gt;Page ID: " + page["id"] + "&lt;/p&gt;\n"            log += '&lt;p&gt;Page URL: &lt;a href="' + page["url"] + '"&gt;' + page["url"] + '&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;\n'            log += "&lt;p&gt;----&lt;/p&gt;\n"            print log                        with codecs.open('logfile.html', 'a', encoding='utf-8') as f:                 f.write(log)                f.close()
```

It will go through every page on your site and see whether it has broken macros on it and outputs the results with links to the pages in an HTML file. I would run it off-hours (or on your test instance) since it hits the server pretty hard, but we have a fairly good size instance and it only took about 5-10 minutes to run. I only tested it with plain Python 2.7.8 and Confluence 5.5, but it should work fine on other versions.

comments: author: Zayne Halsall
body: Doesn't work in Cloud.

```
Traceback (most recent call last):File "./pythonConfluenceBrokenMacros.py", line 10, in &lt;module&gt;token = server.confluence2.login(username, password)File "/usr/lib64/python2.7/xmlrpclib.py", line 1240, in __call__return self.__send(self.__name, args)File "/usr/lib64/python2.7/xmlrpclib.py", line 1599, in __requestverbose=self.__verboseFile "/usr/lib64/python2.7/xmlrpclib.py", line 1280, in requestreturn self.single_request(host, handler, request_body, verbose)File "/usr/lib64/python2.7/xmlrpclib.py", line 1328, in single_requestresponse.msg,xmlrpclib.ProtocolError: &lt;ProtocolError for XXXXXX.atlassian.net/rpc/xmlrpc: 404 Not Found&gt;
```


author: Stephen Deutsch
body: It seems like you might be missing the full context Path. Usually Cloud instances are XXXXXX.atlassian.net/wiki

Try updating your URL to that and hopefully it should work.


author: Zayne Halsall
body: @Stephen Deutsch, spot on. Correcting the URL got it to run. Although I now get a 504 time out after a few minutes.


author: Ulf Glaeser
body: @Stephen Deutsch: Nice example.

Does anyone know whether something like this is possible through the REST API as well, since XML-RPC is now a [deprecated API](https://developer.atlassian.com/confdev/deprecated-apis/confluence-xml-rpc-and-soap-apis)?


author: Nils Leger
body: For python 3.x you need to replace

```
import xmlrpclib
server = xmlrpclib.ServerProxy(confluenceUrl + '/rpc/xmlrpc')
```

with

```
from xmlrpc import client
server = client.ServerProxy(confluenceUrl + '/rpc/xmlrpc')
```


author: Lukas Knoch -Rumpelcoders-
body: There is a plugin that can remove a macro from every page in your confluence instance. You can even replace it with a different string/macro. You might want to check that out. It also lists the occurences of that macro.

<https://marketplace.atlassian.com/plugins/at.rumpelcoder.confluence.search-and-replace>

It doesn't list broken macros. I don't think there is a possibility fot that.