واجهة برمجة التطبيقات تُظهر أخطاء 404

مرحباً بمجتمع Discourse،

أواجه حاليًا تحديات مع نقاط نهاية واجهة برمجة تطبيقات Discourse، وتحديدًا فيما يتعلق بتعليق المستخدمين، وسأقدر بشدة أي مساعدة أو توجيه يمكنك تقديمه.

ملخص المشكلات

  1. 404 لم يتم العثور عليه:

    • عند استخدام نقطة النهاية:
      /admin/users/15/suspend.json، أتلقى باستمرار خطأ “الصفحة غير موجودة”، على الرغم من وجود المستخدم.
    • لقد جربت أيضًا نقطة النهاية البديلة:
      /admin/u/15/suspend.json، والتي تؤدي إلى نفس المشكلة.
  2. استجابة HTML غير متوقعة:

    • بدلاً من إرجاع استجابة JSON المتوقعة، تُرجع واجهة برمجة التطبيقات صفحة HTML بالرسالة:
      “عذرًا! هذه الصفحة غير موجودة أو خاصة.”
    • يحدث هذا بغض النظر عما إذا كنت أستخدم curl أو PowerShell للطلب.
  3. مفتاح واجهة برمجة التطبيقات والأذونات:

    • يحتوي مفتاح واجهة برمجة التطبيقات المستخدم على وصول كامل للمسؤول، ومع ذلك تستمر الطلبات في إرجاع خطأ 404.
    • لقد اختبرت أيضًا استخدام مفاتيح مفصلة (مقيدة بإجراءات التعليق) ومفتاح للقراءة فقط، ولكن المشكلة مستمرة.
    • ومن المثير للاهتمام، أن نقطة النهاية تعمل بشكل مثالي عند الوصول إليها عبر متصفح، ولكنها تفشل عند استخدام طلبات واجهة برمجة التطبيقات مع المفتاح.

أمثلة للطلبات

مثال curl

curl -X PUT "https://your-discourse-domain.com/admin/users/15/suspend.json" \
-H "Api-Key: [REDACTED_API_KEY]" \
-H "Api-Username: system" \
-H "Content-Type: application/json" \
-d '{"suspend_until": "2024-12-31", "reason": "Violation of community guidelines"}'

مثال PowerShell

# PowerShell Script to Suspend a User on Discourse

$baseUrl = "https://your-discourse-domain.com"
$userId = 15
$apiKey = "[REDACTED_API_KEY]"
$apiUsername = "system"
$suspendUntil = "2024-12-31"
$reason = "Violation of community guidelines"

$headers = @{
    "Api-Key" = $apiKey
    "Api-Username" = $apiUsername
    "Content-Type" = "application/json"
}

$body = @{
    suspend_until = $suspendUntil
    reason = $reason
} | ConvertTo-Json

$endpoint = "$baseUrl/admin/users/$userId/suspend.json"

try {
    $response = Invoke-RestMethod -Uri $endpoint -Method Put -Headers $headers -Body $body -ErrorAction Stop
    Write-Host "User suspended successfully!" -ForegroundColor Green
} catch {
    Write-Host "Error suspending user:" -ForegroundColor Red
    Write-Host $_.Exception.Message
}

تفاصيل إضافية

  • إصدار Discourse: 3.4.0.beta3
  • خطوات استكشاف الأخطاء وإصلاحها التي تم اتخاذها:
    لقد حاولت تعديل رؤوس الطلبات، بما في ذلك User-Agent و Referer، ولكن دون جدوى.

أي رؤى أو اقتراحات للمساعدة في حل هذه المشكلات ستكون موضع تقدير كبير. شكرًا مقدمًا على وقتك ودعمك!

مع خالص التقدير،
روس

مثالك يعمل كما هو، باستثناء المعلمات المتوقعة على موقع الاختبار الخاص بنا:

○ → curl -i -X PUT "https://try.discourse.org/admin/users/41/suspend.json" \
  -H "Api-Key: swordfish" \
  -H "Api-Username: michael" \
  -H "Content-Type: application/json" \
  -d '{"suspend_until": "2024-12-31", "reason": "Violation of community guidelines"}'

