YMGalgame API

接入概述

本文档描述的是 月幕Galgame 站点(简称:月幕 或 ymgal)可供开发者接入的 HTTPS API。

部分接口可能需要访问权限,如用户登录、数据修改等,但大部分查询接口 —— 通常来说,这代表着游客在月幕可以阅览的所有数据,在我们的API中是没有权限判定的,您可以自由访问。

月幕的开放接口使用 OAuth2.0 协议认证,包括公共接口,这是为了保证后台设计的同一性而决定的。 调用时,您需要 client_id 与 client_secret 作为客户端凭证,通过允许的认证方式获取到一个 access_token 后,携带此token实行请求。

我们提供了公共的 client_id 与 client_secret 供您使用,它能够满足大部分人的学习、实验、整理、调研等需求。

月幕不能保证各API的可访问性,我们只能保证它在大部分地区,以及境外是可访问的。

月幕不能保证域名的变动可控,它可能会在某次DNS污染后被更换,发生这种情况时,我们会尽可能延续旧域名的可用性,这并不受到保障,不代表您可以直接使用旧域名、或拒绝更新。

文档中所陈列的接口均为稳定状态。


开发者须知

(默认接入方已阅读)

  • 月幕的API服务仅适用于非商业用途,请不要将其用于商业项目。
  • API访问有速率限制以便控制服务器资源,请避免使用并发、循环等调用方式,对于静态资源需做好缓存。
  • 若您申请了专属的 client_id 与 client_secret,请不要将其发布到互联网中(如交流论坛、开源代码),当然,你发布了也行,只是在被坏东西滥用时,走的是您的流量池,这可能会导致您正常的业务受到影响。
  • 若您的项目是一个可在互联网访问、查看的项目,您需要在项目的说明区域(如README、关于、页脚等)提到月幕Galgame。
  • 在开发出现问题时,可以通过接口调用的返回码,来发现和解决问题,具体请查看全局返回对象。
  • 您的服务需要收集用户任何数据的,必须事先获得用户的明确同意,且仅应当收集为运营及功能实现目的而必要的用户数据, 同时应当告知用户相关数据收集的目的、范围及使用方式等,保障用户知情权。
  • 您收集用户的数据后,必须采取必要的保护措施,防止用户数据被盗、泄漏等。
  • 请勿公开表达或暗示您与月幕之间存在合作关系,或声称月幕对您的认可。

Public client identifier

  • client_id: ymgal
  • client_secret: luna0327

暂未开启站内申请渠道(懒得写,有需要的话再看),若您想申请专属的 client_id,请通过提出 issue 的方式,言明您的用途与项目主页

当然,访问速率限制总归是有的,无非是多与少、共享与否的区别

若您开发的是服务型、分发型应用,为了避免影响业务,请自行实现一个妥善的请求拒绝策略,您可以在全局返回对象中查看相关错误码


关于

月幕的开放API并未提供所有服务功能。

一般情况下,日常更新迭代的API可能只是因为站长写代码写嗨了才得以实现,不一定会是按照业务线或模块顺序提供,同时,一不小心鸽它大半年也是很正常的一件事,不得不品鉴。

在 issues 内已同意实现的不会鸽,若有相关需求,请在 issues 提出。

总之,别急。

另外,本文档是个单文件HTML,由程序自动构建,其内容由多个 Markdown 文件组成。

若你发现文档错误、显示异常、渲染失败等情况,欢迎前往此文档的 Github 仓库提交 PR 或 issue。

和 IE 相关的不受理,老哥换个浏览器吧。



获取 Access Token

access_token 是月幕开放API的全局唯一接口调用凭据,调用各接口时都需使用 access_token, 开发者需要进行妥善保存。

access_token 的有效期为 1 个小时,通过相同的认证参数在有效期内重复获取时,将获得重复的 access_token。 access_token 有效期未受到完全的保障,所以请 不要使用定时器 实现更新逻辑,而是在 拒绝策略 中实现。


基本概念

月幕的开放API基于 OAuth2.0 认证协议,您或许会需要以下文档对此协议进行深入了解:


在这里需要指出:就算你完全没接触过 OAuth2.0,也并不影响你对接月幕的开放API,你只要把这个文档看完,照着做就行了。

