master
Chuck Sneed 2022-11-27 14:14:34 -06:00
parent 9613bfe054
commit a24b36a822
1 changed files with 45 additions and 20 deletions

View File

@ -1,7 +1,12 @@
import time
import requests
from bs4 import BeautifulSoup
import traceback
import backoff
class TimeOutException(Exception):
pass
'''
Wrapper around the RDRama API
'''
@ -25,33 +30,49 @@ class RDramaAPIInterface:
'''
Replies to the comment with the given id.
'''
def reply_to_comment(self,parent_fullname, parent_submission, message):
def reply_to_comment(self,parent_fullname, parent_submission, message, file=None):
url=f"{self.protocol}://{self.site}/comment"
return self.post(url, data={
'parent_fullname':parent_fullname,
'submission': parent_submission,
"body": message
})
if file == None:
return self.post(url, data={
'parent_fullname':parent_fullname,
'submission': parent_submission,
"body": message
})
else:
return self.post(url, data={
'parent_fullname':parent_fullname,
'submission': parent_submission,
"body": message
}, files=file)
'''
Replies to the comment with the given id.
'''
def reply_to_comment_easy(self,comment_id, parent_submission, message):
return self.reply_to_comment(f"t3_{comment_id}", parent_submission, message)
def reply_to_comment_easy(self,comment_id, parent_submission, message, file=None):
return self.reply_to_comment(f"c_{comment_id}", parent_submission, message, file=file)
def reply_to_post(self, post_id, message):
return self.reply_to_comment(f"t2_{post_id}", post_id, message)
return self.reply_to_comment(f"p_{post_id}", post_id, message)
'''
Gets "all" comments.
'''
def get_comments(self, number_of_pages=1, user=None, sort="new", upper_bound = 0, lower_bound = 0):
def get_comments(self, number_of_pages=1, user=None, sort="new", upper_bound = 0, lower_bound = 0, t="all"):
return self.search("comments", number_of_pages, user, sort, upper_bound, lower_bound, t)
'''
Gets "all" posts.
'''
def get_posts(self, number_of_pages=1, user=None, sort="new", upper_bound = 0, lower_bound = 0, t="all"):
return self.search("", number_of_pages, user, sort, upper_bound, lower_bound, t)
def search(self, root, number_of_pages, user, sort, upper_bound, lower_bound, t):
if (user == None):
url=f"{self.protocol}://{self.site}/comments"
url=f"{self.protocol}://{self.site}/{root}"
else:
url=f"{self.protocol}://{self.site}/@{user}/comments"
url=f"{self.protocol}://{self.site}/@{user}/{root}"
params = f"?sort={sort}&t=all&before={upper_bound}&after={lower_bound}"
params = f"?sort={sort}&t={t}&before={upper_bound}&after={lower_bound}"
url+=params
if number_of_pages == 1:
@ -60,12 +81,12 @@ class RDramaAPIInterface:
results = []
for i_ in range(number_of_pages):
i = i_ + 1
full_url = f"{url}&page={i}"
full_url=f"{url}&page={i}"
results += self.get(full_url)['data']
return {
'data': results
}
'''
Calls the notifications endpoint
'''
@ -272,6 +293,7 @@ class RDramaAPIInterface:
"user_id": notification['author']['id'],
"id": notification["id"],
"message": notification['body'],
"parent_comment_id": notification['parent_comment_id'] if notification['level'] != 1 else None,
"post_id": notification['post_id']
}
@ -328,13 +350,16 @@ class RDramaAPIInterface:
else:
return response.json()
@backoff.on_exception(backoff.expo, requests.exceptions.RequestException)
def post(self, url, data):
response = requests.post(url, headers=self.headers, data=data)
@backoff.on_exception(backoff.expo, TimeOutException)
def post(self, url, data, files = None):
if files == None:
response = requests.post(url, headers=self.headers, data=data)
else:
response = requests.post(url, headers=self.headers, data=data, files=files)
print(f"POST {url} ({response.status_code}) {data}")
if (response.status_code == 429):
raise requests.exceptions.RequestException()
raise TimeOutException
if (response.status_code != 200):
raise BaseException(f"POST {url} ({response.status_code}) {data} => {response.json()}")
else:
return response.json()
return response.json()