Side Project / AI + LINE Bot

Cody — เพื่อนดูบอลสาย AI

LINE Bot ที่โม้เก่ง ด่าเก่ง เชียร์หงส์ดุ — ใช้ GPT สร้างข้อความอารมณ์แฟนบอลผับ ส่งทุกเช้าหลังวันแข่ง

Google Apps Script ChatGPT API LINE Bot Football-Data API Cloudflare Workers

Overview

"Cody" คือ Bot ในกลุ่ม LINE เพื่อนดูบอล Liverpool ที่ทำตัวเป็นเพื่อนอีกคน — ตื่นมาเช้าวันจันทร์แล้วรายงานผลพร้อมอารมณ์ร่วม

<
Scousers
5 members
C
Cody
ดูบอลเมื่อคืนเหมือนดู Wi-Fi บ้านเพื่อน หลุดทั้งเกม!
21:08
N
วันไหนที่แพ้ เดี๋ยวให้ cody ด่าาา 555
20:47
C
Cody
Slot คิดอะไรอยู่ เปลี่ยนตัวช้ากว่ารถเมล์สาย 8!
08:05
P
เอาอีก Cody! 555
08:12

Design Thinking Process

วิธีคิดเบื้องหลัง Cody — จาก insight เล็กๆ ในกลุ่ม LINE

กลุ่ม LINE เพื่อนดูบอล — ปัญหาซ่อนอยู่

กลุ่ม LINE เพื่อนเชียร์ Liverpool มี 5 คน ดูบอลพรีเมียร์ลีกทุกสัปดาห์ แต่สังเกตว่าวันที่ไม่มีใครเริ่มคุย กลุ่มจะเงียบทั้งวัน — ทุกคนรอให้คนอื่นเริ่มก่อน โดยเฉพาะวันที่แพ้ ไม่มีใครอยากพูดถึง

Insight: กลุ่มต้องการ "คนเริ่มคุย" ที่ไม่อาย ไม่เกรงใจ พร้อมโม้ พร้อมด่าทุกสถานการณ์

"ทำไมไม่มี Bot ที่มีอารมณ์ร่วมเหมือนเพื่อนจริงๆ?"

Bot รายงานผลบอลมีเยอะ แต่ทุกตัว "แข็งๆ" — รายงานสกอร์แล้วจบ ไม่มีอารมณ์ร่วม ไม่มีการโม้ ไม่มีการด่า ไม่มีความสนุก แฟนบอลไม่ได้อยากรู้แค่สกอร์ — อยากมีคนมาร่วมดีใจ หรือร่วมเจ็บปวดด้วย

HMW: How might we สร้าง Bot ที่ "เป็นเพื่อนดูบอล" ไม่ใช่แค่ "เครื่องรายงานสกอร์"?

Context Engine — ให้ Bot รู้จักอารมณ์

ไอเดียหลักคือสร้าง "Context Engine" ที่ไม่ใช่แค่ดู ชนะ/แพ้/เสมอ แต่เข้าใจ บริบท ของผลบอล:

• แพ้แมนยู ≠ แพ้ทีมอื่น (ดาร์บี้ต้องเดือดกว่า)
• แพ้ทีมท้ายตาราง ≠ แพ้ทีมท็อป (แพ้ทีมรั้งท้ายต้องด่าหนักกว่า)
• อันดับตกนอก Top 4 ≠ นำจ่าฝูง (สถานการณ์ต่างกัน อารมณ์ต่างกัน)
• ชนะ Man City ≠ ชนะทีมเล็ก (ชนะทีมใหญ่ต้องโม้ทั้งวัน)

Key Idea: สร้าง "Rage Meter" ที่คำนวณระดับความเดือดจากหลายปัจจัย แล้วส่งให้ GPT เป็น context

Prototype แบบ Lean — ทำให้มันทำงานก่อน

เลือก stack ที่ lean ที่สุด เพราะเป็น side project ที่ต้องดูแลง่าย:

Google Apps Script — free hosting, cron trigger ในตัว, ไม่ต้อง deploy
Cloudflare Workers — proxy API key ไม่ให้ expose
ChatGPT API — สร้างข้อความที่ไม่ซ้ำทุกครั้ง
LINE Messaging API — ส่งตรงเข้ากลุ่มที่ใช้อยู่แล้ว

Zero infrastructure cost — ทุกอย่าง free tier หมด ดูแลตัวเองได้

ทดสอบกับเพื่อนจริง — ฟีดแบ็กทันที

ปล่อย Cody เข้ากลุ่ม LINE โดยไม่บอกเพื่อนล่วงหน้า — สังเกตว่าเพื่อนตอบ Cody เหมือนคุยกับคนจริง มีคนถามว่า "ใครพิมพ์?" 555

Validation: เพื่อนในกลุ่มเริ่มรอข้อความ Cody ทุกเช้า และมี engagement กลับมาจริง

System Architecture

Data flow ตั้งแต่ดึงผลบอลจนถึงข้อความเข้ากลุ่ม LINE

Football-Data API
ผลบอล + ตารางคะแนน PL
🧠
Context Engine
Mood + Rage Meter + Rival Detection
🤖
ChatGPT API
สร้างข้อความ 1 ประโยค
💬
LINE Group
ส่งข้อความเข้ากลุ่ม Scousers

Context Engine — หัวใจของ Cody

ระบบที่ทำให้ Bot เข้าใจ "บริบท" ไม่ใช่แค่ "สกอร์"

🤩
WIN Mode
โม้แบบแฟนหงส์มั่นหน้า ชนะทีมใหญ่ยิ่งต้องโม้ทั้งวัน
😒
DRAW Mode
ประชดแบบแฟนบอลเซ็งๆ "ได้แต้มเดียว เหมือนได้เงินทอน"
🤬
LOSS Mode
ด่า Arne Slot แบบแฟนบอลหัวร้อน + Rage Meter ทำงาน

