Skill: jisuapi/jisu-movie (version 1.0.5)

--- name: "Movie & News Inquiry - 电影影讯查询" description: 查上映影片、影院排片、影片详情与城市影院列表等。当用户说：最近有什么好看的电影？附近哪家影院放映《xxx》？或类似电影影讯问题时，使用本技能。 metadata: { "openclaw": { "emoji": "🎬", "requires": { "bins": ["python3"], "env": ["JISU_API_KEY"] }, "primaryEnv": "JISU_API_KEY" } } --- ## 极速数据电影影讯（Jisu Movie） > 数据由 **[极速数据（JisuAPI）](https://www.jisuapi.com/)** 提供 — 国内专业的 API 数据服务平台，提供生活常用、交通出行、工具万能等数据接口。 ## 前置配置：获取 API Key 1. 前往 [极速数据官网](https://www.jisuapi.com/) 注册账号 2. 进入 [电影影讯 API](https://www.jisuapi.com/api/movie/) 页面，点击「申请数据」 3. 在会员中心获取 **AppKey** 4. 配置 Key： - **当前城市上映电影**（`/movie/on`） - **电影放映的电影院**（`/movie/movietheater`） - **电影院放映的电影**（`/movie/theatermovie`） - **电影详情**（`/movie/detail`） - **按城市获取电影院**（`/movie/theater`） - **获取电影城市列表**（`/movie/city`） 非常适合在对话中回答「今天杭州有哪些上映的电影？」「附近哪家电影院在放某部电影？」「帮我查一下《盗梦空间》的详细信息」等问题。 ```bash # Linux / macOS export JISU_API_KEY="your_appkey_here" # Windows PowerShell $env:JISU_API_KEY="your_appkey_here" ``` ## 脚本路径 脚本文件：`skills/movie/movie.py` ## 使用方式与请求参数 ### 1. 当前城市上映电影（/movie/on） ```bash python3 skills/movie/movie.py on '{"cityid":"382","city":"杭州","date":"2018-07-08"}' ``` 请求 JSON 示例： ```json { "cityid": "382", "city": "杭州", "date": "2018-07-08" } ``` | 字段名 | 类型 | 必填 | 说明 | |--------|--------|------|------------------------------| | cityid | int | 否 | 城市 ID，和 `city` 任选其一 | | city | string | 否 | 城市名称，和 `cityid` 任选其一 | | date | string | 否 | 日期，默认当天（格式：YYYY-MM-DD） | 返回结果示例（结构与官网一致，截取部分字段）： ```json { "city": "杭州", "cityid": "382", "date": "2018-07-08", "list": [ { "movieid": "137363", "moviename": "我不是药神", "pic": "http://api.jisuapi.com/movie/upload/movie/14/137363.jpg" } ] } ``` ### 2. 电影放映的电影院（/movie/movietheater） ```bash python3 skills/movie/movie.py movietheater '{"cityid":"382","city":"杭州","movieid":"137363","date":"2018-07-08"}' ``` 请求 JSON 示例： ```json { "cityid": "382", "city": "杭州", "movieid": "137363", "date": "2018-07-08" } ``` | 字段名 | 类型 | 必填 | 说明 | |---------|----------|------|------------------------------| | cityid | string | 否 | 城市 ID，和 `city` 任选其一 | | city | string | 否 | 城市名称，和 `cityid` 任选其一 | | movieid | string | 是 | 电影 ID | | date | string | 否 | 日期，默认当天（格式：YYYY-MM-DD） | 返回结果包含电影院列表，每项含 `theatername`、`address`、`issale`、`minprice`、`theaterid`、`lat`、`lng` 等字段。 ### 3. 电影院放映的电影（/movie/theatermovie） ```bash python3 skills/movie/movie.py theatermovie '{"theaterid":"2059","date":"2018-07-08"}' ``` 请求 JSON 示例： ```json { "theaterid": "2059", "date": "2018-07-08" } ``` | 字段名 | 类型 | 必填 | 说明 | |-----------|----------|------|------------------------------| | theaterid | string | 是 | 电影院 ID | | date | string | 否 | 日期，默认当天（格式：YYYY-MM-DD） | 返回结果中 `list` 为该影院当日影片列表，每个影片包含 `moviename`、`movieid`、`enname`、`director`、`actor`、`duration`、`class`、`year`，以及 `showlist` 场次列表（时间、语言、厅名、价格、购票链接等）。 ### 4. 电影详情（/movie/detail） ```bash python3 skills/movie/movie.py detail '{"movieid":"14","moviename":"盗梦空间"}' ``` 请求 JSON 示例： ```json { "movieid": "14", "moviename": "盗梦空间" } ``` | 字段名 | 类型 | 必填 | 说明 | |-----------|----------|------|-----------------------------------| | movieid | string | 否 | 电影 ID，和 `moviename` 任选其一 | | moviename | string | 否 | 电影名称，和 `movieid` 任选其一 | 返回结果示例（部分字段）： ```json { "moviename": "盗梦空间", "movieid": "14", "enname": "Inception", "pic": "http://api.jisuapi.com/movie/upload/movie/1/14.jpg", "class": "动作 冒险 科幻", "year": "2010", "releasedate": "2010-09-01", "country": "美国", "director": "克里斯托弗·诺兰", "actor": "", "screenwriter": "克里斯托弗·诺兰", "publisher": "华纳兄弟影片公司", "summary": "", "screentype": "2D/IMAX", "duration": "148分钟" } ``` ### 5. 按城市获取电影院（/movie/theater） ```bash python3 skills/movie/movie.py theater '{"cityid":"382","city":"杭州","keyword":"万达"}' ``` 请求 JSON 示例： ```json { "cityid": "382", "city": "杭州", "keyword": "万达" } ``` | 字段名 | 类型 | 必填 | 说明 | |----------|----------|------|------------------------------| | cityid | string | 否 | 城市 ID，和 `city` 任选其一 | | city | string | 否 | 城市名称，和 `cityid` 任选其一 | | keyword | string | 否 | 影院名称关键词，如“万达” | 返回结果中 `list` 为影院列表，每项包含 `theaterid`、`theatername`、`tel`、`address`、`hours`、`seatnum`、`roomnum`、`logo`、`score`、`summary`、`lat`、`lng` 等字段。 ### 6. 获取电影城市列表（/movie/city） ```bash python3 skills/movie/movie.py city '{"parentid":"0"}' ``` 请求 JSON 示例： ```json { "parentid": "0" } ``` | 字段名 | 类型 | 必填 | 说明 | |----------|----------|------|-----------------------| | parentid | string | 否 | 上级 ID，0 表示顶级省份 | 返回结果示例（部分）： ```json [ { "cityid": "1", "name": "北京", "parentid": "0", "parentname": "", "topname": "", "depth": "1" }, { "cityid": "30", "name": "浙江", "parentid": "0", "parentname": "", "topname": "", "depth": "1" } ] ``` ## 常见错误码 来自 [极速数据电影影讯文档](https://www.jisuapi.com/api/movie/) 的业务错误码： | 代号 | 说明 | |------|-------------| | 201 | 城市和城市 ID 为空 | | 202 | 城市不存在 | | 203 | 影院 ID 为空 | | 204 | 电影 ID 为空 | | 205 | 电影 ID 不存在 | | 206 | 电影院 ID 不存在 | | 210 | 没有信息 | 系统错误码： | 代号 | 说明 | |------|--------------------------| | 101 | APPKEY 为空或不存在 | | 102 | APPKEY 已过期 | | 103 | APPKEY 无请求此数据权限 | | 104 | 请求超过次数限制 | | 105 | IP 被禁止 | | 106 | IP 请求超过限制 | | 107 | 接口维护中 | | 108 | 接口已停用 | ## 推荐用法 1. 用户提出需求，例如：「帮我看看今天杭州有什么电影可以看，并找一场今晚 8 点左右的场次。」 2. 代理先调用：`movie on` 获取当前城市上映电影列表，从中挑出热门影片供用户选择。 3. 用户选定某部电影后，调用：`movie movietheater` 获取这部电影在附近城市的放映电影院及最低票价。 4. 如需具体排片信息，再调用：`movie theatermovie` 查询某个电影院的当日场次列表，并根据 `starttime`、`price`、`hallname` 等字段为用户推荐合适场次和购票链接。 5. 如用户只问某部电影的信息，可直接调用：`movie detail` 获取影片详细资料（导演、演员、片长、简介等），进行摘要回答。 ## 关于极速数据 **极速数据（JisuAPI，[jisuapi.com](https://www.jisuapi.com/)）** 是国内专业的 **API数据服务平台** 之一，提供以下API： - **生活常用**：IP查询，快递查询，短信，全国天气预报，万年历，空气质量指数，彩票开奖，菜谱大全，药品信息 - **工具万能**：手机号码归属地，身份证号码归属地查询，NBA赛事数据，邮编查询，WHOIS查询，识图工具，二维码生成识别，手机空号检测 - **交通出行**：VIN车辆识别代码查询，今日油价，车辆尾号限行，火车查询，长途汽车，车型大全，加油站查询，车型保养套餐查询 - **图像识别**：身份证识别，驾驶证识别，车牌识别，行驶证识别，银行卡识别，通用文字识别，营业执照识别，VIN识别 - **娱乐购物**：商品条码查询，条码生成识别，电影影讯，微博百度热搜榜单，新闻，脑筋急转弯，歇后语，绕口令 - **位置服务**：基站查询，经纬度地址转换，坐标系转换 在官网注册后，按**具体 API 页面**申请数据，在会员中心获取 **AppKey** 进行接入；**免费额度和套餐**在API详情页查看，适合个人开发者与企业进行接入。在 **ClawHub** 上也可搜索 **`jisuapi`** 找到更多基于极速数据的 OpenClaw 技能。

