2017-05-15 7 views
0

私は私のcode.Iが合流バージョン5.8.10以下特定の領域に新しいページを作成し、それを既存のファイルで更新するREST APIを使用してPythonでConfluenceのコンテンツを更新しますか?

import argparse 
import getpass 
import sys 

import json 
import keyring 
import requests 

#----------------------------------------------------------------------------- 
# Globals 

BASE_URL = "https://wiki.hurry.com/rest/api/content" 

def pprint(data): 
    ''' 
    Pretty prints json data. 
    ''' 
    print json.dumps(
     data, 
     sort_keys = True, 
     indent = 4, 
     separators = (', ', ' : ')) 


def write_data(auth, html, title): 

    ver = 'TEST' 

    data = { 
     'type' : 'page', 
     'title' : str(title), 
     'space' : {'key' : TEST}, 
     'body' : { 
      'storage' : 
      { 
       'representation' : 'storage', 
       'value' : str(html), 
      } 
     } 
    } 

    data = json.dumps(data) 

    print data 

    url = '{base}/?os_authType=basic'.format(base = BASE_URL) 
    print url 
    r = requests.post(
     url, 
     data = data, 
     auth = auth, 
     headers = { 'Content-Type' : 'application/json' } 
    ) 

    r.raise_for_status() 



def get_login(username = None): 
    ''' 
    Get the password for username out of the keyring. 
    ''' 

    if username is None: 
     username = getpass.getuser() 

    passwd = keyring.get_password('confluence_script', username) 

    if passwd is None: 
     passwd = getpass.getpass() 
     keyring.set_password('confluence_script', username, passwd) 

    return (username, passwd) 


def main(): 

    parser = argparse.ArgumentParser() 

    parser.add_argument(
     "-u", 
     "--user", 
     default = getpass.getuser(), 
     help = "Specify the username to log into Confluence") 

    parser.add_argument(
     "-t", 
     "--title", 
     default = None, 
     type = str, 
     help = "Specify a new title") 

    parser.add_argument(
     "-f", 
     "--file", 
     default = None, 
     type = str, 
     help = "Write the contents of FILE to the confluence page") 

    parser.add_argument(
     "html", 
     type = str, 
     default = None, 
     nargs = '?', 
     help = "Write the immediate html string to confluence page") 

    options = parser.parse_args() 

    auth = get_login(options.user) 

    if options.html is not None and options.file is not None: 
     raise RuntimeError(
      "Can't specify both a file and immediate html to write to page!") 

    if options.html: 
     html = options.html 

    else: 

     with open(options.file, 'r') as fd: 
      html = fd.read() 

    write_data(auth, html, options.title) 


if __name__ == "__main__" : main() 

を使用していているのConfluence上で新しいページを作成し、HTML file.Belowにある内容でページを更新するPythonスクリプトを書いています私が得るエラーです

r.raise_for_status() 
    File "C:\Python27\lib\site-packages\requests\models.py", line 928, in raise_for_status 
    raise HTTPError(http_error_msg, response=self) 
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://wiki.hurry.com/rest/api/content/?os_authType=basic 

私はここで何が間違っているのか教えていただけますか?

+0

)あなたのURLが 'httpsのようです。 –

+0

@ Tiny.D私はこの後者を変更しましたが、これもhttps://wiki.hurry.com/rest/api/contentで試してみて、同じエラーが発生しました。 – Sushant

+0

'wiki.hurry.com'はまったく動いていないようですね? – errata

答えて

1

400 Client Errorのエラーに基づいて、問題はあなたの側にあります。 RESTful APIは通常、HTMLではなくJSONデータを要求します。リクエストは「舞台裏」追加のものを実行しているので、

あなたが(例えば、自動的にjsonパラメータにpostをします追加する方法のいくつかに渡すものに応じて、あなたが送信されたデータとあなたが要求を使用している方法について確認してくださいあなたの要求にContent-Type: application/jsonヘッダーを追加してください)。 ?//wiki.hurry.com/rest/api/content/ os_authType = basic`投稿することができません;

また、あなたがHTTP response codesを理解してください

+0

同じHTMLファイルの内容を公開するためにrequests.putを使用していたとき、ええ、 request.postを使用しているときに問題が発生しています。これは私にとって非常に奇妙なようです。私はstoriesNode.htmlを持っています。これはstoriesname.moduleとその他の情報を持っています。 – Sushant

+0

@Sushant詳細を含む私の答えを更新しました...あなたの問題を解決したら答えを受け入れてください。さらに問題がある場合は、この質問を更新するのではなく、新しい質問をしてください。 – errata

関連する問題