2
1
0

confluence(クラウド)のAPIを使用してページ更新がしたいですが、以下のURLページを参考にして

もうまくいきませんでした。

それは、ページ更新の記載部分で、page_textのデータが例で記載されたいますが、そのデータを

"body":{ "storage":{ "value":のサンプルデータで使用して、APIを実行すると、エラーが発生します。

エラー内容は、ダブルコーテーションがデータ内に含まれるため、エスケープが必要とのことです。

このデータ例のように、ダブルコーテーションが含めれる場合、エスケープする方法は何でしょうか?

また、エスケープできたとしても更新するデータにダブルコーテーションが含まれる場合、いちいち

修正する必要があるのであれば、APIを使用して自動化などでは使えないと思います。

REST API で Confleunce のページを生成 – リックソフト公式ブログ(Ricksoft Blog)


以上、宜しくお願い致します。

    Commentコメントを追加...

    2 回答

    1.  
      1
      0
      -1

      返信ありがとうございます。

      ページ更新は、クラウド版ですので、自動化のルール定義の「Web リクエストを送信」を使用して、

      ページ更新のAPIに従い、URLを指定し、PUTメソッドで、カスタムデータの記述部分に以下を記述しました。

      そうすると、11行目の最初のダブルコーテーション部分でエスケープが必要とのエラーが発生します。

      {
      "version": {
      "number": 2
      },
      "status": "current",
      "type":"page",
      "title":"test",
      "body":{
      "storage":{
      "value":"<h1>REAT API のサンプルです。</h1>\n \
      <p>今の時刻です:" + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "</p>",
      "representation":"storage"
      }
      }
      }


      以上、宜しくお願い致します。

      1. 青山明

        如何でしょうか?

      2. Shuzaburo Doba

        Jira の Automation をお使いとのことですので、現在時刻を取得している

        datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        の部分は Automation のスマートバリューを使用した形式に書き換える必要があります。

        例えば以下のようなデータにすれば、日本での現在時刻をページ本文に含めることができるかと思います。

        {
          "version": {
              "number": 5
          },
          "status": "current",
          "type": "page",
          "title": "test",
          "body": {
              "storage": {
                  "value": "<h1>REAT API のサンプルです。</h1><p>今の時刻です:{{now.convertToTimeZone("Asia/Tokyo").jqlDateTime}}</p>",
                  "representation": "storage"
              }
          }
        }

        Automation のスマートバリューは以下をご参照ください。

      3. 青山明

        返信ありがとうございます。サンプルデータのものは更新できましたが、

        本当にしたいことは、以下のように更新したいデータを既存のページからbody.storage.value値

        として取得し、値を更新した後、先ほどの自動化+APIを使用してページ更新処理したいです。

        しかし、以下のデータでは、1行目の"details"の部分でエラーが発生します。

        (予期しない文字とのこと)ダブルコーテーションはエスケープする必要があるのでしょうか?

        なお、以下のデータではページプロパティマクロを使用し、そこに表を記述しています。


        {
        "version": {
        "number": 2
        },
        "status": "current",
        "type":"page",
        "title":"test",
        "body":{
        "storage":{
        "value": "<p /><p /><ac:structured-macro ac:name="details" ac:schema-version="1" data-layout="default" ac:local-id="43d00a26-f1c8-4aff-aac1-8e2e01ab48af" ac:macro-id="b8fd8013-6d21-4966-9497-6dc605cc3856"><ac:rich-text-body><table data-layout="default" ac:local-id="bd85e98a-27b9-437f-8332-33d136701948"><colgroup><col style="width: 323.0px;" /><col style="width: 323.0px;" /></colgroup><tbody><tr><td><p>test1</p></td><td><p>12345</p></td></tr><tr><td><p>test2</p></td><td><p>abcdefg</p></td></tr></tbody></table></ac:rich-text-body></ac:structured-macro>",
        "representation": "storage"
        }
        }


        以上、宜しくお願い致します。

      4. Shuzaburo Doba

        詳細のご説明ありがとうございます。

        JSON エンコード のようにしていただくのがよろしいかと思いました。

        値が変数に格納されているようでしたら

        {{variable.jsonEncode}}

        のようにしていただけますし、値が文字列そのままでしたら

        {{#jsonEncode}}<p><ac:structured-macro ac:name="details" ac:schema-version="1" data-layout="default" ac:local-id="43d00a26-f1c8-4aff-aac1-8e2e01ab48af" ac:macro-id="b8fd8013-6d21-4966-9497-6dc605cc3856"><ac:rich-text-body><table data-layout="default" ac:local-id="bd85e98a-27b9-437f-8332-33d136701948"><colgroup><col style="width: 323.0px;" /><col style="width: 323.0px;" /></colgroup><tbody><tr><td><p>test1</p></td><td><p>12345</p></td></tr><tr><td><p>test2</p></td><td><p>abcdefg</p></td></tr></tbody></table></ac:rich-text-body></ac:structured-macro></p>{{/}}

        というように "{{#jsonEncode}} ... {{/}}" で囲っていただくことで
        JSON のテキスト形式に最適化された値に変換されます。

        payload 全体としては以下のようなイメージです。

        値が変数に格納されている場合
        {
            "version": {
                "number": 2
            },
            "status": "current",
            "type": "page",
            "title": "test",
            "body": {
                "storage": {
                    "value": "{{val.jsonEncode}}",
                    "representation": "storage"
                }
            }
        }
        文字列をそのまま適用する場合
        {
            "version": {
                "number": 2
            },
            "status": "current",
            "type": "page",
            "title": "test",
            "body": {
                "storage": {
                    "value": "{{#jsonEncode}}<p><ac:structured-macro ac:name="details" ac:schema-version="1" data-layout="default" ac:local-id="43d00a26-f1c8-4aff-aac1-8e2e01ab48af" ac:macro-id="b8fd8013-6d21-4966-9497-6dc605cc3856"><ac:rich-text-body><table data-layout="default" ac:local-id="bd85e98a-27b9-437f-8332-33d136701948"><colgroup><col style="width: 323.0px;" /><col style="width: 323.0px;" /></colgroup><tbody><tr><td><p>test1</p></td><td><p>12345</p></td></tr><tr><td><p>test2</p></td><td><p>abcdefg</p></td></tr></tbody></table></ac:rich-text-body></ac:structured-macro></p>{{/}}",
                    "representation": "storage"
                }
            }
        }
      5. 青山明

        返信ありがとうございます。やりたいことができました。深謝致します。

        最後に確認ですが、エンコードの仕方は、スマートバリューのマニュアルに

        記載されていたのでしょうか?


        以上、宜しくお願い致します。


      6. Shuzaburo Doba

        ありがとうございます!
        無事に実現できたとのことでよかったです。

        エンコードの仕方は、スマートバリューのマニュアルに記載されておりました。

        Jira スマート バリュー - テキスト フィールド のテキストに対して実施できる操作一覧内の、
        JSON エンコード の項目を参考にいたしました。

      Commentコメントを追加...
    2.  
      2
      1
      0

      ご参考にされたページと同様に、Python から Confluence Cloud のページ更新をされたということで合っておりますでしょうか...?

      その場合、リクエストを送信する際の

      json.dumps(json_data)

      の部分で Json データ (Python の dict) が変換されているので
      特に問題なく更新できるはずなのかと見受けられました。

      もしよろしければ、以下の点を教えていただけますと幸いです。

      • ページ更新をされている方法 (Python スクリプト, curl コマンド 等...)
      • 実際に実行したコマンドやプログラムの内容
        Commentコメントを追加...