自制一言API全指南

Nov 04, 2019

采集数据

用python爬 古诗文网的名句 可以看到古诗文网限制了网页端的深度翻页 不过可以在手机上用HttpCanary抓包。拿到api之后就简单了,可以直接用python内置的json库解码。 完整的python代码如下:

#!env python3

import requests
import json
from tqdm import tqdm #显示进度,可以去掉

url="https://app.gushiwen.cn/api/mingju/Default10.aspx?c=&t=&page={}&token=gswapi"
f = open("./hitokoto.json","w")
f.write("[")
for i in tqdm(range(1,101)):
    content=requests.get(url.format(i)).content
    poem=json.loads(content)['mingjus']
    for j in range(50):
        if poem[j]['author']:
            sentence='{{"hitokoto":"{0}","source":"{1}《{2}》"}}'.format(poem[j]['nameStr'], poem[j]['author'], poem[j]['shiName'])
        else:
            sentence='{{"hitokoto":"{0}","source":"《{1}》"}}'.format(poem[j]['nameStr'], poem[j]['zhangjieNameStr'])
        if i != 100 or j != 49:
            sentence += ",\n"
        f.write(sentence)
f.write("]")
f.close()

因为有些名句没有作者,所以多加了一层判断。最后输出为hitokoto.json,一共五千行。

编写php制成api

有了json源文件后,再用php解码,并根据输入参数随机输出。 api应该有纯文本与json两种输出格式,可带或不带来源。 完整的php代码如下:

<?php
header("Access-Control-Allow-Origin: *");
$data  = dirname(__FILE__) . '/hitokoto.json';
$json  = file_get_contents($data);
$array = json_decode($json, true);
$count = count($array);
$num = array_rand($array);
if ($_GET['encode'] == 'json') {
    if ($_GET['source']) {
        $hitokoto = json_encode($array[$num]);
    } else {
        unset($array[$num]['source']);
        $hitokoto = json_encode($array[$num]);
    }

} else {
    if ($_GET['source']) {
        $hitokoto = $array[$num]['hitokoto'] . '——' . $array[$num]['source'];
    } else {
        $hitokoto = $array[$num]['hitokoto'];
    }
}
echo $hitokoto;

样例

API直接访问默认输出为纯文本不带来源。

参数 含义
encode json 或 留空 json格式输出 或 纯文本输出
source 0 或 1 不带来源 或 带来源

举个例子,输出带来源的json: https://api.func.ltd/hitokoto/?encode=json&source=1

最后做出来就像本站底部的hitokoto部分,刷新一次显示一句古诗词。

HitokotoPythonPHP

Debian/Ubuntu 编译安装 mosh