Add better error handling for Cloudflare rate limiting
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
- Handle None returns from pull_statuses gracefully - Add specific error messages for rate limiting scenarios - Skip None posts in iteration to avoid TypeErrors Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -98,15 +98,38 @@ def fetch_and_relay_post(post_url: str) -> bool:
|
|||||||
api = Api()
|
api = Api()
|
||||||
# Fetch user's statuses and find the matching post
|
# Fetch user's statuses and find the matching post
|
||||||
print(f"Fetching statuses for @{username} to find post {post_id}...")
|
print(f"Fetching statuses for @{username} to find post {post_id}...")
|
||||||
statuses = list(api.pull_statuses(username, replies=True))
|
statuses_gen = api.pull_statuses(username, replies=True)
|
||||||
|
|
||||||
|
if statuses_gen is None:
|
||||||
|
print(
|
||||||
|
"Failed to fetch statuses (API returned None). "
|
||||||
|
"This may be due to rate limiting or Cloudflare blocking.",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
statuses = list(statuses_gen)
|
||||||
|
|
||||||
|
if not statuses:
|
||||||
|
print(
|
||||||
|
"No statuses returned. The API may be rate-limited or blocked.",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
for post in statuses:
|
for post in statuses:
|
||||||
if str(post.get("id", "")) == post_id:
|
if post and str(post.get("id", "")) == post_id:
|
||||||
print(f"Found post {post_id}")
|
print(f"Found post {post_id}")
|
||||||
return process_single_post(post, username)
|
return process_single_post(post, username)
|
||||||
|
|
||||||
print(f"Post not found in recent statuses: {post_id}", file=sys.stderr)
|
print(f"Post not found in recent statuses: {post_id}", file=sys.stderr)
|
||||||
return False
|
return False
|
||||||
|
except TypeError as e:
|
||||||
|
print(
|
||||||
|
f"API error (likely rate-limited or blocked by Cloudflare): {e}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error fetching post: {e}", file=sys.stderr)
|
print(f"Error fetching post: {e}", file=sys.stderr)
|
||||||
return False
|
return False
|
||||||
@@ -129,10 +152,21 @@ def poll_loop() -> None:
|
|||||||
print(f"Checking for new posts from @{TRUTH_USER}...")
|
print(f"Checking for new posts from @{TRUTH_USER}...")
|
||||||
|
|
||||||
# Fetch recent statuses
|
# Fetch recent statuses
|
||||||
statuses = list(api.pull_statuses(TRUTH_USER, replies=False))
|
statuses_gen = api.pull_statuses(TRUTH_USER, replies=False)
|
||||||
|
if statuses_gen is None:
|
||||||
|
print(
|
||||||
|
"Failed to fetch statuses (rate-limited or blocked). Retrying...",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
time.sleep(POLL_INTERVAL)
|
||||||
|
continue
|
||||||
|
|
||||||
|
statuses = list(statuses_gen)
|
||||||
|
|
||||||
# Process in chronological order (oldest first)
|
# Process in chronological order (oldest first)
|
||||||
for post in reversed(statuses):
|
for post in reversed(statuses):
|
||||||
|
if post is None:
|
||||||
|
continue
|
||||||
post_id = str(post.get("id", ""))
|
post_id = str(post.get("id", ""))
|
||||||
if not post_id:
|
if not post_id:
|
||||||
continue
|
continue
|
||||||
@@ -175,9 +209,18 @@ def initial_seed() -> None:
|
|||||||
api = Api()
|
api = Api()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
statuses = list(api.pull_statuses(TRUTH_USER, replies=False))
|
statuses_gen = api.pull_statuses(TRUTH_USER, replies=False)
|
||||||
|
if statuses_gen is None:
|
||||||
|
print(
|
||||||
|
"Failed to fetch statuses (rate-limited or blocked).", file=sys.stderr
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
statuses = list(statuses_gen)
|
||||||
count = 0
|
count = 0
|
||||||
for post in statuses:
|
for post in statuses:
|
||||||
|
if post is None:
|
||||||
|
continue
|
||||||
post_id = str(post.get("id", ""))
|
post_id = str(post.get("id", ""))
|
||||||
if post_id and not is_post_seen(post_id):
|
if post_id and not is_post_seen(post_id):
|
||||||
mark_post_seen(post_id)
|
mark_post_seen(post_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user