新增学术会议、期刊等级查询接口
This commit is contained in:
@@ -2,5 +2,8 @@
|
|||||||
|
|
||||||
> 基于Python的本地Web API项目
|
> 基于Python的本地Web API项目
|
||||||
|
|
||||||
|
#### v260605
|
||||||
|
1. 新增期刊查询接口(数据源easyscholar)
|
||||||
|
|
||||||
#### v260512
|
#### v260512
|
||||||
1. 新增农历、运势、唐诗、地址、时间、谜语等接口及对应数据
|
1. 新增农历、运势、唐诗、地址、时间、谜语等接口及对应数据
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user