API de criação de usuário: atributo ‘active’ definido como True, mas retorna False na resposta

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": True no payload, o atributo active na resposta é sempre false e, 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:

  1. Há algo que eu possa estar perdendo na minha solicitação que possa fazer com que o atributo active não seja definido corretamente?
  2. Existem condições específicas na API do Discourse que possam substituir o atributo active, mesmo que ele seja explicitamente definido como true?

Qualquer insight ou conselho seria muito apreciado!

2 curtidas

Você pode tentar executar este script uma vez; pode ajudá-lo. Aqui está: Um script para criar usuários fictícios para o seu fórum Discourse.

Além disso, seu script parece funcionar muito bem, mas o problema está nos dados que você está usando no seu arquivo CSV.

Testei seu código usando os seguintes dados de exemplo:

Username,Name,Email,Password,Bio,Location,Confirmed,Active,Join Date
Paul,Paul Paul,paul@example.com,tough001!@,This is Paul,Australia,TRUE,TRUE,2023-12-30T14:00:00Z
radhika01,Radhika Singh,singhradhika@example.com,tough001!@,This is Radhika Tomar,India,TRUE,TRUE,2023-12-30T14:00:00Z

Funcionou perfeitamente para mim. Algumas coisas a ter em mente: use senhas com pelo menos 12 caracteres de comprimento e certifique-se de que sejam fortes.

Tente e me diga se isso funciona para você :))

Olá @MihirR

Muito obrigado pela sua resposta e por me ajudar com isso! Eu realmente aprecio.

Acho que encontrei o problema. A questão estava com os endereços de e-mail que eu estava usando — especificamente, e-mails com um sinal de mais (como aliases do Gmail whatever+something@gmail.com, whatever+something2@gmail.com) para usuários fictícios. Quando uso um e-mail sem o sinal de mais, tudo funciona bem e o usuário é criado, como é o caso da sua amostra CSV. No entanto, ao usar um e-mail com um sinal de mais, a API não parece lidar com ele corretamente.

Na captura de tela, você pode ver 2 chamadas curl: com um sinal de mais e sem um sinal de mais no e-mail…

O estranho é que, quando uso o sinal de mais, não recebo um erro. Na verdade, recebo uma resposta de sucesso que diz que a conta foi criada e ativada, mas isso não é verdade. Verifiquei diretamente no console do Rails e me conectei ao banco de dados, e o usuário não está lá. O usuário também não aparece na administração do Discourse.

Parece haver um problema com a resposta da API — ela relata uma criação e ativação bem-sucedidas (Desculpe, a string na captura de tela está em croata), mas o usuário nunca é realmente criado no sistema. Isso sugere que pode haver um problema com a forma como a API lida ou relata a criação de usuários quando caracteres especiais (como o sinal de mais) são usados no e-mail.

Novamente, obrigado pela sua ajuda, e pensei em compartilhar essa descoberta com você caso ajude!

1 curtida

Como a configuração do site normalize_emails está configurada em sua instância?

3 curtidas

Parece que, na verdade, ele relata que a ativação não funcionou, assumindo que é isso que \"active\": false significa.

A chave da mensagem na resposta diz “Sua conta está ativada e pronta para uso.”, o que está errado.

1 curtida

Exatamente, essa é a parte errada em tudo. O parâmetro diz active:false enquanto a mensagem diz “Conta foi ativada e está pronta para uso”

Olá, o parâmetro de resposta diz active:false enquanto a mensagem diz “Conta foi ativada e está pronta para uso”

Ainda não verifiquei, mas vou verificar. Parece que isso foi anunciado aqui: Enabling e-mail normalization by default


Sim, parece que o motivo da falha foi o sinalizador normalize_email:true, que é verdadeiro por padrão. Como eu o desativei, os usuários foram criados… No entanto, a API não está considerando o sinalizador normalize_emails e está retornando sucesso, mesmo que o usuário nunca tenha sido criado ou ativado, para ser sincero :confused: Devo relatar isso no GitHub do Discourse?

2 curtidas

Ou abrir um tópico de Bug rest-api :slight_smile:

1 curtida

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.