kintone で JavaScript / CSS ファイルを全部ダウンロードする Python プログラム

kintone で JavaScript / CSS ファイルを全部ダウンロードする Python プログラムを作りました。

参考にしたページは以下です。

ファイルをダウンロードする - cybozu developer network
https://cybozu.dev/ja/kintone/docs/rest-api/files/download-file/

pythonでkintoneアプリのレコードデータを取得する方法（1レコード）
https://qiita.com/guitar_ell_r/items/573e80d6b573278ac5b2
　


```python:05_file_download.py
import base64
import urllib.request
import json
from pathlib import Path

appno = 123
#appno = 124
#appno = 125
#appno = 126

uri = "https://sample.cybozu.com/k/v1/app/customize.json"

username_password = "UserName:YourPassWord"
auth_header = base64.b64encode(username_password.encode())

headers = {
    "Host": "sample.cybozu.com:443",
    "X-Cybozu-Authorization": auth_header,
    "Content-Type": "application/json",
}

body = {
    "app": appno,
}

req = urllib.request.Request(
            url=uri,
            data=json.dumps(body).encode(),
            headers=headers,
            method="GET",
            )

response = urllib.request.urlopen(req)
res_dict = json.load(response)

for file_type in ['js', 'css']:
    if file_type in res_dict.get("desktop", {}):
        for file_data in res_dict["desktop"][file_type]:
            file_info = file_data.get("file", {})
            name = file_info.get("name", "名前なし")
            size = file_info.get("size", "サイズ不明")
            fileKey = file_info.get("fileKey", "ファイルキーなし")

            #if not name[:3].isdigit() or int(name[:3]) < 100:
            #    continue
            #if Path(name).suffix == '.css':
            #    continue

            #print(f"{fileKey}")
            uri2 = "https://sample.cybozu.com/k/v1/file.json"
            headers2 = {
                "X-Cybozu-Authorization": auth_header,
                "Content-Type": "application/json",
            }
            body2 = {
                "fileKey": fileKey,
            }
            req2 = urllib.request.Request(
                        url=uri2,
                        data=json.dumps(body2).encode(),
                        headers=headers2,
                        method="GET",
                        )
            
            with urllib.request.urlopen(req2) as response2:
                response_body = response2.read().decode("utf-8")
                newline_count = response_body.count("\r\n")
                size2 = str(int(size) - newline_count)
                print(f"{name}, {size}, {size2}")
                with open(name, "w", encoding="utf-8") as f:
                    f.write(response_body)

```

ファイルダウンロードと同時に、ファイル名、ファイルサイズも表示していますが、改行が CRLF と LF がまちまちで、ローカルPCに保存しているファイルと比較するために、CRLF をカウントしてその数を引き算したサイズも表示しています。PCでGitを使用しているので、そこで勝手に変換されてしまうようです。

　
以下は、ローカルPCで保存している同ファイルのサイズを表示するためのプログラムです。CRLF でも LF として見えるように、改行をカウントしてその数を引き算したサイズを表示しています。

```python:02_file_local.py
import os

# フォルダパスを指定
folder_path = r'/mnt/c/Repos/App/123'
#folder_path = r'/mnt/c/Repos/App/124'
#folder_path = r'/mnt/c/Repos/App/125'
#folder_path = r'/mnt/c/Repos/App/126'

# フォルダ内のファイルを取得
files = os.listdir(folder_path)

for file in files:
    file_path = os.path.join(folder_path, file)

    # ファイルのみ処理（ディレクトリを除外）
    if os.path.isfile(file_path):
        # ファイルサイズを取得
        size = os.path.getsize(file_path)

        # ファイル内容を読み込み
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            file_content = f.read()

        # 改行の数をカウント
        newline_count = file_content.count('\n')

        # 改行を引いたサイズ
        size -= newline_count

        # ファイル名の先頭3文字を判定
        #if not file[:3].isdigit() or int(file[:3]) < 100:
        #    # 表示しない
        #    continue
        # 拡張子が 'css' の場合は表示しない
        #elif file.endswith('.css'):
        #     continue
        #else:
        #    # ファイル名とサイズを出力
        print(f"{file}, {size}")
```
　
以下は、単に kintone の JavaScript / CSS ファイル一覧を表示するプログラムです。

```python:01_file_list.py
import base64
import urllib.request
import json
from pathlib import Path

appno = 123
#appno = 124
#appno = 125
#appno = 126

uri = "https://sample.cybozu.com/k/v1/app/customize.json"

username_password = "UserName:YourPassWord"
auth_header = base64.b64encode(username_password.encode())

headers = {
    "Host": "sample.cybozu.com:443",
    "X-Cybozu-Authorization": auth_header,
    "Content-Type": "application/json",
}

body = {
    "app": appno,
}

req = urllib.request.Request(
            url=uri,
            data=json.dumps(body).encode(),
            headers=headers,
            method="GET",
            )

response = urllib.request.urlopen(req)
res_dict = json.load(response)

for file_type in ['js', 'css']:
    if file_type in res_dict.get("desktop", {}):
        for file_data in res_dict["desktop"][file_type]:
            file_info = file_data.get("file", {})
            name = file_info.get("name", "名前なし")
            size = file_info.get("size", "サイズ不明")

            #if not name[:3].isdigit() or int(name[:3]) < 100:
            #    continue
            #if Path(name).suffix == '.css':
            #    continue

            print(f"{name}, {size}")
```