API إنشاء المستخدم: تعيين سمة ‘active’ إلى True ولكن يُرجع False في الاستجابة

مرحباً بالجميع،

أنا أستخدم بايثون لإنشاء مستخدمين عبر واجهة برمجة تطبيقات Discourse. طلب إنشاء المستخدم يعيد استجابة ناجحة، ولكني أواجه مشكلة حيث تكون السمة active في الاستجابة دائمًا false، على الرغم من أنني قمت بتعيينها صراحةً على true في الحمولة. السمة confirmed تم تعيينها على true، وهذا يعمل بشكل جيد.

هذا هو الكود:

import csv
import requests
import json
from datetime import datetime

# تفاصيل واجهة برمجة تطبيقات Discourse
discourse_url = "https://forum.hobiguru.com/"  # استبدل بعنوان URL الخاص بـ Discourse
api_key = "your-api-key"  # استبدل بمفتاح واجهة برمجة تطبيقات Discourse الخاص بك
api_username = "system"  # اسم مستخدم المسؤول

# رؤوس الطلب
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# دالة لإنشاء مستخدم
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,  # تعيين active إلى True افتراضيًا
        "confirmed": True,  # تعيين confirmed إلى True افتراضيًا
        "created_at": join_date_str
    }

    print(f"\nRequest URL: {url}")
    print(f"Request Headers: {json.dumps(headers, indent=2)}")
    print(f"Request 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"User creation successful: {json.dumps(response_json, indent=2)}")
        else:
            print(f"User creation failed. Reason: {response_json.get('message')}")
            print(f"Errors: {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Request failed: {response.status_code}, {response.text}")

# قراءة المستخدمين من ملف CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # استخراج تفاصيل المستخدم من الصف
        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'))

أحصل على هذا مطبوعًا:

 طلب لإنشاء مستخدم

{'name': 'Goran', 'email': 'bla+blaaa@gmail.com', 'password': 'P@ssword!23', 'username': 'goran12', 'active': True, 'confirmed': True, 'created_at': '2024-11-04T10:20:34Z'}
Request URL: https://forum.hobiguru.com/users.json
Request Headers:
{
  "Api-Key": "d9---------------e564d65d9b5a3",
  "Api-Username": "system",
  "Content-Type": "application/json"
}
Request 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"
}
Response:

Full Response: {
  "success": true,
  "active": false,
  "message": "Vaš račun je aktiviran i spreman za korištenje."
}
Request was successful and user got created:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

المشكلة:

  • على الرغم من تمرير "active": True في الحمولة، فإن السمة active في الاستجابة تكون دائمًا false، وعندما أبحث عن المستخدمين في لوحة تحكم مسؤولي Discourse، لا يمكنني العثور على أي منهم.
  • تعيد واجهة برمجة التطبيقات success: true، ولكن يبدو أن المستخدم لم يتم تنشيطه بالكامل.

الأسئلة:

  1. هل هناك شيء قد أكون أغفله في طلبي قد يتسبب في عدم تعيين السمة active بشكل صحيح؟
  2. هل هناك أي شروط محددة في واجهة برمجة تطبيقات Discourse يمكن أن تتجاوز السمة active، حتى لو تم تعيينها صراحةً على true؟

أي رؤى أو نصائح ستكون محل تقدير كبير!

إعجابَين (2)

يمكنك محاولة تشغيل هذا البرنامج النصي مرة واحدة؛ قد يساعدك. تفضل: برنامج نصي لإنشاء مستخدمين وهميين لمنتدى Discourse الخاص بك.

بالإضافة إلى ذلك، يبدو أن البرنامج النصي الخاص بك يعمل بشكل جيد جدًا، ولكن المشكلة تكمن في البيانات التي تستخدمها في ملف CSV الخاص بك.

لقد اختبرت الكود الخاص بك باستخدام بيانات العينة التالية:

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

لقد عمل بشكل مثالي بالنسبة لي. بعض الأشياء التي يجب أن تضعها في اعتبارك: استخدم كلمات مرور لا تقل عن 12 حرفًا وتأكد من أنها قوية.

