Reporting back. Using existing libraries, this is much simpler than I was making it. Here's some sample Python code which posts "Hello, World!" to topic ID 2. Thanks, @julian, for telling me about socket.io.
from socketIO_client import SocketIO, LoggingNamespace
import requests
import json
session = requests.Session()
csrf_token = json.loads(session.get('http://yourdomain:port/api/config').text)['csrf_token']
headers = {
'x-csrf-token': csrf_token
}
data = {
"username": "yourUsername",
"password": "yourPassword"
}
response = session.post("http://yourdomain:port/login", headers=headers, data=data)
def on_response(*args):
print('on_response', json.dumps(args))
with SocketIO('yourdomain', port, LoggingNamespace,
cookies=session.cookies.get_dict()) as s:
s.emit('posts.reply', {'tid': 2, 'content': "Hello, World!"}, on_response)
s.wait_for_callbacks(seconds=1)