eBusy Courts Skill
This skill wraps a small Python client (ebusy_api.py) to log into
eBusy-based booking systems and fetch reservations for a given
court-module and date.
It is designed to work with multiple halls by switching
configuration via environment variables. All hall- and user-specific
values are provided by the environment, not hard-coded in the skill.
Important: No usernames/passwords should be committed into this
skill folder. Keep real credentials in a local .env, your shell
environment, or OpenClaw's gateway config.
Files
- -
skills/ebusy-courts/ebusy_api.py – core Python client - INLINECODE3 – this documentation
Optional (local-only, do not publish):
- -
skills/.env – local environment file with hall-specific credentials
Python client: ebusy_api.py
The client is written to be generic; it reads all hall-specific
config from environment variables:
CODEBLOCK0
Usage (in a venv with requests + beautifulsoup4 installed):
CODEBLOCK1
The script will:
- 1. Log into the configured eBusy instance using the configured
username/password.
- 2. Fetch the reservations JSON for the given date.
- Print a sorted list of reservations:
CODEBLOCK2
Example hall profiles
This section shows example configurations for two real halls in
Germany. Other users can copy the pattern and plug in their own club
URLs and module IDs.
Example: Medenhalle Wiesbaden-Medenbach
- - Base URL: INLINECODE7
- INLINECODE8
- INLINECODE9
- Credentials typically provided via:
-
MEDENHALLE_USER
- INLINECODE11
Example shell setup:
CODEBLOCK3
Example: KTEV Kelkheim
- - Base URL: INLINECODE12
- INLINECODE13
- INLINECODE14
- Credentials typically provided via:
-
KTEV_USER
- INLINECODE16
Example shell setup:
CODEBLOCK4
How an agent can use this skill
When a user asks for availability in a given hall (e.g. "Suche freie
Zeiten in der Tennishalle XYZ am Sonntag"), an OpenClaw agent can:
- 1. Map the hall name to a profile (base URL, module id, first-court-no),
either from
TOOLS.md or agent-specific config.
- 2. Ensure the environment variables
EBUSY_* are set for that hall
(credentials supplied by the runtime or
skills/.env).
- 3. Call
ebusy_api.py for the relevant date, parse the JSON, and build
an availability table (free vs booked) per court and time slot.
The decision logic (which profile to choose for which user request)
should live in the agent and/or TOOLS.md, not in this skill's code.
Publishing considerations
- - Do not publish
skills/.env or any file containing real
credentials to ClawHub.
- - Ensure
.gitignore excludes skills/.env and similar secret-bearing
files.
- - The skill itself (this
SKILL.md + ebusy_api.py) contains only
generic logic and non-secret configuration; the example profiles are
illustrative and can be replaced by any other eBusy-based club.
eBusy 球场技能
该技能封装了一个小型 Python 客户端(ebusy_api.py),用于登录基于 eBusy 的预订系统,并获取指定球场模块和日期的预订信息。
它通过环境变量切换配置,支持多个场馆。所有场馆和用户特定的值均由环境提供,而非硬编码在技能中。
重要提示: 请勿将任何用户名/密码提交到此技能文件夹中。将真实凭据保存在本地 .env 文件、Shell 环境或 OpenClaw 的网关配置中。
文件
- - skills/ebusy-courts/ebusy_api.py – 核心 Python 客户端
- skills/ebusy-courts/SKILL.md – 本文档
可选文件(仅本地使用,请勿发布):
- - skills/.env – 包含场馆特定凭据的本地环境文件
Python 客户端:ebusy_api.py
该客户端设计为通用型;它从环境变量中读取所有场馆特定的配置:
bash
EBUSYBASEURL # 例如 https://myclub.ebusy.de
EBUSY_USERNAME # 所选场馆的登录用户名
EBUSY_PASSWORD # 所选场馆的登录密码
EBUSYCOURTID # 该场馆的 eBusy 球场模块 ID
EBUSYFIRSTCOURT_NO # 该模块内的第一个球场编号
使用方法(在已安装 requests 和 beautifulsoup4 的虚拟环境中):
bash
source venv/bin/activate
export EBUSYBASEURL=https://myclub.ebusy.de
export EBUSY_USERNAME=<你的用户名>
export EBUSY_PASSWORD=<你的密码>
export EBUSYCOURTID=<模块ID>
export EBUSYFIRSTCOURT_NO=<第一个球场编号>
python skills/ebusy-courts/ebusy_api.py 03/07/2026
该脚本将:
- 1. 使用配置的用户名/密码登录配置的 eBusy 实例。
- 获取指定日期的预订 JSON 数据。
- 打印排序后的预订列表:
text
球场 1 预订:09:00 - 10:00 由 <文本>
球场 2 预订:10:00 - 11:00 由 <文本>
...
示例场馆配置
本节展示了德国两个真实场馆的示例配置。其他用户可以复制此模式并填入自己俱乐部的 URL 和模块 ID。
示例:威斯巴登-梅登巴赫的梅登哈勒
- - 基础 URL:https://medenhalle.ebusy.de
- EBUSYCOURTID = 1
- EBUSYFIRSTCOURT_NO = 1
- 凭据通常通过以下方式提供:
- MEDENHALLE_USER
- MEDENHALLE_PASSWORD
示例 Shell 设置:
bash
source venv/bin/activate
加载本地密钥,例如从 skills/.env
export EBUSY
BASEURL=https://medenhalle.ebusy.de
export EBUSY
USERNAME=$MEDENHALLEUSER
export EBUSY
PASSWORD=$MEDENHALLEPASSWORD
export EBUSY
COURTID=1
export EBUSY
FIRSTCOURT_NO=1
python skills/ebusy-courts/ebusy_api.py 03/07/2026
示例:凯尔克海姆的 KTEV
- - 基础 URL:https://ktev.ebusy.de
- EBUSYCOURTID = 807
- EBUSYFIRSTCOURT_NO = 2135
- 凭据通常通过以下方式提供:
- KTEV_USER
- KTEV_PASSWORD
示例 Shell 设置:
bash
source venv/bin/activate
加载本地密钥,例如从 skills/.env
export EBUSY
BASEURL=https://ktev.ebusy.de
export EBUSY
USERNAME=$KTEVUSER
export EBUSY
PASSWORD=$KTEVPASSWORD
export EBUSY
COURTID=807
export EBUSY
FIRSTCOURT_NO=2135
python skills/ebusy-courts/ebusy_api.py 03/07/2026
代理如何使用此技能
当用户询问某个场馆的空闲时间时(例如“搜索周日 XYZ 网球馆的空闲时间”),OpenClaw 代理可以:
- 1. 将场馆名称映射到配置(基础 URL、模块 ID、第一个球场编号),可从 TOOLS.md 或代理特定配置中获取。
- 确保为该场馆设置了环境变量 EBUSY*(凭据由运行时或 skills/.env 提供)。
- 调用相关日期的 ebusyapi.py,解析 JSON,并为每个球场和时段构建空闲时间表(空闲 vs 已预订)。
决策逻辑(针对用户请求选择哪个配置)应位于代理和/或 TOOLS.md 中,而非此技能的代码中。
发布注意事项
- - 请勿将 skills/.env 或任何包含真实凭据的文件发布到 ClawHub。
- 确保 .gitignore 排除了 skills/.env 及类似的包含机密的文件。
- 该技能本身(此 SKILL.md + ebusy_api.py)仅包含通用逻辑和非机密配置;示例配置仅供说明,可替换为任何其他基于 eBusy 的俱乐部。