在月幕的认证、授权流程中,接口返回值不遵循全局返回对象的返回值实现

在月幕的认证、授权流程中,不需要遵循HTTP 请求设置的规范


通过 Token 端点获取 Access Token

端点: GET /oauth/token

重复请求: 返回相同的 access_token

过期时间: 1h


Client Credentials

  • 此节说明的示例基于 OAuth2.0 Client Credentials Grant,适用于所有公共接口

  • Client Credentials 模式不支持 Refresh Token

Request param Type Desc Value
client_id string 标识一个客户端 你申请的 client_id,或公共的 client_id
client_secret string 客户端的密钥 client_id 所对应的密钥
grant_type string 授权类型 client_credentials,固定值
scope string 可访问范围 您试图申请的可访问范围

Example

curl 'https://www.ymgal.games/oauth/token?grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&scope=public'

Success

{
  "access_token": "2fdace3c-651f-4484-85ac-9a449da43f05",
  "token_type": "bearer",
  "expires_in": 3599,
  "scope": "public"
}

Failed

{
  "error": "invalid_client",
  "error_description": "Bad client credentials"
}

其他

暂无需求,所以暂未提供。

如果后续提供了 Authorization Code Grant 的实现,也只会是在需要用户权限的接口被发布时。

不同认证模式获取的 access_token 在相同的 scope 之下访问 API 没有任何区别。


Scopes

Scope Desc
public 公共接口,这里指的是不需要经过任何权限检查也能访问的接口,比如查询游戏详情。

全局返回对象

月幕的 API Response 有一个固定的格式,具体返回的数据会作为 data 字段嵌套在其中,这适用于没有显示声明特例的所有情况。

后续的接口文档中,所有阐述的返回值均遵循此规则,不会额外说明在外侧包装的全局返回对象。


API Response

在接口调用出现异常、参数检查不通过等无法正确响应时,HTTP Status 也仍然会保持 200, 错误内容在 code msg 等字段中体现。

  • 例外情况:认证、授权失败时,对应的 HTTP Status 同步变更为 401、403。

如果接口调用失败,success 字段固定为 false

示例&说明

{
  "success": true, // 本次调用是否成功
  "code": 0, // 详情见 —— 返回码
  "msg": "", // 接口反馈的信息,可能会为 null
  "data": {}// 接口实际返回的数据,可能会为 null
}

一个仅代表调用成功的返回值可能是这样的,没有 data,也没有 msg

{
  "success": true,
  "code": 0
}

Java 模型

@Data
public class R<T> {
    
    private boolean success = false;

    private int code = RCode.SUCCESS.getCode();

    private String msg;

    private T data;

    public R(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;

        this.success = RCode.SUCCESS.valueIs(code);
    }
}

Kotlin 模型

data class R<T>(
    var code: Int = RCode.SUCCESS.code,
    var data: T? = null,
    var message: String? = null
) {

    var success: Boolean = true

    init {
        success = this.code == RCode.SUCCESS.code
    }
}

TS 模型

declare interface R<T = any> {
    success: boolean;
    code: RCode;
    msg?: string;
    data?: T;
}

Page

如果您请求的是一个分页接口,那么默认返回值的 data 格式如下所示

请求的列表会作为数组保存在 result 字段中

{
  "result": [], // 响应的列表
  "total": 0, // 可供查询的总数
  "hasNext": false, // 是否有下一页
  "pageNum": 1, // 当前页
  "pageSize": 10 // 页大小
}

我们访问一个分页接口,得到的最终 HTTP Response Body 完整形态会长成这样

{
  "success": true,
  "code": 0,
  "data": {
    "result": [
      {
        "name": "月に寄りそう乙女の作法",
        "chineseName": "近月少女的礼仪"
      },
      {
        "name": "月に寄りそう乙女の作法2",
        "chineseName": "近月少女的礼仪2"
      }
    ],
    "total": 2,
    "hasNext": false,
    "pageNum": 1,
    "pageSize": 10
  }
}

全局返回码

返回码是全局返回对象中的 code 字段,标识了这个响应的状态

当 code === 0 时,返回对象中的 success 字段恒定为 true

