【2026年版】OBSでシーンアイテムを削除する方法

タイトル。シーンアイテムの削除 OBS自動化

obsws-python(OBS WebSocket v5準拠)をPythonから操作してシーンアイテムを削除する方法を解説します。

私の場合は、ツールでシーンアイテムを大量に作成してOBS上に表示させているため、そのままにしておくとOBS Studio上で管理し辛くなります。
そのため、ツール終了とともにシーンアイテムを削除まとめて削除するときに使っています。

その他にも知りたい方はコチラの記事を見てください。

前提条件、環境

シーンアイテムを削除

OBSでテキストソースを削除するコードは以下になります。

  • シーンアイテムIDを取得
  • sceneNameにシーン名を指定
  • sceneItemIDで削除対象のシーンアイテムIDを指定
# シーンアイテムIDの取得
res = ws.base_client.req("GetSceneItemId",
    {
        "sceneName":"ナニカツクル",   # シーン名を指定
        "sourceName":"テキストメッセージ2" # ソース名を指定
    }
)

# シーンアイテムIDを設定
scene_item_id = res["responseData"]["sceneItemId"]

# シーンアイテムの削除
ws.base_client.req("RemoveSceneItem",
    {
        "sceneName":"ナニカツクル",
        "sceneItemId":scene_item_id
    }
)

OBS WebSocketの接続を含めた一通りのコードは以下となります。

# OBS WebSocketのインポート
import obsws_python as obsws

# OBS接続情報
host = "localhost"
port = 4455
password = "**********"

# OBS WebSocketクライアントの作成
ws = obsws.ReqClient(host=host, port=port, password=password)


# シーンアイテムIDの取得
res = ws.base_client.req("GetSceneItemId",
    {
        "sceneName":"ナニカツクル",   # シーン名を指定
        "sourceName":"テキストメッセージ2" # ソース名を指定
    }
)

# シーンアイテムIDを設定
scene_item_id = res["responseData"]["sceneItemId"]

# シーンアイテムの削除
ws.base_client.req("RemoveSceneItem",
    {
        "sceneName":"ナニカツクル",
        "sceneItemId":scene_item_id
    }
)

# OBSから切断
ws.disconnect()

公式ドキュメント

シーンアイテムを削除する公式ドキュメントは以下にあります。

OBS WebsocketのRemoveSceneItem関数のインターフェース

実際の使い方

シーンアイテムを1つずつ削除するのは面倒ですよね。

私の場合は、ツールで作成するシーンアイテムに接頭辞(prefix)を付けて、接頭辞と合致するシーンアイテムをすべて削除するようにしています。

以下が私が実際に使っている使い方です。
 ①すべてのシーンアイテムを取得
 ②接頭辞(prefix)と合致するシーンアイテムを削除

    # ①すべてのシーンアイテムを取得
    def GetAllSceneItems(self, scene_name):
        try:
            # シーン直下のアイテムを取得
            scene_items = self.ws.base_client.req(
                "GetSceneItemList",
                {"sceneName": scene_name})
            
            all_items = scene_items["responseData"]["sceneItems"]

            return all_items
        
        except Exception as e:
            print(f"シーンアイテムの取得に失敗しました: {e}", flush=True)
            return []

    ## ②接頭辞と合致したシーンアイテムを削除
    def DeleteSceneItemsByPrefix(self, scene_name, prefix):
        """
        指定された scene_name 内のシーンアイテムを走査し、
        sourceName が prefix で始まるアイテムを削除する。
        戻り値: 削除したアイテムのリスト [(scene_name, sourceName, sceneItemId), ...]
        """
        deleted = []
        try:
            items = self.GetAllSceneItems(scene_name)
            for item in items:
                src = item.get('sourceName', '')
                item_id = item.get('sceneItemId')
                if not src or item_id is None:
                    continue
                if src.startswith(prefix):
                    try:
                        self.deleteSceneItem(scene_name, item_id)
                        deleted.append((scene_name, src, item_id))
                    except Exception as ex:
                        logging.error("シーンアイテムの削除に失敗しました", exc_info=True)
                        print(f"削除失敗: {scene_name} / {src} ({item_id}): {ex}", flush=True)

            print(f"DeleteSceneItemsByPrefix: 削除完了 {len(deleted)} 件 (scene='{scene_name}', prefix='{prefix}')", flush=True)
            return deleted
        except Exception as e:
            logging.error("DeleteSceneItemsByPrefix でエラー", exc_info=True)
            print(f"DeleteSceneItemsByPrefix に失敗しました: {e}", flush=True)
            return deleted

コメント