ScrapboxのSnapshotsから特定の日付を取り出すスクリプト
ScrapboxのPage historyで使われているスナップショットのJSONデータから特定の日付のデータのみを取り出すスクリプト。
予めapi/page-snapshots/:projectname/:pageidを使って必要なデータをローカルに用意しておく。
ソース
動作環境:Python 3.9.7以降
code:save_snapshot.py
#!/usr/bin/env python3
from ast import arg
import json
from datetime import date, datetime as dt
# from datetime import timezone as tz
# from datetime import timedelta as td
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-j", "--json-file-name", type=str, help="読み込むJSONのファイル名")
parser.add_argument("-d", "--date", type=str, help="保存する日付")
args = parser.parse_args()
def ext_snapshot_dates(data:dict):
"""オブジェクトからスナップショットの日付のみを取り出してlistに格納します。"""
s = []
for d in data"snapshots":
s += [d"created"]
return s
def print_dates(dates:list, formatted_date:bool=True) -> None:
"""
リストに格納された日付を一覧表示します。
Params
-------
dates
UNIX timeが格納されたlist。
ext_snapshot_datesの返り値をそのまま使用できます。
formatted_date
日付を整形して表示する。
例) "2022/02/05 07:19:27"
"""
s = ""
for i in range(len(dates)):
if formatted_date:
s += format_date(datesi)
else:
s += str(d)
if i % 5 == 0: s += ",\n"
else : s += ", "
print(s)
def format_date(unixtime:int) -> str:
"""UNIX timeを読める形で整形する。"""
t = dt.fromtimestamp(int(unixtime))
return "%04d/%02d/%02d %02d:%02d:%02d" % (t.year,t.month,t.day,t.hour,t.minute,t.second)
def search_date(pattern , dates:list) -> int:
"""
日付を検索する
Params
----
pattern
検索する日付。
format_dateで整形された日付か、UNIX timeに対応している。
dates
UNIX timeが格納されたlist。
Return
----
一致した要素番号(インデックス)を返す。
見つからなかった場合は-1を返す。
"""
for i in range(len(dates)):
if pattern == str(datesi): return i
if pattern == format_date(datesi): return i
return -1
if(args.json_file_name is None): FILE_NAME = input("ファイル名を入力 >>> ")
else: FILE_NAME = args.json_file_name
with open(FILE_NAME, mode="rt", encoding="utf-8") as f:
data = json.load(f)
dates = ext_snapshot_dates(data)
if(args.date is None):
print( "行数:" + str(len(data"snapshots")) )
print_dates(dates)
print("どの日付のスナップショットを取り出しますか?")
d = input("上の中から選んでください >>> ")
d_index = search_date(d, dates)
while(d_index < 0):
d = input("見つからなかったのでもう一度入力 >>> ")
d_index = search_date(d, dates)
else:
d = args.date
d_index = search_date(d, dates)
if(d_index < 0):
print("--dateの値に一致する日付が見つかりませんでした。")
exit(1)
print(f"{d_index}番目のスナップショットを保存します。")
with open(f"{d_index}.json", mode="wt", encoding="utf-8") as f:
json.dump(data"snapshots"d_index, f, ensure_ascii=False, indent=2)
実行後はカレントディレクトリに<番号>.jsonが保存される。
改善案
取り消し線がついている項目は対応済み
コマンド引数に対応すべきだった
タイムゾーンの固定化
UNIXTimeで表示する
標準入力をコマンド引数でも入力できるように
UNIXTimeの入力を受け付ける
#Python