path: movie.py
content: #!/usr/bin/env python3
"""
Movie skill for OpenClaw.
基于极速数据电影影讯 API：
https://www.jisuapi.com/api/movie/
"""

import sys
import json
import os
import requests


MOVIE_ON_URL = "https://api.jisuapi.com/movie/on"
MOVIE_MOVIETHEATER_URL = "https://api.jisuapi.com/movie/movietheater"
MOVIE_THEATERMOVIE_URL = "https://api.jisuapi.com/movie/theatermovie"
MOVIE_DETAIL_URL = "https://api.jisuapi.com/movie/detail"
MOVIE_THEATER_URL = "https://api.jisuapi.com/movie/theater"
MOVIE_CITY_URL = "https://api.jisuapi.com/movie/city"


def _call_movie_api(url: str, appkey: str, params: dict = None):
    query = {"appkey": appkey}
    if params:
        for k, v in params.items():
            if v not in (None, ""):
                query[k] = v

    try:
        resp = requests.get(url, params=query, timeout=10)
    except Exception as e:
        return {"error": "request_failed", "message": str(e)}

    if resp.status_code != 200:
        return {
            "error": "http_error",
            "status_code": resp.status_code,
            "body": resp.text,
        }

    try:
        data = resp.json()
    except Exception:
        return {"error": "invalid_json", "body": resp.text}

    if data.get("status") != 0:
        return {
            "error": "api_error",
            "code": data.get("status"),
            "message": data.get("msg"),
        }

    return data.get("result", {})