code name description
0 SUCCESS 调用成功,如果不是此响应码的话,数据肯定是拿不到的,需要自行检查
7 OTHER 其他
30 TIME_OUT 超时
50 SYSTEM_ERROR 系统内部错误
51 ILLEGAL_VERSION 非法版本
401 UNAUTHORIZED 未经认证,这个code会改变 HTTP Status >> 401
403 FORBIDDEN 未经授权,这个code会改变 HTTP Status >> 403
404 NOT_FOUNT 找不到
429 TOO_MANY_REQUEST 请求过多
614 ILLEGAL_PARAM 非法参数,校验失败时会遇到

Java 模型

public enum RCode {
    SUCCESS(0),//成功
    OTHER(7),//其他
    TIME_OUT(30),//超时
    SYSTEM_ERROR(50),//系统内部错误
    ILLEGAL_VERSION(51),//非法版本
    UNAUTHORIZED(401),//未经认证
    FORBIDDEN(403), //  未经授权
    NOT_FOUNT(404), //  找不到
    TOO_MANY_REQUEST(429), //请求过多
    ILLEGAL_PARAM(614);//非法参数

    private int code;

    RCode(int code) {
        this.code = code;
    }
    
    public int getCode() {
        return code;
    }
}

Kotlin 模型

enum class RCode(val code: Int, val defaultMessage: String) {
    SUCCESS(0, ""),
    OTHER(7, "未知错误"),
    TIME_OUT(30, "超时"),
    SYSTEM_ERROR(50, "系统内部错误"),
    ILLEGAL_VERSION(51, "非法版本"),
    INITIALIZATION_FAILED(52, "初始化失败"),
    UNAUTHORIZED(401, "未经认证"),
    FORBIDDEN(403, "未经授权"),
    NOT_FOUND(404, "找不到"),
    TOO_MANY_REQUEST(429, "请求过多"),
    ILLEGAL_PARAM(614, "非法参数");
}

TS模型

declare const enum RCode {
    SUCCESS = 0, // 成功
    OTHER = 7, // 其他
    TIME_OUT = 30, // 超时
    SYSTEM_ERROR = 50, // 系统内部错误
    ILLEGAL_VERSION = 51, // 非法版本
    UNAUTHORIZED = 401, // 未经认证
    FORBIDDEN = 403, //  未经授权
    NOT_FOUNT = 404, //  找不到
    TOO_MANY_REQUEST = 429, //  请求过多
    ILLEGAL_PARAM = 614// 非法参数
}

注意事项

  • 出于对某些开发语言、环境的礼貌,以及敬畏,月幕的所有接口中,若出现数字精度大于 2^53 的情况(比如有些模型是通过 SnowFlake 算法生成的 ID),接口中返回的所有 数字长整型(int64) 都会转变为 字符串, 这可能会使您感到疑惑,实际是正常的,一般情况下您不需要为此付出额外的心智负担, 各语言主流的 JSON 处理库不会因此出现异常。


HTTP 请求设置

域名:https://www.ymgal.games

API 端点均基于该域名实行请求。

在请求月幕的开放 API 时,需要遵守相关的规定才能成功访问。

简单的来说,你只需要在 Request Header 中设置几个字段即可。


Accept

我们默认所有的接口均使用 JSON 格式返回。

请在你的请求头中设置:

Accept: application/json;charset=utf-8


Authorization

我们默认所有的接口调用均需要 access_token

请在你的请求头中设置:

Authorization: Bearer access_token

如:

Authorization: Bearer 2fdace3c-651f-4484-85ac-9a449da43f05


version

我们默认所有的接口调用均需要指定 version ,接口文档中会声明接口版本

请在你的请求头中设置 (版本为1的情况):

version: 1


⭐ 档案业务API


档案业务模型

业务对象建模,在 Archive 模块中有 4 种平级的档案模型,他们互相之间通过某些形式约定了多对多的关系

  • Game,游戏
  • Organization,机构
  • Character,角色
  • Person,真实人物

其中, 游戏档案 (Game) 包含以下实体关系, 一对多

characters - CharacterRelation[]
staff  -  Staff[]
releases  -  Release[]

并且通过以下字段和其他的模型产生关联, 多对多

developerId -  Organization
staff  -  Staff#pid  -  Person
characters - CharacterRelation#cid -  Character
characters - CharacterRelation#cvid - Person