جرب ذلك وأخبرني إذا كان ذلك يعمل معك :))

مرحباً @MihirR

شكراً جزيلاً على ردك وعلى مساعدتك! أقدر ذلك حقاً.

أعتقد أنني وجدت المشكلة. كانت المشكلة تتعلق بعناوين البريد الإلكتروني التي كنت أستخدمها - على وجه التحديد، رسائل البريد الإلكتروني التي تحتوي على علامة زائد (مثل أسماء مستعارة في Gmail whatever+something@gmail.com, whatever+something2@gmail.com) للمستخدمين الوهميين. عندما أستخدم بريدًا إلكترونيًا بدون علامة زائد، يعمل كل شيء بشكل جيد، ويتم إنشاء المستخدم كما هو الحال مع عينة CSV الخاصة بك. ولكن، عند استخدام بريد إلكتروني يحتوي على علامة زائد، لا يبدو أن واجهة برمجة التطبيقات تتعامل معها بشكل صحيح.

في لقطة الشاشة، يمكنك رؤية استدعاءين لـ curl: أحدهما بعلامة زائد والآخر بدون علامة زائد في البريد الإلكتروني…

الشيء الغريب هو أنه عندما أستخدم علامة الزائد، لا أتلقى خطأ. في الواقع، أتلقى استجابة نجاح تفيد بأنه تم إنشاء الحساب وتفعيله، ولكن هذا ليس صحيحًا. لقد تحققت مباشرة في وحدة تحكم Rails واتصلت بقاعدة البيانات، والمستخدم غير موجود. لا يظهر المستخدم في مسؤول Discourse أيضًا.

يبدو أن هناك مشكلة في استجابة واجهة برمجة التطبيقات - فهي تبلغ عن إنشاء وتفعيل ناجحين (عذرًا، السلسلة النصية في لقطة الشاشة باللغة الكرواتية)، ولكن لم يتم إنشاء المستخدم فعليًا في النظام أبدًا. يشير هذا إلى وجود مشكلة محتملة في كيفية تعامل واجهة برمجة التطبيقات مع إنشاء المستخدم أو الإبلاغ عنه عند استخدام أحرف خاصة (مثل علامة الزائد) في البريد الإلكتروني.

مرة أخرى، شكرًا لك على مساعدتك، واعتقدت أنني سأشارك هذا الاكتشاف معك في حال كان مفيدًا!

إعجاب واحد (1)

كيف يتم تكوين إعداد الموقع normalize_emails في مثيلك؟

3 إعجابات

يبدو أنه يبلغ بالفعل عن فشل التفعيل، بافتراض أن هذا ما يعنيه \"active\": false.

الرسالة الرئيسية في الرد تقول “حسابك نشط وجاهز للاستخدام.”، وهذا خطأ.

إعجاب واحد (1)

بالضبط، هذا هو الجزء الخاطئ في الأمر برمته. المعلمة تقول active:false بينما تقول الرسالة “تم تنشيط الحساب وهو جاهز للاستخدام”

مرحباً، المعلمة active:false في الرد تقول بينما الرسالة تقول “تم تنشيط الحساب وهو جاهز للاستخدام”

لم أتحقق بعد، لكنني سأفعل. يبدو أنه تم الإعلان عن ذلك هنا: Enabling e-mail normalization by default


نعم، يبدو أن سبب الفشل كان العلامة normalize_email:true وهي صحيحة افتراضيًا. عندما قمت بتعطيلها، تم إنشاء المستخدمين… ومع ذلك، فإن واجهة برمجة التطبيقات (API) لا تأخذ في الاعتبار العلامة normalize_emails وتعيد حدثًا ناجحًا على الرغم من عدم إنشاء المستخدم أو تفعيله على الإطلاق:confused: هل يجب أن أبلغ عن هذا في مستودع discourse على GitHub؟

إعجابَين (2)

أو افتح موضوعًا حول Bug rest-api :slight_smile:

إعجاب واحد (1)

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