Hola a todos,
Estoy usando Python para crear usuarios a través de la API de Discourse. La solicitud de creación de usuario devuelve una respuesta de éxito, pero me encuentro con un problema en el que el atributo active en la respuesta es siempre false, a pesar de que lo establecí explícitamente en true en el payload. El atributo confirmed está establecido en true, y eso funciona bien.
Aquí está el código:
import csv
import requests
import json
from datetime import datetime
# Detalles de la API de Discourse
discourse_url = "https://forum.hobiguru.com/" # Reemplaza con tu URL de Discourse
api_key = "tu-api-key" # Reemplaza con tu Clave API de Discourse
api_username = "system" # Nombre de usuario administrador
# Encabezados de la solicitud
headers = {
"Api-Key": api_key,
"Api-Username": api_username,
"Content-Type": "application/json"
}
# Función para crear un usuario
def create_user(username, name, email, password, bio, location, confirmed, active, join_date):
url = f"{discourse_url}/users.json"
join_date_str = join_date.strftime('%Y-%m-%dT%H:%M:%SZ')
payload = {
"name": name,
"email": email,
"password": password,
"username": username,
"active": True, # Establecer active en True por defecto
"confirmed": True, # Establecer confirmed en True por defecto
"created_at": join_date_str
}
print(f"\nURL de la solicitud: {url}")
print(f"Encabezados de la solicitud: {json.dumps(headers, indent=2)}")
print(f"Payload de la solicitud: {json.dumps(payload, indent=2)}")
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
response_json = response.json()
if response_json.get("success"):
print(f"Creación de usuario exitosa: {json.dumps(response_json, indent=2)}")
else:
print(f"Creación de usuario fallida. Razón: {response_json.get('message')}")
print(f"Errores: {json.dumps(response_json.get('errors'), indent=2)}")
else:
print(f"Solicitud fallida: {response.status_code}, {response.text}")
# Lectura de usuarios desde un archivo CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
# Extraer detalles del usuario de la fila
create_user(row['Username'], row['Name'], row['Email'], row['Password'], row['Bio'], row['Location'], row['Confirmed'] == 'TRUE', row['Active'] == 'TRUE', datetime.strptime(row['Join Date'], '%Y-%m-%dT%H:%M:%SZ'))
Esto es lo que imprimo:
Solicitud para crear un usuario
{'name': 'Goran', 'email': 'bla+blaaa@gmail.com', 'password': 'P@ssword!23', 'username': 'goran12', 'active': True, 'confirmed': True, 'created_at': '2024-11-04T10:20:34Z'}
URL de la solicitud: https://forum.hobiguru.com/users.json
Encabezados de la solicitud:
{
"Api-Key": "d9---------------e564d65d9b5a3",
"Api-Username": "system",
"Content-Type": "application/json"
}
Payload de la solicitud:
{
"name": "Goran",
"email": "'bla+blaaa@gmail.com",
"password": "P@ssword!23",
"username": "goran12",
"active": true,
"confirmed": true,
"created_at": "2024-11-04T10:20:34Z"
}
Respuesta:
Respuesta completa: {
"success": true,
"active": false,
"message": "Vaš račun je aktiviran i spreman za korištenje."
}
Solicitud exitosa y el usuario fue creado:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}
Problema:
- A pesar de pasar
"active": Trueen el payload, el atributoactiveen la respuesta es siemprefalsey cuando busco a los usuarios en el panel de administración de Discourse, no encuentro ninguno. - La API devuelve
success: true, pero el usuario no parece estar completamente activado.
Preguntas:
- ¿Hay algo que me esté perdiendo en mi solicitud que pueda hacer que el atributo
activeno se establezca correctamente? - ¿Existen condiciones específicas en la API de Discourse que anulen el atributo
active, incluso si está explícitamente establecido entrue?
¡Cualquier información o consejo sería muy apreciado!

