Как работать с REST API Confluence.
- Структура API в системе Confluence.
- Объекты, файлы, статьи, родство и проч.
- Формирование запроса(адреса) в API Confluence
- Открытие сессии и удержание её в памяти – !
- Формирование заголовков при помощи модуля requests и – json !
- Отправка файла, содержания файла, вики-разметки на сервер Confluence – !
- Интерпретируем ответы от сервера
Что такое Atlassian Confluence вы можете почитать здесь:
- https://www.atlassian.com/software/confluence
- https://ru.wikipedia.org/wiki/Confluence
Кому нужен этот топик?
Тем мученикам, которые хотят автоматизировать процесс написания/отправки документации в разработке.
Тем мученикам, которые как и я, по очевидным примерам не могут разобраться в модуле requests касаемо работе с заголовками.
Мне самому, чтобы не забыть свой “подвиг” и все его наработки, так как память имеет свойство “стираться”.
В тот момент, когда я решил заняться автоматизацией процесса документации в своей компании я не знал, насколько кастрирована наша Confluence и насколько убогий, окажется в принципе сам её API, как долго придется возиться с тем, чтобы составить удобоваримый заголовок, который томкат сможет скушать и не поперхнуться, а также насколько убогая разметка на Confluence, я буду писать несколько топиков, каждый по отдельному пункту или нескольким из указанных выше, также попробую продублировать эту информацию на английском, вдруг сюда захочет зайти наш иностранный коллега.
В общем, кому вдруг пригодится – следите за темой и связанными постами, я буду постепенно выкладывать материал, отсебятину и добавлять ссылки в эту статью.
Для нетерпеливых или тех, кто быстро схватывает и кому достаточно просто посмотреть код или часть его – выкладываю черновой, но рабочий вариант всего этого процесса, сразу предупреждаю, это не пример для подражания, это черновой вариант:
import json import requests # Config HTTP session # request 0 confluence_auth_url = 'https://docs.companyname.com/docs/dashboard.action?os_username=SERVICE_USERNAME&os_password=SERVICE_PASSWORD' session = requests.session() session.post(confluence_auth_url) # Configipedia stats space_page = '625685389' # DocBot SPACE "title":"DocBot space", "space":{"id":624689178,"key":"~SERVICE_USERNAME","name":"Configipedia Automation","type":"global","_links":{"self":"https://docs.companyname.com/docs/rest/api/space/~SERVICE_USERNAME"} space_root_page = '625685397' # DocBot HOMEPADE "title":"Space root page (Parent 1)", "space":{"id":624689178,"key":"~SERVICE_USERNAME","name":"Configipedia Automation","type":"global","_links":{"self":"https://docs.companyname.com/docs/rest/api/space/~SERVICE_USERNAME"} space_id = '624689178' space_key = '~SERVICE_USERNAME' # {"id":624689178,"key":"~SERVICE_USERNAME","name":"Configipedia Automation" space_name = 'DocBot+space' child_page_1 = '625685424' child_page_2 = '625685428' confPedia_root = 'https://docs.companyname.com/docs' confPediaUser = '~SERVICE_USERNAME' # api keys # Usage example: "confPedia_root+conf_content+space_id" - request to get space homepage content api = '/rest/api/' conf_space = '/rest/api/space/' conf_content = '/rest/api/content/' conf_children = '/child/page/' # Usual URLS space_url = confPedia_root+conf_content+space_page space_child_items = confPedia_root+conf_content+space_root_page+conf_children space_post = confPedia_root+conf_content # GET HOMESPACE # request 1 r_homepage = session.get(space_url) r_homepage = r_homepage.json() # Check current location: r_homepage_loc = r_homepage['_links']['webui'] print("You are here now: "+confPedia_root+r_homepage_loc) # GET CHILDREN ITEMS # request 2 r_home_children = session.get(space_child_items) r_home_children = r_home_children.json() # Check current location r_home_children_loc = r_home_children['_links']['self'] print("You are looking through this branch: "+r_home_children_loc) # Getting results from "request 2" r_home_children_results = r_home_children['results'] product_pages_list = [] for item in r_home_children_results: id = item['id'] title = item['title'] web_link = item['_links']['webui'] post_link = item['_links']['self'] # product_page = {'id':id, 'title':title, 'web_link':web_link, 'post_link':post_link} product_page = {'id':id, 'title':title, 'web':confPedia_root+web_link, 'post':post_link} product_pages_list.append(product_page) print(product_page) files = open('THIS_IS_FILE_WHERE_WIKI_MARKUP.txt', 'r') file = files.read() file_string = str(file) file_string_repl = file_string.replace("\\r\\n", "<br/>") contentType = 'application/json' userAgent = 'DocBot/0.0.1' acceptType = 'application/json' header = {"Content-type":contentType} title = 'DOC NAME TITLE' post_object = {"type":"page","title":title,"space":{"key":space_key},"body":{"storage":{"value":file_string_repl,"representation":"storage"}}} data=json.dumps(post_object) # print(file_string) # print(data) # POST SOMETHING ON PAGE # request 3 print("POST something to: "+space_post) r_post_homepage = session.post(space_post, headers=header, data=data) r_post_homepage_answer = r_post_homepage.text print(r_post_homepage_answer)