Benutzererstellung API: Das Attribut 'active' auf True gesetzt, gibt aber False im Antwort zurück

Hallo zusammen,

ich verwende Python, um Benutzer über die Discourse-API zu erstellen. Die Anfrage zur Benutzererstellung gibt eine Erfolgsmeldung zurück, aber ich stoße auf ein Problem, bei dem das Attribut active in der Antwort immer false ist, obwohl ich es im Payload explizit auf true gesetzt habe. Das Attribut confirmed ist auf true gesetzt und funktioniert einwandfrei.

Hier ist der Code:

import csv
import requests
import json
from datetime import datetime

# Discourse API-Details
discourse_url = "https://forum.hobiguru.com/"  # Ersetzen Sie dies durch Ihre Discourse-URL
api_key = "your-api-key"  # Ersetzen Sie dies durch Ihren Discourse API-Schlüssel
api_username = "system"  # Admin-Benutzername

# Anforderungsheader
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# Funktion zum Erstellen eines Benutzers
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,  # Setze active standardmäßig auf True
        "confirmed": True,  # Setze confirmed standardmäßig auf True
        "created_at": join_date_str
    }

    print(f"\nAnforderungs-URL: {url}")
    print(f"Anforderungsheader: {json.dumps(headers, indent=2)}")
    print(f"Anforderungs-Payload: {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"Benutzererstellung erfolgreich: {json.dumps(response_json, indent=2)}")
        else:
            print(f"Benutzererstellung fehlgeschlagen. Grund: {response_json.get('message')}")
            print(f"Fehler: {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Anfrage fehlgeschlagen: {response.status_code}, {response.text}")

# Lesen von Benutzern aus einer CSV-Datei
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # Extrahieren der Benutzerdetails aus der Zeile
        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'))

Ich erhalte Folgendes gedruckt:

Anfrage zur Erstellung eines Benutzers

{'name': 'Goran', 'email': 'bla+blaaa@gmail.com', 'password': 'P@ssword!23', 'username': 'goran12', 'active': True, 'confirmed': True, 'created_at': '2024-11-04T10:20:34Z'}
Anforderungs-URL: https://forum.hobiguru.com/users.json
Anforderungsheader:
{
  "Api-Key": "d9---------------e564d65d9b5a3",
  "Api-Username": "system",
  "Content-Type": "application/json"
}
Anforderungs-Payload:
{
  "name": "Goran",
  "email": "'bla+blaaa@gmail.com",
  "password": "P@ssword!23",
  "username": "goran12",
  "active": true,
  "confirmed": true,
  "created_at": "2024-11-04T10:20:34Z"
}
Antwort:

Vollständige Antwort: {
  "success": true,
  "active": false,
  "message": "Va\\u0161 ra\\u010dun je aktiviran i spreman za kori\\u0161tenje."
}
Anfrage war erfolgreich und der Benutzer wurde erstellt:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

Problem:

  • Trotz Übergabe von "active": True im Payload ist das Attribut active in der Antwort immer false, und wenn ich nach den Benutzern im Discourse-Admin-Panel suche, kann ich keine finden.
  • Die API gibt success: true zurück, aber der Benutzer scheint nicht vollständig aktiviert zu sein.

Fragen:

  1. Gibt es etwas, das ich in meiner Anfrage übersehen könnte, das dazu führen könnte, dass das Attribut active nicht korrekt gesetzt wird?
  2. Gibt es bestimmte Bedingungen in der Discourse-API, die das Attribut active überschreiben würden, auch wenn es explizit auf true gesetzt ist?

Jede Einsicht oder jeder Rat wäre sehr willkommen!

2 „Gefällt mir“

Sie können versuchen, dieses Skript einmal auszuführen; es könnte Ihnen helfen. Hier ist es: Ein Skript zum Erstellen von Dummy-Benutzern für Ihr Discourse-Forum.

Außerdem scheint Ihr Skript recht gut zu funktionieren, aber das Problem liegt bei den Daten, die Sie in Ihrer CSV-Datei verwenden.

Ich habe Ihren Code mit den folgenden Beispieldaten getestet:

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

Bei mir hat es einwandfrei funktioniert. Ein paar Dinge, die Sie beachten sollten: Verwenden Sie Passwörter, die mindestens 12 Zeichen lang sind, und stellen Sie sicher, dass sie stark sind.

Probieren Sie es aus und lassen Sie mich wissen, ob das für Sie funktioniert :))