HTTP/2 200
server: nginx
date: Mon, 11 Nov 2024 19:27:44 GMT
content-type: application/json; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 0
x-content-type-options: nosniff
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-username: michael
x-discourse-route: users/suspend
cache-control: no-cache, no-store
x-request-id: fe9c5ddc-b11a-45ba-ab41-9403eb53f255
cdck-proxy-id: app-router-tiehunter03.sea1
strict-transport-security: max-age=31536000
cdck-proxy-id: app-balancer-tieinterceptor1b.sea1

{
  "suspension": {
    "suspend_reason": "Violation of community guidelines",
    "full_suspend_reason": "Violation of community guidelines",
    "suspended_till": "2024-12-31T00:00:00.000Z",
    "suspended_at": "2024-11-11T19:27:44.927Z",
    "suspended_by": {
      "id": 85,
      "username": "michael",
      "name": "Michael Brown",
      "avatar_template": "/user_avatar/try.discourse.org/michael/{size}/639_2.png"
    }
  }
}
  • التحقق من مفتاح الواجهة البرمجية (API key)
    هل يعرض Discourse مصادقة مستخدم صالحة (x-discourse-username) عند إجراء طلب GET بسيط بهذا المفتاح؟
  • التحقق من معرف المستخدم (user ID)
    إنه موجود بالفعل، أليس كذلك؟ سيحدث خطأ 404 إذا لم يكن كذلك.
  • هل أنت خلف Cloudflare؟
    يمكن أن يعبث بالمعلمات.
إعجابَين (2)
  1. التحقق من مفتاح API
    تم التأكد من صحة مفتاح API باستخدام الأمر التالي:
curl -X GET "https://redactedurl.com/admin/users/list/active.json" -H "Api-Key: LIVEPRODKEYHERE" -H "Api-Username: system"

الاستجابة (مع إخفاء البيانات الحساسة للسرية) هي كما يلي:

[
  {
    "id": 1,
    "username": "User1",
    "name": "Redacted",
    "avatar_template": "/user_avatar/yourforum.com/user1/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Recognized Member",
    "days_visited": 6,
    "post_count": 3
  },
  {
    "id": 19,
    "username": "User2",
    "name": "Redacted",
    "avatar_template": "/letter_avatar_proxy/v4/letter/j/{size}.png",
    "active": true,
    "admin": false,
    "moderator": false,
    "trust_level": 1,
    "title": "Member (Unverified)"
  },
  {
    "id": 3,
    "username": "User3",
    "name": "Redacted",
    "avatar_template": "/user_avatar/yourforum.com/user3/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Community Founder"
  },
  {
    "id": -1,
    "username": "system",
    "name": "system",
    "avatar_template": "/user_avatar/yourforum.com/system/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Bot"
  }
]
  1. تأكيد وجود المستخدم
    تم التحقق من وجود المستخدم التجريبي (المعرف: 15)، كما هو موضح بالاستعلام عن بيانات المستخدم باستخدام /admin/users/15/suspend.json:
{
  "id": 15,
  "username": "User15",
  "active": true,
  "admin": false,
  "moderator": false,
  "trust_level": 0,
  "days_visited": 1,
  "post_count": 0,
  "can_send_activation_email": true,
  "can_activate": false,
  "can_deactivate": true,
  "can_grant_admin": true,
  "can_grant_moderation": true,
  "can_impersonate": true,
  "groups": [
    {
      "name": "trust_level_0",
      "bio_excerpt": "New members with limited abilities"
    }
  ]
}

  1. تكوين الشبكة
    لا يستخدم الموقع Cloudflare. بدلاً من ذلك، يعمل خلف وكيل عكسي NGINX. يستمع التطبيق على المنفذ 8080 داخليًا، مع قيام NGINX بمعالجة إنهاء SSL على المنفذ 443 للوصول الخارجي. لا يربط تكوين app.yml مباشرة بالمنفذ 443، حيث تتم إدارة SSL وإدارة الشهادات بواسطة NGINX لضمان الاتصال الآمن والتوافر.

مرحبًا،
فقط لمتابعة هذا الأمر أعتقد أن النطاق العالمي لمفاتيح API يفتقد نطاق التعليق. كنت أواجه نفس الخطأ. اضطريت إلى تحويل مفتاحي إلى مفتاح تفصيلي مع نطاق التعليق ليعمل. كنت آمل أيضًا أن يعمل إلغاء التعليق ولكن يبدو أنه غير متاح عبر API حتى الآن