Example scripts
To homepage
Confluence

Identify Pages with broken image links
App in script

ScriptRunner For Confluence
by Adaptavist
Compatibility

Confluence (7.15 - 8.6)

ScriptRunner For Confluence (7.10.0)
Language |
groovy
import com.atlassian.confluence.pages.AttachmentManager
import com.atlassian.confluence.pages.Page
import com.atlassian.confluence.pages.PageManager
import com.atlassian.confluence.setup.settings.GlobalSettingsManager
import com.atlassian.sal.api.component.ComponentLocator
import com.onresolve.scriptrunner.canned.confluence.utils.CQLSearch
import com.onresolve.scriptrunner.canned.confluence.utils.CQLSearchUtils
import com.onresolve.scriptrunner.canned.util.OutputFormatter
import com.onresolve.scriptrunner.parameters.annotation.ShortTextInput
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import org.jsoup.parser.Parser
@ShortTextInput(label = 'CQL query', description = 'CQL query to select pages')
String cqlStr
assert cqlStr
def baseUrl = ComponentLocator.getComponent(GlobalSettingsManager).getGlobalSettings().getBaseUrl()
def cqlSearchUtils = ScriptRunnerImpl.scriptRunner.getBean(CQLSearchUtils)
def attachmentManager = ComponentLocator.getComponent(AttachmentManager)
def pageManager = ComponentLocator.getComponent(PageManager)
def pages = cqlSearchUtils.searchForPages(CQLSearch.fromQuery("(${cqlStr}) and type = page"))
def pagesWithBrokenImage = pages.findAll { Page page ->
def bodyString = page.bodyAsString
if (bodyString.contains("unknown-attachment")) {
return true
}
def pageAttachments = page.attachments.findAll { !it.deleted }.fileName.toSet()
def fileNamesInContent = Parser
.xmlParser()
.parseInput(page.bodyAsString, "")
.getElementsByTag('ri:attachment')
def brokenFile = fileNamesInContent.find {
def fileName = it.attr("ri:filename")
def pageElement = it.getElementsByTag("ri:page")
if (pageElement.empty) {
if (!pageAttachments.contains(fileName)) {
return true
}
} else {
def spaceKey = pageElement.attr("ri:space-key")
def pageTitle = pageElement.attr("ri:content-title")
def sourcePage = pageManager.getPage(spaceKey ?: page.space.key, pageTitle)
if (!sourcePage) {
return true
}
def sourcePageAtt = attachmentManager.getAttachment(sourcePage, fileName)
if (!sourcePageAtt || sourcePageAtt.deleted) {
return true
}
}
}
brokenFile != null
} as Collection<Page>
OutputFormatter.markupBuilder {
p("${pagesWithBrokenImage.size()} page(s) found with broken image link(s)")
hr()
pagesWithBrokenImage.each { page ->
p {
a(page.title, [href: "${baseUrl + page.urlPath}", target: "_blank"])
}
}
}
Having an issue with this script?
Report it here