جافاسكريبت - كيفية الحصول على رمز مصادقة لواجهة برمجة تطبيقات ترجمة جوجل السحابية داخل المتصفح (امتداد كروم)


أحاول إنشاء إضافة لمتصفح كروم تستخدم واجهة برمجة تطبيقات الترجمة من جوجل كلاود. لقد اتبعت العديد من التعليمات في صفحات مختلفة في مستندات جوجل ترانسليت ولتطوير إضافات كروم لكني ما زلت لا أستطيع معرفة كيفية استخدام واجهة البرمجة الفعلية من داخل المتصفح.

أبعد ما وصلت إليه كان من خلال اتباع جزء من دليل البدء السريع حيث تقوم بإنشاء حساب خدمة، والحصول على ملف مفتاح حساب الخدمة (تم تنزيله كملف .json)، ثم تثبيت وتهيئة Google SDK، وتعيين متغير البيئة GOOGLE_APPLICATION_CREDENTIALS إلى مسار ملف مفتاح JSON لحساب الخدمة، ثم إجراء طلب curl باستخدام gcloud auth application-default print-access-token للحصول على رمز وصول ليتم إدخاله كجزء من رأس الطلب: "Authorization: Bearer (token here)". تم استرجاع الترجمة بنجاح بهذه الطريقة.

لكن ضمن بيئة الإضافة لا يمكنك تشغيل أوامر مثل gcloud لذا هذا لا يعمل. كنت قادرًا على استرداد رمز الوصول يدويًا باستخدام أمر gcloud، ثم لصقه في كود جافاسكريبت الخاص بي كجزء من رأس الطلب (على سبيل المثال xmlHttpRequest.setRequestHeader('Authorization', 'Bearer ya29.c.Elr6BRuTfOtherRandomLetters');). لكن رمز الوصول هذا ينتهي صلاحيته بعد 60 دقيقة لذا فإن هذا لا يعمل بشكل مستدام.

لقد حاولت أيضًا استخدام طريقة identity.getAuthToken (بعد تحديث الأمور في manifest.json بالطريقة التي تقولها الوثائق)، لكن ذلك لم ينجح. استخدام معرف حساب الخدمة الخاص بي كـ client_id تحت oauth2 في manifest.json أدى إلى ظهور خطأ "معرف العميل غير صالح" من identity.getAuthToken. من ناحية أخرى، عند إنشاء معرف عميل OAuth2 من Google Console، واستخدام myoauth2clientid.apps.googleusercontent.com كـ client_id تحت oauth2 و["https://www.googleapis.com/auth/cloud-translation", "https://www.googleapis.com/auth/cloud-platform"] كـ scopes تحت oauth2 أدى إلى ظهور خطأ "OAuth2 لم يُمنح أو تم سحبه" من identity.getAuthToken.

توليد مفتاح API من صفحة وحدة تحكم Google، واستخدامه مباشرة كمعامل key في استعلام الترجمة الخاص بي، لم ينجح حتى: تلقيت خطأ "الطلب يفتقد مفتاح API صالح."

أنا حقًا في حيرة هنا. أي مساعدة ستكون رائعة.

الإجابة رقم 1

أنا (مشارك للمرة الأولى) مررت أيضًا بنفس الخطوات التي مررت بها، ولكن بمساعدة جواب @magicnumber توصلت إلى حل لترجمة النصوص (من أي لغة إلى الإنجليزية) في امتداد كروم الخاص بي باستخدام مفتاح API بدلاً من ملف مفتاح حساب الخدمة.

أولاً أنشئ دالة الترجمة (لقد استخدمت هنا نمط Async -> Await):

 async function translate(strSourceText,strApiKey)
  {
    var url = `https://translation.googleapis.com/language/translate/v2?key=${strApiKey}`
    let response = await fetch(url, {
      method: 'POST',
      headers : { 
        'Content-Type': 'application/json',
       },
       body: JSON.stringify({
         target: "en",
         format: "text",
         q: strSourceText
       }),
    }); 
    let data = await response.json()
    return data;
  }

ثم استدعِ الدالة غير المتزامنة التي ستُرجع وعدًا، على سبيل المثال:

query="כלב" //Hebrew word for dog 🐶

translate(query,  "YOURVALIDAPIKEYGOESHERE")
  .then(response => console.log(response.data))
  .catch(reason => console.log(reason.message));

يجب أن تبدو الاستجابة من واجهة برمجة تطبيقات ترجمة جوجل كما يلي:

{
  "data": {
    "translations": [
      {
        "translatedText": "Dog",
        "detectedSourceLanguage": "iw"
      }
    ]
  }
}

أخيرًا، لتجنب انتهاك سياسة أمان المحتوى، في حالتي، كان عليّ إضافة نطاق واجهة برمجة تطبيقات الترجمة إلى مفتاح الأذونات في ملف manifest.json الخاص بإضافتي:

"permissions": ["https://translation.googleapis.com/language/translate/v2/*"],

الإجابة رقم 2

لقد اتبعت نفس الخطوات التي قمت بها وأيضًا لا أستطيع الاعتماد على gcloud للمصادقة.

ما أخذني إلى ما بعد خطأ "الطلب يفتقد إلى مفتاح API صالح" كان استخدام صياغة الاستعلام الموضحة هنا https://codelabs.developers.google.com/codelabs/cloud-translation-intro/index.html#5

في حالتي استخدمت:

curl -s -X POST -H "Content-Type: application/json" \
    --data "{
  'q': 'The Great Pyramid of Giza (also known as the Pyramid of Khufu or the
        Pyramid of Cheops) is the oldest and largest of the three pyramids in
        the Giza pyramid complex.',
  'source': 'en',
  'target': 'es',
  'format': 'text'
}" "https://translation.googleapis.com/language/translate/v2?key=YOURVALIDAPIKEYHERE"