diff --git a/apigetpost.py b/apigetpost.py index bbd594ca413..d5f741eeecb 100644 --- a/apigetpost.py +++ b/apigetpost.py @@ -50,14 +50,16 @@ def __setitem__(self, key, value): setattr(self, key, value) def __getitem__(self, item): - getattr(self, item) + return getattr(self, item) def api_get_post(post_url): with GlobalVars.api_request_lock: # Respect backoff, if we were given one if GlobalVars.api_backoff_time > time.time(): - time.sleep(GlobalVars.api_backoff_time - time.time() + 2) + # Use max(0, ...) to ensure no negative sleep times + time.sleep(max(0, GlobalVars.api_backoff_time - time.time() + 2)) + d = parsing.fetch_post_id_and_site_from_url(post_url) if d is None: return None @@ -66,9 +68,12 @@ def api_get_post(post_url): request_url = get_se_api_url_for_route("{}s/{}".format(post_type, post_id)) params = get_se_api_default_params_questions_answers_posts_add_site(site) response = requests.get(request_url, params=params, timeout=GlobalVars.default_requests_timeout).json() + if "backoff" in response: + # Update backoff time if required if GlobalVars.api_backoff_time < time.time() + response["backoff"]: GlobalVars.api_backoff_time = time.time() + response["backoff"] + if 'items' not in response or len(response['items']) == 0: return False @@ -78,6 +83,7 @@ def api_get_post(post_url): post_data.post_url = parsing.url_to_shortlink(item['link']) post_data.post_type = post_type post_data.title = html.unescape(item['title']) + if 'owner' in item and 'link' in item['owner']: post_data.owner_name = html.unescape(item['owner']['display_name']) post_data.owner_url = item['owner']['link'] @@ -86,6 +92,7 @@ def api_get_post(post_url): post_data.owner_name = "" post_data.owner_url = "" post_data.owner_rep = 1 + post_data.site = site post_data.body = item['body'] post_data.body_markdown = item['body_markdown'] @@ -93,10 +100,10 @@ def api_get_post(post_url): post_data.up_vote_count = item['up_vote_count'] post_data.down_vote_count = item['down_vote_count'] post_data.creation_date = item['creation_date'] - try: - post_data.last_edit_date = item['last_edit_date'] - except KeyError: - post_data.last_edit_date = post_data.creation_date # Key not present = not edited + + post_data.last_edit_date = item.get('last_edit_date', post_data.creation_date) # Use .get() for safer access + if post_type == "answer": post_data.question_id = item['question_id'] + return post_data