ضع في اعتبارك إنشاء تطبيق للعمل مع ChatGPT . وستتمثل مهمتها في تلقي الرسائل الصوتية عبر Telegram ، وتحويلها إلى نصوص ، ونقلها إلى ChatGPT ، وإرسال رد إلى Telegram . أثناء عملية الإنشاء ، ستحتاج إلى اتباع الخطوات التالية:
- إنشاء روبوت لـ Telegram وإعداده الأساسي.
- استلام ملف برسالة صوتية (يستخدم Telegram تنسيق .oga ).
- تحويل ملف من oga الى mp3 .
- نقل ملف mp3 إلى خدمة Whisper لتحويله إلى نص.
- إرسال رسالة نصية مستلمة إلى ChatGPT .
- إرسال رد من ChatGPT إلى مستخدم في Telegram .
إنشاء روبوت لـ Telegram وإعداده الأساسي
كل شيء يبدأ بحقيقة تسجيل الروبوت. ولهذا ، يستخدم Telegram برنامج الروبوت الخاص به - BotFather . تحتاج إلى الكتابة إليه والمضي قدمًا في خطوات متسلسلة بسيطة.
نتيجة لذلك ، يجب أن يكون لديك رابط إلى برنامج الروبوت الخاص بك ورمزًا مميزًا لطلبات واجهة برمجة التطبيقات الخاصة به.
يمكنك الآن الانتقال إلى إعداد الروبوت في AppMaster . أسهل طريقة للقيام بذلك هي تثبيت الوحدة المناسبة. تحتاج فقط إلى تحديده في قائمة الوحدات النمطية وتحديد رمز API الخاص بك في الإعدادات.
سيتم إنشاء النماذج الضرورية تلقائيًا في مشروعك ، وستظهر كتل للعمل مع Telegram ، بالإضافة إلى عملية Telegram التجارية الأساسية Telegram: Echo . يجدر النظر بعناية وفهم مبدأ العمل.
عند الإدخال ، يتلقى رسالة من Telegram (نموذج Message ). يحتوي على نص الرسالة المرسلة ( text ) ، بالإضافة إلى نموذج chat الذي يمكنك من خلاله الحصول على معرف المرسل ( id ). آخر كتلة Telegram: Send Message يرسل الرسالة المستلمة مرة أخرى إلى المرسل ، ولكن نيابة عن الروبوت.
يمكنك استخدام عملية الأعمال هذه للاختبار الأولي للروبوت والتواصل معه. للقيام بذلك ، تحتاج إلى إنشاء نقطة نهاية ستتلقى المعلومات وتبدأ عملية تجارية.
عند إنشائه ، من المهم تعطيل Middleware Token Auth . يجب أن تكون نقطة النهاية مفتوحة للاستخدام بدون إذن.
مبدأ تشغيل Telegram bot بسيط للغاية - جميع الرسائل التي سيتم إرسالها إليه تذهب إلى webhook خاص ، والذي يمكنه تلقائيًا نقلها بشكل أكبر وإرسالها إلى نقطة النهاية التي تختارها لمزيد من الإجراءات.
وفقًا لذلك ، تبقى الخطوة الأخيرة لتنشيط الروبوت - تحتاج إلى تسجيل نقطة النهاية هذه في Telegram والإشارة إلى أن هذا الروبوت يجب أن يكون مرتبطًا به. يتطلب هذا إرسال طلب POST مع عنوان URL الكامل لنقطة النهاية والإشارة إلى رمز الروبوت الخاص بك بدلاً من {Bot API Token} إلى العنوان
https://api.telegram.org/bot{Bot API Token}/setWebhook
إذا تلقيت مثل هذه الرسالة ردًا على ذلك ، فحينئذٍ تم تنفيذ كل شيء بشكل صحيح.
{
"ok": true,
"result": true,
"description": "Webhook was set"
}
الروبوت جاهز للعمل ، يمكنك إرسال رسالة إليه واستعادتها.
استقبال ملف برسالة صوتية
تم تصميم وحدة Telegram بشكل أساسي للعمل مع الرسائل النصية. ومهمتنا هي الحصول على ملف برسالة صوتية. باستخدام AppMaster ، يمكنك حل هذه المشكلة بسهولة. أولاً ، نحتاج إلى تحليل ما نتلقاه عمومًا من Telegram لتحليل بنية الرسالة. تم تصميم كتلة Get Request Body لهذا الغرض. إنه يلغي الحاجة إلى تحديد هيكل الطلب مسبقًا ويسمح لك بتلقي الطلب بالكامل ، بغض النظر عن محتواه. تُرجع هذه الكتلة نتيجة الاستعلام كمجموعة من البايتات ، ويمكنك استخدام كتلة To String لتقديم النتيجة في نموذج يمكن قراءته بواسطة الإنسان ، وكذلك حفظها في السجلات (كتلة Write to Log ) لمزيد من التحليل.
نحن مهتمون بمعاملتين من الطلب بأكمله:
Sender ID - محدد في الطلب كـ "id":300493858
File ID - "file_id":"AwACAgIAAxkBAAMzZBk6QRvO-OYWsWUC-Bu1UXDM2FwAAkktAAKTZclIWTSkfTTw8wYvBA"
يمكنك إنشاء النموذج الخاص بك الذي يطابق الطلب واستخدامه للحصول على الحقول المطلوبة. ولكن سيكون من الأسرع إنشاء تعبير عادي ( Regex ) واستخدامه. للقيام بذلك ، تأخذ كتلة String Match Regex التعبير نفسه كمدخل ، بالإضافة إلى السلسلة التي سيتم فيها التحقق من التطابق مع التعبير المحدد.
في الحالة الأولى ، يكون التعبير "id":"\d+
نتيجة لذلك ، نحصل على السلسلة "id":300493858 ، والتي سنحتاج منها إلى إزالة ( "id":) الإضافي باستخدام كتلة Replace String وترك المعرف نفسه فقط.
في الحالة الثانية ، يكون المبدأ هو نفسه تمامًا ، ولكن يتم استخدام تعبير أكثر تعقيدًا قليلاً: "file_id":"[^"]+
الآن لدينا معرف المرسل ومعرف الملف ، ويمكننا استخدام ذلك للحصول على الملف نفسه. للقيام بذلك ، تحتاج إلى اللجوء إلى Telegram API . تم القيام بذلك من قبل عند تسجيل نقطة نهاية الروبوت. أنت الآن بحاجة إلى تقديم طلب مماثل للحصول على الملف. يجب استبدال {File ID} في عنوان URL للطلب بمعرف الملف المستلم.
https://api.telegram.org/bot{Bot API Token}/setWebhook/getFile?file_id={File ID}
لإرسال طلب واستلام نتائجه ، نستخدم كتلة HTTP Request ، مع تحديد عنوان URL Method = GET كمعلمات له.
من الاستجابة المستلمة ، يمكنك معرفة المسار النسبي للملف ، ويتم تمريره في معلمة " file_path ". وفقًا لذلك ، باستخدام التعبير العادي التالي ( "file_path":"[^"]+ ) يمكنك استخراج القيمة المطلوبة والاتصال بـ " https://api.telegram.org/file/bot{Bot API Token}/ " احصل على الرابط الكامل للملف.
تحويل ملف من OGA إلى MP3
تم استلام الملف ، لكن العقبة هي أن خدمة Whisper لا تدعم العمل بتنسيق OGA . تحتاج إلى التحويل إلى أحد التنسيقات المناسبة.
على سبيل المثال ، يتم استخدام خدمة Zamzar (تدعم خطتها المجانية القدرة على إجراء 100 تحويل شهريًا) والتحويل إلى MP3 .
يمكنك الرجوع إلى وثائقها للحصول على التفاصيل أو استخدام خدمة أخرى مماثلة. لن نقوم بتحليل العمل معها بالتفصيل ، وسننظر فقط في الجزء المتعلق مباشرة بتنفيذ AppMaster .
بادئ ذي بدء ، سيحتاج الطلب إلى بيانات المصادقة الصحيحة. يجب توفيرها بتنسيق Basic Authentication . للقيام بذلك ، تحتاج إلى تمرير رأس مع القيم في الطلب:
Key = 'Authorization'
Value = 'Basic '+ معرف المستخدم وكلمة المرور مفصولة بعلامة ":" بتنسيق base64
مفتاح API الذي تم الحصول عليه عند التسجيل في الخدمة هو معرف المستخدم. تحتاج إلى إضافة ":" إليه وترميزه بتنسيق Base64 باستخدام كتلة To Base64 . يجب تحويل النتيجة إلى رأس ( Make Key-Value (String) كتلة).
الخطوة التالية هي إنشاء نموذج للاستعلام في مصمم قاعدة البيانات. يجب إرسال الطلب بتنسيق Multipart Form ، على التوالي ، من الضروري إعداد نموذج لشكل هذا الطلب. في مثالنا ، يتكون النموذج من ثلاثة حقول من النوع String :
- source_file - المسار الكامل للملف المصدر (تم التعرف عليه في الخطوة السابقة).
- source_format - تنسيق الملف المصدر ، في هذا المثال ، هو قيمة ثابتة " ogg ".
- target_format - تنسيق الهدف للتحويل. يمكنك اختيار أي تنسيق يدعمه Whisper . دعونا نستخدم " mp3 " كمثال.
في محرر عمليات الأعمال ، تحتاج إلى استخدام كتلة Make لملء بيانات النموذج وإرسالها كطلب POST إلى https://sandbox.zamzar.com/v1/jobs/ باستخدام كتلة HTTP Request (تأكد من ذلك تحديد Serialize request body = Multipart Form ).
وتجدر الإشارة إلى أن هذا الطلب لا يقوم بإرجاع الملف المحول ولكنه يقوم فقط بإنشاء مهمة لتحويله. تحتاج إلى التقدم للحصول على النتيجة بشكل منفصل ؛ لهذا ، تحتاج إلى معرف المهمة التي تم إنشاؤها. يجب الحصول على هذا المعرف من نص الاستجابة للطلب ، ولهذا ، يجب أن تتم العملية التي تم إجراؤها بالفعل باستخدام التعبيرات العادية واستخراج قيمة المعرف.
يجب تطبيق نتيجة التحويل بشكل منفصل. سيتطلب هذا طلبين آخرين. الأول هو معرفة ما إذا كانت النتيجة جاهزة. والثاني هو التقاط الملف النهائي. في الوقت نفسه ، لا نعرف بالضبط وقت الاستعداد ، لذلك يمكننا تنظيم حلقة ترسل طلبات متكررة للتحقق من الجاهزية في فترات زمنية معينة (على سبيل المثال ، كل ثانية).
يجب إرسال HTTP Request باستخدام طريقة GET إلى عنوان URL https://sandbox.zamzar.com/v1/jobs/{id} ، حيث {id} هو معرف المهمة الذي تم الحصول عليه في الخطوة السابقة. يستخدم هذا نفس الرؤوس كما في الطلب السابق.
من الرد المستلم ، تحتاج إلى معرفة حالة الاستعداد. في حالة اكتمال التحويل ، ستحتوي الاستجابة على "status": "successful" وبالنسبة لنا ، هذه إشارة إلى أنه يمكننا إكمال الحلقة والمضي قدمًا.
بالإضافة إلى الحالة ، يجب أن تحتوي الاستجابة على معرف الملف النهائي ( "target_files":[{"id": :). يجب استخراجه للحصول على الرابط النهائي للملف بالشكل https://sandbox.zamzar.com/v1/files/{ID}/content
في الوقت نفسه ، لا يتوفر استلام الملف إلا للمستخدمين المصرح لهم ، لذلك تحتاج إلى تنفيذ HTTP Request باستخدام نفس الرؤوس كما في الطلبات السابقة.
نتيجة للطلب ، سيتم الحصول على محتويات الملف ، والتي يجب إعطاؤها اسمًا وحفظها للاستخدام مرة أخرى.
إرسال ملف MP3 إلى Whisper لتحويله إلى نص
الآن أصبح كل شيء جاهزًا للخطوة التالية - إرسال ملف برسالة صوتية للتعرف عليه. سيتطلب هذا طلبًا آخر بتنسيق Multipart Form . على عكس المثال السابق فقط ، سيحتاج الطلب إلى نقل الملف نفسه وليس رابطًا إليه.
يمكن إنشاء نموذج لمثل هذا الطلب في قسم External HTTP Request . في هذه الحالة ، لا يمكنك إنشاء طلب بشكل كامل ولكن يمكنك قصر نفسك فقط على إنشاء نموذج نص الطلب. يتكون النموذج نفسه من معلمتين:
- File (نوع Virtual File ) - نفس الملف الذي يجب التعرف عليه.
- model (type String ) - هنا نحدد القيمة whisper-1 .
أيضًا ، بالنسبة للطلب ، من الضروري الحصول على مفتاح للعمل مع OpenAI API وإنشاء رأس ترخيص من نوع Bearer Token .
Key = 'Authorization'
Value = 'Bearer '+ OpenAI API Key
بعد ذلك ، يمكنك إرسال طلب POST نفسه للتعرف على الرسالة الصوتية إلى خدمة Whisper على عنوان URL https://api.openai.com/v1/audio/transcriptions
كنتيجة للتعرف الناجح على الملف ، سيتم تلقي رد على شكل {"text": "Hello world.”}
إرسال رسالة نصية مستلمة إلى ChatGPT
يمكنك الاستمرار في استخدام كتل HTTP Request لإرسال طلب إلى ChatGPT . لاستكشاف وثائق API ، وكذلك إنشاء نماذج للطلبات والاستجابات بشكل مستقل. ولكن يمكنك أيضًا استخدام خيار أبسط في شكل وحدة جاهزة من AppMaster للعمل مع OpenAI ، والتي يجب تثبيتها في قسم الوحدات.
في الحد الأدنى من الإصدار الكافي ، تحتاج فقط إلى تحديد معلمات نموذج OAI ChatCompletionMessage ( role = user ، content = الرسالة المراد إرسالها) ، وإضافتها إلى المصفوفة ، وإرسال طلب إلى ChatGPT باستخدام OpenAI: Create Chat Completion block (تعيين model = gpt-4 ).
نتيجة لذلك ، حصلنا على رد من ChatGPT . لقد قرأناها من معلمة content لنموذج OAI ChatCompletionChoice .
إرسال رد من ChatGPT إلى مستخدم في Telegram
الخطوة الأخيرة هي تكرار ما تم القيام به بالفعل من قبل - إرسال رسالة إلى Telegram . ولكن إذا بدأنا ببساطة بإعادة الرسالة إلى المرسل ، فقد أطلقت هذه الرسالة الآن سلسلة من الإجراءات المختلفة ويتم إرجاع النتيجة كرد من ChatGPT .
في عملية تطوير مثل هذا الروبوت ، يجدر النظر في:
- يعمل Telegram بطريقة تجعل كل طلب يرسله الروبوت تتم معالجته بنجاح. خلاف ذلك ، سيحاول تكراره عدة مرات ، مما يعني أنه في حالة حدوث أي مشاكل ، فستتلقىها مرارًا وتكرارًا. تأكد من أن المنطق مبني بطريقة لا يؤدي فيها الطلب إلى خطأ ويمكن معالجته بنجاح.
- لن تعمل جميع الطلبات على النحو المنشود في المحاولة الأولى. سوف تحتاج إلى البحث عن الأخطاء ، ولهذا ، قم بترتيب كتل Write to Log . إنها مفيدة للتحقق من أن كل كتلة تتلقى بالفعل البيانات التي خططت لإرسالها ولتحليل نتيجة الكتلة ودراسة الاستجابة بالتفصيل.
- كجزء من الدليل ، افترضنا أن جميع الطلبات يمكن التنبؤ بها وناجحة وأن العملية خطية إلى حد ما. من الناحية العملية ، سيكون من الضروري توفير مجموعة متنوعة من الخيارات للإجراءات (على سبيل المثال ، ما يجب فعله إذا أرسل المستخدم رسالة نصية بدلاً من رسالة صوتية أو حتى صورة) ومعالجة الأخطاء (التحقق من حالة طلبات HTTP ، تأخذ في الاعتبار خيارات الاستجابة المختلفة).