-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathapi.py
108 lines (86 loc) · 3.52 KB
/
api.py
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import json
from uuid import uuid4
from flask import request, abort, send_file, session
import captcha
import common as oddb
from common import taskManager
from database import Website
from search.search import InvalidQueryException
def setup_api(app):
taskManager.start_indexer_threads()
@app.route("/api/website/by_url", methods=["GET"])
def api_website_by_url():
token = request.args.get("token")
name = oddb.db.check_api_token(token)
if name:
url = request.args.get("url")
website = oddb.db.get_website_by_url(url)
oddb.logger.info("API get website by url '" + url + "' by " + name)
if website:
return str(website.id)
return abort(404)
else:
return abort(403)
@app.route("/api/website/blacklisted", methods=["GET"])
def api_website_is_blacklisted():
token = request.args.get("token")
url = request.args.get("url")
name = oddb.db.check_api_token(token)
if name:
oddb.logger.info("API get website is blacklisted '" + url + "' by " + name)
return str(oddb.db.is_blacklisted(url))
else:
return abort(403)
@app.route("/api/website/add", methods=["GET"])
def api_add_website():
token = request.args.get("token")
url = request.args.get("url")
name = oddb.db.check_api_token(token)
if name:
website_id = oddb.db.insert_website(Website(url, str(request.remote_addr + "_" +
request.headers.get("X-Forwarded-For", "")),
"API_CLIENT_" + name))
oddb.logger.info("API add website '" + url + "' by " + name + "(" + str(website_id) + ")")
return str(website_id)
else:
return abort(403)
@app.route("/api/website/random")
def api_random_website():
token = request.json["token"]
name = oddb.db.check_api_token(token)
if name:
oddb.logger.info("API get random website by " + name)
return str(oddb.db.get_random_website_id())
else:
return abort(403)
@app.route("/api/search", methods=["POST"])
def api_search():
token = request.json["token"]
name = oddb.db.check_api_token(token)
if name:
try:
hits = oddb.searchEngine.search(
request.json["query"],
request.json["page"], request.json["per_page"],
request.json["sort_order"],
request.json["extensions"],
request.json["size_min"], request.json["size_max"],
request.json["match_all"],
request.json["fields"],
request.json["date_min"], request.json["date_max"]
)
hits = oddb.db.join_website_on_search_result(hits)
oddb.logger.info("API search '" + request.json["query"] + "' by " + name)
return json.dumps(hits)
except InvalidQueryException as e:
oddb.logger.info("API search failed: " + str(e))
return str(e)
else:
return abort(403)
@app.route("/cap", methods=["GET"])
def cap():
word = captcha.make_captcha()
cap_id = uuid4().__str__()
session["cap"] = cap_id
oddb.redis.set(cap_id, word)
return send_file(captcha.get_path(word), cache_timeout=0)