ไลน์บอทที่ตรวจสอบว่าข้อความมีข่าวลือทางอินเตอร์เน็ตหรือไม่
นี่เป็นหนึ่งในโครงการย่อยของ 真的假的。
แผนภาพสถานะนี้อธิบายวิธีที่บอท LINE พูดคุยกับผู้ใช้:
การพัฒนาข่าวลือ-ไลน์-บอทกำหนดให้คุณต้องตั้งค่าต่อไปนี้ให้เสร็จสิ้น
หลังจากโคลนที่เก็บ & cd นี้ลงในไดเร็กทอรีโปรเจ็กต์แล้ว ให้ติดตั้งการขึ้นต่อกัน
$ 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>
env vars ที่ปรับแต่งได้อื่นๆ ได้แก่:
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-server สำหรับ 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 ในช่อง Message API ของคุณ ใต้ Messaging API > การตั้งค่า Webhook ให้ตั้ง ค่า URL ของ Webhook เป็น ${ngrok_url}/callback
แล้วเปิด Use webhook คลิกตรวจสอบเพื่อยืนยันว่าเชื่อมต่อกับเครื่องของคุณสำเร็จแล้ว
เราใช้ LIFF เพื่อรวบรวมเหตุผลของผู้ใช้เมื่อส่งบทความและการตอบรับเชิงลบ
หากคุณไม่จำเป็นต้องพัฒนา LIFF คุณสามารถใช้ LIFF_URL
ที่ให้ไว้ใน .env.sample
ได้โดยตรง ซึ่งลิงก์ไปยังไซต์ staging 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 (http://localhost:5001) หรือเซิร์ฟเวอร์ chatbot ที่ใช้งานจริง
ในโหมดการพัฒนา มันจะหมุน webpack-dev-server บน localhost:<LIFF_DEV_PORT>
(ค่าเริ่มต้นคือ 8080
) และ /liff
ของพร็อกซีเซิร์ฟเวอร์ chatbot จะคำขอทั้งหมดไปยัง webpack-dev-server
เคล็ดลับในการพัฒนา LIFF ในเบราว์เซอร์คือ:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
ในเบราว์เซอร์เดสก์ท็อปliff.logout()
ด้วยตนเองในคอนโซล JS เพื่อทริกเกอร์การเข้าสู่ระบบอีกครั้ง liff.init()
จะยังคงทำงานในเบราว์เซอร์เดสก์ท็อป ดังนั้นแอปจึงแสดงผล ทำให้เราสามารถแก้ไขข้อบกพร่องของเค้าโครงเว็บบนเดสก์ท็อปได้ liff.sendMessages()
จะไม่ทำงานแม้ว่า liff.closeWindow()
จะไม่ทำงานหากหน้าต่างเบราว์เซอร์ของคุณผ่านการเปลี่ยนเส้นทางการเข้าสู่ระบบ
เซิร์ฟเวอร์บอท LINE เริ่มต้นเซิร์ฟเวอร์ GraphQL ที่รวบรวม Cofacts GraphQL API และ API เฉพาะสำหรับแชทบอทของ 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
และทำหน้าที่เป็นไฟล์คงที่โดยเซิร์ฟเวอร์แชทบอต
หากคุณได้รับ 400 bad request
ใน LIFF โปรดค้นหาการเรียกใช้ฟังก์ชัน liff.init
ในไบนารี JS ที่คอมไพล์แล้ว และดูว่า LIFF ID สอดคล้องกับ LIFF URL ของคุณหรือไม่ ซึ่งควรเป็นเส้นทางโดยไม่ต้องนำ https://liff.line.me/
.
LIFF ID ได้รับการตั้งค่าโดยใช้ปลั๊กอิน Webpack Define ในระหว่างการสร้าง ดังนั้นการสลับตัวแปร env LIFF URL โดยไม่สร้างไบนารี LIFF ใหม่จะทำให้เกิดคำขอที่ไม่ถูกต้อง 400 รายการ
เราใช้ ttag เพื่อรองรับ build-time 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/
หากคุณต้องการสร้างโดยใช้ docker แทน คุณอาจต้องแก้ไข 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
และเมทริกซ์ที่กำหนดเอง (ขอบเขต Hit) สำหรับ 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 ด้วย env เมื่อสร้างอิมเมจ คุณสามารถรวม "ตัวแปร Build-time" (แสดงไว้ใน .env.sample
) ไว้ใน .env
เพื่อให้แน่ใจว่าไม่มีข้อมูลรับรองเซิร์ฟเวอร์รั่วไหลในโค้ดไคลเอ็นต์ที่สร้างขึ้น
เนื่องจากอิมเมจนักเทียบท่าที่สร้างขึ้นจะเข้ารหัส URL สาธารณะเป็นไฟล์ที่สร้างขึ้นแบบคงที่ ตัวแปรเวลาบิวด์เหล่านี้เมื่อเราเรียกใช้อิมเมจเป็นคอนเทนเนอร์ ดังนั้น แต่ละสภาพแวดล้อมการปรับใช้ที่แยกจากกันจะต้องมีการสร้างอิมเมจแยกกัน
คุณสามารถทดสอบอิมเมจที่สร้างขึ้นในเครื่องได้โดยใช้ docker-compose.yml
; เพียงยกเลิกการใส่เครื่องหมายส่วนของไลน์บอทและระบุชื่อรูปภาพที่สร้างขึ้น
สำหรับการผลิต โปรดดูที่ข่าวลือ-ปรับใช้ตัวอย่าง docker-coompose.yml
ที่รันอิมเมจดังกล่าว
เราพุชตัวแปรและเหตุการณ์ใน dataLayer
ของ Google Tag Manager เมื่อผู้ใช้โต้ตอบกับ LIFF
คุณสามารถเตรียมการตั้งค่าต่อไปนี้ในไฟล์ .env
:
GTM_ID
: รหัสคอนเทนเนอร์ Google เครื่องจัดการแท็ก ( GTM-XXXXXXX
) แอปพลิเคชันจะเริ่มเหตุการณ์ที่กำหนดเองต่อไปนี้ใน GTM dataLayer
:
dataLoaded
- เมื่อมีการโหลดข้อมูลในบทความ ความคิดเห็น หรือคำติชม LIFFrouteChangeComplete
- เมื่อ LIFF ถูกโหลดหรือเปลี่ยนเส้นทางfeedbackVote
- เมื่อผู้ใช้ส่งคำติชมchooseArticle
- เมื่อผู้ใช้เลือกบทความใน Articles LIFF นอกจากนี้ มันจะพุชตัวแปรที่กำหนดเองต่อไปนี้ไปที่ dataLayer
;
pagePath
- ตั้งค่าเมื่อเหตุการณ์ routeChangeComplete
เริ่มทำงาน เส้นทางหน้าจากเราเตอร์ของ LIFFuserId
- ตั้งค่าหลังจาก LIFF ได้รับโทเค็น ID และถอดรหัส ID ผู้ใช้ LINE ภายในarticleId
และ replyId
: set on Article, Comment และ Feedback onMount()
เรียกว่าวงจรชีวิต หรือเมื่อเหตุการณ์ chooseArticle
เริ่มทำงานdoc
- ตั้งค่าเมื่อเหตุการณ์ dataLoaded
เริ่มทำงาน เนื้อหาที่โหลดเองในออบเจ็กต์ (บทความใน Article LIFF, ความคิดเห็นใน Comment LIFF และคำติชมใน Feedback LIFF) รูปแบบเหตุการณ์ที่ส่ง: Event category
/ Event action
/ Event label
เราใช้ Message Source
มิติ (Dimemsion ที่กำหนดเอง1) เพื่อจัดประเภทแหล่งที่มาของเหตุการณ์ต่างๆ
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
(Custom Metric1) เพื่อบันทึกจำนวนสมาชิกกลุ่มเมื่อแชทบอทเข้าร่วมGroup
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)บันทึก:
- เราตั้งค่าเหตุการณ์ ga 1 เป็น join, -1 เป็น leave หากต้องการทราบจำนวนกลุ่มทั้งหมดที่แชทบอทเข้าร่วมในปัจจุบัน คุณสามารถดูมูลค่ากิจกรรมทั้งหมดได้โดยตรง (รายละเอียดดูจำนวนโดยนัย)
- หากต้องการทราบว่ากลุ่มได้เข้าร่วมหรือออกจากกลุ่มแล้ว คุณควรค้นหาการดำเนินการ
Join
หรือLeave
ครั้งสุดท้ายของClient Id
- นอกจากนี้ คุณควรค้นหาการดำเนิน
Join
ครั้งสุดท้ายของClient Id
เพื่อให้Group Members Count
แม่นยำยิ่งขึ้นGroup Members Count
จะถูกบันทึกเฉพาะเมื่อแชทบอทเข้าร่วมกลุ่ม หากต้องการทราบจำนวนที่แน่นอน คุณควรรับโดยตรงจากการส่งข้อความไลน์-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