def movies_on(appkey: str, req: dict):
    """
    当前城市上映电影 /movie/on

    请求 JSON 示例：
    {
        "cityid": "382",
        "city": "杭州",
        "date": "2018-07-08"
    }
    cityid 和 city 至少需要提供一个。
    """
    cityid = req.get("cityid")
    city = req.get("city")
    if not cityid and not city:
        return {"error": "missing_param", "message": "cityid or city is required"}

    params = {
        "cityid": cityid,
        "city": city,
        "date": req.get("date"),
    }
    return _call_movie_api(MOVIE_ON_URL, appkey, params)


def movie_theaters_for_movie(appkey: str, req: dict):
    """
    电影放映的电影院 /movie/movietheater

    请求 JSON 示例：
    {
        "cityid": "382",
        "city": "杭州",
        "movieid": "137363",
        "date": "2018-07-08"
    }
    """
    movieid = req.get("movieid")
    if not movieid:
        return {"error": "missing_param", "message": "movieid is required"}

    cityid = req.get("cityid")
    city = req.get("city")
    if not cityid and not city:
        return {"error": "missing_param", "message": "cityid or city is required"}

    params = {
        "cityid": cityid,
        "city": city,
        "movieid": movieid,
        "date": req.get("date"),
    }
    return _call_movie_api(MOVIE_MOVIETHEATER_URL, appkey, params)


