如何通过Anilist GraphQL API按MyAnimeList ID批量查询媒体条目?
批量通过MAL ID获取Anilist媒体条目的解决方案
针对Anilist GraphQL API不支持直接通过MAL ID数组批量查询的问题,有以下几种高效的替代方案:
方案1:单个GraphQL请求中定义多个Media字段
在一个查询里为每个MAL ID单独声明一个Media字段,通过不同变量传递ID,一次性获取所有结果。
示例查询:
query BatchMedia($idMal1: Int!, $idMal2: Int!) { media1: Media(idMal: $idMal1) { id idMal title { romaji english } coverImage { large } # 按需添加你需要的其他字段(对应原查询的media片段) } media2: Media(idMal: $idMal2) { id idMal title { romaji english } coverImage { large } # 保持与上面一致的字段集合 } }
对应的变量:
{ "idMal1": 21, "idMal2": 166531 }
- 优势:单次HTTP请求完成,避免多次网络往返开销
- 注意事项:若MAL ID数量较多,查询语句会大幅变长;需留意Anilist的查询复杂度限制,避免超限。
方案2:发送批量GraphQL请求
Anilist支持在单个HTTP请求中发送多个GraphQL查询(批量请求),复用同一个查询模板,仅修改变量即可。
示例请求体(JSON格式):
[ { "query": "query Media($idMal: Int!) { Media(idMal: $idMal) { id idMal title{romaji} } }", "variables": {"idMal": 21} }, { "query": "query Media($idMal: Int!) { Media(idMal: $idMal) { id idMal title{romaji} } }", "variables": {"idMal": 166531} } ]
- 优势:无需修改查询结构,复用性强;相比多次独立HTTP请求,减少了TCP握手、连接建立等额外开销
- 注意事项:单次批量请求的查询数量建议控制在10-20个以内,避免触发Anilist的限流机制。
方案3:先映射MAL ID到Anilist ID,再批量查询
如果需要频繁批量查询,可先将MAL ID转换为对应的Anilist ID并缓存,之后使用Anilist支持的id_in过滤器批量查询:
步骤1:批量转换ID(用方案1或2实现)
步骤2:使用id_in批量查询
query BatchMedia($anilistIds: [Int]!) { Page { media(id_in: $anilistIds) { id idMal title { romaji english } coverImage { large } } } }
对应的变量:
{ "anilistIds": [1535, 111087] // 对应MAL ID 21、166531的Anilist ID }
- 优势:适合长期批量查询场景,查询结构简洁,复杂度更低
内容的提问来源于stack exchange,提问作者Swargaraj Bhowmik
相关产品推荐
相关产品推荐

