ReXploreBackend / post_blog.py
raannakasturi's picture
Refactor paper_data and summarize_paper functions for improved parameter handling and clarity
adbfd57
raw
history blame
14.8 kB
import os
import html
import re
import time
import requests
import dotenv
import mistune
from image import fetch_image
dotenv.load_dotenv()
access_key = os.getenv('ACCESS_KEY')
client_id = os.getenv('CLIENT_ID')
client_secret = os.getenv('CLIENT_SECRET')
refresh_token = os.getenv('REFRESH_TOKEN')
blog_id = os.getenv('BLOG_ID')
imgbb_api_key = os.getenv('IMGBB_API_KEY')
def generate_post_html(doi, title, category, summary, mindmap, citation):
doi = doi.split("https://")[-1]
title = title.replace("{", r'{').replace("}", r'}')
title = re.sub(r"\\(?![a-zA-Z])", r"", title)
summary = summary.replace("{", r'{').replace("}", r'}')
mindmap = mindmap.replace("{", r'{').replace("}", r'}')
citation = citation.replace("{", r'{').replace("}", r'}')
citation = mistune.html(citation.replace("&", "&").strip())
image = fetch_image(title, summary, imgbb_api_key)
html_summary = mistune.html(summary)
post = f"""
<div id="paper_post">
<img style="display:block; width:100%; height:100%;" id="paper_image"
src="{image.strip()}"
alt="{title.strip()}">
<br>
<br>
<div id="paper_summary">
{html_summary.replace("&amp;", "&").strip()}
</div>
<br>
<h2>Mindmap</h2>
<p><small><em>If MindMap doesn't load, go to the <a href="/">Homepage</a> and visit blog again or <a
href="/#">Switch to Android App (Under Development)</a>.</em></small></p>
<div class="markmap" id="paper_mindmap">
<script type="text/template">
{mindmap.replace("&amp;", "&").replace(":", "=>").strip()}
</script>
</div>
<br>
<h2>Citation</h2>
<div id="paper_citation">
{mistune.html(citation.replace("&amp;", "&").strip())}
</div>
<script>
const paperImage = document.querySelector(
'img[style="display:block; width:100%; height:100%;"][id="paper_image"]'
);
if (paperImage) {{
const tablOfContents = document.createElement("div");
tablOfContents.innerHTML = "<b>{{getToc}} $title={{Table of Contents}}</b>";
const brElement = paperImage.nextElementSibling;
if (brElement && brElement.tagName === "BR") {{
brElement.insertAdjacentElement("afterend", tablOfContents);
}}
}}
</script>
<script>
window.markmap = {{
autoLoader: {{
toolbar: true,
}},
}};
</script>
<script src="https://cdn.jsdelivr.net/npm/markmap-autoloader@latest"></script>
<script>
window.addEventListener('load', function() {{
setTimeout(function() {{
const element = document.querySelector('div.mm-toolbar-item[title="Fit window size"]');
console.log(element);
if (element) {{
element.click();
}} else {{
console.log('Element not found');
}}
}}, 0);
}});
</script>
<style>
.markmap {{
position: relative;
}}
.markmap > svg {{
width: 100%;
border: 2px solid #000;
height: 80dvh;
}}
</style>
<script>
window.addEventListener('load', function() {{
const anchor = document.querySelector('a.mm-toolbar-brand');
if (anchor) {{
anchor.href = '/';
const img = anchor.querySelector('img');
if (img) {{
img.src = 'data:image/png;base64,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';
img.alt = 'ReXplore';
}}
const span = anchor.querySelector('span');
if (span) {{
span.textContent = 'ReXplore';
}}
}} else {{
console.log('Anchor element not found');
}}
}});
</script>
</div>
"""
return post, image
def create_post(doi, title, category, summary, mindmap, citation):
post_title = title
post_category = f"{category}"
try:
post_body, post_image = generate_post_html(doi, title, category, summary, mindmap, citation)
# with open('post.html', 'w') as f:
# f.write(post_body)
# exit(code=0)
except Exception as e:
print(f"Error generating post: {e}")
return None, None, None, None
return post_title, post_category, post_body, post_image
def post_post(title, category, body, image):
title = re.sub(r"\\(?![a-zA-Z])", r"", title)
response = None
try:
data = requests.post(
url='https://oauth2.googleapis.com/token',
data={
'grant_type': 'refresh_token',
'client_secret': client_secret,
'refresh_token': refresh_token,
'client_id': client_id,
},
).json()
url = f"https://blogger.googleapis.com/v3/blogs/{blog_id}/posts"
headers = {
'Authorization': f"Bearer {data['access_token']}",
"content-type": "application/json"
}
post_data = {
"kind": "blogger#post",
"blog": {
"id": blog_id
},
"images": [{
"url": image
}],
"title": title,
"content": body,
"labels": [category, "ZZZZZZZZZ"]
}
response = requests.post(url, headers=headers, json=post_data).json()
if response['status'] != 'LIVE':
print(response)
if response['status'] == 'LIVE':
print(f"The post '{title}' is {response['status']}")
return True
else:
print(response)
print(f"Error posting {title}: {response}")
return False
except Exception as e:
print(response)
print(f"Error posting {title}: {e}")
return False
def post_blog(doi, title, category, summary, mindmap, citation, uaccess_key, wait_time=5):
if uaccess_key != access_key:
return False
else:
status = True
post_title, post_category, post_body, post_image = create_post(doi, title, category, summary, mindmap, citation)
if not all([post_title, post_category, post_body, post_image]):
print(f'Failed to create post {post_title}')
return False
post_title = post_title.replace("&amp;", "&")
if "&amp;" in post_title:
return False
status = post_post(post_title, post_category, post_body, post_image)
print(f"Waiting for {wait_time*60} seconds...")
time.sleep(wait_time*60)
if status:
print('Post created successfully')
return True
else:
print('Failed to create post')
return False