روبوت الخط الذي يتحقق مما إذا كانت الرسالة تحتوي على إشاعة عبر الإنترنت.
هذا أحد المشاريع الفرعية لـ 真的假的.
يصف مخطط الحالة هذا كيف يتحدث روبوت LINE مع المستخدمين:
يتطلب تطوير Rums-line-bot منك إنهاء الإعدادات التالية.
بعد استنساخ هذا المستودع والأقراص المضغوطة في دليل المشروع، قم بتثبيت التبعيات.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
يرجى اتباع جميع الخطوات الواردة في البرنامج التعليمي الرسمي لـ LINE.
قم بإنشاء ملف .env
من قالب .env.sample
، على الأقل املأ:
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=<paste Messaging API's channel secret here>
LINE_CHANNEL_TOKEN=<paste Messaging API's channel access token here>
LINE_LOGIN_CHANNEL_ID=<paste LINE Login channel ID here>
LIFF_URL=<paste LIFF app's LiFF URL>
vars env الأخرى القابلة للتخصيص هي:
REDIS_URL
: إذا لم يتم تقديمه، فسيتم استخدام redis://127.0.0.1:6379
.PORT
: أي منفذ سيستمع إليه خادم روبوت الخط.GTM_ID
: معرف إدارة العلامات من Google. بالنسبة للأحداث والمتغيرات التي ندفعها إلى dataLayer
، راجع قسم "Google Tag Manager" أدناه.DEBUG_LIFF
: تعطيل فحص المتصفح الخارجي في LIFF. مفيد عند تصحيح أخطاء LIFF في متصفح خارجي. لا تقم بتمكين هذا على الإنتاج.RUMORS_LINE_BOT_URL
: عنوان url العام للخادم والذي يُستخدم لإنشاء عناوين url للصور التعليمية وعنوان url لرد الاتصال الخاص بـ LINE Notify. ستحتاج إلى Node.JS
16+ للمتابعة.
$ npm i
قم بتدوير الأجهزة الطرفية مثل Redis وMongoDB باستخدام:
$ docker-compose up -d
ثم قم بتدوير التطبيق، بما في ذلك خادم chatbot وخادم webpack-dev لـ LIFF، باستخدام:
$ npm run dev
سيتم تشغيل الخادم على localhost:5001
(أو PORT
الذي حددته في ملف .env
الخاص بك.)
إذا كنت ترغب في إيقاف الأجهزة الطرفية، فقم بتشغيل docker-compose stop
.
فقط قم بتشغيل npm test
. سيقوم تلقائيًا بتدوير عامل الإرساء المذكور أعلاه وتشغيل اختبارات الوحدة.
نوصي باستخدام ngrok
لإنشاء عنوان عام يوجه حركة المرور من خادم LINE إلى جهازك المحلي. مع ngrok
في طريقك، فقط
$ ngrok http 5001
سيعطيك ngrok
عنوان URL عامًا. استخدم هذا لتعيين عنوان URL لقناتك على الويب (راجع قسم "وحدة تحكم القناة" في البرنامج التعليمي الرسمي لـ LINE).
نوصي باستخدام ملف التكوين ngrok لإعداد نفق subdomain
ثابت. بهذه الطريقة يمكن إصلاح عنوان URL العام (يعني عدم تكرار النسخ واللصق في إعدادات قناة LINE!) طالما أن subdomain
غير مشغول بواسطة آخرين.
داخل وحدة تحكم LINE Developers في قناة API للرسائل، ضمن Messaging API > إعدادات Webhook، قم بتعيين عنوان URL لـ Webhook على ${ngrok_url}/callback
وقم بتشغيل Use webhook . انقر فوق "تحقق" لتأكيد اتصاله بنجاح بجهازك المحلي.
نحن نستخدم LIFF لجمع سبب المستخدم عند إرسال المقالة والتعليقات السلبية.
إذا لم تكن بحاجة إلى تطوير LIFF، فيمكنك استخدام LIFF_URL
المتوفر في .env.sample
مباشرةً، والذي يرتبط بموقع LIFF المرحلي.
إذا كنت تريد تعديل LIFF، فقد تحتاج إلى اتباع الخطوات التالية:
لإنشاء تطبيقات LIFF، يرجى اتباع التعليمات الواردة في المستند الرسمي، والتي تتضمن
chat_message.write
في النطاق (لكي يقوم LIFF بإرسال الرسائل) بعد الحصول على عنوان URL لـ LIFF، ضعه في .env
كـ LIFF_URL
.Endpoint URL
ليبدأ بنقطة نهاية chabbot، وأضف /liff/index.html
كـ postfix. لتطوير LIFF، بعد npm run dev
، يمكن الوصول إليه ضمن /liff/index.html
لخادم dev (http://localhost:5001) أو خادم chatbot الإنتاجي.
في وضع التطوير، يقوم بتدوير خادم webpack-dev على localhost:<LIFF_DEV_PORT>
(افتراضي إلى 8080
)، و /liff
من وكلاء خادم chatbot جميع الطلبات المقدمة إلى خادم webpack-dev.
نصيحة لتطوير LIFF في المتصفح هي:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
في متصفح سطح المكتب.liff.logout()
يدويًا في وحدة تحكم JS لبدء إعادة تسجيل الدخول. سيظل liff.init()
يعمل في متصفح سطح المكتب، بحيث يتم عرض التطبيق، مما يمكننا من تصحيح أخطاء تخطيطات الويب على سطح المكتب. لكن liff.sendMessages()
لن يعمل. لن يعمل liff.closeWindow()
أيضًا إذا مرت نافذة المتصفح بعمليات إعادة توجيه تسجيل الدخول.
يقوم خادم LINE bot بتشغيل خادم GraphQL الذي يقوم بدمج واجهة برمجة تطبيقات Cofacts GraphQL وواجهة برمجة التطبيقات الخاصة ببرنامج الدردشة LINE.
عندما يتم تحديث Cofacts API، استخدم npm run cofactsapi
لجلب أحدث مخطط Cofacts API.
أثناء التطوير، استخدم الأمر التالي لبدء كتاب قصص على جهازك المحلي:
npm run storybook # Then visit http://localhost:6006
يمكنك أيضًا زيارة https://cofacts.github.io/rumors-line-bot للاطلاع على القصص القصيرة المعدة مسبقًا في الفرع master
.
عند الإنتاج، يتم تجميع ملفات LIFF إلى دليل /liff
ويتم تقديمها كملفات ثابتة بواسطة خادم chatbot.
إذا حصلت على 400 bad request
في LIFF، فيرجى البحث عن استدعاء دالة liff.init
في برنامج JS الثنائي المترجم ومعرفة ما إذا كان معرف LIFF متوافقًا مع عنوان URL الخاص بـ LIFF، والذي يجب أن يكون المسار بدون بداية https://liff.line.me/
.
يتم تعيين معرف LIFF باستخدام البرنامج المساعد Webpack Define أثناء الإنشاء، وبالتالي فإن تبديل متغير env URL لـ LIFF دون إعادة بناء ثنائيات LIFF سيؤدي إلى 400 طلب سيئ.
نحن نستخدم ttag لدعم i18n في وقت البناء لبرنامج الدردشة الآلية.
يرجى الرجوع إلى وثائق ttag لوضع تعليقات توضيحية على السلاسل المراد ترجمتها.
لاستخراج السلاسل المشروحة إلى ملفات الترجمة، استخدم:
$ npm run i18n:extract
توجد ملفات الترجمة ضمن i18n/
، بتنسيق Gettext PO.
en_US.po
: نظرًا لأن اللغة المستخدمة في التعليمات البرمجية هي الإنجليزية بالفعل، فإن ملف الترجمة الفارغ هذا موجود لتبسيط الإعدادات.zh_TW.po
: الترجمة الصينية التقليدية.ja.po
: الترجمة اليابانية. يمكنك استبدال هذا بأي لغة تريد دعمها، من خلال الاستفادة من أمر Gettext msginit
.
سوف تحتاج إلى تغيير i18n:extract
و i18n:validate
script في package.json
ليعكس التغيير المحلي.
افتراضيًا، سيتم إنشاء برنامج الدردشة الآلي ضمن لغة en_US
.
في Heroku، يرجى تعيين LOCALE
على أحد رموز en_US
أو zh_TW
أو أي رمز لغة آخر موجود ضمن دليل i18n/
.
إذا كنت تريد الإنشاء باستخدام عامل الإرساء بدلاً من ذلك، فقد تحتاج إلى تعديل ملف Dockerfile ليشمل LOCALE
المطلوب.
المتطلبات الأساسية :
لاستخدام رسالة الدفع: في ملف .env
، قم بتعيين NOTIFY_METHOD=PUSH_MESSAGE
لاستخدام LINE Notify:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
، مجموعات LINE_NOTIFY_CLIENT_ID=<paste LINE Notify Client ID here>
LINE_NOTIFY_CLIENT_SECRET=<paste LINE Notify Client Secret here>
NOTIFY_METHOD=LINE_NOTIFY
RUMORS_LINE_BOT_URL=<line bot server url>
LINE_FRIEND_URL=https://line.me/R/ti/p/<paste your chatbot ID here>
يمكنك إعداد نقطة إدخال صفحة الإعداد ( LIFF_URL
?p=setting) في مدير الحساب -> القائمة الغنية
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
يستخدم Rums-line-bot خدمات Google السحابية التي تمت مصادقتها واعتمادها باستخدام حسابات خدمة Google Cloud وبيانات اعتماد التطبيق الافتراضية.
يرجى إنشاء حساب خدمة ضمن المشروع، وتنزيل مفتاحه واستخدام GOOGLE_APPLICATION_CREDENTIALS
env var لتوفير المسار إلى مفتاح حساب الخدمة الذي تم تنزيله. انظر الوثائق لمزيد من التفاصيل.
نحن نستخدم Dialogflow لاكتشاف ما إذا كان المستخدم يحاول الدردشة. إذا تطابق إدخال المستخدم مع أي من أغراض Dialogflow، فيمكننا إرجاع استجابات محددة مسبقًا في هذا الهدف مباشرة.
لاستخدام Dialogflow، يرجى إجراء الإعداد التالي:
dialogflow.sessions.detectIntent
.DAILOGFLOW_LANGUAGE
: فارغ للغة الافتراضية للوكيل، أو يمكنك تحديد لغة.DAILOGFLOW_ENV
: الإعداد الافتراضي لوكيل المسودة، أو يمكنك إنشاء إصدارات مختلفة. قم بإنشاء أبعاد مخصصة (نطاق المستخدم) Message Source
، ومصفوفة مخصصة (نطاق الوصول) Group Members Count
. كلاهما الفهرس الافتراضي هو 1. إذا كانت الفهارس التي أنشأها GA ليست 1، فابحث عن cd1
و cm1
في الكود وقم بتغييرهما إلى cd$theIndexGACreated
و cm$theIndexGACreated
على التوالي.
استخدم npm run typecheck
للتحقق من الأنواع؛ استخدم npm run typegen
لإنشاء النوع من مخطط GraphQL.
قم بإعداد ملف .env
(الذي يجب أن يكون مطابقًا لبيئة النشر الخاصة بك) وقم بتشغيل docker build .
لإنشاء صورة عامل ميناء.
سيتم نسخ .env
إلى صورة المنشئ لإنشاء ملف LIFF الثابت باستخدام env. عند إنشاء صورة، يمكنك فقط تضمين "متغيرات وقت الإنشاء" (المشار إليها في .env.sample
) في .env
لضمان عدم تسرب بيانات اعتماد الخادم في كود العميل المدمج.
نظرًا لأن صور عامل الإرساء المبنية ستعمل على تشفير عناوين URL العامة في ملفات مبنية بشكل ثابت، فإن متغيرات وقت البناء هذه عندما نقوم بتشغيل الصورة كحاوية. لذلك، ستتطلب كل بيئة نشر منفصلة إنشاءًا منفصلاً للصورة.
يمكنك اختبار الصورة المبنية محليًا باستخدام docker-compose.yml
؛ ما عليك سوى إلغاء التعليق على قسم روبوت الخط وتقديم اسم الصورة المضمنة.
بالنسبة للإنتاج، يرجى الاطلاع على نشر الشائعات للحصول على نموذج docker-coompose.yml
الذي يقوم بتشغيل هذه الصورة.
نحن ندفع المتغيرات والأحداث في dataLayer
Google Tag Manager عندما يتفاعل المستخدم مع LIFF.
يمكنك تحضير الإعداد التالي في ملف .env
:
GTM_ID
: معرف حاوية إدارة العلامات من Google ( GTM-XXXXXXX
) سيقوم التطبيق بإطلاق الأحداث المخصصة التالية في GTM dataLayer
:
dataLoaded
- عندما يتم تحميل البيانات في المقالة أو التعليق أو التعليقات LIFF.routeChangeComplete
- عند تحميل LIFF أو تغيير المسار.feedbackVote
- عندما يرسل المستخدم تعليقات.chooseArticle
- عندما يختار المستخدم مقالًا في مقالات LIFF. كما أنه سيدفع المتغير المخصص التالي إلى dataLayer
؛
pagePath
- يتم تعيينه عند إطلاق حدث routeChangeComplete
. مسار الصفحة من جهاز توجيه LIFF.userId
- يتم تعيينه بعد حصول LIFF على رمز المعرف وفك تشفير معرف مستخدم LINE بالداخل.articleId
ومعرف replyId
: يتم تعيينهما على المقالة والتعليق والتعليقات ويتم استدعاء دورة حياة onMount()
. أو عند تشغيل حدث chooseArticle
.doc
- يتم تعيينه عند إطلاق حدث dataLoaded
. المحتوى الذي تم تحميله نفسه في الكائن (مقالة في مقالة LIFF، تعليق في تعليق LIFF وتعليقات في تعليقات LIFF). تنسيق الحدث المرسل: Event category
/ Event action
/ Event label
نحن نستخدم Message Source
البعد (Dimemsion1 مخصص) لتصنيف مصادر الأحداث المختلفة
user
لرسائل 1 على 1room
| group
للرسائل الجماعيةUserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
لكل مقالة تم العثور عليهاUserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/ <intent name>
Article
/ Selected
/ <selected article id>
Reply
/ Search
/ <reply id>
لكل ردودArticle
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
أو /feedback/no
.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/ <articleId>
/reason
./articles
utm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/ <articleId>
utm_source
و utm_medium
./setting
utm_source=rumors-line-bot&utm_medium=reply-request
&utm_source=rumors-line-bot&utm_medium=tutorial
Tutorial
/ Step
/ ON_BOARDING
Tutorial
/ Step
/ RICH_MENU
Tutorial
/ Step
/ <TUTORIAL_STEPS>
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(مقياس مخصص 1) لتسجيل عدد أعضاء المجموعة عند انضمام chatbot.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)ملحوظة:
- قمنا بتعيين قيمة حدث ga على أنها انضمام، -1 على أنها إجازة. لمعرفة إجمالي عدد المجموعات التي انضم إليها برنامج chatbot حاليًا، يمكنك رؤية القيمة الإجمالية للحدث مباشرة (التفاصيل راجع العدد الضمني).
- لمعرفة أن المجموعة قد انضمت أو غادرت حاليًا، يجب أن تجد آخر إجراء
Join
أوLeave
Client Id
.- يجب عليك أيضًا العثور على إجراء
Join
الأخيرClient Id
للحصول علىGroup Members Count
. يتم تسجيلGroup Members Count
فقط عندما ينضم chatbot إلى المجموعة، لمعرفة العدد الدقيق، يجب عليك الحصول عليه مباشرة من Line messages-api.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
لكل مقالة تم العثور عليهاArticle
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(القيمة) يحدد LICENSE
اتفاقية الترخيص للكود المصدري في هذا المستودع.
LEGAL.md
هي اتفاقية المستخدم لمستخدمي موقع Cofacts.