journapi
标准、可扩展的学术制品元数据检索 SDK + CLI —— 首个数据源为期刊(通过公开的 ISSN Portal),提供 Provider 抽象层,为后续更多数据源(文献、DOI 等)预留扩展能力。
项目状态:alpha。ISSN Portal 公开网页接口已实现并测试;官方订阅 API(api.issn.org, REST + JWT)提供完整 Provider 骨架(需订阅凭据端到端验证)。
功能特性
- 期刊检索 — 按刊名、ISSN、eISSN、ISSN-L 搜索,返回 ISSN、ISSN-L、ISSN-H、标题、介质、国家等
- 单条记录 — 按 ISSN 精确查询,含 ISSN-L / ISSN-H、正式题名、出版频率、语言、年份等
- ISSN-L 集群 — 展开同一刊物全部介质版本(Print/Online),含频率、语言、创刊年份
- ISSN-H 家族信息 — 展示历史沿革家族标识与成员数(家族明细需订阅)
- Web UI — 内置浏览器界面,搜索 / 精确查询双模式,可视化浏览
- 中文支持 — 中文刊名自动分词转拼音检索(可选依赖)
- 礼貌抓取 — 限速(robots.txt Crawl-delay 1s)、重试退避、可选缓存
- Provider 抽象 — 注册式多数据源,官方订阅 API 自动降级到公开源
- CLI + JSON — 表格或 JSON 输出,方便脚本与 Agent 集成
架构概览
+------------------------------------+
| Public API 层 |
| ArtifactSearchClient (门面) |
+----------------+-------------------+
|
+-----------------+-----------------+
| | |
v v v
+------------+ +------------+ +------------+
| issn_portal| |issn_portal_| | 第三方 |
| (公开网页)| | api(订阅) | | Provider |
+------+-----+ +------+-----+ +------+-----+
| | |
+-----------------+-----------------+
|
v
+------------------------------------+
| Provider 抽象层 |
| ArtifactProvider (ABC) |
+----------------+-------------------+
|
v
+------------------------------------+
| 基础设施层 |
| HTTP 客户端 | 限速 | 重试 | 缓存 |
+------------------------------------+
|
v
+------------------------------------+
| 应用层 |
| CLI (search/get/cluster/web) |
| Web UI (内置浏览器界面) |
| Agent Skill (AI 助手集成) |
+------------------------------------+
项目结构
journapi/
├── src/journapi/ SDK 核心
│ ├── api.py ArtifactSearchClient 门面 + Provider 注册表
│ ├── models.py 统一数据模型(JournalRecord / SearchOptions 等)
│ ├── provider.py ArtifactProvider 抽象基类
│ ├── http.py HTTP 客户端(限速 / 重试 / 缓存)
│ ├── sources/ 数据源
│ │ └── issn_portal/ ISSN Portal 期刊源
│ │ ├── provider.py 公开网页源(search / get / cluster)
│ │ └── api_client.py 官方订阅 API(REST + JWT)
│ ├── cli/ CLI 入口(search / get / cluster / web)
│ └── web/ 内置 Web UI
│ ├── server.py 服务逻辑(模板加载 + 路由 + JSON API)
│ └── templates/ 前端模板(base / search / record / cluster)
├── skills/ AI Agent 技能
│ └── journapi-skill/ 期刊检索技能(SKILL.md)
├── examples/ 可运行示例
├── docs/ 详细文档
└── tests/ 单元测试
安装
包已发布到 PyPI(包名 journapi)。三种使用方式:
1. uvx 免安装直接运行(推荐)
uvx journapi --help
uvx journapi search "Hearing research"
2. pip 安装(长期使用 / 脚本内调用)
pip install journapi # 仅 CLI
pip install "journapi[chinese]" # 含中文刊名分词支持
3. uv tool 全局安装
uv tool install journapi
journapi search "Hearing research"
开发环境
git clone https://cnb.cool/xqitw/artifetch.git
cd journapi
uv sync --extra chinese --extra dev
快速开始
Python API
import asyncio
from journapi import ArtifactSearchClient, SearchOptions
async def main():
async with ArtifactSearchClient() as client:
# 1) 按刊名 / ISSN / eISSN / ISSN-L 搜索
results = await client.search("Hearing research")
for rec in results.items:
print(rec.issn, rec.issn_l, rec.issn_h, rec.title)
# 2) 按 ISSN 精确查询(含 ISSN-L / ISSN-H)
rec = await client.get("0964-1998")
print(rec.issn_l, rec.issn_h) # 0964-1998 / 9063-7704
# 3) 展开 ISSN-L 集群
members = await client.cluster_issnl("0378-5955")
for m in members:
print(m.issn, m.medium, m.title)
asyncio.run(main())
完整示例见 examples/ 目录。
CLI
# 搜索期刊(刊名 / ISSN / eISSN / ISSN-L)
journapi search "Hearing research"
journapi search 0378-5955 --json
journapi search "hearing" --media online --country USA --page-size 50
# 单条记录
journapi get 0964-1998
# ISSN-L 集群
journapi cluster 0378-5955
# Web UI(浏览器界面)
journapi web --host 127.0.0.1 --port 8787
# 然后浏览器打开 http://127.0.0.1:8787
Web UI
journapi web 启动内置浏览器界面,支持:
- 🔍 搜索 — 按刊名 / 关键词模糊搜索,返回结果列表
- 🎯 精确查询 — 输入 ISSN / eISSN / ISSN-L 直接获取单条记录
- ISSN-L 集群 — 查看刊物全部介质版本
- ISSN-H 家族 — 展示历史沿革标识与成员数
模块说明
| 模块 | 说明 |
|---|---|
src/journapi/api.py |
门面 + Provider 注册表(register_provider / list_providers) |
src/journapi/models.py |
统一数据模型:JournalRecord / SearchResult / SearchOptions |
src/journapi/http.py |
HTTP 客户端:限速、重试退避、可选缓存 |
src/journapi/sources/issn_portal/ |
ISSN Portal 期刊数据源(公开网页 + 官方订阅 API) |
src/journapi/cli/ |
CLI:search / get / cluster / web |
src/journapi/web/ |
内置 Web UI(模板 + 路由 + JSON API) |
skills/ |
AI Agent 技能(npx skills 可安装) |
环境变量
| 变量 | 使用方 | 用途 | 何时需要 |
|---|---|---|---|
ISSN_PORTAL_USERNAME |
issn_portal_api |
官方订阅 API 用户名 | 使用官方订阅 API 时(也可通过构造参数传入) |
ISSN_PORTAL_PASSWORD |
issn_portal_api |
官方订阅 API 密码 | 使用官方订阅 API 时(也可通过构造参数传入) |
Skills
通用智能体技能,通过 npx skills 安装。
npx skills add https://cnb.cool/xqitw/artifetch.git
关键设计
- Provider 抽象层 — 所有数据源实现
ArtifactProvider接口,上层 API / CLI / Web 与具体源解耦 - 统一数据模型 —
JournalRecord跨数据源一致,字段可空性按数据层级区分(搜索卡片 / 详情页 / 集群页) - 礼貌抓取 — 内置限速(robots.txt Crawl-delay 1s)、重试退避、可选缓存
- 自动降级 — 官方订阅 API 不可用时自动回退到公开网页源
- enrich 合并 —
get()自动从 ISSN-L 集群页合并频率/语言/年份,从搜索卡片反查 ISSN-H 家族成员数 - 前端模板化 — Web UI 前端为独立模板文件,Python 仅做
{{TOKEN}}替换,无内嵌 HTML
合规说明
公开门户面向人工浏览。journapi 遵循其 robots.txt:/resource/ISSN/ 允许抓取,/resource/ISSN-L/ 与 /resource/ISSN-H/ 禁止抓取,并强制 1s 爬取延迟。生产 / 批量场景请订阅官方搜索 API 并使用订阅 Provider。
文档
贡献指南
欢迎参与贡献!详细的贡献规范和开发流程请参考 CONTRIBUTING.md。
许可证
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file journapi-0.1.0.tar.gz.
File metadata
- Download URL: journapi-0.1.0.tar.gz
- Upload date:
- Size: 42.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54d809450a83d269cde84fb01505eecb10918e144c23351082e7a075abc5cf03
|
|
| MD5 |
0708bd0a78b504f6e3c3bca423a90436
|
|
| BLAKE2b-256 |
4c7aafe8b0a5ab39efc90b60621aa82fca4e08fab4062cca121828430282d8a4
|
File details
Details for the file journapi-0.1.0-py3-none-any.whl.
File metadata
- Download URL: journapi-0.1.0-py3-none-any.whl
- Upload date:
- Size: 35.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c2562f6e580b9aa16775abfb39c66185da805d4fc51ff8420a03d78e56fbed6
|
|
| MD5 |
4afc7a0828665c270f36811deed41681
|
|
| BLAKE2b-256 |
f28f31e91946bb673b715348b884a49cebbad8733359d11ef35ad9cc2783e118
|