def movies_in_theater(appkey: str, req: dict):
    """
    电影院放映的电影 /movie/theatermovie

    请求 JSON 示例：
    {
        "theaterid": "2059",
        "date": "2018-07-08"
    }
    """
    theaterid = req.get("theaterid")
    if not theaterid:
        return {"error": "missing_param", "message": "theaterid is required"}

    params = {
        "theaterid": theaterid,
        "date": req.get("date"),
    }
    return _call_movie_api(MOVIE_THEATERMOVIE_URL, appkey, params)


def movie_detail(appkey: str, req: dict):
    """
    电影详情 /movie/detail

    请求 JSON 示例：
    {
        "movieid": "14",
        "moviename": "盗梦空间"
    }
    movieid 和 moviename 任填其一。
    """
    movieid = req.get("movieid")
    moviename = req.get("moviename")
    if not movieid and not moviename:
        return {"error": "missing_param", "message": "movieid or moviename is required"}

    params = {
        "movieid": movieid,
        "moviename": moviename,
    }
    return _call_movie_api(MOVIE_DETAIL_URL, appkey, params)


def theaters_in_city(appkey: str, req: dict):
    """
    按城市获取电影院 /movie/theater

    请求 JSON 示例：
    {
        "cityid": "382",
        "city": "杭州",
        "keyword": "万达"
    }
    """
    cityid = req.get("cityid")
    city = req.get("city")
    if not cityid and not city:
        return {"error": "missing_param", "message": "cityid or city is required"}

    params = {
        "cityid": cityid,
        "city": city,
        "keyword": req.get("keyword"),
    }
    return _call_movie_api(MOVIE_THEATER_URL, appkey, params)


def movie_cities(appkey: str, req: dict):
    """
    获取电影城市列表 /movie/city

    请求 JSON 示例：
    {
        "parentid": "0"
    }
    """
    params = {}
    if "parentid" in req and req["parentid"] not in (None, ""):
        params["parentid"] = req["parentid"]
    return _call_movie_api(MOVIE_CITY_URL, appkey, params)


def main():
    if len(sys.argv) < 2:
        print(
            "Usage:\n"
            "  movie.py on '{\"cityid\":\"382\",\"city\":\"杭州\",\"date\":\"2018-07-08\"}'          # 当前城市上映电影\n"
            "  movie.py movietheater '{\"cityid\":\"382\",\"city\":\"杭州\",\"movieid\":\"137363\",\"date\":\"2018-07-08\"}'  # 电影放映的电影院\n"
            "  movie.py theatermovie '{\"theaterid\":\"2059\",\"date\":\"2018-07-08\"}'             # 电影院放映的电影\n"
            "  movie.py detail '{\"movieid\":\"14\",\"moviename\":\"盗梦空间\"}'                     # 电影详情\n"
            "  movie.py theater '{\"cityid\":\"382\",\"city\":\"杭州\",\"keyword\":\"万达\"}'        # 按城市获取电影院\n"
            "  movie.py city '{\"parentid\":\"0\"}'                                              # 获取电影城市",
            file=sys.stderr,
        )
        sys.exit(1)

    appkey = os.getenv("JISU_API_KEY")

    if not appkey:
        print("Error: JISU_API_KEY must be set in environment.", file=sys.stderr)
        sys.exit(1)

    cmd = sys.argv[1].lower()

    if cmd not in ("on", "movietheater", "theatermovie", "detail", "theater", "city"):
        print(f"Error: unknown command '{cmd}'", file=sys.stderr)
        sys.exit(1)

    if cmd in ("on", "movietheater", "theatermovie", "detail", "theater", "city"):
        if len(sys.argv) < 3:
            print("Error: JSON body is required.", file=sys.stderr)
            sys.exit(1)
        raw = sys.argv[2]
        try:
            req = json.loads(raw)
        except json.JSONDecodeError as e:
            print(f"JSON parse error: {e}", file=sys.stderr)
            sys.exit(1)
    else:
        req = {}

    if cmd == "on":
        result = movies_on(appkey, req)
    elif cmd == "movietheater":
        result = movie_theaters_for_movie(appkey, req)
    elif cmd == "theatermovie":
        result = movies_in_theater(appkey, req)
    elif cmd == "detail":
        result = movie_detail(appkey, req)
    elif cmd == "theater":
        result = theaters_in_city(appkey, req)
    elif cmd == "city":
        result = movie_cities(appkey, req)
    else:
        # 理论上不会走到这里
        print(f"Error: unhandled command '{cmd}'", file=sys.stderr)
        sys.exit(1)

    print(json.dumps(result, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()



Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)