|
from fastapi import FastAPI, HTTPException |
|
import urllib.request |
|
from urllib.error import HTTPError |
|
from habanero import Crossref |
|
from fastapi.responses import HTMLResponse |
|
|
|
|
|
app = FastAPI() |
|
|
|
BASE_URL = 'https://doi.org/' |
|
|
|
@app.get("/", response_class=HTMLResponse) |
|
def read_root(): |
|
html_content = """ |
|
<html> |
|
<head> |
|
<title>Citation Helper</title> |
|
</head> |
|
<body> |
|
<h1>Hello!</h1> |
|
<p>As Citation Helper, I specialize in generating citations for academic papers. You can provide me with the DOI (Digital Object Identifier) or the title of an academic paper, and I will create a citation for it.</p> |
|
<p>Here's how you can use my service:</p> |
|
<ul> |
|
<li><b>Provide a DOI or Title:</b> Share the DOI or the title of the paper you need a citation for.</li> |
|
<li><b>Choose a Citation Style:</b> After I generate the citation in APA format, you can request it in another style like Chicago, MLA, or Harvard if needed.</li> |
|
<li><b>Receive Your Citation:</b> I'll provide you with the correctly formatted citation.</li> |
|
</ul> |
|
<p>Feel free to start by giving me a DOI or a paper title!</p> |
|
</body> |
|
</html> |
|
""" |
|
return HTMLResponse(content=html_content) |
|
|
|
@app.get("/title2ref/") |
|
async def title2doi(title: str): |
|
cr = Crossref() |
|
|
|
result = cr.works(query=title) |
|
|
|
|
|
if result['message']['items']: |
|
for item in result['message']['items']: |
|
if 'title' in item and item['title'][0] == title: |
|
doi = item['DOI'] |
|
url = BASE_URL + doi |
|
req = urllib.request.Request(url) |
|
req.add_header('Accept', 'application/x-bibtex') |
|
|
|
try: |
|
with urllib.request.urlopen(req) as f: |
|
bibtex = f.read().decode() |
|
return {"bibtex": bibtex} |
|
except HTTPError as e: |
|
if e.code == 404: |
|
raise HTTPException(status_code=404, detail="DOI not found") |
|
else: |
|
raise HTTPException(status_code=503, detail="Service unavailable") |
|
|
|
|
|
raise HTTPException(status_code=404, detail="Title not found, please enter DOI") |
|
|
|
@app.get("/doi2ref/") |
|
async def doi2ref(doi: str): |
|
url = BASE_URL + doi |
|
req = urllib.request.Request(url) |
|
req.add_header('Accept', 'application/x-bibtex') |
|
|
|
try: |
|
with urllib.request.urlopen(req) as f: |
|
bibtex = f.read().decode() |
|
return {"bibtex": bibtex} |
|
except HTTPError as e: |
|
if e.code == 404: |
|
raise HTTPException(status_code=404, detail="DOI not found") |
|
else: |
|
raise HTTPException(status_code=503, detail="Service unavailable") |
|
|
|
if __name__ == "__main__": |
|
import uvicorn |
|
|
|
uvicorn.run("main:app", host="0.0.0.0", port=7860) |