# Habitica API を活用したタスク管理データの可視化

に公開

Habitica は、ゲーム感覚で習慣を管理できるタスク管理ツールです。
本記事では、Habitica API を活用してPythonでタスクデータを取得する方法を紹介します。

1. Habitica API への接続

まず、Habitica API に接続してユーザーのタスクデータを取得します。
設定のサイトのデータにある、ユーザーIDとAPI トークンを取得します。

1.1 API リクエストの送信

接続できているか確認します。

import requests

# HabiticaのAPI情報
USER_ID = "あなたのUser ID"
API_TOKEN = "あなたのAPIトークン"
API_URL = "https://habitica.com/api/v3/tasks/user"

# ヘッダーの設定
HEADERS = {
    "x-api-user": USER_ID,
    "x-api-key": API_TOKEN,
    "Content-Type": "application/json"
}

# APIリクエストを送信
response = requests.get(API_URL, headers=HEADERS)

取得したデータを確認してみましょう。

if response.status_code == 200:
    tasks = response.json()
    for task in tasks["data"]:
        print(f"タスク: {task['text']} | 種類: {task['type']} | 完了: {task.get('completed', 'N/A')} | タスクID: {task['id']}")
else:
    print("API取得失敗:", response.status_code, response.text)

タスク名、タスクIDなどが確認できます。

2. タスク履歴の取得と解析

特定のタスクの履歴を取得し、データを整形します。

TASK_ID = "タスクID"
task_url = f"https://habitica.com/api/v3/tasks/{TASK_ID}"
task_response = requests.get(task_url, headers=HEADERS)

if task_response.status_code == 200:
    task_data = task_response.json()
    print(task_data["data"])
else:
    print("タスク取得失敗:", task_response.status_code, task_response.text)

取得した履歴データを日本時間に変換し、DataFrame に整理します。

from datetime import datetime
import pytz
import pandas as pd

def time_change(timestamp_ms):
    dt = datetime.utcfromtimestamp(timestamp_ms / 1000)
    jst = pytz.timezone('Asia/Tokyo')
    return dt.replace(tzinfo=pytz.utc).astimezone(jst).strftime('%Y-%m-%d')

data_list = []
for task_single in task_response.json()['data']['history']:
    data_list.append({
        '日付': time_change(task_single['date']),
        '完了フラグ': 1 if task_single['completed'] else 0
    })

df = pd.DataFrame(data_list)
print(df)

日記タスクに関するデータを取得し以下のような結果が得られました。

3. 記録状況を可視化

上記と同様に、掃除タスクの実行状況も取得し可視化を行います。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# DataFrameに変換
dfdf = pd.DataFrame(df_merged, columns=['日付', '完了フラグ_日記','完了フラグ_掃除'])

# 日付をdatetime型に変換
dfdf['日付'] = pd.to_datetime(dfdf['日付'])


# ======== 折れ線グラフの描画 ========
plt.figure(figsize=(12, 5))
plt.plot(dfdf['日付'], dfdf['完了フラグ_掃除'], marker='o', linestyle='', color='b')
plt.plot(dfdf['日付'], dfdf['完了フラグ_日記'], marker='o', linestyle='', color='r')
plt.xticks(rotation=45)
plt.xlabel("date")
plt.ylabel("flag")
plt.title("habit data")
plt.grid(True)
plt.show()

かなり雑ですが、習慣的な掃除(青丸)を12月以降全くやってないことがわかります、、

終わりに

今回は行えていないですが、スクリプトから実行状況の記録が可能なのでアプリを開かずに記録を追加していくのが有効な使い方だなと感じました。

参考にしたサイト

https://zenn.dev/anozon/articles/habitica-api-sample

https://habitica.com/apidoc/

Discussion