Skip to main content

journapi

Latest Release License Python badge badge badge badge

标准、可扩展的学术制品元数据检索 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

许可证

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

journapi-0.1.0.tar.gz (42.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

journapi-0.1.0-py3-none-any.whl (35.0 kB view details)

Uploaded Python 3

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

Hashes for journapi-0.1.0.tar.gz
Algorithm Hash digest
SHA256 54d809450a83d269cde84fb01505eecb10918e144c23351082e7a075abc5cf03
MD5 0708bd0a78b504f6e3c3bca423a90436
BLAKE2b-256 4c7aafe8b0a5ab39efc90b60621aa82fca4e08fab4062cca121828430282d8a4

See more details on using hashes here.

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

Hashes for journapi-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4c2562f6e580b9aa16775abfb39c66185da805d4fc51ff8420a03d78e56fbed6
MD5 4afc7a0828665c270f36811deed41681
BLAKE2b-256 f28f31e91946bb673b715348b884a49cebbad8733359d11ef35ad9cc2783e118

See more details on using hashes here.

Release history Release notifications | RSS feed

1.0.1

2 files

1.0.0

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page