doi2ref / main.py
zliang's picture
Update main.py
588e8ae verified
raw
history blame contribute delete
No virus
3.04 kB
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)
# Check if the result has items and the title matches
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")
# If no matching title found
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)