| 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) |