🔥 Rage Meter — ระดับความเดือดที่คำนวณจากบริบท

แพ้ทีมทั่วไป
3/10
แพ้ทีมท้ายตาราง
+5
อันดับตกนอก Top 4
+2
vs Manchester United
10/10
vs Everton (Derby)
20/10
buildContext_.gs
const SPECIAL_RAGE = { "Manchester United": 10, "Everton": 20 }; const SPECIAL_FLEX = [ "Manchester City", "Arsenal" ]; // ชนะ City หรือ Arsenal? // โม้ทั้งวัน 💪 // แพ้ Everton? // rage = 20 (มิเตอร์แตก)

Prompt Engineering

ศิลปะการสั่ง GPT ให้ "พูดเหมือนเพื่อนในผับ"

🎯 กติกาที่ส่งให้ GPT

1 ประโยค ภาษาแฟนบอล ตลก กวน ไม่เกิน 16 คำ temperature: 1.1
generateGPT_.gs (prompt)
คุณคือแฟนบอล Liverpool สายหัวร้อนในผับ // ส่ง context ทั้งหมดให้ GPT: // - ผลบอล (Home vs Away) // - คู่แข่งชื่ออะไร // - อันดับตาราง Liverpool // - Rage Meter level // - สถานการณ์พิเศษ (ดาร์บี้, ท้ายตาราง) กติกา: - 1 ประโยค - ภาษาแฟนบอล - ตลก กวน - ไม่เกิน 16 คำ ถ้าแพ้: ด่า Arne Slot ถ้าชนะ: โม้แบบแฟนหงส์

ทำไม 16 คำ? — ข้อความสั้นเหมือนเพื่อนส่งมา ไม่ใช่บทความ เพื่อนอ่านแล้วหัวเราะทันที ไม่ต้องเลื่อนอ่าน


Key Design Decisions

ทำไมถึงเลือกแบบนี้

Decision 01
Google Apps Script ไม่ใช่ Server
ไม่ต้อง maintain server, ไม่ต้อง uptime monitoring, trigger ทำงานเองทุกเช้า 8 โมง — เหมาะกับ side project ที่ต้อง "ลืมได้แล้วมันยังทำงาน"
Decision 02
Cloudflare Workers Proxy
Football-Data API ต้องใช้ API key — สร้าง proxy ด้วย Cloudflare Workers ซ่อน key ไว้ฝั่ง edge ไม่ต้อง hardcode ใน Apps Script
Decision 03
Deduplication ด้วย Property Store
เก็บ LAST_SENT_MATCH ใน PropertiesService — trigger รันทุกวันแต่ถ้าส่งแล้วจะไม่ส่งซ้ำ ป้องกัน spam กลุ่ม
Decision 04
Temperature 1.1 = ความบ้าพอดี
Temperature สูงกว่า default (0.7) ทำให้ GPT "กล้าเล่น" มากขึ้น ข้อความไม่ซ้ำ ไม่น่าเบื่อ แต่ไม่เพี้ยนจนอ่านไม่รู้เรื่อง

Results

ผลลัพธ์จากการใช้งานจริง

0
Infrastructure Cost
5
Active Group Members
38
Matchweeks / Season
3
Mood States (W/D/L)

Learnings

สิ่งที่ได้เรียนรู้จากโปรเจกต์นี้

Context สำคัญกว่า Content — GPT สร้างข้อความเก่งอยู่แล้ว แต่ถ้าส่ง prompt แค่ "Liverpool แพ้" จะได้ข้อความกลางๆ ไม่มีอารมณ์ การสร้าง Context Engine ที่บอก GPT ว่า "แพ้ Everton ในดาร์บี้ ทั้งที่อันดับ 1" ได้ข้อความที่ต่างกันโดยสิ้นเชิง
Constraint ทำให้ดีขึ้น — กติกา "1 ประโยค, ≤16 คำ" ไม่ใช่ข้อจำกัด แต่เป็นสิ่งที่ทำให้ output ดี ข้อความสั้นเหมือนเพื่อนส่งมาจริง ไม่ใช่ AI เขียนบทความ
Side Project ต้อง Zero Maintenance — ถ้าต้อง SSH เข้า server ดู log ทุกสัปดาห์ โปรเจกต์จะตาย Google Apps Script + Cloudflare Workers = set แล้วลืมได้
Bot ที่ดีไม่ใช่ Bot ที่ฉลาด — แต่เป็น Bot ที่มีบุคลิก — Cody ไม่ได้ฉลาดกว่า Bot ตัวอื่น แต่มี "ตัวตน" ที่ชัดเจน: แฟนหงส์หัวร้อนในผับ เพื่อนในกลุ่มรู้สึกว่ากำลังคุยกับ "คน" ไม่ใช่ "Bot"
Explore ด้วยความกล้า — ไอเดียเริ่มจาก "ถ้า Bot มีอารมณ์ได้ล่ะ?" ซึ่งฟังดูเล็ก แต่พอลงมือทำจริง กลายเป็นการ explore ตั้งแต่ Prompt Engineering, Context-Aware AI, serverless architecture — โปรเจกต์เล็กที่ได้เรียนรู้เยอะ
Aw mascot

⚽ Built for real fans

โปรเจกต์นี้สร้างขึ้นเพราะอยากมีเพื่อนดูบอลที่ไม่เคยหลับ ไม่เคยเงียบ และพร้อมด่า Arne Slot ทุกครั้งที่แพ้ — ทุก feature เกิดจาก insight จริงในกลุ่ม LINE เพื่อนเชียร์ Liverpool

Google Apps Script ChatGPT API LINE Messaging API Football-Data API Cloudflare Workers