部署hitokoto一言api

一言-hitokoto 是什么

​ 先放上官方的链接 一言网 ,

​ 一句话服务,简单说就是随机选取一句话展现出来,效果图。

1

需要做什么

  • 部署接口

    在网站根目录新建hitokoto文件夹,然后在文件夹里新建 index.php 文件

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    $path = dirname(__FILE__);
    $file = file($path."/hitokoto.txt"); #hitokoto.txt为语句文件
    $arr = mt_rand( 0, count( $file ) - 1 ); #随机选取一行
    $content = trim($file[$arr]);
    if (isset($_GET['charset']) && !empty($_GET['charset'])) {
    $charset = $_GET['charset'];
    if (strcasecmp($charset,"gbk") == 0 ) {
    $content = mb_convert_encoding($content,'gbk', 'utf-8');
    }
    } else {
    $charset = 'utf-8';
    }
    header("Content-Type: text/html; charset=$charset");
    if ($_GET['format'] === 'js') {
    echo "function hitokoto(){document.write('" . $content ."');}";
    } else {
    echo $content;
    }
  • 获取语句文件(hitokoto.txt)

    一言网 爬取 语句文件

    一言网 api的请求地址为:https://v1.hitokoto.cn/

    根据官方提供的文档,返回默认为json格式,各参数如下.

    3

    选择需要的分类(tpye),将id和正文(hitokoto)分别保存下来,避免重复。

    代码如下,请前往 此处 下载 (说起来这好像是我写的第一个爬虫…)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import requests
import argparse
import json
import time

L=[]

#读取已经存在的hitokoto,避免重复
def loadFromfile():
global L
with open('id.txt','r') as f:
idcount=0;L=[]
for line in f:
L.append(line)
idcount+=1
print(str(idcount)+" hitokoto loaded")

#将内容写入文件,content为内容,file为地址
def writeTofile(content,file):
with open(file,'a',encoding='utf-8') as f:
f.write(content+'\n')


def gethitokoto(amount,delay):
count=0
loadFromfile()
while count < amount:
r=requests.get('https://v1.hitokoto.cn/')
#hitokoto.cn上的一些json格式是错误的,会报错然后脚本终止,用try..except跳过
try:
hitokoto_json=r.json()
except json.decoder.JSONDecodeError as e:
continue
#选取需要的分类
if (hitokoto_json['type'] == 'a' or hitokoto_json['type'] == 'b' or hitokoto_json['type'] == 'c' or hitokoto_json['type'] == 'd'):
if hitokoto_json['id'] in L:
continue
count += 1
if hitokoto_json['from']!='':
content=hitokoto_json['hitokoto']+'---《'+hitokoto_json['from']+'》' #加上破折号和书名号
else:
content=hitokoto_json['hitokoto'] #有些hitokoto没有from
writeTofile(str(hitokoto_json['id']),'id.txt')
writeTofile(content,'hitokoto.txt')
time.sleep(delay) #请求间隔

#传入命令行参数
def parseArguments():
parser = argparse.ArgumentParser()
parser.add_argument("-a", help="counts of request", type=int)
parser.add_argument("-d", help="delay between each request in second", type=float, default=0.5)
if not parser.parse_args().a:
print("Missing arguments.\nUsing: python hitokoto.py --help for more information")
exit(1)
return parser.parse_args()

args = parseArguments()
gethitokoto(args.a,args.d)
print(str(args.a)+" hitokoto is successfully added to hitokoto.txt")

命令行运行示例

1
python hitokoto.py -a <amount of the hitokoto> -d <delay>

脚本会在相应目录下生成id.txt 和hitokoto.txt 文件

将hitokoto.txt 文件放入之前创建的hitokoto文件夹内

  • 调用部署好的接口

    将下面两行代码添加到博客你想显示一言的位置

    1
    2
    <script type="text/javascript" src="https://你的域名/hitokoto/?format=js&charset=utf-8"></script>
    <div id="hitokoto"><script>hitokoto()</script></div>

参考链接

老D博客-给博客加上 Hitokoto·一言经典语句

写了个一言爬虫–Blessing Studio

Requests: 让 HTTP 服务人类

python文件的IO操作

argparse-python之旅