a digital person for bluesky

Diagnose X API authentication requirements for posting

- Enhanced error logging reveals posting needs OAuth User Context
- Current Bearer token is Application-Only (read-only)
- Added documentation about authentication requirements
- Free tier allows 17 posts/day but needs proper auth method

Next: Need OAuth 2.0 User Context or OAuth 1.0a for posting

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Changed files
+15 -4
+15 -4
x.py
··· 124 125 except requests.exceptions.HTTPError as e: 126 if response.status_code == 401: 127 - logger.error("X API authentication failed for posting - check your bearer token permissions") 128 elif response.status_code == 403: 129 - logger.error("X API posting forbidden - may need elevated access or different permissions") 130 elif response.status_code == 429: 131 logger.error("X API rate limit exceeded for posting") 132 else: 133 logger.error(f"X API post request failed: {e}") 134 logger.error(f"Response content: {response.text}") ··· 199 print(f"Test failed: {e}") 200 201 def reply_to_cameron_post(): 202 - """Reply to Cameron's specific X post.""" 203 try: 204 client = create_x_client() 205 ··· 211 212 print(f"Attempting to reply to post {cameron_post_id}") 213 print(f"Reply text: {reply_text}") 214 215 result = client.post_reply(reply_text, cameron_post_id) 216 ··· 218 print(f"✅ Successfully posted reply!") 219 print(f"Reply ID: {result.get('data', {}).get('id', 'Unknown')}") 220 else: 221 - print("❌ Failed to post reply") 222 223 except Exception as e: 224 print(f"Reply failed: {e}")
··· 124 125 except requests.exceptions.HTTPError as e: 126 if response.status_code == 401: 127 + logger.error("X API authentication failed for posting - check your bearer token") 128 + logger.error(f"Response: {response.text}") 129 elif response.status_code == 403: 130 + logger.error("X API posting forbidden - likely app permissions issue") 131 + logger.error("Check that your X app has 'Read and Write' permissions enabled") 132 + logger.error(f"Response: {response.text}") 133 elif response.status_code == 429: 134 logger.error("X API rate limit exceeded for posting") 135 + logger.error(f"Response: {response.text}") 136 else: 137 logger.error(f"X API post request failed: {e}") 138 logger.error(f"Response content: {response.text}") ··· 203 print(f"Test failed: {e}") 204 205 def reply_to_cameron_post(): 206 + """ 207 + Reply to Cameron's specific X post. 208 + 209 + NOTE: This requires OAuth User Context authentication, not Bearer token. 210 + Current Bearer token is Application-Only which can't post. 211 + """ 212 try: 213 client = create_x_client() 214 ··· 220 221 print(f"Attempting to reply to post {cameron_post_id}") 222 print(f"Reply text: {reply_text}") 223 + print("\nNOTE: This will fail with current Bearer token (Application-Only)") 224 + print("Posting requires OAuth User Context authentication") 225 226 result = client.post_reply(reply_text, cameron_post_id) 227 ··· 229 print(f"✅ Successfully posted reply!") 230 print(f"Reply ID: {result.get('data', {}).get('id', 'Unknown')}") 231 else: 232 + print("❌ Failed to post reply (expected with current auth)") 233 234 except Exception as e: 235 print(f"Reply failed: {e}")