Line Bot ที่ตรวจสอบว่าข้อความมีข่าวลือทางอินเทอร์เน็ตหรือไม่
นี่คือหนึ่งในโครงการย่อยของ真的假的。
แผนภาพสถานะนี้อธิบายถึงวิธีการที่บอทบรรทัดพูดกับผู้ใช้:
การพัฒนาข่าวลือ-บรรทัด-บอทคุณต้องทำการตั้งค่าให้เสร็จสิ้น
หลังจากโคลนที่เก็บและซีดีนี้ลงในไดเรกทอรีโครงการแล้วติดตั้งการอ้างอิง
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
โปรดทำตามขั้นตอนทั้งหมดในการสอนอย่างเป็นทางการ
สร้างไฟล์ .env
จากเทมเพลต .env.sample
อย่างน้อยก็กรอกข้อมูล:
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=
LINE_CHANNEL_TOKEN=
LINE_LOGIN_CHANNEL_ID=
LIFF_URL=
env vars ที่ปรับแต่งได้อื่น ๆ คือ:
REDIS_URL
: หากไม่ได้รับ redis://127.0.0.1:6379
ใช้PORT
: พอร์ตใดที่เซิร์ฟเวอร์บอทบรรทัดจะฟังที่GTM_ID
: Google Tag Manager ID สำหรับเหตุการณ์และตัวแปรที่เราส่งไปยัง dataLayer
ดูส่วน "Google Tag Manager" ด้านล่างDEBUG_LIFF
: ปิดใช้งานเบราว์เซอร์ภายนอกตรวจสอบใน Liff มีประโยชน์เมื่อทำการดีบัก Liff ในเบราว์เซอร์ภายนอก อย่าเปิดใช้งานสิ่งนี้ในการผลิตRUMORS_LINE_BOT_URL
: URL สาธารณะเซิร์ฟเวอร์ซึ่งใช้ในการสร้าง URL ภาพการสอนและ URL การโทรกลับของสายการแจ้งเตือน คุณจะต้องใช้ Node.JS
16+ เพื่อดำเนินการต่อ
$ npm i
หมุนอุปกรณ์ต่อพ่วงเช่น Redis และ MongoDB โดยใช้:
$ docker-compose up -d
จากนั้นหมุนแอปพลิเคชันรวมถึงเซิร์ฟเวอร์ chatbot และ webpack-dev-server สำหรับ LIFF โดยใช้:
$ npm run dev
เซิร์ฟเวอร์จะเริ่มต้นใน localhost:5001
(หรือ PORT
ที่คุณระบุในไฟล์. .env
ของคุณ)
หากคุณต้องการหยุดอุปกรณ์ต่อพ่วงให้เรียกใช้ docker-compose stop
เพียงเรียกใช้ npm test
มันจะหมุน Docker ดังกล่าวและเรียกใช้การทดสอบหน่วยโดยอัตโนมัติ
เราขอแนะนำให้ใช้ ngrok
เพื่อสร้างที่อยู่สาธารณะที่นำทราฟฟิกจาก Line Server ไปยังเครื่องท้องถิ่นของคุณ กับ ngrok
ในเส้นทางของคุณเพียงแค่
$ ngrok http 5001
ngrok
จะให้ URL สาธารณะแก่คุณ ใช้สิ่งนี้เพื่อตั้งค่า URL webhook ของช่องของคุณ (ดูส่วน "คอนโซลช่อง" ในบทแนะนำอย่างเป็นทางการของสาย)
เราขอแนะนำให้ใช้ไฟล์กำหนดค่า NGROK เพื่อตั้งค่าอุโมงค์ด้วย subdomain
ย่อยคงที่ ด้วยวิธีนี้ URL สาธารณะสามารถแก้ไขได้ (หมายถึงไม่มีการคัดลอกการคัดลอกซ้ำไปยังการตั้งค่าแชนเนลบรรทัด!) ตราบใดที่ subdomain
ไม่ได้ถูกครอบครองโดยผู้อื่น
Inside Line Developers Console ในช่องข้อความ API ของคุณภายใต้การส่งข้อความ API> การตั้งค่า WebHook ตั้ง ค่า URL WebHook เป็น ${ngrok_url}/callback
และเปิด ใช้งาน WebHook คลิกตรวจสอบเพื่อยืนยันว่าเชื่อมต่อกับเครื่องในพื้นที่ของคุณสำเร็จ
เรากำลังใช้ LIFF เพื่อรวบรวมเหตุผลของผู้ใช้เมื่อส่งบทความและข้อเสนอแนะเชิงลบ
หากคุณไม่จำเป็นต้องพัฒนา LIFF คุณสามารถใช้ LIFF_URL
โดยตรงที่ให้ไว้ใน .env.sample
ซึ่งเชื่อมโยงไปยังการจัดเตรียมไซต์ Liff
หากคุณต้องการแก้ไข LIFF คุณอาจต้องทำตามขั้นตอนเหล่านี้:
หากต้องการสร้างแอพ LIFF โปรดทำตามคำแนะนำภายใต้เอกสารอย่างเป็นทางการซึ่งเกี่ยวข้องกับ
chat_message.write
ในขอบเขต (สำหรับ liff เพื่อส่งข้อความ) หลังจากได้รับ liff url วางไว้ใน .env
เป็น LIFF_URL
Endpoint URL
เพื่อเริ่มต้นด้วยจุดสิ้นสุด Chabbot ของคุณและเพิ่ม /liff/index.html
เป็น postfix ในการพัฒนา LIFF หลังจาก npm run dev
สามารถเข้าถึงได้ภายใต้ /liff/index.html
ของ Dev Server (http: // localhost: 5001) หรือเซิร์ฟเวอร์ Chatbot ที่ผลิต
ในโหมดการพัฒนามันหมุน webpack-dev-server บน localhost:
(ค่าเริ่มต้นถึง 8080
) และ /liff
ของ proxies เซิร์ฟเวอร์ chatbot ทุกคำขอไปยัง webpack-dev-server
เคล็ดลับในการพัฒนา LIFF ในเบราว์เซอร์คือ:
https:///liff/index.html?p=&...
ในเบราว์เซอร์เดสก์ท็อปliff.logout()
ด้วยตนเองในคอนโซล JS เพื่อเรียกใช้โลจินใหม่ liff.init()
จะยังคงทำงานในเบราว์เซอร์เดสก์ท็อปเพื่อให้แอปแสดงผลทำให้เราสามารถดีบักเค้าโครงเว็บบนเดสก์ท็อป liff.sendMessages()
จะไม่ทำงาน liff.closeWindow()
จะไม่ทำงานหากหน้าต่างเบราว์เซอร์ของคุณผ่านการเปลี่ยนเส้นทางเข้าสู่ระบบ
เซิร์ฟเวอร์ Line Bot เริ่มต้นเซิร์ฟเวอร์ graphQL ที่ stiches cofacts graphql api และ API เฉพาะกับ line chatbot
เมื่อใดก็ตามที่ Cofacts API UPDATES ให้ใช้ npm run cofactsapi
เพื่อดึง COFACTS API Schema ล่าสุด
ในระหว่างการพัฒนาให้ใช้คำสั่งต่อไปนี้เพื่อเริ่มนิทานในเครื่องในพื้นที่ของคุณ:
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
Function Call ใน JS Binary ที่คอมไพล์แล้วและ https://liff.line.me/
ว่า liff id สอดคล้องกับ url liff ของคุณหรือไม่ .
LIFF ID ถูกตั้งค่าโดยใช้ webpack define plugin ในระหว่างการสร้างดังนั้นการสลับตัวแปร url url env โดยไม่ต้องสร้างไบนารี LIFF ใหม่จะทำให้เกิดคำขอที่ไม่ดี 400 รายการ
เราใช้ TTAG เพื่อรองรับ I18N เวลาที่สร้างขึ้นสำหรับ Chatbot
โปรดดูเอกสาร TTAG สำหรับการใส่คำอธิบายประกอบสตริงเพื่อแปล
ในการแยกสตริงหมายเหตุประกอบไปยังไฟล์การแปลใช้:
$ npm run i18n:extract
ไฟล์การแปลอยู่ภายใต้ i18n/
, ในรูปแบบ GetText PO
en_US.po
: เนื่องจากภาษาที่ใช้ในรหัสเป็นภาษาอังกฤษอยู่แล้วไฟล์การแปลที่ว่างเปล่านี้มีอยู่เพื่อทำให้การตั้งค่าง่ายขึ้นzh_TW.po
: การแปลภาษาจีนแบบดั้งเดิมja.po
: การแปลภาษาญี่ปุ่น คุณสามารถแทนที่ด้วยภาษาใดก็ได้ที่คุณต้องการสนับสนุนโดยใช้ประโยชน์จากคำสั่ง getText msginit
คุณจะต้องเปลี่ยน i18n:extract
และ i18n:validate
สคริปต์ใน package.json
เพื่อสะท้อนการเปลี่ยนแปลงสถานที่
โดยค่าเริ่มต้น chatbot จะถูกสร้างขึ้นภายใต้ locale en_US
บน Heroku โปรดตั้ง LOCALE
เป็นหนึ่งใน en_US
, zh_TW
หรือรหัสภาษาอื่น ๆ ที่มีอยู่ภายใต้ i18n/
ไดเรกทอรี
หากคุณต้องการสร้างโดยใช้ Docker แทนคุณอาจต้องแก้ไข DockerFile เพื่อรวม LOCALE
ที่ต้องการ
ข้อกำหนดเบื้องต้น:
หากต้องการใช้ข้อความแบบพุช: ในไฟล์ .env
ตั้งค่า NOTIFY_METHOD=PUSH_MESSAGE
เพื่อใช้ Line Notify:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback /line_notify.env
ตั้งค่า LINE_NOTIFY_CLIENT_ID=
LINE_NOTIFY_CLIENT_SECRET=
NOTIFY_METHOD=LINE_NOTIFY
RUMORS_LINE_BOT_URL=
LINE_FRIEND_URL=https://line.me/R/ti/p/
คุณสามารถตั้งค่าจุดเข้าหน้าการตั้งค่า ( LIFF_URL
? P = การตั้งค่า) ใน Manager Account -> Rich Menu
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
Rumors-Line-Bot ใช้บริการ Google Cloud ที่ได้รับการรับรองความถูกต้องและได้รับอนุญาตโดยใช้บัญชี Google Cloud Service และแอปพลิเคชันเริ่มต้น
โปรดสร้างบัญชีบริการภายใต้โครงการดาวน์โหลดคีย์และใช้ GOOGLE_APPLICATION_CREDENTIALS
env var เพื่อให้เส้นทางไปยังคีย์บัญชีบริการที่ดาวน์โหลดของคุณ ดูเอกสารสำหรับรายละเอียด
เราใช้ Dialogflow เพื่อตรวจสอบว่าผู้ใช้พยายาม chit-chat หรือไม่ หากอินพุตของผู้ใช้ตรงกับจุดประสงค์ของการโต้ตอบใด ๆ เราสามารถส่งคืนการตอบกลับที่กำหนดไว้ล่วงหน้าได้โดยตรงในเจตนานั้น
หากต้องการใช้ DialogFlow โปรดทำการตั้งค่าต่อไปนี้:
dialogflow.sessions.detectIntent
PermissionDAILOGFLOW_LANGUAGE
: ว่างกับภาษาเริ่มต้นของตัวแทนหรือคุณสามารถระบุภาษาได้DAILOGFLOW_ENV
: ค่าเริ่มต้นเป็นตัวแทนร่างหรือคุณสามารถสร้างเวอร์ชันที่แตกต่างกัน สร้าง dimemsion ที่กำหนดเอง (ขอบเขตผู้ใช้) สำหรับ Message Source
และ metrix ที่กำหนดเอง (ขอบเขต) สำหรับ Group Members Count
ดัชนีเริ่มต้นทั้งคู่คือ 1 ถ้าดัชนี GA ที่สร้างขึ้นไม่ใช่ 1, ค้นหา cd1
และ cm1
ในรหัสและเปลี่ยนเป็น cd$theIndexGACreated
และ cm$theIndexGACreated
ตามลำดับ
ใช้ npm run typecheck
เพื่อตรวจสอบประเภท ใช้ npm run typegen
เพื่อสร้างประเภทจาก graphql schema
เตรียมไฟล์ .env
(ซึ่งควรเหมือนกับสภาพแวดล้อมการปรับใช้ของคุณ) และเรียกใช้ docker build .
เพื่อสร้างภาพนักเทียบท่า
.env
จะถูกคัดลอกไปยังอิมเมจผู้สร้างเพื่อสร้างไฟล์ Liff Static ด้วย Env เมื่อสร้างภาพคุณสามารถรวม "ตัวแปรเวลาสร้าง" (แสดงใน .env.sample
) ใน .env
เพื่อให้แน่ใจว่าไม่มีข้อมูลประจำตัวของเซิร์ฟเวอร์รั่วไหลในรหัสไคลเอนต์ที่สร้างขึ้น
เนื่องจากอิมเมจนักเทียบท่าที่สร้างขึ้นจะเข้ารหัส URL สาธารณะลงในไฟล์ที่สร้างขึ้นแบบคงที่ตัวแปรเวลาที่สร้างขึ้นเหล่านี้เมื่อเราเรียกใช้ภาพเป็นคอนเทนเนอร์ ดังนั้นแต่ละสภาพแวดล้อมการปรับใช้ที่แยกต่างหากจะต้องมีการสร้างภาพแยกต่างหาก
คุณสามารถทดสอบภาพที่สร้างขึ้นในเครื่องโดยใช้ docker-compose.yml
; เพียงแค่ไม่ใส่ใจส่วนบอทบรรทัดและระบุชื่อภาพที่สร้างขึ้น
สำหรับการผลิตโปรดดูข่าวลือที่ใช้สำหรับตัวอย่าง docker-coompose.yml
ที่ใช้งานดังกล่าว
เราผลักดันตัวแปรและเหตุการณ์ใน dataLayer
ของ Google Tag Manager เมื่อผู้ใช้โต้ตอบกับ LIFF
คุณสามารถเตรียมการตั้งค่าต่อไปนี้ในไฟล์ .env
:
GTM_ID
: Google Tag Manager ID ID ( GTM-XXXXXXX
) แอปพลิเคชันจะยิงเหตุการณ์ที่กำหนดเองต่อไปนี้ใน GTM dataLayer
:
dataLoaded
- เมื่อโหลดข้อมูลในบทความความคิดเห็นหรือข้อเสนอแนะ LIFFrouteChangeComplete
- เมื่อโหลด LIFF หรือเปลี่ยนเส้นทางfeedbackVote
- เมื่อผู้ใช้ส่งข้อเสนอแนะchooseArticle
- เมื่อผู้ใช้เลือกบทความในบทความ Liff นอกจากนี้มันจะผลักดันตัวแปรที่กำหนดเองต่อไปนี้ไปยัง dataLayer
;
pagePath
- ตั้งค่าเมื่อเหตุการณ์ routeChangeComplete
FIRES เส้นทางหน้าจากเราเตอร์ของ LiffuserId
- ตั้งค่าหลังจาก LIFF ได้รับ ID Token และถอดรหัส ID ผู้ใช้ Line Line ภายในarticleId
และ replyId
: ตั้งค่าในบทความความคิดเห็นและข้อเสนอ onMount()
วงจรชีวิตเรียกว่า หรือเมื่อมีการไล่ล่าเหตุการณ์ chooseArticle
doc
- ตั้งค่าเมื่อ dataLoaded
Event Fires เนื้อหาที่โหลดเองในวัตถุ (บทความในบทความ Liff แสดงความคิดเห็นในความคิดเห็น LIFF และข้อเสนอแนะในข้อเสนอแนะ LIFF) รูปแบบเหตุการณ์ที่ส่ง: Event category
/ Event action
/ Event label
เราใช้ Message Source
มิติ (กำหนดเอง dimemsion1) เพื่อจำแนกแหล่งเหตุการณ์ที่แตกต่างกัน
user
สำหรับ 1 ใน 1 ข้อความroom
| group
สำหรับข้อความกลุ่มUserInput
/ MessageType
/
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
สำหรับแต่ละบทความที่พบUserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/
Article
/ Selected
/
Reply
/ Search
/
สำหรับการตอบกลับแต่ละครั้งArticle
/ NoReply
/
Reply
/ Selected
/
Reply
/ Type
/
UserInput
/ Feedback-Vote
/ /
/feedback/yes
หรือ /feedback/no
ถูกส่งไปArticle
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/
/reason
/articles
จะถูกส่งutm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/
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
/
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(Custom Metric1) เพื่อบันทึกสมาชิกกลุ่มนับเมื่อ Chatbot เข้าร่วมGroup
/ Leave
/ -1
( Event category
/ ค่า Event action
/ Event value
)บันทึก:
- เราตั้งค่าเหตุการณ์ GA 1 เป็นเข้าร่วม -1 เป็นลา หากต้องการทราบกลุ่มทั้งหมดนับ chatbot เข้าร่วมคุณสามารถดูค่าเหตุการณ์ทั้งหมดได้โดยตรง (รายละเอียดดูการนับโดยนัย)
- หากต้องการทราบว่ากลุ่มเข้าร่วมหรือลื่นคุณควรค้นหา
Join
ครั้งสุดท้ายหรือLeave
การกระทำของClient Id
- นอกจากนี้คุณควรค้นหาการดำเนิน
Join
ครั้งสุดท้ายของClient Id
เพื่อให้ได้Group Members Count
ที่แม่นยำยิ่งขึ้นGroup Members Count
จะถูกบันทึกเมื่อ Chatbot เข้าร่วมกลุ่มเพื่อทราบจำนวนที่แน่นอนคุณควรได้รับโดยตรงจาก Line Messaging-API
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
สำหรับแต่ละบทความที่พบArticle
/ Selected
/
Reply
/ Selected
/
UserInput
/ Intro
/
เข้าถึง
Forward
ContentProxy
อกซี LICENSE
กำหนดข้อตกลงใบอนุญาตสำหรับซอร์สโค้ดในที่เก็บนี้
LEGAL.md
เป็นข้อตกลงผู้ใช้สำหรับผู้ใช้เว็บไซต์ Cofacts