Spaces:
Running
Running
File size: 14,538 Bytes
aa34b1f 9194514 aa34b1f 6415f78 aa34b1f f50b29d aa34b1f 14fbe6d 6415f78 f50b29d 8d39c59 f50b29d aa34b1f 3294248 0485034 f50b29d 0485034 f50b29d 0485034 3f1a8fc 0485034 f50b29d 0485034 f50b29d 0485034 f50b29d 0485034 f50b29d 0485034 f50b29d 3294248 f50b29d 3294248 74f5da0 3294248 b80eb1d 4fa06af b80eb1d 95ef056 22c0846 aa34b1f e73bcbd aa34b1f f50b29d 14fbe6d 244ca67 14fbe6d 244ca67 f50b29d e73bcbd aa34b1f f50b29d 1a5b0c0 f50b29d 2713c62 f50b29d 2713c62 f50b29d 2713c62 aa34b1f 6ad097c f50b29d 14fbe6d f50b29d aa34b1f f50b29d db9b48e f50b29d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
import os
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')
def generate_post_html(doi, title, category, summary, mindmap, citation):
doi = doi.split("https://")[-1]
mindmap = mindmap.replace("{", r'{').replace("}", r'}')
citation_clean = citation.replace("&", "&").replace("```plaintext\n", "").replace("\n```", "").strip()
citation_html = mistune.html(repr(citation_clean)[1:-1])
image = fetch_image(title, category, summary)
html_summary = mistune.html(summary).replace("&", "&").strip()
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}
</div>
<br>
<h2>Mindmap</h2>
<p><small><em>If MindMap doesn't load, please try refreshing the page.</em></small></p>
<div class="markmap" id="paper_mindmap">
<script type="text/template">
{mindmap.replace("&", "&").replace(":", "=>").strip()}
</script>
</div>
<br>
<h2>Citation</h2>
<div id="paper_citation">
{citation_html}
</div>
<script>
const paperImage = document.querySelector('img[style="display:block; width:100%; height:100%;"][id="paper_image"]');
if (paperImage) {{
const toc = document.createElement("div");
toc.innerHTML = "<b>{{getToc}} $title={{Table of Contents}}</b>";
const brElem = paperImage.nextElementSibling;
if (brElem && brElem.tagName === "BR") {{
brElem.insertAdjacentElement("afterend", toc);
}}
}}
</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 elem = document.querySelector('div.mm-toolbar-item[title="Fit window size"]');
if (elem) {{
elem.click();
}} else {{
console.log('Element not found');
}}
}}, 50);
}});
</script>
<style>
.markmap {{
position: relative;
}}
.markmap > svg {{
width: 100%;
border: 2px solid #000;
height: 60dvh;
}}
</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):
try:
post_body, post_image = generate_post_html(doi, title, category, summary, mindmap, citation)
except Exception as e:
print(f"Error generating post: {e}")
return None, None, None, None
post_title = title.replace("&", "&")
if "&" in post_title:
return None, None, None, None
post_category = f"{category}"
return post_title, post_category, post_body, post_image
def fetch_oauth_token():
token_data = {
'grant_type': 'refresh_token',
'client_secret': CLIENT_SECRET,
'refresh_token': REFRESH_TOKEN,
'client_id': CLIENT_ID,
}
try:
response = requests.post('https://oauth2.googleapis.com/token', data=token_data)
response.raise_for_status()
token_info = response.json()
return token_info.get('access_token')
except Exception as e:
print(f"Error fetching OAuth token: {e}")
return None
def post_post(title, category, body, image):
access_token = fetch_oauth_token()
if not access_token:
return False
url = f"https://blogger.googleapis.com/v3/blogs/{BLOG_ID}/posts"
headers = {
'Authorization': f"Bearer {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"]
}
try:
response = requests.post(url, headers=headers, json=post_data)
response.raise_for_status()
result = response.json()
if result.get('status') == 'LIVE':
print(f"The post '{title}' is LIVE")
return True
else:
print(f"Error posting {title}: {result}")
return False
except Exception as e:
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
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
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
if __name__ == "__main__":
doi = "https://doi.org/10.1234/example"
title = "Example Title"
category = "Science"
summary = "This is an example summary in markdown format."
mindmap = "{example: mindmap content}"
citation = "Example citation text"
uaccess_key = ACCESS_KEY
post_success = post_blog(doi, title, category, summary, mindmap, citation, uaccess_key)
print("Post success:", post_success)
|