Olá a todos,
Estou usando Python para criar usuários através da API do Discourse. A solicitação de criação de usuário está retornando uma resposta de sucesso, mas estou encontrando um problema onde o atributo active na resposta é sempre false, mesmo que eu o tenha definido explicitamente como true no payload. O atributo confirmed está definido como true, e isso funciona bem.
Aqui está o código:
import csv
import requests
import json
from datetime import datetime
# Detalhes da API do Discourse
discourse_url = "https://forum.hobiguru.com/" # Substitua pela sua URL do Discourse
api_key = "your-api-key" # Substitua pela sua Chave de API do Discourse
api_username = "system" # Nome de usuário administrador
# Cabeçalhos da solicitação
headers = {
"Api-Key": api_key,
"Api-Username": api_username,
"Content-Type": "application/json"
}
# Função para criar um usuário
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, # Definir active como True por padrão
"confirmed": True, # Definir confirmed como True por padrão
"created_at": join_date_str
}
print(f"\nURL da Solicitação: {url}")
print(f"Cabeçalhos da Solicitação: {json.dumps(headers, indent=2)}")
print(f"Payload da Solicitação: {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"Criação de usuário bem-sucedida: {json.dumps(response_json, indent=2)}")
else:
print(f"Falha na criação de usuário. Motivo: {response_json.get('message')}")
print(f"Erros: {json.dumps(response_json.get('errors'), indent=2)}")
else:
print(f"Falha na solicitação: {response.status_code}, {response.text}")
# Lendo usuários de um arquivo CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
# Extrair detalhes do usuário da linha
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'))
Eu recebo isso impresso:
Solicitação para criar um usuário
{'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 da Solicitação: https://forum.hobiguru.com/users.json
Cabeçalhos da Solicitação:
{
"Api-Key": "d9---------------e564d65d9b5a3",
"Api-Username": "system",
"Content-Type": "application/json"
}
Payload da Solicitação:
{
"name": "Goran",
"email": "'bla+blaaa@gmail.com",
"password": "P@ssword!23",
"username": "goran12",
"active": true,
"confirmed": true,
"created_at": "2024-11-04T10:20:34Z"
}
Resposta:
Resposta Completa: {
"success": true,
"active": false,
"message": "Vaš račun je aktiviran i spreman za korištenje."
}
Solicitação foi bem-sucedida e o usuário foi criado:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}
Problema:
- Apesar de passar
"active": Trueno payload, o atributoactivena resposta é semprefalsee, quando procuro pelos usuários no painel de administração do Discourse, não consigo encontrar nenhum. - A API retorna
success: true, mas o usuário não parece estar totalmente ativado.
Perguntas:
- Há algo que eu possa estar perdendo na minha solicitação que possa fazer com que o atributo
activenão seja definido corretamente? - Existem condições específicas na API do Discourse que possam substituir o atributo
active, mesmo que ele seja explicitamente definido comotrue?
Qualquer insight ou conselho seria muito apreciado!