游戏之外的几种模型都比较简单,查看对应小节的字段解释与 JSON 样例即可



Archive

首先请先看一下这个抽象的档案模型,本模型定义了月幕中档案的公用基本参数

Game、Organization、Character、Person 均属于该模型的一种具体实现

虽然在后端的设计中它们之间并不是一个直接的继承或组合关系,但是在 API 对接时,你可以理解为上述四种档案模型均是继承自 Archive 的子类,这与请求、响应的现状是相符的

字段名 类型 nullable 说明 例子 备注
name string 档案名 月に寄りそう乙女の作法 可能是英文、中文,反正原名是什么就是什么
chineseName string ✅ 档案中文名 大藏游星 这个是汉化名。若本身原名即是中文,那么这里是可能没有的
extensionName ExtensionName[] 拓展名 [] 一般来说是外号、别称、还有各个国家的不同翻译
introduction string 简介、说明
state ArchiveStateEnum 档案状态 FREEZE 标识状态的,可以等同于string
weights int32 权重 0
mainImg string ✅ 主图 在作为接口返回值时是不会为null的,检查到null时会自动设置为默认的图片地址
moreEntry MoreEntry[] 额外的键值对 [] 一般用来放置额外信息
publishVersion int32 发布版本 0
publishTime datetime ✅ 发布时间 2023-08-07 00:01:50 === string
publisher int64 ✅ 发布者

ExtensionName、MoreEntry 均属于单纯为了承载信息的内容字段,并不与任何档案之间具备任何关联关系,在本章节最后面统一列出详细信息


ArchiveStateEnum

ArchiveStateEnum 是一个枚举,标识了这个档案处于什么状态,不同的状态可能需要不同的访问权限才可以查看。

共三种类型:

  • FREEZE
  • PROTECTED_PUBLISHED
  • PUBLIC_PUBLISHED

绝大部分接口中接入者都不需要关心这个东西



Game

游戏档案,JSON示例请查看最后一节

字段名 类型 nullable 说明 例子 备注
gid int64 游戏档案ID 31147 https://www.ymgal.games/ga31147
developerId int64 游戏品牌的机构ID 关联关系用, 等同于orgId
haveChinese boolean 有中文版 true
typeDesc string 游戏类型描述 バトルADV
releaseDate Date ✅ 发售日期 2020-01-01 string:yyyy-MM-dd, 指的是正式发售日期
restricted boolean 限制级 false 带有露点、暴力等内容为true
country string ✅ 国家
characters CharacterRelation[] 出场人物 主角配角们,关联的Charater
releases Release[] 发行版本 该游戏发行过的版本
website Website[] 相关网站 官网、售卖网站等
staff Staff[] 制作员工 声优、画师、脚本等人力资源。

Website 属于单纯为了承载信息的内容字段,在本章节最后面统一列出详细信息


CharacterRelation

字段名 类型 nullable 说明 例子 备注
cid int64 角色ID Character#cid
cvId int64 ✅ 配音员的人物ID Person#pid, 一个角色可以没有配音
characterPosition number 角色定位 1 1=主角 2=配角

Release

字段名 类型 nullable 说明 例子 备注
id int64 发布名称 主键
release_name string 发布名称 ISLAND 体験版
related_link string ✅ 相关链接 http://never-island.com/game/download.html
platform string 发行平台 PS4 、PC、 PS Vita、 Nintendo Switch
release_date Date ✅ 发售日期 2020-01-01 string:yyyy-MM-dd
restriction_level string 限制级等级 All ages、 15+
country string 发售国家 Chinese、English、Japanese

Staff

游戏制作人员

字段名 类型 nullable 说明 例子 备注
sid int64 主键
pid int64 ✅ 真实人物的pid 虽然有staff名字,但是不晓得是对应哪个人的话,这个字段就为空咯
job_name string 职位名 原画设计、剧本 该staff的担当职责
desc string ✅ 跟在员工名称后面的备注
emp_name string 员工名称 参与名,不一定是真名


Organization

组织机构,可能是发行商、开发商、工作室等等等等

