WhatsAppログ分割ツールの改良:よ
り使いやすいフォルダ構成と選択方法の実装

関連記事

1. はじめに

LINEが主流の日本と違い、海外ではWhatsAppが主要なコミュニケーションツールとして使われています。特に複数人でのグループチャットなど、長期間使うと大量のメッセージが蓄積されます。WhatsAppの標準機能では、チャット履歴をエクスポートするとすべてのメッセージが1つのテキストファイルにまとめられてしまいます。

これを日付ごとに分割するツールを作りましたが、使っていくうちに「もっと使いやすくできるはず」と感じる部分が出てきました。今回は、出力フォルダの名前付けと出力方法の選択部分を改良した過程を紹介します。

1.1. 元のツールの構造と課題点

当初のツールは以下のような仕組みでした:

  1. WhatsAppからエクスポートされたZIPファイルを読み込む
  2. 日付ごとにメッセージを分類する
  3. 「すべての日付」または「最新の数日分のみ」という2つの出力方法をチェックボックスで選択
  4. 選択された方法で、Documents/WhatsAppLogsフォルダの下に「all_days」や「latest_X_days」というサブフォルダを作成して出力

この仕組みには以下の課題がありました:

  • 出力フォルダの名前がわかりにくい
  • チェックボックスでの選択だと「両方選ぶ」ことができてしまう
  • サブフォルダがあることで階層が深くなりすぎる

1.2. 改良点の検討

これらの課題を解決するために、以下の改良を検討しました:

  1. ZIPファイル名から出力フォルダ名を生成する
  2. 出力方法の選択をチェックボックスからラジオボタンに変更
  3. サブフォルダを廃止して直接ファイルを出力

特にフォルダ名については、「WhatsApp Chat – グループ名」という形式のファイル名から不要な部分を取り除き、先頭に日付を付けることで、整理しやすくする案が浮かびました。

2. 実装方法の解説

2.1. 1. フォルダ名生成機能

ZIPファイル名から適切なフォルダ名を生成する関数を作りました:

def get_output_folder_name(self, input_file):
    """入力ファイルから出力フォルダ名を生成"""
    # ファイル名の部分を取得
    base_name = os.path.basename(input_file)
    file_name, _ = os.path.splitext(base_name)
    
    # 「WhatsApp Chat - 」を除去
    clean_name = file_name.replace("WhatsApp Chat - ", "")
    
    # 特殊文字を置換
    safe_name = re.sub(r'[\\/:*?"<>|]', '_', clean_name)
    
    # 現在の日時を取得
    now = datetime.datetime.now().strftime("%Y%m%d")
    
    # フォルダ名を生成(例:「20230501_友達グループ」)
    return f"{now}_{safe_name}"
Code language: PHP (php)

この関数は、「WhatsApp Chat – 友達グループ.zip」というファイル名から「20230501_友達グループ」という形式のフォルダ名を生成します。先頭の日付により、いつ処理したファイルかがすぐわかります。

2.2. 2. 出力方法選択の改良

チェックボックスからラジオボタンに変更することで、ユーザーが「どちらか一方」しか選べないようにしました:

# 出力オプション部分
options_frame = ttk.LabelFrame(self.root, text="出力オプション")
options_frame.pack(fill="x", padx=5, pady=5)

# ラジオボタンのための変数
self.output_option = tk.StringVar(value="latest")  # デフォルトは最新

# ラジオボタン
all_days_radio = ttk.Radiobutton(
    options_frame, 
    text="すべての日付ごとに出力", 
    variable=self.output_option,
    value="all")
all_days_radio.grid(row=0, column=0, padx=5, pady=5, sticky="w")

latest_days_radio = ttk.Radiobutton(
    options_frame, 
    text="最新の日付のみ出力", 
    variable=self.output_option,
    value="latest")
latest_days_radio.grid(row=1, column=0, padx=5, pady=5, sticky="w")
Code language: PHP (php)

デフォルトは「latest」(最新の日付のみ)に設定しました。こうすることで、ほとんどのユーザーが求める使い方がデフォルトになります。

2.3. 3. 出力処理の変更

出力処理部分も、選択されたオプションに応じて一つの方法だけを実行するように変更しました:

# 出力フォルダ名を生成
folder_name = self.get_output_folder_name(input_file)
base_output_dir = self.output_dir_var.get()
output_dir = os.path.join(base_output_dir, folder_name)
os.makedirs(output_dir, exist_ok=True)

self.log(f"出力フォルダを作成: {output_dir}")

# 選択されたオプションに応じて出力
option = self.output_option.get()

if option == "all":
    self.log(f"すべての日付ごとにファイルを出力中: {output_dir}")
    self.write_per_day(days, output_dir)
else:  # latest
    try:
        n_days = int(self.days_var.get())
    except ValueError:
        n_days = 2
        self.days_var.set("2")
    
    self.log(f"最新 {n_days} 日分のファイルを出力中: {output_dir}")
    self.write_latest_n_days(days, output_dir, n=n_days)
Code language: PHP (php)

サブフォルダを作成せず、直接生成したフォルダにファイルを出力するようにしました。これにより、フォルダ階層がシンプルになりました。

3. 改良後の使い心地

これらの変更により、次のような改善がありました:

  1. フォルダ名から内容がすぐにわかるようになった
  2. ラジオボタンによって選択の意図が明確になった
  3. フォルダ階層がシンプルになり、ファイルの管理が楽になった

特に、「20230501_家族グループ」のような名前になることで、「いつ、どのグループのログを処理したか」が一目でわかるようになりました。コンピュータのフォルダ表示では通常日付順にソートされるため、時系列での管理も容易です。

4. 最後に:ユーザーインターフェース設計の大切さ

今回の改良は、コードの機能面ではなく使いやすさに焦点を当てたものでした。ユーザーインターフェース(UI)は、いくら機能が優れていても使いにくければ価値が半減します。特に以下の点に注意することが大切です:

  • わかりやすい命名
  • 直感的な操作方法
  • シンプルな階層構造

こうした小さな改良の積み重ねが、ツールの使いやすさを大きく向上させます。今後も使用感を見ながら、より良いツールに育てていきたいと思います。