|
|
@@ -9,6 +9,9 @@ import ip2region.util as util
|
|
|
|
from pathlib import Path
|
|
|
|
from pathlib import Path
|
|
|
|
import json
|
|
|
|
import json
|
|
|
|
import random
|
|
|
|
import random
|
|
|
|
|
|
|
|
import urllib.error
|
|
|
|
|
|
|
|
import urllib.parse
|
|
|
|
|
|
|
|
import urllib.request
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LowercasePathMiddleware:
|
|
|
|
class LowercasePathMiddleware:
|
|
|
@@ -109,6 +112,7 @@ a:hover{text-decoration:underline;}</style>
|
|
|
|
<tr><td>地址接口</td><td><a href="/ip/api">/ip/api</a></td><td><a href="/ip/help">/ip/help</a></td></tr>
|
|
|
|
<tr><td>地址接口</td><td><a href="/ip/api">/ip/api</a></td><td><a href="/ip/help">/ip/help</a></td></tr>
|
|
|
|
<tr><td>时间接口</td><td><a href="/time/api">/time/api</a></td><td><a href="/time/help">/time/help</a></td></tr>
|
|
|
|
<tr><td>时间接口</td><td><a href="/time/api">/time/api</a></td><td><a href="/time/help">/time/help</a></td></tr>
|
|
|
|
<tr><td>谜语接口</td><td><a href="/riddle/api">/riddle/api</a></td><td><a href="/riddle/help">/riddle/help</a></td></tr>
|
|
|
|
<tr><td>谜语接口</td><td><a href="/riddle/api">/riddle/api</a></td><td><a href="/riddle/help">/riddle/help</a></td></tr>
|
|
|
|
|
|
|
|
<tr><td>期刊接口</td><td><a href="/sci/api">/sci/api</a></td><td><a href="/sci/help">/sci/help</a></td></tr>
|
|
|
|
</tbody></table></body></html>
|
|
|
|
</tbody></table></body></html>
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
@@ -514,6 +518,71 @@ def riddle():
|
|
|
|
return jsonify({"items": items, "params": params})
|
|
|
|
return jsonify({"items": items, "params": params})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/sci/help")
|
|
|
|
|
|
|
|
def sci_help():
|
|
|
|
|
|
|
|
return jsonify({
|
|
|
|
|
|
|
|
"路径": "/sci/api",
|
|
|
|
|
|
|
|
"功能": "获取期刊信息",
|
|
|
|
|
|
|
|
"参数": {
|
|
|
|
|
|
|
|
"nane=xxx": "必填,期刊名称(可缩写)",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/sci/api")
|
|
|
|
|
|
|
|
def sci():
|
|
|
|
|
|
|
|
args_lower = {k.lower(): v for k, v in request.args.items()}
|
|
|
|
|
|
|
|
if set(args_lower.keys()) - {"nane", "name"}:
|
|
|
|
|
|
|
|
return jsonify({
|
|
|
|
|
|
|
|
"error": f"{set(args_lower.keys()) - {"nane", "name"}}参数非法",
|
|
|
|
|
|
|
|
"allowed_params": ["nane=xxx"],
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
publication_name = args_lower.get("nane", "").strip() or args_lower.get("name", "").strip()
|
|
|
|
|
|
|
|
params = {"nane": publication_name}
|
|
|
|
|
|
|
|
if not publication_name:
|
|
|
|
|
|
|
|
resp = {"error": "nane参数不能为空"}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
query = urllib.parse.urlencode({
|
|
|
|
|
|
|
|
"secretKey": "0361aa1c9a8b4a30889ab6b02eae902c",
|
|
|
|
|
|
|
|
"publicationName": publication_name,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
url = f"https://www.easyscholar.cc/open/getPublicationRank?{query}"
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
request_obj = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
|
|
|
|
|
|
|
|
with urllib.request.urlopen(request_obj, timeout=10) as response:
|
|
|
|
|
|
|
|
raw_data = response.read().decode("utf-8")
|
|
|
|
|
|
|
|
except urllib.error.HTTPError as error:
|
|
|
|
|
|
|
|
resp = {"error": f"期刊接口请求失败: HTTP {error.code}"}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
except urllib.error.URLError as error:
|
|
|
|
|
|
|
|
resp = {"error": f"期刊接口请求失败: {error.reason}"}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
result = json.loads(raw_data)
|
|
|
|
|
|
|
|
except json.JSONDecodeError:
|
|
|
|
|
|
|
|
resp = {"error": "期刊接口返回内容不是有效JSON"}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
if result.get("code") != 200:
|
|
|
|
|
|
|
|
resp = {"error": result.get("msg", "期刊接口返回异常")}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
data = result.get("data") or {}
|
|
|
|
|
|
|
|
official_rank = data.get("officialRank") or {}
|
|
|
|
|
|
|
|
all_rank = official_rank.get("all") or {}
|
|
|
|
|
|
|
|
resp = {
|
|
|
|
|
|
|
|
"CCF等级": all_rank.get("ccf", ""),
|
|
|
|
|
|
|
|
"影响因子": all_rank.get("sciif", ""),
|
|
|
|
|
|
|
|
"JCR分区": all_rank.get("sci", ""),
|
|
|
|
|
|
|
|
"中科院分区": all_rank.get("sciUp", ""),
|
|
|
|
|
|
|
|
"TOP期刊": all_rank.get("sciUpTop", ""),
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
resp["params"] = params
|
|
|
|
|
|
|
|
return jsonify(resp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.errorhandler(404)
|
|
|
|
@app.errorhandler(404)
|
|
|
|
def not_found(_error):
|
|
|
|
def not_found(_error):
|
|
|
|
return redirect("/"), 302
|
|
|
|
return redirect("/"), 302
|
|
|
|