Hallo @MihirR

Vielen Dank für deine Antwort und deine Hilfe! Ich weiß das wirklich zu schätzen.

Ich glaube, ich habe das Problem gefunden. Das Problem lag bei den E-Mail-Adressen, die ich verwendet habe – insbesondere bei E-Mails mit einem Pluszeichen (wie Gmail-Aliase whatever+something@gmail.com, whatever+something2@gmail.com) für Dummy-Benutzer. Wenn ich eine E-Mail ohne Pluszeichen verwende, funktioniert alles einwandfrei und der Benutzer wird wie in deinem CSV-Beispiel erstellt. Wenn ich jedoch eine E-Mail mit einem Pluszeichen verwende, scheint die API dies nicht korrekt zu verarbeiten.

Auf dem Screenshot siehst du 2 Curl-Aufrufe: mit und ohne Pluszeichen in der E-Mail…

Das Seltsame ist, dass ich bei Verwendung des Pluszeichens keine Fehlermeldung erhalte. Ich erhalte tatsächlich eine Erfolgsmeldung, die besagt, dass das Konto erstellt und aktiviert wurde, aber das stimmt nicht. Ich habe direkt in der Rails-Konsole nachgesehen und mich mit der Datenbank verbunden, und der Benutzer ist nicht da. Der Benutzer wird auch nicht im Discourse-Admin angezeigt.

Es scheint ein Problem mit der Antwort der API zu geben – sie meldet eine erfolgreiche Erstellung und Aktivierung (Entschuldigung, der Text auf dem Screenshot ist auf Kroatisch), aber der Benutzer wird nie tatsächlich im System erstellt. Dies deutet darauf hin, dass es ein Problem damit geben könnte, wie die API die Benutzererstellung bei Sonderzeichen (wie dem Pluszeichen) in der E-Mail verarbeitet oder darüber berichtet.

Nochmals vielen Dank für deine Hilfe, und ich dachte, ich teile diese Entdeckung mit dir, falls sie hilfreich ist!

1 „Gefällt mir“

Wie ist die Website-Einstellung normalize_emails in Ihrer Instanz konfiguriert?

3 „Gefällt mir“

Es sieht so aus, als ob es tatsächlich meldet, dass die Aktivierung nicht funktioniert hat, vorausgesetzt, das bedeutet \"active\": false.

Der Nachrichten-Schlüssel in der Antwort sagt „Ihr Konto ist aktiviert und einsatzbereit“, was falsch ist.

1 „Gefällt mir“

Genau, das ist der falsche Teil am Ganzen. Der Parameter sagt active:false, während die Nachricht lautet: “Konto wurde aktiviert und ist einsatzbereit”

Hallo, der Antwortparameter besagt active:false, während die Nachricht lautet: “Konto wurde aktiviert und ist einsatzbereit”

Ich habe das nicht überprüft, werde es aber tun. Es scheint, dass dies hier angekündigt wurde: Enabling e-mail normalization by default


Ja, es scheint, dass der Grund für den Fehler das Flag normalize_email:true war, das standardmäßig auf true gesetzt ist. Als ich es deaktivierte, wurden die Benutzer erstellt… Allerdings berücksichtigt die API das Flag normalize_emails nicht und gibt ein Erfolgsevent zurück, obwohl der Benutzer nie erstellt oder aktiviert wurde :confused: Soll ich das im Discourse GitHub melden?

2 „Gefällt mir“

Oder ein Bug rest-api Thema eröffnen :slight_smile:

1 „Gefällt mir“

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