字段名 类型 nullable 说明 例子 备注
orgId int64 主键 10041 https://www.ymgal.games/oa10041
country string ✅ 国家
website Website[] 相关网站 官方推特、官网等
birthday Date ✅ 建立日期 2020-01-01 string:yyyy-MM-dd,有时可能会出现 Y >= 3000的情况,这一般是因为不知道具体的年份才设置的


Character

角色档案

字段名 类型 nullable 说明 例子 备注
cid int64 主键 19366 https://www.ymgal.games/ca19366
gender GenderEnum 性别 1 number
birthday Date ✅ 生日 2201-01-01 同 Organization#birthday

GenderEnum

这个枚举也会在人那里用到,虽然真实人物没有扶她 = =

Java

public enum GenderEnum {

    UNKNOWN(0, "未知"),
    MAN(1, "男"),
    WOMAN(2, "女"),
    // ふたなり
    FUTANARI(3, "扶她");

    private int code;
    private String desc;

    GenderEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

TypeScript

export enum Gender {
    UNKNOWN = 0, //"未知"
    MAN = 1, //男
    WOMAN = 2,//女
    // ふたなり
    FUTANARI = 3,//扶她
}


Person

现实人类个体

需要注意的是 Person 档案的 name 并不一定就是那个人的真名。 自称、约定速成的名字 都可能存在

字段名 类型 nullable 说明 例子 备注
pid int64 主键 10150 https://www.ymgal.games/pa10150
country string ✅ 国籍
birthday Date ✅ 生日 2001-01-01 同 Character#birthday
gender GenderEnum 性别 1 同 Character#gender
website Website[] 相关网站 []


内容字段建模

ExtensionName

拓展名称字段

字段名 类型 nullable 说明 例子 备注
name string 名称 アイランド、ISLAND
type string ✅ 类型描述 中文译名、英文译名、别名、简称 描述就是中文描述
desc string ✅ 备注 跟在名称后面的备注

MoreEntry

额外键值对, 补充说明用

有的编辑老哥会额外加些东西,比如:

  • 18X补丁发布时间:xxx
  • 特殊码:xxx
  • 发售价格:xxx
  • 等等……
字段名 类型 nullable
key string
value string

Website

和档案相关的网站

字段名 类型 nullable 说明 例子 备注
title string 标题 wiki、官方网站
link string 网站URL https://www.baidu.com



JSON Example (Game)

{
      "publishVersion": 0,
      "publishTime": "2021-08-07 00:00:00",
      "name": "月に寄りそう乙女の作法",
      "chineseName": "近月少女的礼仪",
      "extensionName": [
        {
          "name": "つり乙",
          "type": "",
          "desc": ""
        },
        {
          "name": "Tsuriotsu",
          "type": "",
          "desc": ""
        }
      ],
      "introduction": "主人公大藏游星,作为代表了日本财界的“华丽一族”的大藏家的末端......",
      "state": "PUBLIC_PUBLISHED",
      "weights": 0,
      "mainImg": "http://store.dev-ymgal.com/archive/main/3d/3d99dc3f2888479f98eadb3501c50713.webp",
      "moreEntry": [],
      "gid": 31147,
      "developerId": 10041,
      "haveChinese": true,
      "typeDesc": "",
      "releaseDate": "2012-10-26",
      "restricted": true,
      "country": "",
      "website": [
        {
          "title": "官中网站",
          "link": "https://hikarifield.co.jp/tsukiniyorisou/"
        }
      ],
      "characters": [
        {
          "cid": 19365,
          "cvId": 11333,
          "characterPosition": 1
        },
        {
          "cid": 19366,
          "cvId": 10954,
          "characterPosition": 2
        }
      ],
      "releases": [
        {
          "id": 110064,
          "releaseName": "近月少女的礼仪",
          "relatedLink": "https://hikarifield.co.jp/tsukiniyorisou/",
          "platform": "Windows",
          "releaseLanguage": "Chinese",
          "restrictionLevel": "全年龄"
        },
        {
          "id": 110065,
          "releaseName": "A moon a sun and three macaroons",
          "relatedLink": "https://drive.google.com/file/d/1vTyy7AY0MG6RWJmi-qLsgPERjmm44WiG/view?usp=sharing",
          "platform": "Windows",
          "releaseDate": "2021-07-05",
          "releaseLanguage": "English",
          "restrictionLevel": "未分级"
        }
      ],
      "staff": [
        {
          "sid": 126376,
          "pid": 11083,
          "empName": "鈴平 ひろ",
          "empDesc": "",
          "jobName": "原画"
        },
        {
          "sid": 126377,
          "pid": 11236,
          "empName": "西又 葵",
          "empDesc": "",
          "jobName": "原画"
        }
      ],
      "type": "GAME",
      "freeze": false
    }

搜索游戏-精确

精确搜索游戏,直接返回对应目标 详情

具体的来说,此接口要求传入一个尽可能符合游戏名(或游戏中文名)的关键字以供查询

对于单个档案而言,将同时判定原名与中文名,取高值

本接口命中到复数档案时,返回名称相似度最高的数据

keyword 匹配根据 Trigram 算法实现


此接口并不能保证匹配精确性,只能说,它在满足以下条件时,是可靠的

