Loline——一个flask RESTful API

Loline

受于一言的启发,利用今天一下午的时间利用flask建立了一个轻量级的RESTful API——Loline。其内容大抵是英雄联盟143位英雄的中英文绰号、名字和pick台词。

下文所列出的部分网站可能需要科学上网才能访问

一开始要收集到所有英雄的全部台词的,发现收集这些东西真的很难。

中文名称及绰号

这个是在鹅厂联盟官网资料库收集的,因为用了不懂的技术,网页源代码里边没有要找的数据,自然也不能用简单的爬虫来做这些事。还是浏览器开发者工具帮了忙:在Elements一栏可以复制想要的数据,然后保存到本地文件,就可以用Beautiful Soup来提取数据了。这里提取到的是中英文名称及中文绰号,然后根据英文名称去下一步爬取英文绰号。

英文绰号

一开始去了拳头的开发网站,发现根本没有提供这种接口。后来发现在GamePedia的英雄详情页有需要的东西,但也仅仅是lol.qq.com的英文版(能用爬虫解决)。写好爬虫脚本,来回更改执行好几次才把英文绰号保存下来。

在GemaPedia-英雄联盟的主页仔细看了一下,也没找到英雄详细信息的入口,得在搜索栏搜索英雄的名字才能找到,例如:Teemo

Pick台词

然后又是pick台词的收集工作,这是最令人头疼的地方。在百度云搜素引擎上找到了大多数英雄的Word版英雄台词,但因为建立日期比较早,有很多台词已经更改了,再加上处理量比较大、需求量不高,就暂时搁置了那个Word。但总得有点内容吧,就选定了Pick英雄的台词,大都是百度谷歌搜集而来。因为英雄改版重做等原因,有些已经不适用了,然后自己启动游戏训练模式,选好英雄听语音,然后立马关掉……不知道百度、谷歌、开关游戏多少次,才勉强把143位英雄的台词收集完。因为有的英雄台词不太熟悉,可能有的已经过时而没有更改,这就等到发现再说吧。

Api的使用

使用方式经多次尝试,已经更新为新的方式

使用方法是同一言一样 ,你同样可以参照原文作者的方式,但只需要根据下方代码把themes/next/layout/_macro/sidebar.swig中的id和Hitokoto的小标题改一下即可。

themes/next/layout/_scripts/commons.swig
<script type="text/javascript">
$.get('http://149.129.113.178:5000/', function (data) {
console.log('----------------------------------------')
console.log(data)
$('#loline-content').css('display', '').text(data.words);
$('#loline-from').css('display', '').text('——' + data.title_zh+' '+data.name_zh);
});

代码

收集数据的时候也写了不少的代码,但保存下来数据之后其中大多数已经没有用了,所以这里只贴出来了Flask的代码。需要请邮件联系获取 😄

#! py -3
# -*- coding: utf-8 -*-

import json
import random
from util import load_champions
from flask import Flask, jsonify, abort, make_response, request

# http://www.pythondoc.com/flask-restful/first.html
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
champions = load_champions("data/champions.json")

@app.route('/', methods=['GET'])
def index():
id_ = random.randint(1, len(champions))
print(id_)
champion = list(filter(lambda t: t['id'] == id_, champions))
return jsonify(champion[0])

def after_requests(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
return response

@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not Found'}), 404)

if __name__ == '__main__':
app.after_request(after_requests)
app.run(debug=True)