V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lhx2008
V2EX  ›  分享创造

一言·古诗词 API,随机返回一条古诗词名句,支持 svg/json/png/txt 返回, Vert.x 异步框架 + Redis 开发,毫秒级稳定响应。 [开源]

  •  2
     
  •   lhx2008 ·
    xenv · 2018-08-05 21:47:14 +08:00 · 7446 次点击
    这是一个创建于 2301 天前的主题,其中的信息可能已经有所发展或是发生改变。



    简介

    古诗词·一言 API 是一个可以随机返回一句古诗词名句的接口。(可刷新本页查看效果)

    具有以下特点:

    • 快:使用 Vert.x Java 异步框架开发,使用 Redis 数据库,确保毫秒级稳定响应。
    • 多:收录将近 10000 条古诗词名句
    • 全:支持 svg / txt / json / png 调用,满足你在任何地方的调用需求
    • 准:可以根据你的喜好,在指定的分类中进行随机返回

    项目首页:https://gushi.ci

    项目 Github: https://github.com/xenv/gushici


    API 举例

    API 地址格式(仅支持 https)

    https://api.gushi.ci/{一级分类}/{二级分类(可选)}.{返回格式(可选)}

    查看所有目前支持的分类:https://api.gushi.ci/

    目前支持的后缀:.svg .txt .png .json 不加后缀默认返回 json

    例子:SVG 调用
    <img src="https://api.gushi.ci/all.svg">
    

    SVG 后缀是我们推荐的最优调用方案,可以在部分论坛、任何博客、小程序内无损直接调用,并且可以一定程度上控制样式。缺点是部分老旧浏览器不支持。

    其他调用方案见:https://gushi.ci

    闲话

    无意中了解到 hitokoto API,感于没有古诗词方面的 API,便想自己动手撸一个。并且,在返回结果的类型上,做了更多大胆的尝试。可以说是很有创新的。

    技术栈上,第一次尝试 使用 Vert.x 开发应用,整个开发耗时两天,Vert.x 整体来说性能确实不错,响应时间一般在 15ms 以内,而本地则在 5ms 以内。但是相关生态确实不完善。异步编程也带来了更多的 bug,对于调试来说也是一个不小的挑战。

    数据库我直接选择了 Redis,原因一个是为了追求极速的响应速度,第二是数据一般没有什么变化,查询也简单,没有必要用 mysql 等落地。直接从 Python 数据源采集发到 redis 即可。欢迎有兴趣的同学共同学习,提意见。

    第 1 条附言  ·  2018-08-06 07:55:06 +08:00
    有计划用 mongo 重写数据源,以便更快的响应多数据源和多纬度搜索
    第 2 条附言  ·  2018-09-25 21:56:18 +08:00
    新版接口,根据时间地点天气事件推荐一句古诗词: https://www.v2ex.com/t/492535
    58 条回复    2018-08-12 09:39:21 +08:00
    monkeylmj
        1
    monkeylmj  
       2018-08-06 00:21:36 +08:00 via Android
    lhx2008
        2
    lhx2008  
    OP
       2018-08-06 00:22:44 +08:00
    @monkeylmj V2 只能 markdown 才能加自己的图片,回复只能用 v2 图床和新浪的
    monkeylmj
        3
    monkeylmj  
       2018-08-06 00:24:30 +08:00 via Android
    @lhx2008 长姿势了
    mooncakejs
        4
    mooncakejs  
       2018-08-06 00:26:04 +08:00 via iPhone
    数据不大直接加载到内存比较好吧,干嘛还要 redis
    lhx2008
        5
    lhx2008  
    OP
       2018-08-06 00:32:31 +08:00
    @mooncakejs

    1. 数据不少,一万条,png 用 base64 存,有 20 多 M
    2. 访问量统计需要持久化
    3. 可以异地 /跨语言直接发布新的数据,现在的数据就是由 python 发上去的
    karottc
        6
    karottc  
       2018-08-06 00:50:01 +08:00 via Android
    优秀,后生可畏
    imhx233
        7
    imhx233  
       2018-08-06 01:35:50 +08:00 via iPhone
    哇 其实这也是我一直想做的(奈何没技术)。

    可以考虑下根据诗人甚至具体到某一首诗来返回一言。

    本来想自己部署一个的,但是部署方式太复杂了,于是只能作罢。
    twor
        8
    twor  
       2018-08-06 01:45:45 +08:00
    能支持自定义语句吗

    比如 ” PHP 是最好的语言 - 爱因斯坦“
    lhx2008
        9
    lhx2008  
    OP
       2018-08-06 07:42:55 +08:00 via Android
    @imhx233
    现在的话只能是写死的分类了,如果要多纬度的话可能要用 mongo 重新做数据源
    自定义语句,现在是可以用 redis 命令自己添加的,不支持用户添加。
    densuc
        10
    densuc  
       2018-08-06 08:03:39 +08:00 via iPhone
    哈哈哈 记得 你还是高中生吧 😁
    lhx2008
        11
    lhx2008  
    OP
       2018-08-06 08:10:21 +08:00
    @densuc 你这怕是几年前的记忆 😂
    missdeer
        12
    missdeer  
       2018-08-06 08:59:21 +08:00
    数据库能分享吗
    dejavuwind
        13
    dejavuwind  
       2018-08-06 09:02:05 +08:00 via Android
    手动点赞。古诗词我还是很喜欢的。
    E0
        14
    E0  
       2018-08-06 09:03:47 +08:00 via Android
    赞一个,有些一言 api 句子真的尴尬中二。
    henbf
        15
    henbf  
       2018-08-06 09:24:51 +08:00
    <kbd><img src="https://api.gushi.ci/all.svg"></kbd>
    sagaxu
        16
    sagaxu  
       2018-08-06 09:24:58 +08:00 via Android   ❤️ 1
    才 10K 条,png 不需要 base64 编码,全放内存里很合适,毕竟 JVM 基础开销都不止 20M 了。统计可以记录到进程内,定期往 db 里刷写。
    Sanko
        17
    Sanko  
       2018-08-06 09:31:37 +08:00
    支持楼主,这个一定时间内有没有访问次数限制?
    lhx2008
        18
    lhx2008  
    OP
       2018-08-06 09:34:20 +08:00
    @Sanko 暂时没有, 不过如果服务器顶不住的话会在 nginx 加规则,当然还是以宽松为主。
    lhx2008
        19
    lhx2008  
    OP
       2018-08-06 09:35:42 +08:00
    @missdeer 自行采集吧,数据源是 古诗文网 的名句,还是保留点私货哈哈
    kokdemo
        20
    kokdemo  
       2018-08-06 10:12:10 +08:00
    这个有点帅啊!
    pipijin
        21
    pipijin  
       2018-08-06 11:29:25 +08:00 via Android
    优秀
    kran
        22
    kran  
       2018-08-06 17:03:12 +08:00 via iPhone
    看了这个帖子自己写了一个,30 多万的数据 us 级响应,sqlite 数据库
    lhx2008
        23
    lhx2008  
    OP
       2018-08-06 17:34:48 +08:00 via Android
    @kran 走 http 吗?其实我感觉时间主要还是看 http 框架和链路上的各种反代和防火墙了
    sangmong
        24
    sangmong  
       2018-08-06 18:04:05 +08:00
    dyxang
        25
    dyxang  
       2018-08-06 18:22:27 +08:00
    楼主 good,用的是这个库吗,在这里: https://github.com/chinese-poetry/chinese-poetry
    lhx2008
        26
    lhx2008  
    OP
       2018-08-06 18:45:06 +08:00 via Android
    @dyxang 谢谢,看过这个,这个没有名句的数据,我自己在网上随便找的数据
    sobigfish
        27
    sobigfish  
       2018-08-06 18:48:08 +08:00
    字体看着虚, 用个开源的黑体?
    dyxang
        28
    dyxang  
       2018-08-06 19:01:54 +08:00   ❤️ 1
    @sobigfish 黑体就没有古风的感觉了
    楼主为何不用古体字,类似方正龙爪字体,或者文悦古典明朝体(非商用)
    这是文悦古典明朝体的
    sobigfish
        29
    sobigfish  
       2018-08-06 19:07:44 +08:00
    @dyxang #28 因为版权问题-。- 所以我建议用开源的字体
    dyxang
        30
    dyxang  
       2018-08-06 19:10:58 +08:00
    @sobigfish (非商用)
    lhx2008
        31
    lhx2008  
    OP
       2018-08-06 19:22:50 +08:00
    @dyxang
    svg 用的是用户的系统字体,而不是我这边生成,svg 默认是楷体,如果没有是用雅黑或者其他系统字体。小众字体要有效果必须要用户电脑安装了字体。你可以在引用的时候修改 SVG 的 CSS,嵌入网络字体。
    png 是我这边生成,用的是思源宋体,
    lhx2008
        32
    lhx2008  
    OP
       2018-08-06 19:23:09 +08:00
    @sobigfish 见上
    lhx2008
        33
    lhx2008  
    OP
       2018-08-06 19:24:24 +08:00
    font-family='KaiTi, "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans","wenquanyi micro hei","Hiragino Sans GB", "Hiragino Sans GB W3", sans-serif'
    kran
        34
    kran  
       2018-08-06 22:13:00 +08:00 via iPhone
    kran
        35
    kran  
       2018-08-06 22:13:50 +08:00 via iPhone
    @lhx2008 这点数据确实没必要要求数据库怎么样。
    sevenQu
        36
    sevenQu  
       2018-08-06 23:38:26 +08:00
    感觉挺好的,不知道为什么,我必须要翻墙才能看到你的网站和 api 返回,是我的原因吗?,ps:如果是返回是完整的诗会更好,总是一句经典的,我个人总想去看看全诗是什么
    lhx2008
        37
    lhx2008  
    OP
       2018-08-07 09:22:34 +08:00 via Android
    @sevenQu 没有被墙,可能是 dns 的问题吧,小众域名管理局的 dns 不给力,有机会还是换回主流域名吧
    vjnjc
        38
    vjnjc  
       2018-08-07 12:12:02 +08:00
    已 star。
    请问楼主能部署在我的域名下嘛?买了一个域名不知道放点啥 0 0
    vjnjc
        39
    vjnjc  
       2018-08-07 12:14:02 +08:00
    再看了一下,svg 的效果很好啊,原来能这么用
    lhx2008
        40
    lhx2008  
    OP
       2018-08-07 12:25:47 +08:00 via Android
    @vjnjc 哈?我就是为了这个项目专门注册了个域名
    E1n
        41
    E1n  
       2018-08-07 13:20:33 +08:00 via Android
    不错👍
    vjnjc
        42
    vjnjc  
       2018-08-07 14:21:22 +08:00
    @lhx2008 前阵子脑袋一热买了个域名,现在没东西放。请问楼主我能编译下你的源码,然后挂我自己域名下嘛?(你要是不介意的话
    lhx2008
        43
    lhx2008  
    OP
       2018-08-07 15:38:09 +08:00 via Android
    @vjnjc GPL 协议的,你自己可以编译运行来玩啊,只是不能卖给别人。
    我没有提供完整的古诗词数据在 github 上面,不过代码是没问题的。所以你自己玩还要自己采集下数据。
    lhx2008
        44
    lhx2008  
    OP
       2018-08-07 15:47:12 +08:00 via Android
    @vjnjc 或者你自己直接用 nginx 反代我的 api,哈哈
    vjnjc
        45
    vjnjc  
       2018-08-07 17:22:11 +08:00
    @lhx2008 好的,那我自己编译一份~
    sangmong
        46
    sangmong  
       2018-08-08 17:20:10 +08:00
    想要整首诗。。。类似西窗烛那种
    x7395759
        47
    x7395759  
       2018-08-08 17:46:10 +08:00
    太强了
    lemcon
        48
    lemcon  
       2018-08-10 00:16:12 +08:00
    特地登录一个 n 年前的账号上来狂顶楼主
    lemcon
        49
    lemcon  
       2018-08-10 00:16:35 +08:00
    楼主,什么时候能加关键词呀?
    lhx2008
        50
    lhx2008  
    OP
       2018-08-10 00:21:19 +08:00 via Android
    @lemcon 谢谢,会考虑提供更多标签(分类)和更加智能的显示,但是根据关键词搜索结果这个,没有在计划内,不过你也可以自己稍微改一下来玩玩。(只采集你想要的关键词的诗导入就可以)
    keller
        51
    keller  
       2018-08-10 09:34:32 +08:00
    无法访问此网站
    gushi.ci 的响应时间过长。
    lhx2008
        52
    lhx2008  
    OP
       2018-08-10 09:39:30 +08:00 via Android
    @keller 能给我看下 ping 的结果吗,看看解析到哪里去了
    lhx2008
        53
    lhx2008  
    OP
       2018-08-10 09:44:21 +08:00 via Android
    @keller gushi.ci 是静态页面,不存在响应时间过长。。
    lhx2008
        54
    lhx2008  
    OP
       2018-08-10 10:03:39 +08:00 via Android
    @keller

    @sevenQu

    项目首页更换到了阿里云香港 oss,原来是东京机房,现在不知道会不会访问正常了
    ibegyourpardon
        55
    ibegyourpardon  
       2018-08-11 23:16:56 +08:00
    svg 在线是用什么生成的……
    lhx2008
        56
    lhx2008  
    OP
       2018-08-11 23:19:36 +08:00
    @ibegyourpardon 在浏览器打开 svg,右键查看源代码你就懂了。
    ibegyourpardon
        57
    ibegyourpardon  
       2018-08-12 09:36:21 +08:00
    @lhx2008 噗……

    可是那 PNG 就实在看不懂了,这总得实时生成绘图吧。
    lhx2008
        58
    lhx2008  
    OP
       2018-08-12 09:39:21 +08:00
    @ibegyourpardon 离线绘图然后丢进 redis,实时太慢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2558 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:56 · PVG 12:56 · LAX 20:56 · JFK 23:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.