  • 入参 keyword 是游戏的全名,如:月に寄りそう乙女の作法、近月少女的礼仪
  • 游戏的全名所对应的游戏档案只有 1 个

如果你的入参 keyword 是游戏别名、简称、外号等,大概率你是查不到的,除非它正好和某个游戏名的匹配度较高


Resource Path

GET /open/archive/search-game

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
mode string ✅ 固定值: accurate, 请直接传入此参数
keyword string ✅ length < 96 查询关键字
similarity int32 ✅ 取值范围 50~99 百分比相似度,只会定位到相似度比此参数更高的数据

Request Body

无


Response Body

{
    "game": {},
    "cidMapping": {
        "19366": {
            "cid": 19366,
            "name": "桜小路 ルナ", // 此档案名称,原名
            "mainImg": "",  // 一个完整的图片路径
            "state": "PUBLIC_PUBLISHED",  // 此档案状态
            "freeze": false   // 是否属于一个被冻结的档案
        }
    },
    "pidMapping": {
        "10018": {
            "pid": 10018,
            "name": "橋本 みゆき",
            "mainImg": "",
            "state": "PUBLIC_PUBLISHED",
            "freeze": false
        }
    }
}

说明:

  • game 字段数据和 档案业务模型 中定义的 Game 模型一致,内部嵌套了 character、staff 等关联关系
  • cidMapping 是一个映射表(cid -> data),返回此游戏涉及到的所有 character 基础信息
  • pidMapping 是一个映射表(pid -> data),返回此游戏涉及到的所有 person 基础信息

找不到的 Response body(完整)

{
  "success": false,
  "code": 614,
  "msg": "根据关键字找不到对应档案"
}

搜索游戏列表

同月幕Galgame主站搜索功能。

传入查询 keyword 时,此接口会根据以下要素命中数据:

  • 中文名与原名的完全匹配
  • 与中文名或原名相似度 > 0.5
  • keyword 分词后,根据倒排索引命中的文本向量,按权重大小直出

以上优先度依次递减。


同时此接口支持别名、外号、圈内称呼等查询。

比如:罚抄

可以命中:Rewrite(改写)

当然,能查 != 查的对,查询不等式秒了。


Resource Path

GET /open/archive/search-game

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
mode string ✅ 固定值: list, 请直接传入此参数
keyword string ✅ length < 96 查询关键字
pageNum int32 ✅ 大于 0 页号
pageSize int32 ✅ 取值范围 1~20 页大小

Request Body

无


Response Body

此接口返回一个 Page,下方示例仅为 Page 中列表的单条数据

字段说明请与档案API章节的档案模型对照,这里并没有需要额外注意的参数, 仅需注意返回值中每条数据的 id 等于 gid 即可。

{
  "orgId": 0,
  "orgName": "",
  "releaseDate": "2024-05-10",
  "haveChinese": false,
  "id": 0, // gid
  "name": "",
  "chineseName": "",
  "state": "FREEZE",
  "weights": 0,
  "mainImg": "",
  "publishVersion": 0,
  "publishTime": "2024-05-10 16:15:16",
  "publisher": 0,
  "score": ""
}

查询游戏详情

通过 gid 查询单个游戏的详情

和搜索游戏-精确这个接口的返回值一模一样

除非你是瞎几把传的 gid, 否则不会出现 NOT FOUND 的错误


https://www.ymgal.games/GA31147

GA31147 === Game archive with id 31147


Resource Path

GET /open/archive

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
gid int64 ✅ 游戏ID

Request Body

无


Response Body

{
    "game": {},
    "cidMapping": {
        "19366": {
            "cid": 19366,
            "name": "桜小路 ルナ", // 此档案名称,原名
            "mainImg": "",  // 一个完整的图片路径
            "state": "PUBLIC_PUBLISHED",  // 此档案状态
            "freeze": false   // 是否属于一个被冻结的档案
        }
    },
    "pidMapping": {
        "10018": {
            "pid": 10018,
            "name": "橋本 みゆき",
            "mainImg": "",
            "state": "PUBLIC_PUBLISHED",
            "freeze": false
        }
    }
}

说明:

