anoninimi

joined 5 months ago
 

I'm currently working on a script to automate posting replies to topics in a NodeBB forum using the NodeBB API. I have successfully managed to log in and retrieve user data, but I'm encountering issues when trying to post a reply to a topic.

Here is the relevant part of my code:

Python
import requests
import json

class NodeBBAPI:
    def __init__(self):
        self.session = requests.Session()
        self.session.verify = False
        self.base_url = "https://example.com/"
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'X-Requested-With': 'XMLHttpRequest',
            'Origin': 'https://example.com/',
            'Referer': 'https://example.com/'
        }
        self.user_data = None

    def login(self, username, password):
        try:
            config_response = self.session.get(
                f"{self.base_url}/api/config",
                headers=self.headers
            )
            
            login_data = {
                "username": username,
                "password": password
            }
            
            login_response = self.session.post(
                f"{self.base_url}/api/v3/utilities/login",
                json=login_data,
                headers=self.headers
            )
            
            if login_response.ok:
                response_data = login_response.json()
                if response_data.get('status', {}).get('code') == 'ok':
                    self.user_data = response_data.get('response', {})
                    self.headers['Authorization'] = f"Bearer {self.user_data.get('token')}"
                    return True

            return False
            
        except Exception as e:
            print(f"Login error: {str(e)}")
            return False

    def post_reply(self, topic_id, content):
        if not self.user_data:
            print("You must log in first!")
            return None

        try:
            reply_data = {
                "content": content,
                "_uid": self.user_data.get("uid")
            }
            
            response = self.session.post(
                f"{self.base_url}/api/v3/topics/{topic_id}/reply",
                json=reply_data,
                headers=self.headers
            )
            
            return response.ok
                
        except Exception as e:
            print(f"Error posting reply: {str(e)}")
            return False

def main():
    username = 'your_username'
    password = 'your_password'
    topic_id = 123  # Replace with the actual topic ID
    content = 'This is an automated reply.'

    nodebb = NodeBBAPI()
    
    if nodebb.login(username, password):
        if nodebb.post_reply(topic_id, content):
            print("Reply posted successfully!")
        else:
            print("Failed to post reply.")
    else:
        print("Login failed.")

if __name__ == "__main__":
    main()

I am able to log in successfully and get the user data, but when I attempt to post a reply, I receive a 403 Forbidden error.

Here are some details from the response:

Status Code: 403 Response: "Forbidden" I have verified that my user account has write permissions and I can post replies manually via the web interface.

Can anyone provide insights into what might be going wrong or if there are any specific headers or parameters that I need to include in the request?

Thank you in advance for your help!