  • game 字段数据和 档案业务模型 中定义的 Game 模型一致,内部嵌套了 character、staff 等关联关系
  • cidMapping 是一个映射表(cid -> data),返回此游戏涉及到的所有 character 基础信息
  • pidMapping 是一个映射表(pid -> data),返回此游戏涉及到的所有 person 基础信息


查询机构详情

通过 orgId 查询单个机构的详情


Resource Path

GET /open/archive

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
orgId int64 ✅ 机构ID

Request Body

无


Response Body

{
    "org": {
      "publishVersion": 4,
      "publishTime": "2024-05-11 23:00:42",
      "publisher": 1,
      "name": "枕",
      "chineseName": "枕社",
      "extensionName": [
        {
          "name": "まくら",
          "type": "",
          "desc": ""
        },
        {
          "name": "Makura",
          "type": "",
          "desc": ""
        }
      ],
      "introduction": "枕,是一家日本视觉小说制作工作室……",
      "state": "PUBLIC_PUBLISHED",
      "weights": 0,
      "mainImg": "https://store.ymgal.games/archive/main/00/00946e721af7447fa8e5028f7950ca6b.webp",
      "moreEntry": [],
      "orgId": 10270,
      "country": "ja",
      "website": [
        {
          "title": "wikidata",
          "link": "https://en.wikidata.org/wiki/Q6006086"
        },
        {
          "title": "homepage",
          "link": "http://www.makura-soft.com/"
        }
      ],
      "type": "ORGANIZATION",
      "freeze": false
    }
  }

说明:



查询角色详情

通过 cid 查询单个游戏出场角色的详情


Resource Path

GET /open/archive

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
cid int64 ✅ 角色ID

Request Body

无


Response Body

{
  "character": {
    "publishVersion": 4,
    "publishTime": "2021-10-05 22:38:56",
    "publisher": 223,
    "name": "小倉 朝日",
    "chineseName": "小仓朝日",
    "extensionName": [
      {
        "name": "Ookura Yuusei",
        "type": "",
        "desc": ""
      },
      {
        "name": "大蔵 遊星",
        "type": "",
        "desc": ""
      },
      {
        "name": "大藏游星",
        "type": "",
        "desc": ""
      }
    ],
    "introduction": "伪装起性别与身份,樱小路露娜的女仆……",
    "state": "PUBLIC_PUBLISHED",
    "weights": 0,
    "mainImg": "https://store.ymgal.games/archive/main/c9/c92c1ceafcc54ec9a182655faedae453.jpg",
    "moreEntry": [],
    "cid": 19365,
    "gender": 1,
    "birthday": "3000-01-06",
    "type": "CHARACTER",
    "freeze": false
  }
}

说明:



查询人物详情

通过 pid 查询单个人物的详情


Resource Path

GET /open/archive

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
pid int64 ✅ 人物ID

Request Body

无


Response Body

{
  "person": {
    "publishVersion": 1,
    "publishTime": "2022-10-20 02:04:06",
    "publisher": 6228,
    "name": "高野直子",
    "chineseName": "高野直子",
    "extensionName": [
      {
        "name": "川村みどり",
        "type": "马甲",
        "desc": ""
      },
      {
        "name": "雅姫乃",
        "type": "马甲",
        "desc": ""
      }
    ],
    "introduction": "高野直子(1968年6月18日 - ),是日本的女性声优……",
    "state": "PUBLIC_PUBLISHED",
    "weights": 0,
    "mainImg": "https://store.ymgal.games/archive/main/d6/d6ba6218f7bd43a081978c6ff2c4ffc3.webp",
    "moreEntry": [],
    "pid": 10008,
    "country": "ja",
    "birthday": "1968-06-16",
    "gender": 2,
    "website": [
      {
        "title": "事务所个人页",
        "link": "https://sigma7.co.jp/actors/takano_naoko"
      },
      {
        "title": "个人博客",
        "link": "http://naokoblog.exblog.jp/"
      }
    ],
    "type": "PERSON",
    "freeze": false
  }
}

说明:



查询机构下的游戏

指定机构

返回所有该机构下的游戏,没有则为空数组


Resource Path

GET /open/archive/game

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
orgId int64 ✅ 机构ID

Request Body

无


Response Body

[
  {
    "gid": 0,
    "developerId": 0,
    "name": "",
    "chineseName": "",
    "haveChinese": false,
    "mainImg": "",
    "releaseDate": "2024-05-13",
    "state": "FREEZE"
  }
]

查询日期区间内发行的游戏

传入一个日期区间,查询出发行时间在该区间内的游戏

一般可用作查询 本月新作、上月新作 等


Resource Path

GET /open/archive/game

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
releaseStartDate Date ✅ yyyy-MM-dd = string,开始时间
releaseEndDate Date ✅ yyyy-MM-dd = string,结束时间
  1. 开始时间不能在结束时间之后
  2. 区间内的天数不能超过 50
  3. 开始时间必须在 1980 年之后
  4. 开始时间不能超过当前五年,假设今年是2020年,则 releaseStartDate 不能是 2026-01-01

Request Body

无


Response Body

正确返回的话内容不会为 null,如指定区间内不存在发行游戏则返回空数组

[
  {
    "restricted": false,
    "orgName": "",
    "gid": 0,
    "developerId": 0,
    "name": "",
    "chineseName": "",
    "haveChinese": false,
    "mainImg": "",
    "releaseDate": "2024-05-13",
    "state": "FREEZE"
  }
]

随机游戏

随机出一个游戏列表,可指定数量

经过默认的筛选,不会返回一些特别小众的、未经过修订的游戏


Resource Path

GET /open/archive/random-game

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
num int32 ✅ 取值范围1~10 要随机出的数量

Request Body

无


Response Body

本接口必定能返回符合期望的数据条数

[
  {
    "gid": 0,
    "developerId": 0,
    "name": "",
    "chineseName": "",
    "haveChinese": false,
    "mainImg": "",
    "releaseDate": "2024-05-13",
    "state": "FREEZE"
  }
]

主题列表

获取月幕 Galgame 最新发布的资讯或专栏。


Resource Path

GET /open/topic/news —— 获取最新资讯列表

GET /open/topic/column —— 获取最新专栏列表

version: 1


Request Parameter

参数名 类型 默认值 必要 校验 说明
page int32 1 ❌ 大于 0 页号,每页返回 10 条数据

Request Body

无


Response Body

两个接口的返回结构一致。mainImg 为主图完整地址,topicUrl 为文章页面完整地址。

[
  {
    "topicId": 123,
    "author": 456,
    "mainImg": "https://cdn.ymgal.games/topic/main/example.webp",
    "topicUrl": "https://www.ymgal.games/co/article/123",
    "title": "文章标题",
    "introduction": "文章简介",
    "views": 100,
    "replyNum": 10,
    "likesNum": 20,
    "favoritesNum": 5,
    "publishTime": "2026-08-05 12:00:00",
    "createAt": "作者名称",
    "topicCategory": "资讯"
  }
]

Change list

2026-08-05

  • API:查询最新资讯与专栏列表

2025-04-12

  • 移动端适配

2024-06-23

  • API:查询机构详情
  • API:查询角色详情
  • API:查询人物详情

2024-05-15

经过观察,较稳定,正式发布

  • API:查询机构下的游戏
  • API:查询日期区间内发行的游戏
  • API:随机游戏

2024-05-11

预发布,稳定性及易用性待考察

  • OAuth2.0 认证接口已测试
  • API:搜索游戏-精确
  • API:搜索游戏列表
  • API:查询游戏详情
  • HTML 生成稳定