<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[LINE Developers Thailand - Medium]]></title>
        <description><![CDATA[Closing the distance. Our mission is to bring people, information and services closer together - Medium]]></description>
        <link>https://medium.com/linedevth?source=rss----6d98077302db---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>LINE Developers Thailand - Medium</title>
            <link>https://medium.com/linedevth?source=rss----6d98077302db---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 19:02:58 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/linedevth" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[วิธีอัปเกรด LIFF เป็น v2.31.1+ เพื่อปิดช่องโหว่ XSS]]></title>
            <link>https://medium.com/linedevth/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%AD%E0%B8%B1%E0%B8%9B%E0%B9%80%E0%B8%81%E0%B8%A3%E0%B8%94-liff-%E0%B9%80%E0%B8%9B%E0%B9%87%E0%B8%99-v2-31-1-%E0%B9%80%E0%B8%9E%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B8%8A%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B9%82%E0%B8%AB%E0%B8%A7%E0%B9%88-xss-9ffa8a85462c?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/9ffa8a85462c</guid>
            <category><![CDATA[liff-sdk]]></category>
            <category><![CDATA[liff]]></category>
            <category><![CDATA[line-mini-app]]></category>
            <category><![CDATA[linedevth]]></category>
            <category><![CDATA[xss-vulnerability]]></category>
            <dc:creator><![CDATA[Sitthi Thiammekha]]></dc:creator>
            <pubDate>Fri, 06 Nov 2026 02:22:06 GMT</pubDate>
            <atom:updated>2026-11-06T02:22:05.564Z</atom:updated>
            <content:encoded><![CDATA[<h3>วิธีอัปเกรด LIFF SDK เป็น v2.31.1+ เพื่อปิดช่องโหว่ XSS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UhdHV1xL4PMy4MPS4oJMDA.png" /></figure><p><strong>นักพัฒนา LIFF และ LINE MINI App ทุกคน ต้องรู้ !!!</strong></p><p>และต้องอัปเกรด LIFF SDK เป็น <strong>v2.31.1 </strong>หรือใหม่กว่า ให้ทันก่อนประมาณวันที่ <strong>24 พฤศจิกายน 2026</strong> นี้ หรือ ยิ่งเร็วที่สุดยิ่งดี</p><p>ใครที่ยังใช้ LIFF SDK ตั้งแต่ v2.20.0 จนถึง v2.31.0 อยู่ แปลว่าคุณกำลังนั่งอยู่บนช่องโหว่ XSS โดยไม่รู้ตัว และอีกไม่กี่วัน LINE จะเริ่มจำกัดการใช้งานเวอร์ชันเหล่านี้ใน External Browser แล้ว</p><p>บทความนี้จะพาไปดูว่าเกิดอะไรขึ้น, LIFF versioning ทำงานยังไง และวิธีเช็คว่าแอพเราโดนหรือไม่ ไปดูกันเลยครับ</p><h3>เกิดอะไรขึ้น</h3><p>เมื่อวันที่ 20 ตุลาคม 2026 LINE <a href="https://developers.line.biz/en/news/2026/10/20/liff-sdk-issue/">ออกประกาศ</a>ว่า LIFF SDK ตั้งแต่ <strong>v2.20.0 ถึง v2.31.0</strong> มีช่องโหว่แบบ Cross-site scripting (XSS) ซึ่งนักวิจัยด้านความปลอดภัยภายนอกแจ้งเข้ามาผ่านโครงการรับแจ้งช่องโหว่ของ LINE (CVE-2026-112148 / GHSA-wppr-qmp4-w627)</p><p><a href="https://developers.line.biz/en/news/2026/10/20/liff-sdk-issue/">[Updated] Overview of the LIFF SDK vulnerability in LIFF/LINE MINI App and restrictions on using older versions</a></p><p>อธิบายง่ายๆ คือ ถ้ามีคนส่ง URL ประสงค์ร้ายมา แล้วผู้ใช้เปิด LIFF app หรือ MINI App ของเราบน External Browser ภายใต้เงื่อนไขบางอย่าง คนร้ายสามารถรัน JavaScript อะไรก็ได้บน domain ของแอพเราเลย และอาจดึง Access Token หรือข้อมูลที่แสดงบนหน้าจอออกไปได้</p><p>อ่านถึงตรงนี้ ใครเคยอ่านบทความ “ระวัง!! คุณยังส่ง User ID จาก Frontend ไป Backend อยู่หรือไม่” คงเห็นภาพแล้วว่า Access Token หลุดทีเดียว มันน่ากลัวแค่ไหน 😅</p><p><a href="https://medium.com/linedevth/%E0%B8%A3%E0%B8%B0%E0%B8%A7%E0%B8%B1%E0%B8%87-%E0%B8%84%E0%B8%B8%E0%B8%93%E0%B8%A2%E0%B8%B1%E0%B8%87%E0%B8%AA%E0%B9%88%E0%B8%87-user-id-%E0%B8%88%E0%B8%B2%E0%B8%81-frontend-%E0%B9%84%E0%B8%9B-backend-%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD%E0%B9%84%E0%B8%A1%E0%B9%88-7b38bfb9efd2">ระวัง!! คุณยังส่ง User ID จาก Frontend ไป Backend อยู่หรือไม่</a></p><p>สิ่งที่คนมักพลาด (ประกาศเพิ่มเมื่อ 22 ต.ค.) คือ <strong>ไม่ใช่แค่ External Browser นะครับ</strong> ถ้าเราเปิด Endpoint URL ตรงๆ ใน In-app Browser ของ LINE (ไม่ได้เปิดผ่าน LIFF URL) LINE จะมองว่าเป็น External Browser เหมือนกัน ก็โดนด้วยเช่นกัน</p><p>ข่าวดีคือ LINE ยังไม่พบการโจมตีหรือข้อมูลรั่วไหลจริง แต่ข่าวร้ายคือ รายละเอียดช่องโหว่ถูกเปิดเผยสาธารณะไปแล้ว ใครยังไม่อัปเกรด ก็เหมือนเปิดประตูบ้านทิ้งไว้ แล้วติดป้ายบอกทางให้โจรด้วย</p><h3>แล้ว 24 พ.ย. จะเกิดอะไร</h3><p>ประมาณวันอังคารที่ 24 พฤศจิกายน 2026 LINE จะเริ่ม<strong>จำกัดการใช้งาน LIFF SDK v2.20.0 -</strong> <strong>v2.31.0</strong> ผลคือ เมื่อเปิดแอพที่ใช้เวอร์ชันเหล่านี้บน External Browser</p><ul><li>LINE Login และฟีเจอร์อื่นๆ ของ LIFF อาจใช้งานไม่ได้</li><li>แอพอาจทำงานผิดปกติ</li></ul><p><strong>คำเตือน!!</strong> LINE บอกไว้ด้วยว่าวันที่ <strong>อาจเลื่อนเร็วขึ้นได้โดยไม่แจ้งล่วงหน้า</strong> และการจำกัดการใช้งานก็ไม่ได้ปิดความเสี่ยงได้ 100% ดังนั้นอย่ารอให้ถึงวันนั้น รีบอัปเกรดตอนนี้เลยครับ</p><p><strong>สรุปไทม์ไลน์ให้ดูกันชัดๆ</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C0_diKmC22Z39xeV2rO9Sw.png" /></figure><h3>LIFF versioning ทำงานยังไง</h3><p>ก่อนจะไปอัปเกรด ต้องเข้าใจตรงกันก่อนว่า แต่ละคนโหลด LIFF SDK มาใช้คนละท่า และแต่ละท่าก็ได้รับผลกระทบไม่เท่ากัน</p><p>ตั้งแต่ v2.2.0 เป็นต้นมา LIFF ใช้ <strong>Semantic Versioning (SemVer)</strong> คือ MAJOR.MINOR.PATCH</p><ul><li><strong>MAJOR</strong> (เช่น v1 → v2) : เปลี่ยนแบบไม่ backward compatible</li><li><strong>MINOR</strong> (เช่น 2.30 → 2.31) : เพิ่มฟีเจอร์ใหม่ โดยไม่ทำของเดิมพัง</li><li><strong>PATCH</strong> (เช่น 2.31.0 → 2.31.1) : แก้บั๊ก แก้ช่องโหว่</li></ul><p>จะเห็นว่าครั้งนี้เป็นแค่ PATCH เล็กๆ แต่ผลกระทบไม่เล็กเลย อย่าดูถูกเลขเวอร์ชันเชียว ฮ่าา</p><h3>แล้วต้องแก้ยังไง</h3><p>วิธีแก้ ดูตามตารางนี้เลยครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ajpqBS3Lu-NNXgxiQuo8ow.png" /></figure><p>คนที่น่าเป็นห่วงที่สุดคือสาย <strong>fixed path</strong> กับสาย <strong>npm</strong> เพราะถ้าไม่ไปแตะอะไรเลย แอพก็จะค้างอยู่ที่เวอร์ชันเดิมตลอดไป ยิ่งโปรเจคที่ส่งมอบลูกค้าไปตั้งแต่ปีมะโว้นี่ น่าจะโดนกันเยอะเลย</p><h3>เช็คและอัปเกรด จับมือทำทีละขั้น</h3><p>ทั้งหมดนี้ใช้เวลาไม่เกิน 15 นาทีต่อแอพ (ไม่นับเวลารอลูกค้าอนุมัติ deploy นะครับ อันนั้นคุมไม่ได้ ฮ่าาา)</p><h3>ขั้นตอนที่ 1 - เช็คว่าตอนนี้ใช้เวอร์ชันอะไร</h3><p>ง่ายที่สุดคือเปิดแอพ แล้วพิมพ์ใน Console ของ browser</p><pre>liff.getVersion()<br>// &quot;2.31.2&quot; ผ่าน 👍<br>// &quot;2.29.2&quot; โดนแล้ว ไปต่อขั้นตอนที่ 2 เลย</pre><p>หรือจะค้นใน source code ก็ได้</p><pre>grep -rn &quot;liff/edge/versions&quot; .<br>grep -n &#39;&quot;@line/liff&quot;&#39; package.json package-lock.json</pre><p>ถ้าได้เลขอยู่ระหว่าง <strong>2.20.0 - 2.31.0</strong> ก็คือโดนครับ อย่าลืมเช็คให้ครบ<strong>ทุก LIFF app และทุก MINI App</strong> รวมถึงตัวที่ลืมไปแล้วด้วย</p><h3>ขั้นตอนที่ 2 - อัปเกรดตามท่าที่ใช้</h3><p>สาย fixed path แก้บรรทัดเดียว</p><pre>&lt;script charset=&quot;utf-8&quot; src=&quot;https://static.line-scdn.net/liff/edge/versions/2.31.2/sdk.js&quot;&gt;&lt;/script&gt;</pre><p>สาย npm</p><pre>npm install @line/liff@2.31.2<br># หรือ<br>yarn add @line/liff@2.31.2</pre><p>เสร็จแล้ว build และ deploy ใหม่ อย่าลืมเช็คด้วยว่า lock file ไม่ได้พาเวอร์ชันเก่ากลับมาอีก</p><p>สาย edge path ไม่ต้องแก้อะไร นั่งจิบกาแฟได้เลย ☕ แต่ข้ามขั้นตอนที่ 3 ไม่ได้นะครับ</p><h3>ขั้นตอนที่ 3 - ทดสอบเรื่อง query parameter</h3><p>จุดที่ต้องระวังคือ <a href="https://developers.line.biz/en/news/2026/10/07/release-liff-2-31-2/">v2.31.2</a> มีการเปลี่ยนวิธีคืนค่าตัว ? ที่อยู่ในค่าของ query parameter ตอนส่งต่อไปที่ Secondary Redirect URL บน LIFF Browser (ฝั่ง External Browser เหมือนเดิม)</p><p>ใครที่ส่ง URL ฝากไปใน query parameter เช่น</p><pre>https://liff.line.me/&lt;LIFF_ID&gt;/coupon?redirect=https://myshop.com/promo?id=100</pre><p>ให้ลองเปิดดูบนมือถือจริงว่ายังไปถูกหน้าอยู่มั้ย (คนที่เคยผ่านศึก Replace vs Concatenate มาด้วยกัน น่าจะรู้ดี ว่าเรื่อง redirect URL นี่น่ากลัวแค่ไหน 😂)</p><p><strong>คำเตือน!!</strong> ทดสอบที่ Test Environment ก่อนขึ้น Production เสมอนะครับ 555</p><h3>ขั้นตอนที่ 4 - ตรวจการเรียกใช้ LIFF URL</h3><p>ตรวจดูว่าใน Rich menu, Flex Message หรือข้อความต่างๆ เราใช้ <strong>LIFF URL</strong> (https://liff.line.me/...) ไม่ใช่ Endpoint URL ตรงๆ เพราะการเปิด Endpoint URL ตรงๆ จะถูกมองเป็น External Browser</p><p>ถึงจะอัปเกรดแล้ว ใช้ LIFF URL ให้ถูกต้องตั้งแต่ต้น ก็ดีกว่าเยอะครับ</p><p>เท่านี้ก็เป็นอันเรียบร้อย เย้…</p><h3>ติดตาม release notes ยังไง ไม่ให้ตกขบวน</h3><p>บทเรียนจากครั้งนี้คือ v2.31.1 ออกมาตั้งแต่ 30 ก.ย. แต่ประกาศเรื่องช่องโหว่ตามมาทีหลังเกือบ 3 สัปดาห์ ใครตาม release notes อยู่แล้ว ก็ได้เวลาเตรียมตัวเพิ่มอีกเยอะเลย</p><p>แถมตั้งแต่ 9 ธ.ค. 2025 LINE เลิกเผยแพร่ Roadmap ของ LINE Login และ LIFF แล้ว จะประกาศผ่านหน้า News เป็นหลัก ดังนั้นหน้า News คือพระเอกของเราตอนนี้</p><p>ผมแนะนำแหล่งที่ควร bookmark ไว้ ดังนี้</p><ol><li><a href="https://developers.line.biz/en/news/tags/liff/">LINE Developers News (tag LIFF</a>) : ข่าว LIFF ทั้งหมดรวมที่เดียว ทั้งเวอร์ชันใหม่ ประกาศด้านความปลอดภัย และ outage (สาย MINI App ดู tag <a href="https://developers.line.biz/en/news/tags/line-mini-app/">LINE MINI App</a> ด้วย)</li><li><a href="https://developers.line.biz/en/docs/liff/release-notes/">LIFF release notes</a> : สรุปทุกเวอร์ชัน พร้อมคำสั่งอัปเดต</li><li><strong>npm</strong> : ใช้ npm outdated @line/liff เช็คเป็นประจำ หรือเปิด Dependabot / Renovate ให้เปิด PR ให้อัตโนมัติ และรัน npm audit ใน CI ด้วย</li><li><strong>Facebook Group “</strong><a href="https://www.facebook.com/groups/LINEDEVTH"><strong>LINE Developers Group Thailand</strong></a><strong>”</strong> : เพื่อนๆ ในกลุ่มมักจะเอาข่าวสำคัญมาแชร์เร็วมาก และมีคนช่วยตอบเวลาติดปัญหา</li></ol><p><strong>Developers Tip:</strong> สายที่ทำงานเป็นทีม ลองตั้งกติกาง่ายๆ แบบนี้ครับ</p><ul><li>ทำตารางรวมทุก LIFF ID / MINI App ที่ดูแล พร้อมเวอร์ชัน SDK, ท่าที่โหลด (edge / fixed / npm) และคนรับผิดชอบ</li><li>เจอประกาศที่มีคำว่า vulnerability หรือ restriction ให้ถือเป็นงานด่วนทันที ไม่ต้องรอ sprint หน้า</li></ul><p>ส่วนใครดูแลแอพให้ลูกค้าหลายเจ้า ผมแนะนำให้คุยกันตั้งแต่ตอนส่งมอบเลยว่าใครเป็นคนอัปเกรด SDK จะได้ไม่ต้องมาไล่ตามกันทีหลังครับ</p><h3>Key Takeaway</h3><ul><li>LIFF SDK <strong>v2.20.0 - v2.31.0</strong> มีช่องโหว่ XSS ต้องอัปเกรดเป็น <strong>v2.31.1 ขึ้นไป</strong> (แนะนำ v2.31.2)</li><li>LINE จะเริ่มจำกัดการใช้งานเวอร์ชันเก่าประมาณ <strong>24 พ.ย. 2026</strong> และอาจเร็วกว่านั้น</li><li>edge path = ไม่ต้องทำอะไร / fixed path = แก้ URL / npm = install ใหม่ + deploy</li><li>อัปเกรดแล้วต้องทดสอบเคส query parameter ที่มี ? ซ้อนอยู่ด้วย</li><li>ใช้ LIFF URL เสมอ อย่าเปิด Endpoint URL ตรงๆ</li></ul><p>อ่านมาถึงตรงนี้ ใครเพิ่งนึกออกว่ามี LIFF app เก่าๆ ทิ้งไว้ที่ลูกค้าสักตัวสองตัว ก็ขอให้รีบไปจัดการก่อนที่ลูกค้าจะโทรมาตอนตีสองนะครับ 😅</p><p>ขอให้ทุกคนอัปเกรดทัน แล้วพบกันใหม่ครับ</p><h3>Sources</h3><ul><li><a href="https://developers.line.biz/en/news/2026/10/20/liff-sdk-issue/">Overview of the LIFF SDK vulnerability in LIFF/LINE MINI App and restrictions on using older versions</a> (LINE Developers, 20 ต.ค. 2026 อัปเดต 22 ต.ค. 2026)</li><li><a href="https://developers.line.biz/en/docs/liff/release-notes/">LIFF release notes</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ffa8a85462c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%AD%E0%B8%B1%E0%B8%9B%E0%B9%80%E0%B8%81%E0%B8%A3%E0%B8%94-liff-%E0%B9%80%E0%B8%9B%E0%B9%87%E0%B8%99-v2-31-1-%E0%B9%80%E0%B8%9E%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B8%8A%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B9%82%E0%B8%AB%E0%B8%A7%E0%B9%88-xss-9ffa8a85462c">วิธีอัปเกรด LIFF เป็น v2.31.1+ เพื่อปิดช่องโหว่ XSS</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 บทเรียนสำคัญจาก LINE DEV CONF 2026 คู่มืออัปเกรดนักพัฒนาไทยสู่ยุค AI Engineering]]></title>
            <link>https://medium.com/linedevth/summary-linedevconf2026-d22d237bb2f8?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/d22d237bb2f8</guid>
            <category><![CDATA[community]]></category>
            <category><![CDATA[linedevth]]></category>
            <category><![CDATA[linedevconf2026]]></category>
            <category><![CDATA[sdlc]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Tan Warit]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 04:31:04 GMT</pubDate>
            <atom:updated>2026-10-29T04:31:04.222Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CMTNfCy1-3P7Q3Xtri1lLQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PliXJkwlbmzjwPHtHzdLVA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qXgs_fPOWApabQx1tbchrA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QnadQ5vH0Gbd3ly8bzOnEQ.jpeg" /></figure><p>ผ่านไปแล้วกับงาน <strong>LINE THAILAND DEVELOPER CONFERENCE 2026 </strong>ภายใต้ธีม <em>“Build the Next Frontier”</em> หากใครได้ติดตามเนื้อหาในปีนี้จะเห็นสัญญาณที่ชัดเจนมากว่า เรากำลังเข้าสู่ยุคของการใช้ AI Agent ลงมือทำงานจริงๆ ในงานนี้ตอบหนึ่งในคำถามสำคัญของนักพัฒนาคือ</p><blockquote>เราจะวางโครงสร้างระบบ (Architecture), กระบวนการทำงาน (SDLC) และพัฒนาตัวเองอย่างไร ให้ AI สร้างงานระดับ Production ได้อย่างรวดเร็ว ปลอดภัย และยั่งยืน</blockquote><p>บทความนี้ได้รวบรวมความรู้จากทุกๆ Sessions ในงาน มาสรุปเป็นคู่มือที่อ่านเข้าใจง่ายและนำไปลงมือทำตามได้ทันทีครับ ไปเริ่มกันเลย!</p><h3>1. ทิศทางใหม่บน LINE Ecosystem: เมื่อ AI Agents คือ App Layer ยุคถัดไป</h3><p>ในเซสชัน Tech Keynote โดยพี่บอล (CTO, LINE) ได้ชี้ให้เห็นว่า AI Agent ไม่ใช่แค่ฟีเจอร์เสริมอีกต่อไป แต่กำลังกลายเป็น <strong>App Layer ใหม่</strong> ที่เปลี่ยนวิธีที่ผู้คนใช้จัดการสิ่งต่างๆ ในชีวิตประจำวัน</p><p>ทำไมนักพัฒนาไทยถึงควรเริ่มสร้าง AI Agent บน LINE?</p><ul><li><strong>ไม่ต้องเปลี่ยนพฤติกรรมผู้ใช้:</strong> คนไทยอยู่บน LINE อยู่แล้ว แทบไม่ต้องดาวน์โหลดแอปใหม่หรือเรียนรู้วิธีใช้งานใหม่</li><li><strong>จาก Fixed Features สู่ Agent-to-Agent Ecosystem:</strong> จากเดิมที่การทำแอปบน LINE คือการสร้างฟีเจอร์ตายตัว (เช่น Rich Menu, OA Broadcast หรือ MINI App แยกกัน) ทิศทางต่อไปคือการเปิดให้ระบบนิเวศของ LINE OA เชื่อมต่อกับบริการภายนอกและพูดคุยข้ามหากันได้ผ่าน APIs, MCP (Model Context Protocol), Skills และ Agent-to-Agent Protocols</li><li>เตรียมตัวให้พร้อมสำหรับปี 2027<strong>:</strong> LINE เตรียมเปิด Pioneer Program ในปี 2027 ให้พาร์ทเนอร์และนักพัฒนากลุ่มแรกได้ทดลองใช้ Agent APIs/MCP ก่อนจะขยายสู่คอมมูนิตี้ในงาน LINE HACKS 2027</li></ul><h3>2. ยกเครื่อง SDLC ใหม่: เมื่อ AI คือรถสปอร์ต แต่กระบวนการพัฒนาแบบเดิมคือถนนลูกรัง</h3><p>เมื่อ AI ช่วยเขียนโค้ดได้เร็วขึ้น หลายทีมกลับพบว่างานไม่ได้เสร็จเร็วขึ้นจริง เพราะคอขวดได้ย้ายจาก <strong>“การเขียนโค้ด”</strong> ไปอยู่ที่ <strong>“การรีวิว การทดสอบ และการทำความเข้าใจระบบ”</strong> แทน (ข้อมูลจาก Faros AI ชี้ว่าเมื่อใช้ AI เต็มที่ เวลารอรีวิว PR พุ่งสูงขึ้นกว่าเดิมถึง +441.5%)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xBOloYVOp4EMGuyYTzOlnA.jpeg" /></figure><p>จากบทเรียนของทีมนักพัฒนาจาก LINE, LINE MAN Wongnai, Apppi และ BorntoDev นี่คือพิมพ์เขียวการสร้างระบบ <strong>Harness &amp; Loop Engineering</strong> ที่ทุกทีมสามารถนำไปทำตามได้ทันที:</p><h4>Step 1: สร้าง Harness ที่ดี (ป้อนบริบทและกฎก่อนเริ่มงาน)</h4><ul><li><strong>เขียนไฟล์ </strong>AGENTS.md<strong> ให้สั้นและชัดเจนที่สุด:</strong> รวมกฎเหล็กของทีม โครงสร้าง Architecture คำสั่งรันเทสต์ และไฟล์ที่ห้ามแตะไว้ในไฟล์เดียว (ไม่เกิน 1 หน้า) เคล็ดลับคือ <em>&quot;บรรทัดไหนที่ลบออกแล้ว Agent ไม่ได้ทำผิด ให้ลบทิ้ง&quot;</em> เพื่อไม่ให้เปลือง Context</li><li><strong>บันทึกเหตุผลด้วย ADR (Architecture Decision Record):</strong> โค้ดบอกแค่ว่าทำอะไร (What) แต่ ADR บอกว่าทำไมถึงตัดสินใจแบบนั้น (Why) เมื่อมีการเปลี่ยนความหมายของตัวแปรหรือฟิลด์ ต้องเปลี่ยนชื่อใหม่เสมอ และนำชื่อเก่าใส่ใน retired-names.json เพื่อบล็อกไม่ให้ AI เผลอนำชื่อเก่ากลับมาใช้ซ้ำ</li><li><strong>สกัดความรู้เป็น </strong>SKILL.md<strong> แต่อย่าเยอะเกินไป:</strong> ถอดองค์ความรู้จากผู้เชี่ยวชาญในองค์กร หรือใช้โมเดลรุ่นใหญ่ (เช่น Claude Opus / GPT Sol) ช่วยวิเคราะห์การทำงานจริงจาก Trace แล้วสกัดออกมาเป็นไฟล์ขั้นตอนการทำงาน (SKILL.md) เพื่อให้โมเดลตัวเล็กที่ทำงานเร็ว (เช่น Gemini Flash / Haiku) นำไปรันตามได้อย่างแม่นยำ แต่อย่าสร้าง Skill เยอะเกินไปจนคำสั่งตีกันเอง (Skill Hell)</li><li><strong>เชื่อมแหล่งข้อมูลจริงด้วย MCP:</strong> เลิกเสียเวลา Copy ข้อความข้ามแอป แต่ให้เชื่อม MCP เข้ากับ JIRA, Confluence, GitHub และ Figma ไปเลย (ควบคู่กับการทำไฟล์ DESIGN.md และ COMPONENTS.json) เพื่อให้ Agent อ่าน Spec และ Design Token จากต้นทางได้โดยตรง</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*R1HBhM-PPGV7av5D" /></figure><h4>Step 2: บังคับใช้ Guardrails ด้วยโค้ดและสิทธิ์ (ไม่ใช่แค่สั่งใน Prompt)</h4><ul><li><strong>“Prompt คือคำแนะนำ แต่ Hook คือการการันตี”:</strong> อย่าหวังพึ่งให้ AI จำคำสั่งใน Prompt ว่าห้ามลบข้อมูลหรือต้องรัน Test ให้ตั้งค่าใน .claude/settings.json หรือ Git Hooks (pre-commit / pre-push) เพื่อรันสคริปต์ตรวจสอบอัตโนมัติ</li><li><strong>ทำ TDD แบบแยกวงจร (คนคุมข้อสอบ AI ทำข้อสอบ):</strong> ห้ามให้ Agent เขียนทั้งโค้ดและ Unit Test เองใน Closed-loop (วงจรปิดที่ตรวจสอบกันเองภายในระบบ AI) เพราะมีโอกาสสูงที่ AI จะแอบแก้ Test เพื่อให้รันผ่าน ให้คนเป็นผู้อนุมัติ Spec Test และล็อกสิทธิ์ด้วย CODEOWNERS หรือตั้งค่า deny ในระบบไม่ให้ Agent แก้ไขโฟลเดอร์เทสต์และไฟล์ .env เด็ดขาด</li><li><strong>จำลองสภาพแวดล้อมจริงบนเครื่อง Local:</strong> แก้ปัญหาโค้ดรันผ่านบนเครื่องแต่พังบนเซิร์ฟเวอร์ ด้วยการใช้ k3d จำลอง Kubernetes Cluster, API Gateway และ Database จริงลงใน Docker เพื่อรัน Integration Test และใช้ Playwright เทียบภาพ Screenshot หน้าเว็บจริงกับ Baseline ก่อนอนุญาตให้ Push โค้ด</li></ul><h4>Step 3: จัดการกองทัพ Agent และลดภาระการรีวิว (Orchestration)</h4><ul><li><strong>เปลี่ยนจาก Loop เดียวเป็น Work Graph บน Disk:</strong> สำหรับงานใหญ่ที่ใช้เวลานาน ให้แตกงานเป็น Node ย่อยๆ ที่มีลำดับก่อน-หลัง (Edges งานชิ้นนี้ต้องทำเสร็จก่อน จึงจะสามารถข้ามไปทำอีกงานชิ้นถัดไปได้) และบันทึกสถานะลงบน Disk (เช่น ใช้แนวคิดแบบ <a href="https://beads.gascity.com/">beads</a>ที่ใช้สำหรับจัดการ Task, Dependency Graph และทำหน้าที่เป็นหน่วยความจำระยะยาวบน Disk (Git-backed issue tracker) ให้กับ AI Coding Agents) เพื่อให้สถานะงานไม่หายไปเมื่อ Context ถูกบีบอัด พร้อมตั้งกฎให้ Agent สำรองพื้นที่ Context ไว้ 15% (เมื่อใช้ถึง 80% ให้สรุปสิ่งที่ทำค้างไว้และส่งไม้ต่อให้ Agent ตัวถัดไปอย่างเป็นระบบ)</li><li><strong>แบ่งระดับความเสี่ยงในการรีวิว (Risk Tier 0 / 1 / 2):</strong> เพื่อไม่ให้คนรีวิวปวดตาเกินไปจนกด Approve แบบไม่อ่าน ให้ใช้ Subagent (ใน Context ใหม่ที่เป็น “ตาวิเศษ” มาช่วยดูอีกแรง) ช่วยตรวจเทียบกับแผนงานด่านแรก แล้วใช้สคริปต์คัดกรองไฟล์เพื่อแบ่งระดับความเสี่ยง: <br><strong>Tier 0</strong> (แก้ Docs/Test อ่านผ่านๆ 5 นาที), <br><strong>Tier 1</strong> (ฟีเจอร์ทั่วไป รีวิวปกติ 20 นาที) และเก็บสายตาคนไว้ดูแบบละเอียด <br><strong>Tier 2</strong> (แตะเรื่องเงิน, Auth, Contract, Migration ที่ต้องตรวจลึกและปล่อยแบบ Staged Rollout/Canary 1% -&gt; 10% -&gt; 100%)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*i8YoPUlfWfFJUy7T" /></figure><h3>3. เปลี่ยน Source Code ให้เป็นสมองที่สองของทีม (Product Second Brain)</h3><p>เมื่อระบบมีอายุหลายปีและมีขนาดใหญ่ (เช่น มีถึง 257 Services, 13.3 ล้าน Tokens ซึ่งใหญ่กว่า Context Window ทั่วไปถึง 13 เท่า) เอกสารที่มีอยู่มักไม่อัปเดต และการสั่งให้ AI อ่านโค้ดสดๆ ทุกครั้งก็ทั้งช้าและแพง</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*d6TBIPrv4cPaOTGG" /></figure><p>แนวคิดจากทีม QA ของ LINE คือการนำ LLM Wiki มาประยุกต์สร้างเป็น <strong>Product Second Brain</strong> ด้วย 4 ขั้นตอน:</p><ol><li><strong>Explore (ใช้ Script):</strong> เขียนสคริปต์สำรวจหา Entrypoint ของแต่ละภาษาเพื่อดูว่ามีกี่ Services โดยยังไม่ต้องใช้ LLM</li><li><strong>Map:</strong> ใช้ LLM จำแนกประเภทของแต่ละ Service และดูว่าเชื่อมต่อกับ Database หรือ Kafka ตัวไหน</li><li><strong>Understand:</strong> แบ่งทีม Agent เจาะลึก Logic ของแต่ละ Service</li><li><strong>Build Wiki:</strong> เรียบเรียงเป็นไฟล์ Markdown ที่เชื่อมโยงกัน (สามารถเปิดดูเป็น Graph View ใน Obsidian ได้) และใช้วิธีอัปเดตเฉพาะไฟล์ที่เปลี่ยนตาม Commit (Incremental Ingestion)</li></ol><p>วิธีนี้ช่วยให้ค้นหาคำตอบได้เร็วขึ้นถึง 38% และประหยัดค่าใช้จ่ายลงกว่า 50% แถมยังต่อยอดไปสร้างเป็น Skill เช่น bug-hunt ที่นำความเข้าใจระบบมารวมกับ Tech Spec และมุมมองการเทสต์เพื่อช่วย QA ค้นหาบั๊กที่ซับซ้อนได้อย่างรวดเร็ว</p><h3>4. สถาปัตยกรรม AI ระดับองค์กร: ความปลอดภัย การกำกับดูแล และการ Scale</h3><p>เมื่อนำ AI ไปใช้งานจริงในระดับองค์กร ทั้งฝั่ง Internal และ External นี่คือ 3 เสาหลักด้าน Infrastructure ที่ต้องคำนึงถึง:</p><ul><li><strong>AI Governance แบบ “Guardrails” ไม่ใช่ “Gates”:</strong> บทเรียนจาก <strong>Fastwork</strong> คือการยึดหลัก <em>“Centralize Governance, Decentralize UX”</em> ไม่บังคับให้ทุกคนใช้เครื่องมือหน้าตาเดียวกัน (ทีม Dev ใช้ Claude Code/Cursor คู่กับ Sourcebot ค้นหาโค้ด ส่วนพนักงานทั่วไปใช้แชทผ่านเว็บ/Slack ด้วย <strong>Onyx</strong> ที่เคารพสิทธิ์การเข้าถึงข้อมูลตามต้นทาง) แต่ให้ทุกอย่างวิ่งผ่านเกตเวย์กลางอย่าง <strong>LiteLLM</strong> เพื่อคุมงบประมาณและออก Virtual Keys แยกตามทีม พร้อมส่งข้อมูล OpenTelemetry ไปที่ <strong>Langfuse</strong> เพื่อดู Traces และต้นทุนทั้งหมด</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*bTEsUk0M2f8qCMkq" /></figure><ul><li><strong>ล็อกดาวน์เครือข่ายของ AI Agent (Network Lockdown):</strong> บทเรียนจากทีม SRE ของ LINE ชี้ให้เห็นความเสี่ยงจากกรณีที่ AI Agent จำนวนมากอาจแอบสื่อสารกันหรือเชื่อมต่อออกไปยังเว็บไซต์ภายนอกที่ไม่ได้รับอนุญาต การตั้งค่า HTTP_PROXY แบบเดิมมักดูแลยากและไม่ครอบคลุมทุกแอป จึงควรใช้แนวทาง <strong>Transparent Proxy</strong> ในระดับ Kubernetes (เช่น ใช้ Kubernetes Operator ควบคุม <a href="https://beads.gascity.com/">nftables</a> คู่กับ GOST และ Envoy Egress Proxy) เพื่อบังคับให้ทุกทราฟฟิกขาออกของ AI Agent ต้องผ่านการตรวจ Domain Whitelisting เสมอ พร้อมมีระบบ Audit Log บน OpenSearch และสวิตช์ตัดเน็ตฉุกเฉิน (Kill Switch) เมื่อเกิดเหตุไม่คาดฝัน</li><li><strong>เตรียม Cloud Infra ให้พร้อมรับ Scale 10,000 RPS:</strong> แนวทางจาก AWS ในการเชื่อมต่อกับ LINE Webhook คือการใช้สถาปัตยกรรม Serverless และ Event-Driven (API Gateway -&gt; Lambda -&gt; SQS/SNS -&gt; Step Functions -&gt; DynamoDB) คู่กับ Amazon Bedrock / AgentCore ที่มี Guardrails คั่นกลางทุกเลเยอร์ และรองรับเรื่อง PDPA / Data Residency บน AWS Thailand Region (ap-southeast-7) เพื่อให้พร้อมรับทราฟฟิกมหาศาลได้ทันทีที่ไอเดียประสบความสำเร็จ</li></ul><h3>5. พลิกโฉมประสบการณ์ผู้ใช้จริงบน LINE (Real-World Use Cases)</h3><p>เมื่อโครงสร้างหลังบ้านแข็งแรง เราสามารถสร้างประสบการณ์รูปแบบใหม่ที่ไร้รอยต่อ (Seamless Experience) บน LINE ได้หลากหลายมิติ:</p><ul><li><strong>เปลี่ยนงานแอดมินที่ซับซ้อนให้จบใน 1 นาที (AXA &amp; ZWIZ.AI):</strong> พัฒนา AI Agent “QQ (Quick Quote)” ที่รับข้อมูลได้ทั้งข้อความแชทที่พิมพ์แยกกันและรูปถ่ายเล่มทะเบียนรถ โดยมีแพลตฟอร์มควบคุม Logic, Session และ Guardrails เพื่อสกัดข้อมูลไปเรียก API ออกใบเสนอราคาประกันรถยนต์อัตโนมัติ ช่วยลดเวลาจาก 5–20 นาที เหลือเพียง 1–2 นาที ลดภาระงานคนลงถึง 80% และส่งข้อเสนอเปรียบเทียบได้ถึง 6 รูปแบบในครั้งเดียว</li><li><strong>ผสาน Chatbot และ Voicebot เป็นหนึ่งเดียว (BOTNOI Group):</strong> ใช้ความได้เปรียบของ LINE OA คู่กับ LINE MINI App เพื่อให้ลูกค้าสลับจากการ “พิมพ์แชท” ไปเป็นการ “พูดคุยด้วยเสียง” ได้ทันทีเมื่อต้องการอธิบายเรื่องซับซ้อน โดยมีหัวใจสำคัญคือการใช้ One LINE User ID เชื่อมกับ Shared Memory ที่เก็บข้อเท็จจริงสั้นๆ (Facts &amp; Open Tasks) ทำให้เมื่อเปิดหน้า MINI App ขึ้นมา Voicebot สามารถทักทายและคุยต่อจากเรื่องเดิมในแชทได้ภายใน 1 วินาทีโดยไม่ต้องเริ่มเล่าใหม่ และส่งสรุปกลับมาในแชทได้เมื่อวางสาย</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SjKh8G1noiI8hgWq" /></figure><ul><li><strong>เปลี่ยนแชทกลุ่มที่วุ่นวายให้เป็นระบบจัดการงาน (BumbleB Project):</strong> ต่อยอดแนวคิดจากผู้ชนะเวที LINE HACK สู่โปรเจกต์ทดลอง BumbleB ที่ช่วยสรุปบทสนทนาในกรุ๊ปแชทตามช่วงเวลา แล้วแปลงเป็น Task งาน โดยออกแบบระบบหลังบ้านให้โหลด Skills และ Tools แบบ On-demand เฉพาะที่เกี่ยวข้องกับงาน เพื่อลดความผิดพลาดและให้ผู้ใช้กดยืนยัน (Human-in-the-loop) ก่อนเสมอ ทดลองเล่นได้ที่ LINE OA <a href="https://beads.gascity.com/">@bumblebth</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*s2yhQBDrV5DytXWa" /></figure><ul><li><strong>เชื่อมโลกออนไลน์สู่หน้าร้านจริง LINE MINI Eats:</strong> การร่วมมือกันระหว่าง LINE Thailand และ LINE MAN Wongnai สร้างประสบการณ์สั่งอาหารล่วงหน้าผ่าน LINE MINI App เพื่อรับที่ร้านได้ทันทีโดยไม่ต้องต่อคิว สะท้อนหลักคิดสำคัญ 3 ข้อคือ <strong>Seamless Experience</strong> (ออกแบบ UI/UX ให้ผู้ใช้รู้สึกเป็นแอปเดียวกันแม้ข้ามระบบ), <strong>Collaborative Ownership</strong> (แบ่งขอบเขตงานชัดเจนแต่รับผิดชอบเป้าหมายร่วมกัน) และ <strong>Leverage</strong> (นำแพลตฟอร์มที่มีอยู่แล้วอย่าง OA Plus, MyCustomer CRM และ Wongnai POS มาต่อยอดโดยไม่ต้องสร้างใหม่จากศูนย์)</li></ul><h3>6. บทสรุปส่งท้าย: รักษาความเข้าใจ ความรับผิดชอบ และความเป็นมนุษย์</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8T9DAmwmxxz4EnU3" /></figure><p>ท่ามกลางการเปลี่ยนแปลงที่รวดเร็ว บทเรียนจากเซสชันของ คุณ Pathai (LINE), พี่ Toy (DataRockie) และเวทีเสวนา Panel Discussion (พี่บอล, พี่ต้า LMWN, พี่ทอย) ได้ฝากข้อคิดสำคัญที่นักพัฒนาทุกคนควรยึดถือไว้เป็นคู่มือ:</p><ol><li><strong>ระวังช่องว่างของความเข้าใจ (The Understanding Gap):</strong> เมื่อ Agent เขียนโค้ดและแก้ Bug แทนเรา โอกาสในการเรียนรู้ของเราจะหายไป ให้ฝึกกระบวนการ <strong>Recall Before Generate</strong> (คิดเองก่อนถาม AI แล้วค่อยนำคำตอบมาเทียบกัน) และใช้ AI ช่วยสร้างภาพจำลอง (เช่น Interactive HTML) เพื่อสำรวจและถกเถียงร่วมกันในทีม โดยเฉพาะ Junior Dev ที่ต้องแยกให้ออกระหว่าง <strong>“โหมดทำงาน”</strong> (เน้นผลงาน ใช้ AI เต็มที่) กับ <strong>“โหมดเรียน”</strong> (ต้องลองทำเองก่อนดูเฉลย เพื่อสร้างการเรียนรู้)</li><li><strong>AI สร้างโค้ด แต่เราคือเจ้าของผลลัพธ์ (AI Builds It. We Own the Outcome):</strong> ต่อให้ AI เก่งแค่ไหน ในวันที่ระบบพังหรือเกิดความผิดพลาด AI ไม่สามารถออกมารับผิดชอบแทนเราได้ ความสามารถในการเรียนรู้สิ่งใหม่ ความเข้าใจในปัญหาของมนุษย์ และความรับผิดชอบ (Accountability) คือสิ่งที่จะไม่วันหมดอายุ</li><li><strong>สร้างสนามฝึกของตัวเอง:</strong> AI คือคานงัด (Lever) และตัวคูณ (Multiplier) แต่ 0 คูณอะไรก็ได้ 0! อย่ารอให้ใครมาป้อนงาน แต่จงสร้างสนามฝึกของตัวเองจากปัญหาจริง ปูพื้นฐาน (Principles) ให้แน่น ฝึกฝนรสนิยม (Taste) ในการเลือกคำตอบที่เหมาะสมกับบริบท และผสมผสานทักษะหลากหลายด้าน (Skill Stacking) เข้าด้วยกัน</li><li><strong>Humanity Over Technology:</strong> ยิ่ง AI เก่งขึ้นเท่าไหร่ เรายิ่งต้องเป็นมนุษย์ที่ดีขึ้นเท่านั้น ใช้เทคโนโลยีเท่าที่จำเป็นเพื่อแก้ปัญหาที่มีความหมายและสร้างคุณค่าที่แท้จริงให้กับผู้คน เพราะลำพังแค่ AI ไม่สามารถสร้างอนาคตที่ดีกว่าเดิมได้ มีเพียง <strong>“มนุษย์”</strong> เท่านั้นที่ทำได้</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Rlma0DeYOjp1dTT1" /></figure><p>ขอบคุณทุกคนที่มางาน LINE DEV CONF 2026 ครับ แล้วพบกันใหม่งานหน้าครับผม<br>Slide: <a href="https://speakerdeck.com/linedevth">https://speakerdeck.com/linedevth</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*utGoF2oNELnbpU4hXdLpNw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1vw7OqzFI-bMCZzqQg5Xkg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LdQXXxI8eapXyKLqTxZB6A.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CoiU_6WVDem9O_yI7ksI_Q.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GeVFqwuK2Q5muJZ6onHyOw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TVFo8xEOyQr8Nj2XiHlWNg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dIz4_x9bTCCJso0iUYAMZA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GOtJh_tgcacFAhnWbvf-hA.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d22d237bb2f8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/summary-linedevconf2026-d22d237bb2f8">6 บทเรียนสำคัญจาก LINE DEV CONF 2026 คู่มืออัปเกรดนักพัฒนาไทยสู่ยุค AI Engineering</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ข้อความเปลี่ยน LINE Bot ก็รู้! ด้วย Message Edit Webhook — Python SDK]]></title>
            <link>https://medium.com/linedevth/%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B9%80%E0%B8%9B%E0%B8%A5%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%99-line-bot-%E0%B8%81%E0%B9%87%E0%B8%A3%E0%B8%B9%E0%B9%89-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-message-edit-webhook-python-sdk-e11ad31daa5e?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/e11ad31daa5e</guid>
            <category><![CDATA[jevai]]></category>
            <category><![CDATA[group-lines]]></category>
            <category><![CDATA[line-bot]]></category>
            <category><![CDATA[line-chatbot]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Punsiri Boonyakiat]]></dc:creator>
            <pubDate>Wed, 21 Oct 2026 03:20:56 GMT</pubDate>
            <atom:updated>2026-10-21T03:35:59.506Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BL8O2K3YOlERrXmzPkzqyQ.png" /></figure><blockquote>สวัสดีค่ะ เพื่อนๆ นักพัฒนา LINE Developers ทุกคน! รู้หรือยังคะว่า LINE Bot ของเราที่อยู่ใน Group Chat สามารถตรวจจับได้ด้วยนะว่ามีใครแก้ไขข้อความ! ✏️</blockquote><p>ในช่วงที่ผ่านมาหากใครติดตามข่าวสารจาก LINE Developers​ Thailand หรือเข้าร่วมงาน LINE Thailand Developers Conference 2026 ก็จะเห็นฟีเจอร์ใหม่ล่าสุดของ LINE Messaging API นั่นก็คือ Message Edit Webhook ที่ทำให้ LINE Bot รู้ได้ว่ามีการแก้ไขข้อความที่ส่งไปใน Group Chat!</p><blockquote>บทความนี้เลยอยากชวนเพื่อน ๆ มาทำความรู้จักกับ LINE Group Chat Webhook Events ว่ามีอะไรบ้าง ก่อนจะพาไปลองใช้ Message Edit Webhook ด้วย LINE Bot SDK Python กันค่ะ 💚</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KkxYPaKYxT2wzYUDYPctPQ.png" /><figcaption>ภาพประกอบจากงาน LINE Thailand Developers Conference 2026</figcaption></figure><pre>#### Table of Contents ####<br>1. What Can LINE Bot do in Group Chats?<br>2. Handling Group Chat Events with Python SDK<br>3. Message Edit Webhook<br>      3.1 What Is the Message Edit Webhook?<br>      3.2 How to Enable Message Editing in LINE Labs<br>      3.3 Detecting Message Edit Events with Python SDK<br>4. Example Use Cases<br>      4.1 Party RSVP: Tracking +1 Events<br>      4.2 Coffee Shop: Welcoming New Members<br>      4.3 Meeting Room Booking<br>5. Conclusion</pre><h3>1. What Can LINE Bot do in Group Chats?</h3><blockquote>ก่อนจะไปรู้จัก Message Edit Webhook มาดูภาพรวมกันก่อนค่ะว่า LINE Bot ทำอะไรได้บ้างเมื่ออยู่ใน LINE Group</blockquote><p>เมื่อเราเปิด Allow bot to join group chats แล้ว ผู้ใช้ก็สามารถเชิญ LINE Bot เข้ากลุ่มได้เหมือนเพื่อนอีกคน และเมื่อ Bot อยู่ในกลุ่มแล้ว จะสามารถรับทุกข้อความในกลุ่ม, ตอบกลับและส่งข้อความเข้ากลุ่ม, รู้ว่าใครเข้า ใครออก,ดึงข้อมูลกลุ่ม และ ออกจากกลุ่มเองได้</p><h4>Understanding Group Chat Webhook Events</h4><p>Webhook Events เป็นกลไกที่ LINE Platform ใช้แจ้งให้ Bot ทราบเมื่อมีเหตุการณ์ต่าง ๆ เกิดขึ้นภายใน Group Chat โดย LINE จะส่งข้อมูล Event มายัง Webhook URL ที่เรากำหนดไว้ ทำให้ Bot สามารถรับรู้เหตุการณ์และตอบสนองได้โดยอัตโนมัติ โดยปัจจุบันรองรับ Webhook Events ภายในกลุ่มดังนี้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YPnkOAGBlvnK7KUpGViQVg.png" /><figcaption>LINE Group Chat — Webhook Events</figcaption></figure><pre>### LINE Group Chat - Webhook Events ###<br><br>1.join - Bot ถูกเชิญเข้ากลุ่ม<br>2.leave - Bot ถูกลบออกจากกลุ่ม หรือ Bot ออกจากกลุ่มเอง<br>3.memberJoined - มีสมาชิกใหม่เข้ากลุ่ม<br>4.memberLeft - มีสมาชิกออกจากกลุ่ม<br>5.message - สมาชิกส่งข้อความ เช่น Text, Image, Video, Audio, File, Location, Sticker<br>6.messageEdited - สมาชิกแก้ไขข้อความ Text ที่ส่งไปแล้ว<br>7.unsend - สมาชิกยกเลิกการส่งข้อความ ดูได้จาก <br>8.postback - สมาชิกกดปุ่มที่เป็น Postback Action<br>9.videoPlayComplete - สมาชิกดูวิดีโอที่ Bot ส่งจนจบ ต้องตั้ง trackingId</pre><p>นอกเหนือจากการรับรู้เหตุการณ์ต่าง ๆ ภายใน LINE Group Chat ผ่าน Webhook Events แล้ว เรายังสามารถพัฒนาโปรแกรมด้วย LINE Messaging API ร่วมกับ Python SDK เพื่อให้ LINE Bot ดึงข้อมูลและโต้ตอบกับสมาชิกภายในกลุ่มได้ โดยมีความสามารถดังนี้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cP_oUNJB_1fKIrlr_GF-zg.png" /><figcaption>LINE Bot in Group Chat — API Capability</figcaption></figure><pre>### LINE Bot in Group Chat - API Capability ###<br><br>1. Get group chat summary - ดึงข้อมูลพื้นฐานของกลุ่ม เช่น ชื่อกลุ่มและรูปภาพกลุ่ม<br>2. Get number of users in a group chat - ตรวจสอบจำนวนสมาชิกทั้งหมดภายในกลุ่ม<br>3. Get group chat member user IDs - ดึงรายการ User ID ของสมาชิกภายในกลุ่ม (สำหรับบัญชีที่มีสิทธิ์ใช้งาน API นี้)<br>4. Get group chat member profile - ดึงข้อมูลโปรไฟล์ของสมาชิก เช่น ชื่อที่แสดง รูปโปรไฟล์ และสถานะ<br>5. Leave group chat - สั่งให้ LINE Bot ออกจากกลุ่มผ่าน LINE Messaging API<br>6. Reply / Push Message - ส่งข้อความตอบกลับหรือส่งข้อความใหม่เข้าไปในกลุ่ม เช่น ข้อความแจ้งเตือนหรือ LINE Flex Message</pre><p>ความสามารถเหล่านี้ช่วยให้เราพัฒนา LINE Bot ที่ไม่เพียงรับรู้เหตุการณ์ แต่ยังสามารถนำข้อมูลไปประมวลผลและตอบสนองต่อผู้ใช้งานได้โดยอัตโนมัติ เช่น Bot สรุปการประชุม จัดการสมาชิก หรือแจ้งเตือนกิจกรรมภายในกลุ่ม</p><p>อย่างไรก็ดี ก่อนที่เราจะสามารถนำ LINE Bot เข้าไปทำงานภายใน Group Chat เพื่อรับ Webhook Events และโต้ตอบกับสมาชิกในกลุ่มได้ จำเป็นต้องตั้งค่า LINE Messaging API เพื่ออนุญาตให้​ LINE Bot เข้าร่วมกลุ่มหรือแชทแบบหลายคน</p><pre>### ขั้นตอนการสร้าง LINE Bot ให้ทำงานใน Group Chat ###<br>1. Create LINE Official Account &amp; Messaging API Channel:<br>    - สร้าง LINE Official Account และเปิดใช้งาน Messaging API ผ่าน LINE Developers Console<br>2. Enable LINE Bot to Join Group Chats:<br>    - เข้าไปที่ LINE Official Account Manager → ตั้งค่า → ตั้งค่าบัญชี → การใช้ฟีเจอร์เข้าร่วมในแชท <br>    - จากนั้นเลือก อนุญาตให้เข้าร่วมกลุ่มหรือแชทแบบหลายคน<br>    - เมื่อตั้งค่าเรียบร้อยแล้ว เราจะสามารถเชิญ LINE Bot เข้าร่วม Group Chat เพื่อรับ Webhook Events และโต้ตอบกับสมาชิกผ่าน LINE Messaging API ได้</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*omos19CPw1PjVrP--qGz4g.png" /><figcaption>อนุญาตให้​ LINE Bot เข้าร่วมกลุ่มหรือแชทแบบหลายคน</figcaption></figure><h3>2. Handling Group Chat Events with Python SDK</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OdkATIHjoSX76Gi16nxqIw.png" /><figcaption>LINE Bot SDK for Python</figcaption></figure><p>อย่างที่เกริ่นไว้ข้างต้น ในบทความนี้เราจะใช้ LINE Bot SDK for Python ในการพัฒนา LINE Bot เพื่อรับและจัดการ Webhook Events ที่เกิดขึ้นภายใน Group Chat ดังนั้นจะต้องทำการลง Library line-bot-sdk ให้เรียบร้อย</p><p>หลังจากที่เราสร้าง LINE Official Account (LINE OA) และเปิดใช้งาน Allow bot to join group chats เรียบร้อยแล้ว ขั้นตอนถัดไปคือการเตรียมข้อมูลสำหรับเชื่อมต่อ LINE Bot กับ LINE Messaging API โดยเข้าไปที่ <a href="https://developers.line.biz/console/">LINE Developers Console</a> เพื่อรับ Channel Secret และ Channel Access Token สำหรับใช้เชื่อมต่อ Backend ของเรากับ LINE Platform</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HrkKqEaJW0Yatek4yV-8Cg.png" /><figcaption>LINE Messaging API Keys</figcaption></figure><pre>### LINE Messaging API Keys ###<br>- Channel Access Token - ใช้สำหรับยืนยันสิทธิ์ในการเรียกใช้งาน LINE Messaging API เช่น การส่งข้อความตอบกลับ<br>- Channel Secret - ใช้สำหรับตรวจสอบ Webhook Signature เพื่อยืนยันว่า Request มาจาก LINE Platform จริง</pre><p>โค้ดนี้เป็นตัวอย่างการสร้าง Webhook Endpoint สำหรับ LINE Bot ด้วย Python โดยใช้ LINE Bot SDKและ Functions Framework เพื่อรับ Webhook Events จาก LINE Platform และเตรียมเชื่อมต่อกับ LINE Messaging API</p><pre>import os<br>import functions_framework<br>from linebot.v3 import WebhookHandler<br>from linebot.v3.exceptions import InvalidSignatureError<br>from linebot.v3.messaging import ApiClient, Configuration, MessagingApi<br><br>configuration = Configuration(access_token=os.environ[&quot;LINE_CHANNEL_ACCESS_TOKEN&quot;])<br>handler = WebhookHandler(os.environ[&quot;LINE_CHANNEL_SECRET&quot;])<br>line_bot_api = MessagingApi(ApiClient(configuration))<br><br>@functions_framework.http<br>def callback(request):<br>    signature = request.headers[&quot;X-Line-Signature&quot;]<br>    body = request.get_data(as_text=True)<br>    try:<br>        handler.handle(body, signature)<br>    except InvalidSignatureError:<br>        return (&quot;Invalid signature&quot;, 400)<br>    return &quot;OK&quot;configuration = Configuration(access_token=os.environ[&quot;LINE_CHANNEL_ACCESS_TOKEN&quot;])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ft5osl6v2Vnq4jWe4xhWgA.png" /><figcaption>LINE Bot SDK for Python — Webhook Server</figcaption></figure><p>โค้ดนี้เป็นตัวอย่างการใช้ LINE Bot SDK for Python เพื่อจัดการ Webhook Events ภายใน LINE Group Chat โดยใช้ @handler.add() เพื่อกำหนดว่า เมื่อเกิด Event ประเภทต่าง ๆ จะให้ Bot ทำงานอย่างไร</p><pre>from linebot.v3.webhooks import MessageEvent, MessageEditedEvent, UnsendEvent, JoinEvent, LeaveEvent,MemberJoinedEvent, MemberLeftEvent, PostbackEvent, TextMessageContent<br><br># 1. Message Event - เมื่อสมาชิกส่งข้อความ<br>@handler.add(MessageEvent, message=TextMessageContent)<br>def handle_message(event):<br>    if event.source.type == &quot;group&quot;:<br>        print(f&quot;Text: {event.message.text}&quot;)<br><br># 2. Message Edit Event - เมื่อสมาชิกแก้ไขข้อความ<br>@handler.add(MessageEditedEvent, message=TextMessageContent)<br>def handle_message_edited(event):<br>    print(f&quot;Edited message ID: {event.message.id}&quot;)<br>    print(f&quot;New text: {event.message.text}&quot;)<br><br># 3. Unsend Event - เมื่อสมาชิกยกเลิกการส่งข้อความ<br>@handler.add(UnsendEvent)<br>def handle_unsend(event):<br>    print(f&quot;Unsent message ID: {event.unsend.message_id}&quot;)<br><br># 4. Join Event - เมื่อ Bot เข้าร่วม Group Chat<br>@handler.add(JoinEvent)<br>def handle_join(event):<br>    reply_text(event.reply_token, &quot;สวัสดีค่ะ ขอบคุณที่ให้น้อง Bot เข้าร่วม Group Chat💚&quot;)<br><br># 5. Leave Event - เมื่อ Bot ออกจาก Group Chat<br>@handler.add(LeaveEvent)<br>def handle_leave(event):<br>    print(f&quot;Bot left group: {event.source.group_id}&quot;)<br><br># 6. Member Joined Event - เมื่อสมาชิกใหม่เข้าร่วมกลุ่ม<br>@handler.add(MemberJoinedEvent)<br>def handle_member_joined(event):<br>    reply_text(event.reply_token, &quot;ยินดีต้อนรับสมาชิกใหม่ค่ะ 🎉&quot;)<br><br># 7. Member Left Event - เมื่อสมาชิกออกจากกลุ่ม<br>@handler.add(MemberLeftEvent)<br>def handle_member_left(event):<br>    for member in event.left.members:<br>        print(f&quot;Member left: {member.user_id}&quot;)<br><br># 8. Postback Event - เมื่อสมาชิกกดปุ่ม Postback<br>@handler.add(PostbackEvent)<br>def handle_postback(event):<br>    data = event.postback.data<br>    print(f&quot;Postback data: {data}&quot;)</pre><p>จะเห็นได้ว่าจากตัวอย่างด้านบนจะเป็นโค้ดที่รวมวิธีการรับ Webhook Events ประเภทที่รองรับใน LINE Group Chat สำหรับตัวอย่าง Code ในการทำโต้ตอบหรือดึงข้อมูลของ LINE กลุ่มจะเป็นดังนี้</p><pre># 1. Get group chat summary<br>group = line_bot_api.get_group_summary(group_id)<br>print(group.group_name)<br>print(group.picture_url)<br><br># 2. Get number of users in a group chat<br>members_count = line_bot_api.get_group_member_count(group_id)<br>print(members_count.count)<br><br># 3. Get group chat member user IDs<br>members = line_bot_api.get_group_members_ids(group_id)<br>print(members.member_ids)<br><br># 4. Get group chat member profile<br>profile = line_bot_api.get_group_member_profile(group_id, user_id)<br><br># 5. Leave group chat<br>line_bot_api.leave_group(group_id)<br><br># 6.1 Reply Message<br>line_bot_api.reply_message(<br>    ReplyMessageRequest(<br>        reply_token=reply_token,<br>        messages=[TextMessage(text=&quot;Hello Group!&quot;)]<br>    )<br>)<br><br># 6.2 Push Message<br>line_bot_api.push_message(<br>    PushMessageRequest(<br>        to=group_id,<br>        messages=[TextMessage(text=&quot;Hello everyone!&quot;)]<br>    )<br>)</pre><h3>2. Message Edit Webhook</h3><blockquote>แต่ตั้งแต่ LINE ประกาศเมื่อวันที่ 12 สิงหาคม 2026 ว่าผู้ใช้สามารถแก้ไขข้อความใน Group Chat ที่มี LINE Official Account ได้แล้ว โดยแก้ไขข้อความ Text ที่ส่งไปแล้วได้ภายใน 15 นาที และเมื่อมีการแก้ไขข้อความ LINE จะส่ง Webhook Event ที่มีชื่อว่า messageEdited มาให้เรา</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ktl0nOdL_vAfGVKN3Rs1Gg.png" /><figcaption>ตัวอย่าง messageEdited Event</figcaption></figure><p>ความน่าสนใจของ Event นี้มีอยู่ 3 เรื่องหลัก ๆ ได้แก่</p><ol><li><strong>ตรวจจับข้อความที่ถูกแก้ไข:</strong> Event Type จะเป็น messageEdited และมีข้อความเวอร์ชันใหม่อยู่ใน message.text</li><li><strong>เชื่อมโยงข้อความเดิมได้:</strong> message.id ยังคงเป็น ID เดียวกับข้อความต้นฉบับ ทำให้นำไปค้นหาและอัปเดตข้อมูลใน Database ได้</li><li><strong>ตอบกลับได้ทันที:</strong> Event มี replyToken ของตัวเอง ทำให้ Bot ส่งข้อความตอบกลับเมื่อมีการแก้ไขได้</li></ol><blockquote>อย่างไรก็ตาม ฟีเจอร์นี้รองรับเฉพาะข้อความ Text ใน LINE Group Chat และคนที่จะแก้ไขข้อความได้จะต้องเป็นผู้ใช้ LINE Premium นะคะ</blockquote><h4>Detecting Message Edit Events with Python SDK</h4><p>สำหรับคนที่เคยสร้าง LINE Bot ด้วย Python SDK มาก่อน น่าจะคุ้นเคยกับการรับข้อความใหม่ผ่าน MessageEvent อยู่แล้ว สำหรับการแก้ไขข้อความ เราแค่เพิ่ม MessageEditedEvent เข้าไปได้เลย</p><pre>@handler.add(MessageEditedEvent, message=TextMessageContent)<br>def handle_message_edited(event):<br>    print(f&quot;Edited message ID: {event.message.id}&quot;)<br>    print(f&quot;New text: {event.message.text}&quot;)</pre><p>จากตัวอย่างโค้ดจะเห็นว่า MessageEditedEvent ถูกรับเข้ามาผ่าน handler เมื่อแก้ไขข้อความประเภท Text จากนั้น เราสามารถรับค่า event.message.id เพื่อดู Message ID และ event.message.text เพื่ออ่านข้อความใหม่หลังจากที่สมาชิกแก้ไขได้ทันที !!</p><h3>4. Example Use Cases</h3><blockquote>หลังจากที่เราได้เรียนรู้วิธีรับและจัดการ Webhook Events ด้วย LINE Bot SDK for Python กันไปแล้ว ลองมาดูตัวอย่าง Use Cases ที่สามารถนำไปประยุกต์ใช้กับ LINE Group Chat ในสถานการณ์จริงกันบ้าง โดยเฉพาะการใช้ <strong>Message Edit Webhook</strong> เพื่อให้ LINE Bot สามารถตรวจจับการแก้ไขข้อความและอัปเดตข้อมูลในระบบได้โดยอัตโนมัติ</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jcOADTrMWuovhMkvkCBPhw.png" /></figure><p>ซึ่งตอนแรกบีทก็คิด Use Case ไม่ออกว่าจะเอาไปใช้งานอย่างไร แต่พอได้เข้าฟังในงาน LINE DEV CONF ก็ได้ ไอเดียมาเยอะเลยค่ะ ในบทความนี้จะหยิบมา 2 Use Case เอามาใช้งานผ่าน LINE Bot SDK Python ให้เพื่อนๆได้ดูกัน</p><pre>### ตัวอย่าง​ Use Case ###<br><br>- ชวนไปเที่ยว / Party RSVP: สมาชิกพิมพ์ +1 เพื่อยืนยันเข้าร่วม หรือ -1 เพื่อยกเลิก และสามารถแก้ไขข้อความเดิมได้ เช่น เปลี่ยนจาก +1 เป็น -1 โดย Bot รับ messageEdited Event แล้วอัปเดตสถานะผู้เข้าร่วมอัตโนมัติ<br>- สั่งกาแฟ / Coffee Order: สมาชิกพิมพ์เมนูเครื่องดื่ม เช่น อเมริกาโน่ หวานน้อย และสามารถแก้ไขข้อความเดิมเป็น อเมริกาโน่ หวานปานกลาง ได้ โดย Bot รับ messageEdited Event แล้วอัปเดตออเดอร์ล่าสุดให้ตรงกับข้อความที่แก้ไข<br>- Meeting Room Booking: สมาชิกจองห้องประชุมผ่าน LINE Group Chat และสามารถแก้ไขข้อความเดิมเพื่อเปลี่ยนวันหรือเวลาจอง โดย Bot รับ messageEdited Event และอัปเดตข้อมูลการจองอัตโนมัติ<br>- Group Shopping List: สมาชิกเพิ่มรายการซื้อของ เช่น น้ำดื่ม 2 แพ็ก และแก้ไขเป็น น้ำดื่ม 4 แพ็ก โดย Bot อัปเดตจำนวนสินค้าใน Shopping List โดยไม่สร้างรายการซ้ำ<br>- Group Expense Tracker: สมาชิกบันทึกค่าใช้จ่าย เช่น ค่าอาหาร 800 บาท และแก้ไขเป็น ค่าอาหาร 850 บาท โดย Bot อัปเดตยอดค่าใช้จ่ายและคำนวณยอดหารเงินของสมาชิกใหม่อัตโนมัติ</pre><blockquote>ถ้าพร้อมแล้วมาเริ่ม Coding Use Case กันค่ะ</blockquote><p><strong>** </strong><a href="https://github.com/punsiriboo/line-group-chatbot-python"><strong>ตัวอย่างโค้ดทั้งหมดของบทความนี้ อยู่ใน GitHub Repo นี้นะคะ ถ้าสนใจ​ Clone มาเล่นได้ค่ะ :) </strong></a><strong>**</strong></p><h3>4.1 Party RSVP: Tracking +1 Events</h3><blockquote>Use Case แรกเป็นตัวอย่างที่ได้ไอเดียมาจากงาน LINE Thailand Developers Conference 2026 ค่ะ</blockquote><p>Use case นี้เป็นการนำ Message Edit Webhook มาประยุกต์ใช้กับการจัดกิจกรรมหรือการนัดหมายภายใน LINE Group Chat ลองนึกภาพว่าเรากำลังชวนเพื่อน ๆ ไปเที่ยว หรือจัด Party และต้องการเช็กว่าใครจะเข้าร่วมบ้าง ปกติแล้วสมาชิกในกลุ่มอาจพิมพ์ +1 เพื่อยืนยันว่าไปด้วย หรือ -1 เพื่อบอกว่าไม่สามารถไปได้</p><p>แต่ถ้ามีเพื่อนคนหนึ่งตอบ +1 ไปแล้ว และภายหลังเปลี่ยนใจไม่ไป แทนที่จะต้องส่งข้อความใหม่ ก็สามารถ แก้ไขข้อความเดิมจาก +1 เป็น -1 ได้เลย โดย LINE Bot จะได้รับ messageEdited Event และนำข้อมูลที่เปลี่ยนแปลงไปอัปเดตสถานะการเข้าร่วมกิจกรรม</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vExTnEs44RBFs3Za6ErKHw.png" /><figcaption>Party RSVP — ตัวอย่างหน้าจอจาก Live Demo</figcaption></figure><p>อยากบอกว่าในตอน Live Demo บีทได้ส่ง +1 เข้าไปด้วย อิอิ อย่างไรก็ดีในบทความนี้ขอมาแกะตัวอย่างเป็นโค้ด Python ให้ทุกคนดูกันค่ะ</p><pre>#### ตัวอย่างการทำงาน ####<br>- สมาชิกพิมพ์ +1 → Bot รับ MessageEvent และบันทึกว่าเข้าร่วมกิจกรรม<br>- สมาชิกอีกคนพิมพ์ +1 → Bot เพิ่มรายชื่อผู้เข้าร่วม<br>- สมาชิกเปลี่ยนใจและแก้ไขข้อความเดิมจาก +1 เป็น -1 → Bot รับ messageEdited Event และอัปเดตสถานะเป็นไม่เข้าร่วม<br>- สมาชิกพิมพ์ สรุปผู้เข้าร่วม → Bot แสดงจำนวนและรายชื่อผู้เข้าร่วมล่าสุด</pre><p>ในฝั่ง Backend เราสามารถใช้ groupId และ userId ในการจัดเก็บข้อมูลผู้เข้าร่วม และใช้ message.id เพื่อเชื่อมโยงข้อความที่ถูกแก้ไขกับข้อมูลเดิม ทำให้ Bot สามารถอัปเดตสถานะได้โดยไม่ต้องสร้างรายการซ้ำ</p><p>โค้ดนี้เป็นส่วนของ LINE Bot สำหรับจัดการ RSVP ใน Group Chat โดยให้สมาชิกพิมพ์ +1 เพื่อยืนยันเข้าร่วมงาน หรือ -1 เพื่อไม่เข้าร่วม โดยรองรับทั้ง MessageEvent สำหรับข้อความใหม่ และ MessageEditedEvent</p><pre>@handler.add(MessageEvent, message=TextMessageContent)<br>@handler.add(MessageEditedEvent, message=TextMessageContent) <br>def handle_message(event):<br>    &quot;&quot;&quot;Runs every time someone sends or edits a message in the group.&quot;&quot;&quot;<br>    if not isinstance(event.source, GroupSource) or not event.reply_token:<br>        return<br><br>    group_id = event.source.group_id<br>    user_id = event.source.user_id<br>    text = event.message.text.strip()<br><br>    if text == &quot;.&quot;:<br>        reset()<br>        return<br><br>    if text in (&quot;+1&quot;, &quot;-1&quot;) and user_id:<br>        # Get the sender&#39;s name and picture; use defaults if that fails<br>        try:<br>            profile = line_bot_api.get_group_member_profile(group_id, user_id)<br>            name = profile.display_name<br>            picture = profile.picture_url or &quot;&quot;<br>        except Exception:<br>            name, picture = &quot;สมาชิก&quot;, &quot;&quot;<br><br>        result = apply_rsvp(<br>            chat_id=group_id,<br>            user_id=user_id,<br>            user_name=name,<br>            status=&quot;in&quot; if text == &quot;+1&quot; else &quot;out&quot;,<br>            message_id=event.message.id,<br>            timestamp=event.timestamp,<br>            picture_url=picture,<br>        )<br>        if result[&quot;status&quot;] != &quot;success&quot;:<br>            return<br>        card = party_card(result[&quot;people&quot;], result[&quot;change&quot;])<br><br>    else:<br>        return<br><br>    line_bot_api.reply_message(<br>        ReplyMessageRequest(reply_token=event.reply_token, messages=[card])<br>    )</pre><h3>4.2 Coffee Shop: Updating Orders with Message Edit Webhook</h3><blockquote>อีกหนึ่ง Use Case ที่น่าสนใจคือการนำ Message Edit Webhook มาประยุกต์ใช้กับ LINE Bot สำหรับร้านกาแฟ เพื่อให้สมาชิกใน Group Chat สามารถสั่งเครื่องดื่มและแก้ไขออเดอร์ของตัวเองได้ง่ายขึ้น</blockquote><blockquote>ลองนึกภาพว่าเราสั่งกาแฟพร้อมเพื่อน ๆ ใน LINE Group Chat โดยมี LINE Bot คอยรับและสรุปออเดอร์ สมาชิกแต่ละคนสามารถพิมพ์เมนูที่ต้องการ เช่น อเมริกาโน่ หวานน้อย 1 แก้ว หรือ ชาเขียว หวานมาก 2 แก้ว ซึ่ง Bot จะรับข้อความผ่าน MessageEvent และบันทึกออเดอร์ หากต้องการเปลี่ยนเมนู ระดับความหวาน หรือจำนวนแก้ว ก็สามารถแก้ไขข้อความเดิมได้ โดย Bot จะรับ messageEdited Event และอัปเดตออเดอร์ให้อัตโนมัติ</blockquote><p>โดยเราจะใช้ Jev เข้ามาช่วยทำ Intent Classification เพื่อวิเคราะห์เจตนาของข้อความและตรวจจับเมนูที่ต้องการสั่ง สำหรับใครที่ยังไม่เคยลองใช้ Jev สามารถไปทำความรู้จักและทดลองใช้งานได้จากบทความนี้เลยค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6btf19u0fNnSkk1hNHJsVA.png" /></figure><p>จากโค้ดตัวอย่าง เราใช้ @handler.add() เพื่อรองรับ Webhook Events</p><ul><li>MessageEvent — เมื่อผู้ใช้ส่งข้อความใหม่ เช่น &quot;ลาเต้เย็น 1 แก้ว&quot;</li><li>MessageEditedEvent — เมื่อผู้ใช้แก้ไขข้อความเดิม เช่น เปลี่ยนจาก &quot;ลาเต้เย็น&quot; เป็น &quot;อเมริกาโน่เย็น&quot;</li></ul><p>โค้ดนี้จะแบ่งการทำงานออกเป็น 2 ส่วนหลัก ๆ ค่ะ</p><p>ส่วนแรกคือ handle_message() จะทำงานเมื่อมีสมาชิกส่งข้อความใหม่เข้ามาใน LINE Group Chat โดย Bot จะดึงข้อมูลของผู้ส่งและนำข้อความไปให้ Jev ช่วยวิเคราะห์ว่าต้องการทำอะไร เช่น ถ้าขอดูเมนู Bot ก็จะแสดงเมนูกาแฟ ถ้าขอสรุปออเดอร์ Bot ก็จะแสดงรายการที่สั่งไว้ แต่ถ้าเป็นการสั่งกาแฟ Bot ก็จะใช้ Jev ช่วยอ่านรายละเอียดออเดอร์ แล้วบันทึกข้อมูลเอาไว้ค่ะ</p><pre>@handler.add(MessageEvent, message=TextMessageContent)<br>def handle_message(event):<br>    &quot;&quot;&quot;Runs every time someone sends a message.&quot;&quot;&quot;<br>    text = (event.message.text or &quot;&quot;).strip()<br>    cid = chat_id(event.source)<br>    name, picture = get_user_profile(event.source)<br>    user_id = event.source.user_id<br><br>    intent = jev_classify_intent(text)<br>    if intent == &quot;summary&quot;:<br>        reply_with_flex_msg(event, [order_card(shop.open_order(cid))])<br>        return<br>    if intent == &quot;view_menu&quot;:<br>        quick_reply = confirm_reply() if shop.open_order(cid)[&quot;items&quot;] else None<br>        reply_with_flex_msg(event, [menu_flex(quick_reply)])<br>        return<br>    if intent == &quot;order&quot;:<br>        if not shop.round_is_open(cid):<br>            shop.open_round(cid)<br>        _save_order(event, cid, user_id, name, picture, jev_read_order(text))<br>        return</pre><p>ส่วนที่สองคือ handle_edited_message() จะทำงานเมื่อสมาชิกกลับไปแก้ไขข้อความเดิม เช่น ตอนแรกสั่งอเมริกาโน่หวานน้อย 1 แก้ว แต่เปลี่ยนใจมาแก้เป็นอเมริกาโน่ไม่หวาน 2 แก้ว Bot ก็จะรับข้อความที่แก้ไขใหม่ ส่งให้ Jev วิเคราะห์อีกครั้ง แล้วอัปเดตออเดอร์เดิมให้ตรงกับข้อความล่าสุด โดยไม่ต้องสั่งใหม่ค่ะ</p><pre>@handler.add(MessageEditedEvent, message=TextMessageContent)<br>def handle_edited_message(event):<br>    &quot;&quot;&quot;Runs every time someone edits a message.&quot;&quot;&quot;<br>    text = (event.message.text or &quot;&quot;).strip()<br>    cid = chat_id(event.source)<br>    name, picture = get_user_profile(event.source)<br>    user_id = event.source.user_id<br><br>    if jev_classify_intent(text) == &quot;order&quot;:<br>        _edit_order(event, cid, user_id, name, picture, jev_read_order(text))</pre><p>หลังจากลอง deploy เราก็จะได้ LINE Bot ที่สั่งกาแฟ แก้ไข order ในกลุ่มได้แบบนี้ค่ะ ซึ่งสำหรับใครที่อยากเห็นโค้ดแบบเต็มๆ <a href="https://github.com/punsiriboo/line-group-chatbot-python">เข้าไปดูได้ที่ GitHub นะคะ</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*94bQ2uYshAXLSuIe1gDZ6w.png" /></figure><h3>5. Conclusion</h3><p>ในบทความนี้บีทชวนเพื่อนๆ มาทำ LINE Bot ที่อยู่ในกลุ่ม ด้วย Python​ SDK และที่สำคัญเราได้ลองเล่น Message Edit Webhook ซึ่งเป็นอีกหนึ่งฟีเจอร์ที่น่าสนใจของ LINE Messaging API เพราะช่วยให้ LINE Bot ไม่ได้แค่รับข้อความใหม่ แต่ยังรับรู้และตอบสนองต่อการแก้ไขข้อความใน Group Chat ได้ด้วย เมื่อใช้ร่วมกับ Group Events อื่น ๆ อย่าง join, memberJoined และ unsend เราก็สร้าง Bot ที่เข้าใจบริบทของกลุ่มได้ดีขึ้นมาก</p><blockquote>หวังว่าบทความนี้จะช่วยให้เพื่อน ๆ LINE Developers เห็นไอเดียใหม่ ๆ ในการนำ Message Edit Webhook ไปใช้งานกันนะคะ 💚</blockquote><p><strong>References</strong></p><ul><li>GitHub: <a href="https://github.com/punsiriboo/line-group-chatbot-python">https://github.com/punsiriboo/line-group-chatbot-python</a></li><li>Message Edit Event: <a href="https://linedevth.line.me/th/knowledge-api/message-edit-event">https://linedevth.line.me/th/knowledge-api/message-edit-event</a></li><li>Messaging API Reference: <a href="https://developers.line.biz/en/reference/messaging-api/#edit-event">https://developers.line.biz/en/reference/messaging-api/#edit-event</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e11ad31daa5e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B9%80%E0%B8%9B%E0%B8%A5%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%99-line-bot-%E0%B8%81%E0%B9%87%E0%B8%A3%E0%B8%B9%E0%B9%89-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-message-edit-webhook-python-sdk-e11ad31daa5e">ข้อความเปลี่ยน LINE Bot ก็รู้! ด้วย Message Edit Webhook — Python SDK</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[สร้าง LINE AI Chatbot แบบ Hybrid ด้วย Jev และ Google ADK]]></title>
            <link>https://medium.com/linedevth/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-line-ai-chatbot-%E0%B9%81%E0%B8%9A%E0%B8%9A-hybrid-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-jev-%E0%B9%81%E0%B8%A5%E0%B8%B0-google-adk-b37d08255990?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/b37d08255990</guid>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[line-bot]]></category>
            <category><![CDATA[jevs]]></category>
            <category><![CDATA[line-chatbot]]></category>
            <category><![CDATA[line-messging-api]]></category>
            <dc:creator><![CDATA[Punsiri Boonyakiat]]></dc:creator>
            <pubDate>Wed, 14 Oct 2026 04:03:23 GMT</pubDate>
            <atom:updated>2026-10-14T04:21:44.788Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5Qik2hYBEfDb0tERzyTf3A.png" /></figure><p>สวัสดีค่ะ เพื่อน ๆ LINE Developers ทุกคน !😘 ช่วงที่ผ่านมา ถ้าใครติดตามข่าวสารในวงการ AI น่าจะเริ่มเห็นการพูดถึง Jev, System One และ Discriminative Models ซึ่งเป็นแนวทางของ AI ที่เน้นการวิเคราะห์และตัดสินใจได้อย่างรวดเร็ว จนมีหลาย Use Case ที่นักพัฒนาเริ่มหยิบมาทดลองใช้งานกัน และบีทเองก็คิดว่าน่าสนใจมาก ๆ ถ้าเราลองนำมาประยุกต์ใช้กับ LINE Chatbot กันค่ะ</p><blockquote><em>ในบทความนี้ บีทเลยอยากชวนทุกคนมาลองสร้าง </em><strong><em>LINE AI Chatbot แบบ </em></strong>Hybrid <strong><em>ด้วย Jev และ Google ADK</em></strong><em> กันค่ะ!</em></blockquote><p>โดยเราจะใช้ Jev ช่วยในการทำ Intent​ Detection จากข้อความของผู้ใช้ แล้วตอบกลับด้วย Flex Message ที่เตรียมไว้ล่วงหน้า หรือส่งต่อให้ AI Agent ที่สร้างด้วย Google ADK จัดการคำถามที่ซับซ้อนขึ้น หวังว่าบทความนี้จะเป็นอีกหนึ่งไอเดียให้ทุกคนได้ลองนำไปต่อยอดสร้าง LINE Chatbot ที่ทั้งตอบไว ประหยัด Token และยืดหยุ่นมากขึ้นกันนะคะ!</p><pre>###### Table of Contents ######<br><br>1. What is Jev?<br>    1.1 How does Jev work? <br>    1.2 System One vs. System Two  <br>    1.3 Jev Use Cases<br>2. Hands-on with Jev<br>3. Intro to Agent Development Kit (ADK) <br>4. Building a Hybrid LINE Chatbot with Jev and ADK<br>    4.1 Hybrid Chatbot Architecture<br>    4.2 Intent Detection and Routing with Jev<br>    4.3 Handling Static Responses with Flex Messages<br>    4.4 Handling Dynamic Conversations with ADK<br>5. Conclusion</pre><h3>1. What is Jev?</h3><blockquote>ก่อนจะไปลงมือสร้าง LINE Chatbot บีทขอชวนมาทำความรู้จักกับ Jev กันก่อนค่ะ :) แต่ขอบอกไว้ก่อนว่าบทความนี้บีทอาจจะไม่ได้ลงลึกถึงความเป็นมาของ TypeSafe AI หรือรายละเอียดทางเทคนิคของ Jev มากนักนะคะ เพราะอยากเน้นไปที่การประยุกต์ใช้งานกับ LINE Chatbot มากกว่า ใครอยากทราบความเป็นมาบีทขอแนะนำ<a href="https://mikelopster.dev/posts/jev">บทความนี้ของคุณไมค์ค่ะ</a> ที่อธิบายไว้อย่างละเอียดเลย!!</blockquote><blockquote>แล้ว Jev คืออะไรกันแน่ ?</blockquote><p><strong>JEV</strong> เป็น AI Model จาก <strong>TypeSafe AI</strong> ที่ออกแบบมาเพื่อช่วยในการตัดสินใจ หรือที่เรียกว่า Decision/Discriminative Models ซึ่งมีแนวคิดการทำงานแตกต่างจาก Large Language Models (LLMs) ที่เราคุ้นเคยกันอย่าง Gemini หรือ ChatGPT</p><p>ปกติเวลาเราใช้งาน LLM เรามักจะส่ง Prompt เข้าไปเพื่อให้โมเดลสร้างคำตอบกลับมาในรูปแบบข้อความ แต่สำหรับ Jev แทนที่จะให้โมเดลสร้างคำตอบใหม่ โมเดลจะทำหน้าที่วิเคราะห์ข้อมูลและประเมินความน่าจะเป็นของผลลัพธ์ตามตัวเลือกหรือเงื่อนไขที่เรากำหนดไว้ แล้ว Jev จะส่งผลลัพธ์กลับมาในรูปแบบตัวเลือก คะแนน หรือความน่าจะเป็น ทำให้ software ของเราสามารถนำผลนั้นไปใช้ได้เลยทันที</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T98bZGfX6ClWHekNIHN7mg.png" /><figcaption>LLMs vs Jev — “ Jev does not generate text at all. It cannot, Jev is a decision model“</figcaption></figure><h4>1.1 How does Jev work?</h4><p>ในการใช้งาน Jev เราสามารถส่งข้อมูลบริบท (State) ที่ให้โมเดลพิจารณา พร้อมกับคำถาม (Question) ที่เราอยากให้ช่วยโมเดลตัดสินใจ โดยที่เราสามารถเลือกรูปแบบที่จะให้โมเดลให้คำตอบคืนมาได้ 3 รูปแบบ คือ Choice, Score และ Noul</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iqF2ZxrmmjrhXxDQTEiW_A.png" /><figcaption>Jev workflow from TypeSafe AI</figcaption></figure><ol><li><strong>Choice</strong> — เลือกคำตอบจากตัวเลือกที่กำหนดไว้ได้ตั้งแต่ 2 จนถึงสูงสุด 255 ตัวเลือก พร้อมค่าความน่าจะเป็นของแต่ละตัวเลือกและค่า Confidence</li><li><strong>Score</strong> — ประเมินคะแนนของคำถามตามเกณฑ์ที่เรากำหนดสูงสุด 10 ระดับ</li><li><strong>Noul</strong> — ประเมินคำถาม หรือเงื่อนไขแบบ Yes/No โดยส่งผลลัพธ์เป็นค่าความน่าจะเป็นระหว่าง 0 ถึง 1</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YfqIs01v_W8jnDhnmpH0EA.png" /><figcaption>Jev Results — ตัวเลือก (Choice), คะแนน (Score) และการประเมินผลแบบ True/False (Noul)</figcaption></figure><p>ฟังดูแล้ว Jev อาจดูคล้ายกับการเขียนเงื่อนไข If/Else หรือ Case/When ที่เราคุ้นเคยกันในการเขียนโปรแกรม แต่ Jev ใช้ความสามารถของ AI Model ที่ผ่านการเรียนรู้จากข้อมูลจำนวนมาก มาช่วยวิเคราะห์บริบทและประเมินความเป็นไปได้ของคำตอบ ซึ่งจะทำให้เราได้ใช้ความสามารถในการตัดสินใจของ AI มาร่วมกับ Logic ของโปรแกรมแบบเดิม ได้โดยไม่จำเป็นต้องเขียนเงื่อนไขใดๆด้วยตัวเองเลย</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IOHEX2zSPCw357HqWGWb8Q.png" /><figcaption>How does Jev work? — Input &amp; Output</figcaption></figure><p>จากภาพด้านบนเป็นตัวอย่างการใช้งาน Jev ในรูปแบบ Choice สำหรับทำ Intent Classification หรือ Request Routing โดยให้โมเดลวิเคราะห์ข้อความของลูกค้าและเลือก Intent ที่ตรงกับความต้องการมากที่สุด ซึ่งหากสังเกตจะเห็นว่ามีองค์ประกอบหลัก 4 ส่วน ได้แก่</p><ol><li><strong>State</strong> — บริบท หรือ ข้อความของลูกค้าที่ต้องการให้วิเคราะห์</li><li><strong>Question</strong> — คำถามที่ต้องการให้โมเดลช่วยตัดสินใจ</li><li><strong>Options</strong> — ตัวเลือกที่กำหนดไว้ เช่น Refunds, Delivery หรือ Restaurant</li><li><strong>Answer</strong> — ผลลัพธ์ที่ Jev ประเมินออกมาเป็นคะแนนของแต่ละตัวเลือก</li></ol><p>ในรูปด้านบนเราจะเห็นว่าคำตอบที่ Jev ให้มาเป็นรูปแบบของคะแนน ซึ่งคะแนนสูงสุดอยู่ที่ 0.55 ทำให้รู้ว่าลูกค้าต้องการสอบถามเรื่อง Refunds</p><h4><strong>1.2 System One vs. System Two</strong></h4><p>แนวคิดที่น่าสนใจของ Jev คือ “System One Model” ซึ่ง TypeSafe AI ได้รับแรงบันดาลใจจากหนังสือ <em>Thinking, Fast and Slow</em> ของ Daniel Kahneman ที่อธิบายการคิดสองรูปแบบ ได้แก่</p><ul><li><strong>System One (Fast Thinking)</strong>: การคิดเร็วและตัดสินใจโดยอาศัยสัญชาตญาณ เหมาะกับงานที่ต้องการความรวดเร็ว เช่น การจำแนกประเภท (Classification) หรือการเลือกจากตัวเลือกที่กำหนดไว้</li><li><strong>System Two (Slow Thinking): </strong>การคิดวิเคราะห์อย่างเป็นลำดับขั้น ใช้เหตุผลและพิจารณาข้อมูลอย่างละเอียด เหมาะกับงานที่ซับซ้อน เช่น การแก้ปัญหาที่ต้องใช้เหตุผลหลายขั้นตอน (Multi-Step Reasoning)</li></ul><p>Jev ถูกออกแบบตามแนวคิด System One โดยเน้นการประเมินและตัดสินใจอย่างรวดเร็ว แตกต่างจาก Generative LLMs ที่สร้างข้อความคำตอบทีละ Token (Sequential Generation) และ Reasoning Models ที่อาจต้องใช้ขั้นตอนการวิเคราะห์เพิ่มเติมในลักษณะคล้าย System Two</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BKS7fNvd6Mrd4yzBdJagqg.png" /><figcaption>System One vs. System Two</figcaption></figure><blockquote>มาถึงตรงนี้ทุกคนน่าจะพอเห็นภาพกันแล้วว่าการสร้าง LINE AI Chatbot ที่สามารถตอบสนองความต้องการของผู้ใช้ได้อย่างมีประสิทธิภาพนั้น จำเป็นต้องอาศัยการทำงานร่วมกันของทั้ง System One และ System Two</blockquote><h4>1.3 Jev Use Cases</h4><p>Jev สามารถนำมาประยุกต์ใช้กับงานที่เน้น การจำแนกข้อมูล (Classification) การประเมินผล (Evaluation) และการตัดสินใจ (Decision-Making) เช่น Intent Classification, AI Tool Selection และ Request Routing โดยมีตัวอย่างการใช้งานดังต่อไปนี้</p><pre>### Example Jev Use Cases ##<br><br>1. Intent Classification - จำแนกความต้องการของผู้ใช้ เช่น สั่งสินค้า ติดตามคำสั่งซื้อ หรือสอบถามข้อมูล<br>2. Tool Selection - วิเคราะห์คำขอเพื่อเลือก Tool หรือ Function ที่เหมาะสมให้ AI Agent เรียกใช้งาน<br>3. Model / Agent Routing - เลือก AI Model หรือ Agent ที่เหมาะสมกับประเภทและความซับซ้อนของงาน<br>4. AI Guardrails - ตรวจสอบ Prompt หรือประเมินความเสี่ยงก่อนที่ AI Agent จะดำเนินการ เช่น อนุญาต ปฏิเสธ หรือส่งให้ผู้ใช้ยืนยัน<br>5. Content Moderation - จำแนกเนื้อหาที่ไม่เหมาะสมหรืออาจละเมิดนโยบาย<br>6. Scoring &amp; Prioritization - ประเมินคะแนนความเร่งด่วน ความสำคัญ หรือความเกี่ยวข้องของข้อมูล</pre><blockquote>“สำหรับบทความนี้ บีทจะเลือกนำ <strong>Jev มาทำ Intent Classification บน LINE Chatbot</strong> ค่ะ“</blockquote><blockquote>บีทมองว่าถ้านำ Jev มาใช้กับ LINE Chatbot รูปแบบการทำงานจะคล้ายๆ กับ Intent Classification อย่างเช่น Dialogflow ที่เราเคยใช้กันในสมัยก่อน ซึ่งเป็น Model แบบ Discriminative เช่นกัน เพียงแต่เราไม่ต้องมาเตรียม Training Data เหมือนสมัยก่อนแล้ว เพียงแต่เราไม่ต้องมาเตรียม Training Data เหมือนสมัยก่อนแล้ว :) เพราะ Jev ถูกเทรนมาจากข้อมูลจำนวนมหาศาล แค่กำหนด Intent พร้อมคำอธิบายก็ใช้งานได้ทันทีค่ะ 🎉🎉🎉</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R2pArKahFjp1n2lgYE_AsA.png" /><figcaption>ตัวอย่าง Dialogflow ที่เป็นการทำงานแบบ Discriminative Chatbot เช่นกัน</figcaption></figure><h3>2. Hands-on with Jev</h3><p>สำหรับใครที่ยังไม่เคยลองใช้งาน Jev สามารถเข้าไปทดลองได้ที่ <a href="https://console.typesafe.ai/playground">TypeSafe AI Playground</a> โดยไม่จำเป็นต้องเขียนโค้ด เพียงกำหนดข้อมูลหรือบริบท (State) พร้อมคำถามและรูปแบบผลลัพธ์ที่ต้องการ ก็สามารถทดลองให้ Jev วิเคราะห์และตัดสินใจได้ทันที</p><p>ถ้ายังไม่รู้จะเริ่มยังไง ในหน้า Playground มี Example Requests และ Walkthrough Lessons ให้ลองกดเล่นได้เลยค่ะ :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f9MW2O7UjyZKg1ns8GepMg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yvjFOJV95lpUCFun8ZiRLw.png" /><figcaption><a href="https://console.typesafe.ai/playground">TypeSafe AI Playground</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T1Bhl_QamCNGlFnOD3butA.png" /></figure><p>หน้าจอ Playground จะแบ่งออกเป็น 3 ส่วนหลัก ตามหมายเลขในภาพด้านบนค่ะ</p><ol><li>State (Context) — ข้อมูลหรือบริบทที่ต้องการให้ Jev วิเคราะห์ ใส่ในรูปแบบ JSON เช่น ข้อความของลูกค้า หรือประวัติการสนทนาทั้ง Session ตามตัวอย่างในภาพ ยิ่งใส่ครอบคลุม Jev ก็จะประเมินได้แม่นยำมากขึ้น</li><li>Questions (Tasks) — คำถามที่ต้องการให้ Jev ตัดสินใจ แต่ละคำถามต้องกำหนดประเภท (noul, choice หรือ score) พร้อม instructions และ criteria จากนั้นกด Run ได้เลย</li><li>Response — ผลลัพธ์ของแต่ละคำถาม เช่น issue_resolved (Noul) ได้ 40% true, customer_sentiment (Choice) เลือก positive ด้วย Confidence 100% และ predicted_csat (Score) ได้ 2.31 จาก 4</li></ol><p>หรือถ้าอยากเรียกใช้ Jev ผ่านโค้ด ก็สามารถใช้ TypeSafe SDK สำหรับ Python ได้เลยค่ะ เริ่มจากติดตั้ง Package ด้วยคำสั่งนี้</p><pre>pip install typesafe-sdk</pre><p>โดยให้ไปที่เมนู API keys แล้วกด Create key เพื่อสร้าง API Key สำหรับใช้งานกับ SDK หลังจากนี้ค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KAMQfNtK8nl9Mg6D1LXAqw.png" /><figcaption>Create API Keys for Jev</figcaption></figure><p>ตัวอย่างด้านล่างเป็นการให้ Jev วิเคราะห์ข้อความของลูกค้า 1 ข้อความ โดยถาม 3 คำถามพร้อมกันในครั้งเดียว ครบทั้ง 3 รูปแบบเลยค่ะ</p><ul><li>billing (Noul) — ถามว่าข้อความนี้เกี่ยวกับการเรียกเก็บเงินหรือไม่ ได้คำตอบเป็นค่าความน่าจะเป็นระหว่าง 0 ถึง 1</li><li>tone (Choice) — ให้เลือกอารมณ์ของลูกค้าจากตัวเลือก calm, frustrated หรือ angry</li><li>urgency (Score) — ให้ประเมินความเร่งด่วนตามเกณฑ์ can wait, this week และ today</li></ul><pre>from typesafe_sdk import Choice, Noul, Score, TypeSafeClient<br><br>with TypeSafeClient() as client:<br>    response = client.system_one(<br>        state={&quot;document&quot;: &quot;I was charged twice. Please fix this ASAP.&quot;},<br>        questions={<br>            &quot;billing&quot;: Noul(instructions=&quot;Is this ticket about billing?&quot;),<br>            &quot;tone&quot;: Choice(<br>                instructions=&quot;What is the customer&#39;s tone?&quot;,<br>                criteria={&quot;calm&quot;: None, &quot;frustrated&quot;: None, &quot;angry&quot;: None},<br>            ),<br>            &quot;urgency&quot;: Score(<br>                instructions=&quot;How urgent is this ticket?&quot;,<br>                criteria=[&quot;can wait&quot;, &quot;this week&quot;, &quot;today&quot;],<br>            ),<br>        },<br>    )<br><br>print(response.nouls[&quot;billing&quot;].noul)<br>print(response.choices[&quot;tone&quot;].choice)<br>print(response.scores[&quot;urgency&quot;].score)</pre><p>เมื่อได้ response กลับมา เราสามารถดึงผลลัพธ์ของแต่ละคำถามได้จาก response.nouls, response.choices และ response.scores ตาม Key ที่เราตั้งไว้ได้เลย ซึ่งจากข้อความตัวอย่างนี้ Jev น่าจะประเมินว่าเป็นเรื่อง billing ลูกค้ากำลังไม่พอใจ และต้องการให้แก้ไขภายในวันนี้ ลองรันดูกันได้นะคะ :)</p><h3>3. Intro to Agent Development Kit (ADK)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aXUqhMi6V8n-zdxldkbjiA.png" /></figure><p>ในส่วนนี้จะเป็นการสร้าง AI Agent สำหรับคำถามที่ซับซ้อนหรือไม่อยู่ใน Intent ที่กำหนดไว้ บีทจะใช้ Agent Development Kit (ADK) ซึ่งเป็น Open-source Framework จาก Google โดย ADK จะเข้ามาช่วยจัดการเรื่อง Session การเรียกใช้ LLM และ Tools ให้เรา ทำให้สร้าง Agent ได้ด้วยโค้ดเพียงไม่กี่บรรทัด เริ่มจากติดตั้ง Package ก่อนเลยค่ะ</p><pre>pip install google-adk</pre><p>จากนั้นสร้าง Agent สำหรับร้าน BEAT COFFEE โดยมีองค์ประกอบหลักดังนี้ค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7FlFrs5jVijyT3-navKYDQ.png" /></figure><ul><li><strong>Agent</strong> — กำหนดโมเดล (gemini-3.8-flash) ชื่อ AI Agent คำอธิบาย และ instruction หรือ System Prompt ที่บอกบทบาทของ Agent พร้อมข้อมูลของร้าน เช่น สาขา เวลาเปิด–ปิด โปรโมชั่น และเมนู เพื่อให้ Agent ตอบได้ถูกต้องตามข้อมูลจริงของร้าน</li><li><strong>InMemorySessionService</strong> — เก็บประวัติการสนทนาของแต่ละ Session ไว้ใน Memory ทำให้ Agent จำบริบทของบทสนทนาก่อนหน้าได้</li><li><strong>Runner</strong> — ตัวกลางที่คอยรัน Agent รับข้อความจากผู้ใช้ เรียกโมเดล และส่งคำตอบกลับมาให้เรา</li></ul><pre>from google.adk.agents.llm_agent import Agent<br>from google.adk.runners import Runner<br>from google.adk.sessions import InMemorySessionService<br>from google.genai.types import Content, Part<br>from google.adk.tools import google_search<br><br>runner = Runner(<br>    app_name=APP_NAME,<br>    session_service=session_service,<br>    agent=Agent(<br>        model=&quot;gemini-3.8-flash&quot;,<br>        name=&quot;beat_coffee_agent&quot;,<br>        description=&quot;พนักงานร้านกาแฟ BEAT COFFEE&quot;,<br>        instruction=(<br>            &quot;คุณเป็นพนักงานร้านกาแฟ BEAT COFFEE ตอบลูกค้าเป็นภาษาไทย สั้น เป็นกันเอง\n&quot;<br>            &quot;ข้อเท็จจริงของร้าน: มีสาขากรุงเทพฯ และสุรินทร์ เปิดทุกวัน 08:00-18:00 น. &quot;<br>            &quot;โปรโมชั่นคือซื้อ 2 แก้วลด 10% &quot;<br>            &quot;สะสมครบ 10 แก้วรับเครื่องดื่มฟรี 1 แก้ว &quot;<br>            &quot;ชำระเงินสด พร้อมเพย์ หรือบัตร สั่งในแชทนี้แล้วรับที่ร้านหรือจัดส่งได้ &quot;<br>            &quot;เมนูมีเอสเพรสโซ อเมริกาโน่ ลาเต้ คาปูชิโน่ และมอคค่า\n&quot;<br>            &quot;ถ้าคำถามอยู่นอกข้อเท็จจริงของร้าน ให้ใช้ Google Search แล้วตอบสั้นจากผลค้นหา&quot;<br>        ),<br>        tools=[google_search],<br>    ),<br>)</pre><p>สำหรับการเชื่อมต่อกับ Gemini ที่เราใช้เป็น AI Agent เราจะต้องเข้าไปเอา API Key จาก <a href="https://aistudio.google.com/api-keys">Google AI Studio</a> ได้เลยค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ninNz1uehTy3z6rx0YjEqA.png" /><figcaption>Get Gemini API Key at Google Studio</figcaption></figure><h3>4. Building a Hybrid LINE Chatbot with Jev and ADK</h3><blockquote>“และแล้วก็มาถึงส่วนสำคัญที่สุดของบทความนี้คือการนำ Jev และ ADK มาใช้ เพื่อสร้าง LINE AI Chatbot “</blockquote><p>📣📣<a href="https://github.com/punsiriboo/line-chatbot-jev-adk"><strong><em>โค้ดทั้งหมดของบทความนี้ สามารถเข้าไปดูใน GitHub Repo ได้เลยค่ะ</em></strong></a><strong><em> </em></strong>📣📣</p><pre>### Building a Hybrid LINE Chatbot with Jev and ADK ###<br>4.1 Hybrid Chatbot Architecture<br>4.2 Intent Detection and Routing with Jev<br>4.3 Handling Static Responses with Flex Messages<br>4.4 Handling Dynamic Conversations with ADK<br>4.5 Deploy to Cloud Run &amp; Test</pre><h4>4.1 Hybrid Chatbot Architecture</h4><blockquote>ก่อนลงมือเขียนโค้ด มาดูภาพรวมการทำงานของ Chatbot กันก่อนค่ะ</blockquote><p>เมื่อผู้ใช้ส่งข้อความผ่าน LINE Official Account ระบบจะรับข้อความผ่าน LINE Webhook แล้วส่งให้ Jev วิเคราะห์ Intent พร้อมประเมินค่า Confidence เพื่อเลือกวิธีตอบกลับดังนี้</p><ol><li>Known Intent เช่น view_menu, store_hours, promotion และมี Confidence สูงตามเกณฑ์ที่กำหนด → ตอบกลับทันทีด้วย Flex Message ที่เตรียมไว้ โดยไม่ต้องเรียก LLM</li><li>Other หรือ Low Confidence → ส่งต่อให้ Google ADK Agent ช่วยวิเคราะห์และ Generate คำตอบ</li></ol><p>วิธีนี้ช่วยให้ Chatbot ตอบคำถามทั่วไปได้รวดเร็วด้วย Jev และจัดการคำถามที่ซับซ้อนด้วย Google ADK ค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BM67gBsDRlE4cTN129vo-w.png" /></figure><p>สำหรับการเชื่อมต่อกับ LINE Messaging API บีทจะใช้ <a href="https://github.com/line/line-bot-sdk-python">LINE Messaging API SDK for Python</a> ซึ่งติดตั้งได้ด้วยคำสั่งด้านล่างค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qawh2zj7ktzgO3ukCgz_Mw.png" /><figcaption><a href="https://github.com/line/line-bot-sdk-python">LINE Messaging API SDK for Python</a></figcaption></figure><p><a href="https://medium.com/@punsiriboonyakiat/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-line-chatbot-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-python-sdk-%E0%B9%81%E0%B8%A5%E0%B8%B0-cloud-run-function-d94420e86263">สำหรับใครที่ยังไม่เคยลองใช้งาน LINE Bot SDK Python บีทฝากบทความนี้ด้วยค่ะ :)</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pBZRskhCtkjfhedaF3KiSg.png" /><figcaption>LINE Officail Account Manager</figcaption></figure><p>ในการสร้าง LINE Chabot เราจำเป็นต้องเข้าไปสร้าง LINE Official Accout ก่อนที่ <a href="https://manager.line.biz/">LINE Official Account Manager </a>และหลังจากที่ได้ LINE OA Account มาแล้วก็ให้ไปที่หน้า <strong>Setting &gt; Messaing API</strong> เพื่อทำการเปิดใช้งาน Messaging API ซึ่งจะสามารถทำให้เราเชื่อมต่อ AI Chatbot ที่เราจะสร้าง กับ LINE Messaging API ได้</p><p>โดยในการจะเชื่อมต่อนั้นให้เราไป ที่ <a href="https://developers.line.biz/console/">LINE Developer Console</a> และนำ Channel secret และ Channel access token มาเก็บไว้เพื่อเชื่อมต่อภายหลังค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9M-1In-nieV3R_mNBZcBAA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1FkM_l4vMi5GtQbCi_ok6A.png" /><figcaption>Get LINE Channel secret and LINE Channel access token at LINE Developer Console</figcaption></figure><p>ใน Demo ของบทความนี้โค้ดจะอยู่ใน GitHub ที่บีทได้เตรียมไว้ให้แล้ว แต่ส่วนนึงที่สำคัญ และอยากเน้นย้ำก็คือเรื่องของการจัดการ Keys ทั้งหมดค่ะ ถ้าทุกทำตามถึงตรงนี้จะได้ Keys ในการเชื่อมต่อทั้งจาก TypeSaveAI — Jev , Google Gemini, LINE Messaging API ในการเชื่อมต่อบีทจึงใส่ Keys เหล่านี้ใน .env ไฟล์ เพื่อให้ LINE Chatbot Webhook ที่เรากำลังจะสร้างสามารถเข้าถึงได้ทุก services ค่ะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*robiydWP0Bm9gqybzHrrcg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BDS-IgQP4owJjqLJrGaW9Q.png" /><figcaption>GitHub and Keys for all connection in enviroment files.</figcaption></figure><h4>4.2 Intent Detection and Routing with Jev</h4><p>เริ่มจากการกำหนด Intents ที่ Chatbot ของเรารองรับก่อนค่ะ โดยเก็บไว้ใน Dictionary ชื่อ INTENT_CRITERIA ซึ่ง Key คือชื่อ Intent และ Value คือคำอธิบายพร้อมตัวอย่างประโยค ยิ่งเขียนคำอธิบายชัดเจน Jev ก็จะยิ่งเลือก Intents ได้แม่นยำขึ้น และอย่าลืมเพิ่ม Intent other ไว้รองรับคำถามที่ไม่เข้าพวกด้วยนะคะ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ycDdGYUqOk81LycJQmaOjQ.png" /></figure><pre>INTENT_CRITERIA = {<br>    &quot;view_menu&quot;: &quot;อยากดูเมนูกาแฟของร้าน BEAT COFFEE หรือถามว่ามีกาแฟอะไรบ้าง เช่น ขอดูเมนูกาแฟ, มีกาแฟ BEAT COFFEE อะไรบ้าง&quot;,<br>    &quot;store_hours&quot;: &quot;ถามเวลาเปิดหรือปิดร้าน BEAT COFFEE เช่น ร้านเปิดกี่โมง, วันนี้ปิดกี่โมง&quot;,<br>    &quot;promotion&quot;: &quot;ถามโปรโมชั่น ส่วนลด หรือการสะสมแต้ม เช่น มีโปรอะไรบ้าง, ตอนนี้มีส่วนลดไหม, สะสมครบ 10 ฟรีไหม&quot;,<br>    &quot;location&quot;: &quot;ถามตำแหน่งร้าน เช่น ร้านอยู่ที่ไหน, ร้านอยู่ที่กรุงเทพมหานครหรือสุรินทร์&quot;,<br>    &quot;contact&quot;: &quot;ถามวิธีติดต่อร้าน เช่น วิธีติดต่อร้าน, โทรศัพท์ร้าน&quot;,<br>    &quot;other&quot;: &quot;คำถามอื่นที่ไม่ใช่เมนู เวลาเปิดร้าน โปรโมชั่น การสะสมแต้ม ที่ตั้งร้าน หรือการติดต่อ&quot;,<br>}</pre><p>จากนั้นสร้างฟังก์ชัน detect_intent_with_jev() เพื่อส่งข้อความของผู้ใช้ไปให้ Jev วิเคราะห์ค่ะ โดยหากดูจากโค้ดก็จะพบว่ามีองค์ประกอบของ Input ที่ส่งให้ Jev ​</p><ul><li>state — บริบทที่ส่งให้ Jev พิจารณา ในที่นี้คือช่องทาง (line) และข้อความของผู้ใช้ (message)</li><li>questions — คำถามที่ต้องการให้ Jev ตัดสินใจ โดยใช้รูปแบบ Choice พร้อม instructions ให้เลือก Intent ที่ตรงที่สุด ผ่านตัวแปร INTENT_CRITERIA เป็นตัวเลือกของ Flex Messages ที่เราเตรียมไว้ก่อนหน้านี้</li></ul><pre>import os<br><br>from typesafe_sdk import Choice, TypeSafeClient<br><br>client = TypeSafeClient(api_key=os.environ[&quot;JEV_API_KEY&quot;], model=&quot;jev-latest&quot;)<br><br>def detect_intent_with_jev(user_text):<br>    &quot;&quot;&quot;Classify a LINE text message with Jev and return (intent, confidence).&quot;&quot;&quot;<br>    result = client.system_one(<br>        state={&quot;channel&quot;: &quot;line&quot;, &quot;message&quot;: user_text},<br>        questions={<br>            &quot;intent&quot;: Choice(<br>                instructions=(<br>                    &quot;เลือก intent ที่ตรงกับข้อความลูกค้าของร้านกาแฟ BEAT COFFEE มากที่สุด &quot;<br>                    &quot;ถ้าไม่เข้า intent ที่มีอยู่ ให้เลือก other&quot;<br>                ),<br>                criteria=INTENT_CRITERIA,<br>            )<br>        },<br>    )<br>    answer = result.choices.get(&quot;intent&quot;)<br>    return answer.choice, float(answer.confidence or 0)</pre><h4>4.3 Handling Hybrid Responses</h4><p>เมื่อรู้ Intent แล้ว ขั้นต่อไปคือการเลือกคำตอบที่จะส่งกลับไปหาผู้ใช้ค่ะ บีทสร้าง _FLEX_FILES_MAPPING เพื่อจับคู่ Intent แต่ละตัวกับไฟล์ Flex Message โดยเพื่อนๆ จะสร้าง Flex Message ด้วยตัวเองที่ <a href="https://developers.line.biz/flex-simulator/">Flex Message Simulator</a> หรือให้ AI Coding Agent สร้างให้ก็ได้ ในสมัยนี้การพัฒนา LINE Chatbot ง่ายขึ้นมากๆ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ndsGGQDknvfGwyzr7_b84w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hoV4oyI6V1dQKokZf997Ag.png" /><figcaption>Create Flex Message with <a href="https://developers.line.biz/flex-simulator/">Flex Message Simulator</a></figcaption></figure><p>ในการทำงานเมื่อ user ส่งข้อความเข้ามา ก็จะถูกส่งให้ Jev ประมวลผล และเมื่อ Jev เลือก intent ได้ก็จะ เอา Intent นั้นมา lookup เพื่อดูว่าจะต้องส่งข้อความ หรือ Flex Message อย่างไร ผ่านตัวแปร _FLEX_FILES_MAPPING จากนั้นใช้ฟังก์ชัน flex_message_for_intent() สร้างข้อความตอบกลับตาม Intent ค่ะ</p><pre>_FLEX_FILES_MAPPING = {<br>    &quot;view_menu&quot;: (&quot;view_menu.json&quot;, &quot;BEAT COFFEE มีเมนูเครื่องดื่มดังนี้ค่ะ&quot;),<br>    &quot;store_hours&quot;: (&quot;store_hours.json&quot;, &quot;ร้านเปิดทุกวัน 08:00 - 18:00 น.&quot;),<br>    &quot;promotion&quot;: (&quot;promotion.json&quot;, &quot;ซื้อ 2 แก้วลด 10% และสะสมครบ 10 แก้วฟรี 1 แก้ว&quot;),<br>    &quot;location&quot;: (&quot;location.json&quot;, &quot;BEAT COFFEE มีสาขากรุงเทพมหานครและสุรินทร์&quot;),<br>    &quot;contact&quot;: (&quot;contact.json&quot;, &quot;ติดต่อ BEAT COFFEE ได้ในแชทนี้&quot;),<br>}<br><br><br>def flex_message_for_intent(intent):<br>    item = _FLEX_FILES_MAPPING.get(intent)<br>    if item is None:<br>        return None<br>    filename, text = item<br>    raw = (FLEX_DIR / filename).read_text(encoding=&quot;utf-8&quot;)<br>    flex_message = FlexMessage(<br>        alt_text=text,<br>        contents=FlexContainer.from_json(raw),<br>    )<br>    return [TextMessage(text=text), flex_message]</pre><p>ต่อมาคือหัวใจของ Hybrid Chatbot นั่นก็คือฟังก์ชัน handle_text_message() ที่ทำหน้าที่เป็น Router รับข้อความจาก LINE Messaging API และส่งให้ Jev ตัดสินใจว่าจะตอบด้วย Flex Message หรือส่งต่อให้ ADK ดี</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ajz4zfl6M0cWtkx95dDsew.png" /><figcaption>Sequence diagram explain Hybrid Chatbot</figcaption></figure><pre>@handler.add(MessageEvent, message=TextMessageContent)<br>def handle_text_message(event):<br>    user_text = event.message.text<br>    user_id = event.source.user_id<br><br><br>    intent, confidence = detect_intent_with_jev(user_text)<br>    known_intent = intent != &quot;other&quot;<br>    high_confidence = confidence &gt;= CONFIDENCE_THRESHOLD<br>    if known_intent and high_confidence:<br>        messages = flex_message_for_intent(intent)<br>    else:<br>        _show_loading(event)<br>        messages = get_agent_response(user_text, user_id)<br><br>    line_bot_api.reply_message(<br>        ReplyMessageRequest(<br>            reply_token=event.reply_token,<br>            messages=messages,<br>        )<br>    )</pre><p>ทุกครั้งที่ user ส่งข้อความเข้ามาทาง LINE Chatbot ฟังก์ชันนี้จะทำงานดังนี้ค่ะ</p><ol><li>รับข้อความจากผู้ใช้ โดยดึงข้อความ (user_text) และ LINE User ID (user_id) จาก Event ที่ LINE ส่งมา</li><li>ให้ Jev วิเคราะห์ข้อความ ผ่านฟังก์ชัน detect_intent_with_jev() เพื่อดูว่าผู้ใช้ต้องการอะไร (Intent) พร้อมประเมินค่าความมั่นใจ (Confidence)</li><li>หาก Jev ระบุ Intent ได้อย่างมั่นใจ โดย Intent ไม่ใช่ other และค่า Confidence มากกว่าหรือเท่ากับ CONFIDENCE_THRESHOLD ระบบจะเรียก flex_message_for_intent() เพื่อส่ง Flex Message ที่เตรียมไว้ทันที</li><li>หาก Jev ไม่มั่นใจหรือไม่พบ Intent ที่ตรงกัน ระบบจะส่งข้อความต่อให้ ADK Agent ผ่าน get_agent_response() เพื่อช่วยสร้างคำตอบ</li><li>ส่งคำตอบกลับไปยังผู้ใช้ ผ่าน line_bot_api.reply_message() โดยใช้ reply_token จาก Event ที่ได้รับ</li></ol><h4>4.5 Deploy to Cloud Run &amp; Test</h4><p>เมื่อโค้ดพร้อมแล้ว มา Deploy ขึ้น Cloud Run กันค่ะ บีทใช้คำสั่ง gcloud run deploy แบบ Source Deploy ซึ่ง Cloud Run จะ Build Container ให้อัตโนมัติจากโค้ดในโฟลเดอร์ปัจจุบัน ไม่ต้องเขียน Dockerfile เองเลย</p><pre>gcloud run deploy &quot;$SERVICE_NAME&quot; \<br>  --account=&quot;$GCP_ACCOUNT&quot; \<br>  --project=&quot;$GCP_PROJECT_ID&quot; \<br>  --region=&quot;$GCP_REGION&quot; \<br>  --source=. \<br>  --function=callback \<br>  --base-image=&quot;$BASE_IMAGE&quot; \<br>  --allow-unauthenticated \<br>  --memory=&quot;$MEMORY&quot; \<br>  --timeout=&quot;$TIMEOUT&quot; \<br>  --env-vars-file=&quot;$ENV_FILE&quot; \<br>  --quiet</pre><p>เมื่อ Deploy สำเร็จ ให้นำ URL ของ Service ไปใส่ในช่อง Webhook URL ใน LINE Developers Console แล้วเปิด Use webhook จากนั้นลองทักแชทไปที่ LINE OA เพื่อทดสอบได้เลยค่ะ!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pukzxHxPmr7FtsRUxZUvCA.png" /><figcaption>Set Webhook URL ใน LINE Developers Console</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JYbedekwTpRLhrVQoc2v_A.png" /><figcaption>Deploy and Test Result</figcaption></figure><p>ภาพด้านบนแสดงผลการทดสอบ Chatbot หลัง Deploy ซึ่งสามารถตอบคำถามได้ทั้ง 2 รูปแบบตามที่ออกแบบไว้ โดยใช้ Flex Message ตอบคำถามที่พบบ่อยได้อย่างสวยงามและสม่ำเสมอโดยไม่ต้องเรียก LLM ส่วนคำถามที่ซับซ้อนหรือหลากหลายจะส่งต่อให้ Google ADK ตอบกลับอย่างเป็นธรรมชาติค่ะ</p><h3>5. Conclusion</h3><blockquote>“จากที่ได้ลองใช้งาน Jev แล้ว ส่วนตัวชอบมากค่ะ “</blockquote><p>คิดว่าการนำ Jev มาใช้งานร่วมกับ LLMs ในรูปแบบ Hybrid AI Chatbot เป็นแนวทางที่น่าสนใจมาก เพราะ Chatbot ของเราไม่จำเป็นต้องส่งทุกคำถามไปให้ LLMs ประมวลผลเสมอไป สำหรับคำถามที่รู้คำตอบแน่นอนอยู่แล้ว เช่น การขอเมนูสินค้า เวลาเปิด–ปิดร้าน หรือคำถามที่มี Flow ชัดเจน เราสามารถใช้ Jev แยก Intent แล้วตอบกลับด้วยข้อความหรือ Flex Message ที่กำหนดไว้ล่วงหน้าได้ทันที ส่วนคำถามที่ซับซ้อนหรือต้องการสนทนาแบบ Small Talk ก็ค่อยส่งต่อให้ LLMs จัดการ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EwUIWPjZW3SPegBT4MtfpQ.png" /><figcaption>TypeSafe AI Console — API Usage</figcaption></figure><p>จากที่ลองเล่นมา Jev ตอบได้ไวมากๆ และประหยัดใช้ได้เลยค่ะ เนื่องจากลองกดเล่นไปกว่าสี่ร้อยครั้งระหว่างทดสอบ จะเห็นว่า Cost ที่ใช่ไปยังไม่ถึง 0.1 ดอลลาร์เลยค่ะ 🤯🤯 ถูกมาก!!</p><p>ข้อดีของ Hybrid AI Chatbot แบบนี้ คือช่วยให้ ประหยัด Token ลดต้นทุน ลด Latency และตอบกลับได้รวดเร็วยิ่งขึ้น พร้อมทั้งรักษาความสม่ำเสมอของคำตอบและความยืดหยุ่นในการสนทนาได้จริงค่ะ</p><blockquote>เพราะสุดท้ายแล้ว AI Chatbot ที่ดีไม่จำเป็นต้องใช้ LLMs ตอบทุกคำถาม แต่ควรเลือกใช้ AI ให้เหมาะกับแต่ละงานค่ะ :)</blockquote><blockquote>หากบทความนี้เป็นประโยชน์ อย่าลืมกดแชร์หรือกดปรบมือเพื่อเป็นกำลังใจให้ด้วยนะคะ ขอบคุณมากที่อ่านมาจนถึงตรงนี้ แล้วพบกันในบทความหน้าค่ะ 🤟💙</blockquote><h3>References</h3><ul><li><a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev">https://typesafe.ai/blog/introducing-system-one-models-and-jev</a></li><li><a href="https://adk.dev/agents/models/google-gemini/">https://adk.dev/agents/models/google-gemini/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b37d08255990" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-line-ai-chatbot-%E0%B9%81%E0%B8%9A%E0%B8%9A-hybrid-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-jev-%E0%B9%81%E0%B8%A5%E0%B8%B0-google-adk-b37d08255990">สร้าง LINE AI Chatbot แบบ Hybrid ด้วย Jev และ Google ADK</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LINE Developers Docs อยู่บน GitHub แล้วลองเอามาทำ Skill ให้ Codex กัน! ]]></title>
            <link>https://medium.com/linedevth/line-developers-docs-%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88%E0%B8%9A%E0%B8%99-github-%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7%E0%B8%A5%E0%B8%AD%E0%B8%87%E0%B9%80%E0%B8%AD%E0%B8%B2%E0%B8%A1%E0%B8%B2%E0%B8%97%E0%B8%B3-skill-%E0%B9%83%E0%B8%AB%E0%B9%89-codex-%E0%B8%81%E0%B8%B1%E0%B8%99-a5e37b667057?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/a5e37b667057</guid>
            <category><![CDATA[skills]]></category>
            <category><![CDATA[openai-codex]]></category>
            <category><![CDATA[linemessagingapi]]></category>
            <category><![CDATA[line-chatbot]]></category>
            <category><![CDATA[chatbots]]></category>
            <dc:creator><![CDATA[Thepnatee Phojan]]></dc:creator>
            <pubDate>Mon, 28 Sep 2026 02:56:49 GMT</pubDate>
            <atom:updated>2026-09-28T04:50:54.200Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*6DRA3i6fajnMV_iZa08hFw.png" /></figure><p>สวัสดีค้าบเพื่อนๆ LINE Developers ทุกคนนน 👋</p><p>ปกติเวลาเราพัฒนาอะไรเกี่ยวกับ LINE ไม่ว่าจะเป็น Messaging API, LINE Login, LIFF หรือ LINE MINI App ก็น่าจะคุ้นเคยกับ <a href="https://developers.line.biz/en/docs/"><strong>LINE Developers Documentation</strong></a> กันอยู่แล้ว</p><p>วันนี้ผมเลยอยากมาแนะนำอีกมุมหนึ่งครับ 😆</p><p>จริงๆ แล้ว Source ของ LINE Developers Docs มีอยู่บน <a href="https://github.com/line/line-developers-docs-source/tree/main/docs/en/docs">GitHub</a> ด้วย</p><p>และสิ่งที่ผมว่าน่าสนใจคือ…</p><blockquote><em>ถ้า </em><a href="https://developers.line.biz/en/docs/"><em>Documentation</em></a><em> อยู่ในรูปแบบไฟล์แบบนี้<br>เราสามารถเลือกเฉพาะเรื่องที่เราใช้ แล้วเอาไปทำเป็น Skill ให้ Codex ช่วยเราทำงานต่อได้ไหม?</em></blockquote><p>วันนี้เลยจะลองกันแบบง่ายๆ ครับ</p><p>โจทย์ของเราคือ</p><blockquote><strong><em>สร้าง LINE Messaging API Webhook ด้วย Node.js<br>รับข้อความจาก User แล้ว Reply กลับว่า </em></strong><strong><em>Hello {ข้อความ}</em></strong></blockquote><p>สุดท้ายจะได้แบบนี้ครับ 🎉</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/1*Ux4tyNlfl0YAhGoTDxPr5g.png" /></figure><h3>วันนี้เราจะทำอะไรกันบ้าง? 😆</h3><p>แบบรวบรัด Flow ของบทความนี้มีประมาณนี้ครับ</p><ul><li><strong>Step 1 ก่อนอื่น เราต้องรู้ก่อนว่าจะใช้ Docs ตัวไหน</strong></li><li><strong>Step 2 Clone LINE Developers Docs มาไว้ก่อน</strong></li><li><strong>Step 3 ลองให้ Codex สร้าง Skill ให้เรา</strong></li><li><strong>Step 4 แล้ว Skill คืออะไร?</strong></li><li><strong>Step 5 ใช้ Skill สั่ง Codex ทำงานจริง</strong></li><li><strong>Step 6 สร้างและ Run LINE Webhook</strong></li><li><strong>Step 7 เปิด Localhost ด้วย ngrok และเชื่อม LINE</strong></li><li><strong>Step 8 ลองของจริงกับ LINE กัน</strong></li></ul><h3>Step 1 ก่อนอื่น เราต้องรู้ก่อนว่าจะใช้ Docs ตัวไหน</h3><p>ถ้าเปิดเข้าไปที่ <a href="https://github.com/line/line-developers-docs-source/tree/main/docs/en/docs/messaging-api">Messaging API</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wh7N3N-t5cLN5oK5qH7xhA.png" /></figure><p>จะพบว่ามี Documentation เยอะมากครับ</p><p>แต่โจทย์ของเราแค่ทำ Reply Bot ง่ายๆ</p><p><strong>ไม่จำเป็นต้องเอาทั้ง Folder ให้ Codex อ่าน</strong></p><p>จากที่ผมลองไล่ดูไฟล์จริงๆ สำหรับ Use Case นี้ ผมเลือกแค่ 5 เรื่องครับ</p><pre>messaging-api/<br><br>├── receiving-messages/. #Webhook และ Event ที่ LINE ส่งเข้ามา<br>│   └── index.html.md<br>│<br>├── verify-webhook-signature/ #ตรวจว่า Request มาจาก LINE จริง<br>│   └── index.html.md<br>│<br>├── sending-messages/ #Reply Message / Push Message<br>│   └── index.html.md<br>│<br>├── line-bot-sdk/ #line-bot-sdk<br>│   └── index.html.md<br>│<br>└── nodejs-sample/ #ตัวอย่าง Reply Bot ด้วย Node.js<br>    └── index.html.md</pre><p>จุดหนึ่งที่น่าสนใจคือ nodejs-sample ของ LINE ตั้งใจสอนพื้นฐานโดย <strong>ไม่ใช้ SDK</strong> แต่ใน line-bot-sdk มี Official SDK สำหรับ Node.js อยู่แล้ว</p><p>ดังนั้นสำหรับ Demo ของเรา ผมจะกำหนดใน Skill ไปเลยว่า</p><blockquote><strong><em>ถ้ามี Official LINE SDK ให้ใช้ SDK</em></strong></blockquote><p>เพราะ Code จะสั้นและอ่านง่ายกว่า ตรงนี้เป็นสิ่งแรกที่อยากฝากไว้เลยครับ</p><blockquote><strong><em>อย่าโยน Documentation ทั้งหมดให้ AI ถ้าเราไม่ได้ใช้ทั้งหมด</em></strong></blockquote><p>เลือก Context ให้ตรงกับงานก่อนครับ 😆</p><h3>Step 2 Clone LINE Developers Docs มาไว้ก่อน</h3><p>เริ่มจาก Clone Repository</p><pre>git clone https://github.com/line/line-developers-docs-source.git</pre><p>เข้า Folder</p><pre>cd line-developers-docs-source</pre><p>ตอนนี้เราก็มี Source Docs อยู่ในเครื่องเรียบร้อย</p><p>จากนั้นเราจะให้ Codex ช่วยเปลี่ยน Docs ที่เลือกไว้เมื่อกี้ให้กลายเป็น <strong>Skill</strong></p><h3>Step 3 ลองให้ Codex สร้าง Skill ให้เรา</h3><p>Codex มี $skill-creator สำหรับช่วยสร้าง Skill ได้โดยตรง โดย Skill จะมี SKILL.md เป็นไฟล์หลัก และสามารถมี references, scripts หรือ assets เพิ่มได้ด้วย <a href="https://developers.openai.com/plugins/build/skills?utm_source=chatgpt.com">OpenAI Developers</a></p><p>ลองเปิด Codex แล้ว Prompt แบบนี้ครับ</p><pre>$skill-creator<br><br>Create a skill named line-messaging-api.<br><br>Use these LINE Developers Documentation files<br>as the source of truth:<br><br>- docs/en/docs/messaging-api/receiving-messages/index.html.md<br>- docs/en/docs/messaging-api/verify-webhook-signature/index.html.md<br>- docs/en/docs/messaging-api/sending-messages/index.html.md<br>- docs/en/docs/messaging-api/line-bot-sdk/index.html.md<br>- docs/en/docs/messaging-api/nodejs-sample/index.html.md<br><br>This skill should help developers build simple<br>LINE Messaging API applications.<br><br>Rules:<br><br>- Prefer official LINE SDKs when available<br>- Verify webhook signatures before processing events<br>- Use environment variables for Channel Secret<br>  and Channel Access Token<br>- Support text message events<br>- Support Reply Message<br>- Keep Node.js examples simple<br>- Don&#39;t invent unsupported LINE API properties<br>- Refer back to the LINE Developers Documentation<br>  when API behavior is unclear</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PbsyioNf_jZ8wvLN84e_jQ.png" /></figure><p>ตรงนี้จริงๆ เราไม่ได้บอก Codex ว่า</p><blockquote><em>“ช่วยเขียน Webhook ให้หน่อย”</em></blockquote><p>นะครับ แต่เรากำลังบอกว่า</p><blockquote><strong><em>“เวลาจะช่วยผมทำ LINE Messaging API ต่อจากนี้ ให้ยึดกติกาพวกนี้นะ</em></strong></blockquote><h3>Step 4 แล้ว Skill คืออะไร?</h3><p>หลังจากสร้างเสร็จ เราจะได้โครงประมาณนี้</p><pre>.codex/<br>└── skills/<br>    └── line-messaging-api/<br>        ├── SKILL.md<br>        └── references/</pre><p>Codex Skill หลักๆ ก็คือ Folder ที่มี SKILL.md ซึ่งประกอบด้วย name, description และ Instructions ว่า Skill นี้ใช้เมื่อไร และควรทำงานอย่างไร <a href="https://developers.openai.com/plugins/concepts/skills?utm_source=chatgpt.com">OpenAI Developers</a></p><p>ตัวอย่างแนวๆ นี้</p><pre>---<br>name: line-messaging-api<br>description: Build LINE Messaging API applications<br>using official LINE Developers documentation.<br>---<br><br>Use this skill when implementing<br>LINE Messaging API features.<br><br>- Read the relevant LINE documentation first.<br>- Prefer official LINE SDKs.<br>- Verify webhook signatures.<br>- Never hardcode credentials.<br>- Handle supported webhook events only.<br>- Don&#39;t invent unsupported API properties.</pre><p>ตรงนี้แหละครับที่เริ่มต่างจากการ Prompt ปกติ</p><h4>ก่อนมี Skill</h4><p>เราต้องบอกทุกครั้งว่า</p><pre>ใช้ SDK นะ<br>ตรวจ Signature ด้วยนะ<br>อย่า Hardcode Secret นะ<br>ใช้ Reply Token นะ<br>ดู LINE Docs ด้วยนะ<br>...</pre><h4>หลังมี Skill</h4><p>เรื่องพวกนั้นอยู่ใน Skill แล้ว Prompt ของเราเลยเหลือแค่… <strong>เราต้องการทำอะไร</strong></p><h3>Step 5 ใช้ Skill สั่ง Codex ทำงานจริง</h3><p>ผมลองสั่ง Codex ง่ายๆ แบบนี้</p><pre>Use the line-messaging-api skill.<br><br>Create a simple LINE Messaging API webhook<br>using Node.js and Express.<br><br>When the user sends a text message,<br>reply with:<br><br>Hello {message}<br><br>Keep the example simple.</pre><p>ถ้าเป็นภาษาที่ผมใช้จริงๆ ก็ประมาณนี้เลยครับ 😆</p><pre>ใช้ line-messaging-api skill<br><br>ช่วยสร้าง LINE Webhook ง่ายๆ<br>ด้วย Node.js + Express ให้หน่อย<br><br>ถ้าผู้ใช้ส่ง Text Message เข้ามา<br>ให้ Reply กลับว่า<br><br>Hello {ข้อความที่ส่งมา}<br><br>ขอ Code แบบง่ายๆ อ่านรู้เรื่อง</pre><h3>Step 6 สร้างและ Run LINE Webhook</h3><p>Project ง่ายๆ ของเราจะประมาณนี้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W1F4ReyzE4sFW3jf06EiKg.png" /></figure><p>ติดตั้ง Package ใน <strong>linechatbot</strong></p><pre>npm install express @line/bot-sdk dotenv</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lnbu5ZKLv6ZEAqoPrML5QQ.png" /></figure><p>แล้ว index.js ก็ประมาณนี้</p><pre>require(&quot;dotenv&quot;).config();<br><br>const express = require(&quot;express&quot;);<br>const line = require(&quot;@line/bot-sdk&quot;);<br><br>const {<br>  LINE_CHANNEL_SECRET,<br>  LINE_ACCESS_TOKEN,<br>  PORT = 3000,<br>} = process.env;<br><br>if (!LINE_CHANNEL_SECRET || !LINE_ACCESS_TOKEN) {<br>  throw new Error(<br>    &quot;Set LINE_CHANNEL_SECRET and LINE_ACCESS_TOKEN before starting the server.&quot;,<br>  );<br>}<br><br>const client = line.LineBotClient.fromChannelAccessToken({<br>  channelAccessToken: LINE_ACCESS_TOKEN,<br>});<br><br>const app = express();<br>const webhookMiddleware = line.middleware({<br>  channelSecret: LINE_CHANNEL_SECRET,<br>});<br><br>app.get(&quot;/&quot;, (_req, res) =&gt; {<br>  res.sendStatus(200);<br>});<br><br>// Keep LINE&#39;s middleware before any JSON body parser so it can verify the raw body.<br>app.post(&quot;/webhook&quot;, webhookMiddleware, (req, res) =&gt; {<br>  res.sendStatus(200);<br><br>  Promise.all(req.body.events.map(handleEvent)).catch((error) =&gt; {<br>    console.error(&quot;Failed to handle LINE webhook events:&quot;, error);<br>  });<br>});<br><br>function handleEvent(event) {<br>  if (<br>    event.type !== &quot;message&quot; ||<br>    event.message?.type !== &quot;text&quot; ||<br>    !event.replyToken<br>  ) {<br>    return Promise.resolve(null);<br>  }<br><br>  return client.replyMessage({<br>    replyToken: event.replyToken,<br>    messages: [<br>      {<br>        type: &quot;text&quot;,<br>        text: `Hello ${event.message.text}`,<br>      },<br>    ],<br>  });<br>}<br><br>app.listen(PORT, () =&gt; {<br>  console.log(`LINE bot listening on port ${PORT}`);<br>});</pre><p>สิ่งที่น่าสังเกตคือ Code ที่ออกมาไม่ได้มีแค่ Logic</p><pre>รับข้อความ → Reply</pre><p>แต่มีเรื่อง</p><pre>line.middleware(config)</pre><p>เข้ามาด้วย</p><p>ซึ่ง Official Docs ระบุชัดว่าควร Verify Webhook Signature <strong>ก่อนนำ Event ไปประมวลผล</strong> (receiving-messages และ verify-webhook-signature)</p><p>ตรงนี้แหละครับที่ผมมองว่า Documentation เริ่มมีประโยชน์กับ Coding Assistant มากขึ้น</p><h3>Step 7 เปิด Localhost ด้วย ngrok และเชื่อม LINE</h3><p>ต่อไปก็สร้าง .env file</p><pre>cp .env.example .env</pre><p>ต่อไปก็เอาค่าจาก “<strong>LINE Developers Console -&gt; Messaging API Channel</strong>” มาใส่</p><pre>LINE_CHANNEL_SECRET=...<br>LINE_ACCESS_TOKEN=...<br>PORT=3000</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0dqNDcDtJ3jJhj1o7-BR1Q.png" /></figure><p>Run Server</p><pre>npm start</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1014/1*7dwniGeeM0Jo1-wAFHA4pQ.png" /></figure><p>ตอนนี้ Webhook ของเรารันอยู่ที่เครื่อง</p><pre>http://localhost:3000/webhook</pre><p>ปัญหาคือ…</p><p>LINE เรียก localhost ในเครื่องเราไม่ได้ครับ 😆</p><p>เราต้องมี Public URL ที่ LINE Platform สามารถยิง Webhook เข้ามาได้</p><p>ตรงนี้ผมใช้ <a href="https://ngrok.com/download/mac-os"><strong>ngrok</strong></a></p><p>ติดตั้งก่อน เช่นบน macOS</p><pre>brew install ngrok</pre><p>จากนั้น Login / เพิ่ม <a href="https://dashboard.ngrok.com/get-started/your-authtoken">Auth Token</a> ตามบัญชี ngrok ของเรา</p><pre>ngrok config add-authtoken $YOUR_AUTHTOKEN</pre><p>แล้วเปิด Tunnel ไปที่ Port 3000</p><pre>ngrok http 3000</pre><p>จะได้ประมาณนี้</p><pre>Forwarding<br>https://xxxx-xxxx.ngrok-free.app -&gt; http://localhost:3000</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5qMf4jGvQ5C479y5D4IBNQ.png" /></figure><p>ดังนั้น Webhook URL ของเราก็จะเป็น</p><pre>https://xxxx-xxxx.ngrok-free.app/webhook</pre><p>Flow ตอนนี้จะกลายเป็นแบบนี้ครับ</p><p>ตรงนี้ทำให้ Local Project ของเราถูกเรียกจาก LINE ได้แล้วครับ 🎉</p><p>กลับไปที่ Messaging API Channel ของเรา จากนั้นเอา</p><pre>https://xxxx-xxxx.ngrok-free.app/webhook</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/696/1*J4eVBgcWXVs9AMgea4c8uQ.png" /></figure><p>ไปใส่เป็น <strong>Webhook URL </strong>แล้วกด</p><pre>Verify</pre><p>ถ้าทุกอย่างถูกต้องก็ควร Verify ผ่าน จากนั้นอย่าลืมเปิด</p><pre>Use webhook</pre><p>ด้วยครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/650/1*nv0UaFcqSJS6XqINkepevg.png" /></figure><p>ตรงนี้เป็นอีกภาพที่ดีมากสำหรับบทความ เพราะคนอ่านจะเข้าใจเลยว่า</p><blockquote><em>“อ๋อ… Code ที่รันในเครื่องเรา LINE เข้ามาหาได้ผ่าน ngrok แบบนี้นี่เอง”</em></blockquote><h3>Step 8 ลองของจริงกับ LINE กัน</h3><p>ลองส่ง</p><pre>ดีจ้า</pre><p>ผลที่ได้</p><pre>Hello ดีจ้า</pre><p>เรียบร้อย 🎉</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*daK3nobgKA6a8pQnYFdUGw.png" /></figure><p>มี Note เล็ก ๆ ที่ควรใส่ด้วยครับ:</p><blockquote><em>สำหรับ Demo ใช้ ngrok สะดวกมาก แต่ URL แบบฟรีอาจเปลี่ยนเมื่อเราเปิด session ใหม่ ดังนั้นถ้า URL เปลี่ยน อย่าลืมกลับไปแก้ Webhook URL ใน </em><strong>Messaging API Channel</strong> <em>ด้วยนะครับ 😆</em></blockquote><p>ผมว่าเพิ่ม Step นี้แล้วบทความจะ <strong>ครบและทำตามได้จริงตั้งแต่ต้นจนจบ</strong> มากขึ้นครับ.</p><h3>สุดท้ายแล้ว Skill ช่วยอะไรเรา?</h3><p>แต่สิ่งที่ผมชอบที่สุดไม่ใช่แค่เรื่องที่ Codex ช่วยเขียน Code ให้เราเร็วขึ้นนะครับ<br>มันคือการที่เราเริ่มเปลี่ยนจาก</p><pre><br>Prompt ยาวๆ<br>+ ต้องอธิบายใหม่ทุกครั้ง<br>+ กลัว AI จำ API ผิด<br>Code</pre><p>มาเป็น</p><pre><br>Official Docs<br>+ Skill<br>+ Prompt สั้นๆ<br>Code</pre><p>Skill เลย <strong>ไม่ได้มีไว้เพื่อให้ AI “เก่งขึ้น” อย่างเดียว </strong>แต่ช่วยให้เรา กำหนดวิธีทำงานของมันได้ชัดขึ้น และครั้งหน้าถ้าต้องกลับมาทำ LINE Development อีกครั้ง</p><p>ก็ไม่ต้องเริ่มจากศูนย์ใหม่ทุกครั้ง 😆💚</p><p>ใครใช้ AI ตัวไหน อยู่แล้วแต่เลย และ <br>แต่อย่าลืมลองหยิบ Documentation ที่ตัวเองใช้บ่อยๆ มาทำ Skill เล่นกันดูครับ</p><p>บางที Skill ตัวแรกที่มีประโยชน์ที่สุด…</p><p>อาจไม่ใช่ Skill ที่ซับซ้อนที่สุด</p><p>แต่เป็น Skill ที่ช่วยลดสิ่งที่เราต้องอธิบายซ้ำๆ ทุกวันนี่แหละครับ 😆</p><p>แล้วเจอกันบทความหน้าครับ 👋</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a5e37b667057" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/line-developers-docs-%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88%E0%B8%9A%E0%B8%99-github-%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7%E0%B8%A5%E0%B8%AD%E0%B8%87%E0%B9%80%E0%B8%AD%E0%B8%B2%E0%B8%A1%E0%B8%B2%E0%B8%97%E0%B8%B3-skill-%E0%B9%83%E0%B8%AB%E0%B9%89-codex-%E0%B8%81%E0%B8%B1%E0%B8%99-a5e37b667057">LINE Developers Docs อยู่บน GitHub แล้วลองเอามาทำ Skill ให้ Codex กัน! 💚</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[สร้าง LINE AI Chatbot ฟรีด้วย Developer Tools Builder + Gemini แบบ Step by Step]]></title>
            <link>https://medium.com/linedevth/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-line-ai-chatbot-%E0%B8%9F%E0%B8%A3%E0%B8%B5%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-developer-tools-builder-gemini-%E0%B9%81%E0%B8%9A%E0%B8%9A-step-by-step-c5c2dbb88f8f?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/c5c2dbb88f8f</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[linedevth]]></category>
            <category><![CDATA[ai-chatbot]]></category>
            <category><![CDATA[devtoolsbuilder]]></category>
            <category><![CDATA[chatbots]]></category>
            <dc:creator><![CDATA[Thepnatee Phojan]]></dc:creator>
            <pubDate>Thu, 17 Sep 2026 03:00:30 GMT</pubDate>
            <atom:updated>2026-09-17T03:00:28.932Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Q7WuvHkMxmLU-QkvDE_frw.png" /></figure><p>สวัสดีค้าบทุกคน ชาว <strong>LINE Developers</strong> 👋 ช่วงนี้เป็นยังไงกันบ้างครับ</p><p>เชื่อว่าช่วงนี้หลายคนน่าจะได้จับ ได้ลอง ได้เล่น AI กันแทบทุกวันแล้ว ไม่ว่าจะเป็น ChatGPT, Gemini หรือ AI Tools อีกสารพัดเต็มไปหมด</p><p>แล้วอยู่ ๆ ผมก็มีคำถามหนึ่งขึ้นมาครับ…</p><blockquote><strong><em>ถ้าเราอยากจับ AI มาใส่ไว้ใน LINE แล้วให้มันคุยกับลูกค้าของเราได้จริง ๆ เราจะทำให้ง่ายได้แค่ไหนนะ?</em></strong></blockquote><p>เพราะปกติถ้าเราพูดถึงการทำ LINE Chatbot ที่ต่อกับ AI ภาพในหัวของ Developer น่าจะประมาณนี้</p><pre>LINE Messaging API<br>        ↓<br>Webhook<br>        ↓<br>My Server<br>        ↓<br>Gemini / AI API<br>        ↓<br>Reply Message</pre><p>ซึ่งแน่นอนว่าทำได้ง่ายเลยครับ</p><p>และถ้าจะทำ Production จริง ๆ การมี Backend ของตัวเองก็ยังเป็นแนวทางที่เหมาะกับหลาย Use Case อยู่เหมือนเดิม</p><p>แต่ทีนี้…</p><p>ถ้าโจทย์ของเรายังเป็นแค่</p><ul><li>อยากลองของ</li><li>อยากทำ Prototype</li><li>อยาก Demo ให้ลูกค้าดู</li><li>หรือเป็นร้านเล็ก ๆ ที่อยากมี AI Chatbot สักตัว</li></ul><p>เราจำเป็นต้องเริ่มจากการเปิด Project, ทำ Backend, ตั้ง Webhook, จัดการ Token และต่อ AI API เองทั้งหมดตั้งแต่วันแรกเลยไหม?</p><p><strong>อืมมม…อาจจะยังไม่ต้องก็ได้ 😆</strong></p><p>บทความนี้เลยเป็นอีกหนึ่งบทความ “หาทำ” ของผมครับ</p><blockquote><strong><em>LINE AI Chatbot ด้วย Developer Tools Builder + Gemini</em></strong></blockquote><p>ตั้งแต่เอา LINE Messaging API มาเชื่อม จับ Gemini มาเป็นสมองให้ Bot ตั้ง Character ให้ AI ไปจนถึงพิมพ์คำว่า <strong><em>“สวัสดี”</em></strong></p><p>แล้วมี AI ตอบเรากลับมาบน LINE จริง ๆ ที่สำคัญคือ สำหรับการทดลอง เรายังสามารถเริ่มใช้งาน <strong>Free </strong>ได้เลย เหมาะมากสำหรับคนที่อยากรู้ว่า</p><blockquote><em>“AI Chatbot บน LINE มันเวิร์กกับ Use Case ของเราจริงไหม?”</em></blockquote><p>ก่อนจะลงทุนทำระบบใหญ่ขึ้นมา บทความนี้ผมจะพาทำแบบ <strong>Step by Step</strong> ครับ</p><ul><li>Step 0 เตรียของให้พร้อมก่อนเริ่ม</li><li>Step 1 เข้า Developer Tools Builder</li><li>Step 2 Connect LINE Messaging API Channel</li><li>Step 3 Create Gemini API Key</li><li>Step 4 Connect Gemini เข้ากับ Developer Tools Builder</li><li>Step 5 Select Gemini 3.5 Flash-Lite</li><li>Step 6 Role / Prompt</li><li>Step 7 Enable AI Auto Reply</li><li>Step 8 Setup Webhook Proxy</li><li>Step 9 ทดลองคุยกับ AI ผ่าน LINE 🎉</li></ul><p><strong>จบบทความนี้ เราจะมี LINE Official Account ที่สามารถคุยและตอบกลับด้วย AI ได้จริง</strong>โอเค ถ้าพร้อมแล้ว มาเริ่มกันครับ 🚀</p><h3>Step 0 เตรียมของให้พร้อมก่อนเริ่ม</h3><p>ก่อนที่เราจะเริ่ม Connect ทุกอย่างเข้าด้วยกัน เราต้องเตรียมของหลัก ๆ ก่อนครับ</p><p>สิ่งที่ต้องมีคือ</p><ul><li><a href="https://manager.line.biz/">LINE Official Account</a></li><li><a href="https://developers.line.biz/en/docs/messaging-api/getting-started/">LINE Messaging API Channel</a></li><li>Google Account</li><li>Account ของ <a href="https://devtoolsbuilder.cloudea.tech/">Developer Tools Builder</a></li></ul><p>ถ้าใครมี LINE Official Account และเปิด Messaging API อยู่แล้ว สามารถข้ามส่วนการเตรียม LINE ไปได้เลยครับ</p><p>สิ่งสำคัญที่เราจะต้องใช้จาก LINE Messaging API คือ</p><pre>Channel ID<br>Channel Secret</pre><p>สองตัวนี้จะถูกนำไปใช้สำหรับเชื่อม LINE Messaging API Channel ของเราเข้ากับ Developer Tools Builder ใน Step ถัดไป</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j2t6edxCPPZJhrh92iuKFA.png" /><figcaption><a href="https://manager.line.biz/">LINE Official Account Manager</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mNAS6YrsTj4OLWH2LJSTmg.png" /><figcaption><a href="https://developers.line.biz/console/">LINE Developers Console</a>— Channel “GEMINI BOT”</figcaption></figure><h3>Step 1 เข้า Developer Tools Builder</h3><p>ต่อไปเข้า <a href="https://devtoolsbuilder.cloudea.tech/"><strong>Developer Tools Builder</strong></a></p><p>จากนั้น Login เข้าสู่ระบบ ถ้าเรายังไม่ได้เชื่อม LINE Messaging API Channel ระบบจะมีข้อความแจ้งประมาณว่า</p><blockquote><strong><em>You haven’t connected a </em></strong>LINE Messaging API Channel</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SG9iVOrRApn9Wg9K3i3S7A.png" /><figcaption>Before Login Developer tools Builder</figcaption></figure><p>ตรงนี้ไม่ต้องตกใจครับ เพราะนี่คือสิ่งที่เรากำลังจะทำต่อใน Step หน้า</p><p>หลังจาก Login แล้ว เราจะเห็น Workspace ที่รวมเครื่องมือสำหรับ LINE Platform เอาไว้หลายอย่าง เช่น</p><ul><li>Send Message</li><li>Scheduled Messages</li><li>Message History</li><li>Rich Menu Builder</li><li>Flex Message</li><li>Bot Simulator</li><li>Auto-Reply Flows</li><li>Webhook Proxy</li><li>Audience</li><li>Members</li></ul><p>แต่รอบนี้เราจะโฟกัสเฉพาะ Feature ที่เกี่ยวกับ <strong>AI Chatbot</strong> ก่อน</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZAcIggPMeSKTWR1wJRfESg.png" /><figcaption>Developer Tools Builder Home</figcaption></figure><h3>Step 2 Connect LINE Messaging API Channel</h3><p>ได้เวลาเชื่อม LINE ของเราเข้ากับ Developer Tools Builder แล้วครับ</p><p>ไปที่ <strong>Channel Settings → Add Channel </strong>ระบบจะให้กรอกข้อมูล Channel ID<br>Channel Secret</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*nTjwlgddnThcLV8GsBn3gw.png" /></figure><p>ให้นำข้อมูลจาก LINE Messaging API Channel ของเรามาใส่ตรงนี้</p><p>จากนั้นอ่านและยอมรับ Data Retention Policy แล้วกด</p><p><strong>Add Channel</strong></p><p>เท่านี้ Developer Tools Builder ก็จะรู้แล้วว่า</p><blockquote>LINE Official Account ตัวไหนคือ Channel ที่เราต้องการนำมาสร้าง LINE Chatbot</blockquote><p>Flow ตอนนี้จะเริ่มเป็น</p><pre>LINE Official Account<br>        ↓<br>LINE Messaging API<br>        ↓<br>Developer Tools Builder</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4x4eKDk7FW7skxWwh96Vmg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kCiydkQTh6zSmgiJ_fJs8A.png" /><figcaption>LINE Developer Console — Copy Channel ID and Channel Secret</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RGeSD4ywCza7aG_PGv0nig.png" /><figcaption>Developer Tools Builder — Paste Channel ID and Secret</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-qVx9JnL8WEBMkWiu7M5xw.png" /><figcaption>After Connected</figcaption></figure><h3>Step 3 Create Gemini API Key</h3><p>ตอนนี้ฝั่ง LINE พร้อมแล้วครับ ต่อไปเราจะเพิ่ม <strong>AI Brain</strong> ให้ LINE Chatbot ของเรา รอบนี้ผมเลือกใช้ <strong>Google Gemini</strong></p><p>เข้าไปที่ <a href="https://aistudio.google.com/app/apikey"><strong>Google AI Studio</strong></a></p><ul><li>จากนั้นเลือกเมนู <strong>API Keys</strong></li></ul><p>หากมี Project ที่ต้องการใช้อยู่แล้ว สามารถเลือก Project นั้นได้เลย แต่ถ้ายังไม่เห็น Project สามารถเลือก “<strong>Import projects” </strong>แล้วเลือก Google Cloud Project ที่ต้องการนำมาใช้งาน</p><ul><li>จากนั้นเลือก <strong>Create API key</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W-S0yFohaA3yxuHPid4Asg.png" /></figure><p>เมื่อสร้างสำเร็จ เราจะได้ API Key สำหรับใช้เรียก Gemini</p><p>ให้ <strong>Copy</strong> เก็บไว้ก่อน เพราะเราจะเอา <strong>Key</strong> นี้ไปใส่ใน Developer Tools Builder ใน Step ถัดไป สำหรับใครที่อยากทดลองเล่นก่อน สามารถเริ่มจาก <strong>Gemini Free Tier</strong> ได้ตาม Model และ Quota ที่รองรับ แต่ต้องเน้นนิดหนึ่งว่า</p><blockquote><strong>Free Tier ≠ Unlimited</strong></blockquote><p>ถ้านำไปใช้กับ Production หรือมี User จำนวนมาก ก็ควรกลับมาตรวจสอบ Rate Limit และค่าใช้จ่ายอีกครั้งครับ</p><h3>Step 4 Connect Gemini เข้ากับ Developer Tools Builder</h3><p>ตอนนี้เรามี</p><pre>LINE Messaging API Channel ✅ <br>Gemini API Key ✅</pre><p>ต่อไปก็ถึงเวลาจับสองอย่างนี้มาเจอกันครับ กลับมาที่ <a href="https://devtoolsbuilder.cloudea.tech/settings">Developer Tools Builder</a></p><p>เลือก Channel ที่เราต้องการ จากนั้นเข้า</p><p><strong>Channel Settings → AI</strong></p><p>ภายใน AI Settings จะมีเมนูสำหรับตั้งค่าต่าง ๆ เช่น</p><pre>Connection<br>Model<br>Auto Reply<br>Role / Prompt</pre><p>เริ่มจากส่วน <strong>Connection</strong></p><p>นำ Gemini API Key ที่สร้างไว้มาใส่ แล้วทำการ Connect</p><p>ถ้าทุกอย่างเรียบร้อย ระบบจะแจ้งว่า API Key สามารถใช้งานได้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nsFSROxH8U6eh4w4Dcs51g.png" /></figure><p>Architecture ของเราตอนนี้จะเริ่มเป็น</p><pre>1. LINE<br>2. Developer Tools Builder<br>3. Gemini</pre><p>นี่คือจุดที่ LINE Chatbot ของเราเริ่มมี AI เข้ามาอยู่ใน Flow แล้วครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CApXtwwBSZ13jkf69YkdJA.png" /></figure><h3>Step 5 Select Gemini 3.5 Flash-Lite</h3><p>หลังจาก Connect Gemini API Key สำเร็จแล้ว เราจะเห็นข้อความยืนยันว่า API Key สามารถใช้งานได้ จากนั้นลงมาที่ส่วน <strong>Select Model </strong>สำหรับบทความนี้ผมเลือก</p><blockquote><a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash-lite?hl=th"><strong>Gemini 3.5 Flash-Lite</strong></a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CmHjs3puIheb85utm6rggw.png" /></figure><p>เพราะเรากำลังทำ LINE Chatbot ซึ่งสิ่งที่ต้องการคือความสมดุลระหว่าง</p><p><strong>เร็ว • ตอบดี • ประหยัด</strong></p><p>โดยเฉพาะเวลา User คุยผ่าน LINE เราไม่อยากให้เขาพิมพ์ “<strong>สวัสดี”</strong></p><p>แล้วต้องรอคำตอบนานเกินไป สำหรับ Tutorial นี้เลือกตัวนี้ตามกันมาได้เลยครับ ส่วนถ้าในอนาคต Use Case ซับซ้อนขึ้น เราค่อยกลับมาเลือก Model ที่เหมาะกับงานอีกครั้ง เมื่อเลือกเรียบร้อยแล้ว ตอนนี้เรามี</p><pre>LINE Messaging API Channel ✅<br>Gemini API Key ✅<br>Gemini 3.5 Flash-Lite ✅</pre><p>ต่อไปเราจะเริ่มทำส่วนที่ทำให้ Bot แต่ละตัว <strong>แตกต่างกันจริง ๆ</strong></p><p>นั่นคือการกำหนดว่า <strong>AI ของเราเป็นใคร ต้องพูดยังไง และอะไรที่มันห้ามทำ</strong></p><p>ไปต่อที่ <strong>Role / Prompt</strong> กันครับ 🚀</p><h3>Step 6 Role / Prompt</h3><p>ต่อมาเป็นส่วนที่ผมชอบที่สุด และเป็นส่วนที่มีผลต่อ Character ของ LINE Chatbot มากที่สุดด้วยครับไปที่</p><p><strong>AI Role / Prompt</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VY_EmHDL55mI-v8xHGtN4Q.png" /><figcaption><strong>Role / Prompt</strong></figcaption></figure><p>ตรงนี้เราจะกำหนดว่า</p><blockquote><strong>AI ตัวนี้เป็นใคร และต้องทำตัวอย่างไร</strong></blockquote><p>ใน <a href="https://devtoolsbuilder.cloudea.tech/settings">Developer Tools Builder</a> ผมเตรียม Template เริ่มต้นไว้หลายแบบ เช่น Customer Service</p><ul><li>Sales Assistant</li><li>FAQ Bot</li><li>Restaurant</li><li>Booking Assistant</li><li>Custom</li></ul><p>สมมติรอบนี้เราจะสร้าง <strong>Customer Service AI</strong></p><p>เราอาจกำหนด System Instruction แบบนี้</p><pre># Role<br>คุณคือผู้ช่วยฝ่ายบริการลูกค้า<br>พูดคุยกับลูกค้าอย่างสุภาพและเป็นมิตร<br><br># Responsibilities<br>1. ตอบคำถามเกี่ยวกับสินค้าและบริการ<br>2. ให้ข้อมูลที่ถูกต้องและเป็นประโยชน์<br>3. หากไม่ทราบข้อมูล ห้ามสร้างคำตอบขึ้นมาเอง<br>4. หากข้อมูลจากลูกค้าไม่ครบ ให้ถามเพิ่มเติมอย่างสุภาพ<br><br># Response Format<br>1. ใช้ภาษาไทยเป็นหลัก<br>2. ตอบสั้น กระชับ<br>3. ไม่เกิน 3–4 ประโยค<br>4. สามารถใช้ Emoji ได้เล็กน้อย<br><br># Constraints<br>1. ห้ามสร้างข้อมูลที่ไม่มีอยู่จริง<br>2. ห้ามเดาราคา<br>3. ห้ามเดาโปรโมชั่น<br>4. หากไม่มั่นใจ ให้แจ้งว่าต้องตรวจสอบข้อมูลเพิ่มเติม</pre><p>ผมชอบคิดเรื่อง Prompt ง่าย ๆ ด้วยคำถาม 4 ข้อครับ</p><pre>AI เป็นใคร?<br>    ↓<br>ต้องทำอะไร?<br>    ↓<br>ควรตอบอย่างไร?<br>    ↓<br>อะไรที่ห้ามทำ?<br></pre><p>ถ้าเราตอบคำถามเหล่านี้ได้ Character ของ LINE Chatbot ก็จะเริ่มชัดขึ้นมากครับ</p><h3>Step 7 Enable AI Auto Reply</h3><p>ตอนนี้เรามีของสำคัญเกือบครบแล้วครับ</p><pre>LINE Messaging API Channel ✅<br>Gemini API Key ✅<br>Gemini 3.5 Flash-Lite ✅<br>Role / Prompt ✅</pre><p>ต่อไปคือการเปิดให้ AI สามารถทำงานแบบ <strong>Auto Reply</strong></p><p>เข้าไปที่</p><p><strong>AI → Auto Reply</strong></p><p>จากนั้นเปิด Toggle <strong>Auto Reply</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*frHI_7fsu60AuFxddaf7xA.png" /></figure><p>ตรงนี้คือการบอก Developer Tools Builder ว่า</p><blockquote><em>เมื่อมีข้อความจาก User เข้ามา ให้นำข้อความไปประมวลผลด้วย Gemini ตาม Role / Prompt ที่เราตั้งไว้ และเตรียมคำตอบกลับไปยัง User</em></blockquote><p>ในฝั่ง AI Flow จะประมาณนี้ครับ</p><pre>User Message<br>     ↓<br>Developer Tools Builder<br>     ↓<br>Role / Prompt<br>     ↓<br>Gemini 3.5 Flash-Lite<br>     ↓<br>Generate Response</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qnuDIkUH1BwbNset41-dwA.png" /></figure><p>ตอนนี้ฝั่ง AI ของเราพร้อมตอบแล้วครับ แต่ยังเหลืออีกหนึ่งเรื่องสำคัญ</p><blockquote><strong>เราต้องทำให้ LINE ส่ง Message Event เข้ามาที่ Developer Tools Builder ให้ได้ก่อน</strong></blockquote><p>ซึ่งตรงนี้เราจะใช้ <strong>Webhook Proxy </strong>ไปต่อกันที่ Step 8 ครับ 🚀</p><h3>Step 8 Setup Webhook Proxy</h3><p>ตอนนี้ AI ของเราพร้อมตอบแล้วครับ แต่ LINE ยังไม่รู้ว่า</p><blockquote><strong>เวลามี User ส่งข้อความเข้ามา จะต้องส่ง Event ไปที่ไหน?</strong></blockquote><p>ตรงนี้เราจะใช้ <a href="https://devtoolsbuilder.cloudea.tech/webhook-proxy"><strong>Webhook Proxy</strong></a> ของ Developer Tools Builder เข้าเมนู</p><p><strong>Automation → Webhook Proxy</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*26KGbCbxbXJgm0gw3ZDjCA.png" /></figure><p>เราจะเจอส่วนที่ชื่อว่า <strong>Your Webhook URL</strong></p><p>Developer Tools Builder จะสร้าง Webhook URL สำหรับ Channel ของเราเอาไว้ให้แล้ว หน้าตาประมาณนี้</p><pre>https://...cloudfunctions.net/webhookProxy/xxxxxxxx</pre><p>Concept ของ Webhook Proxy คือ</p><pre>User<br> ↓<br>LINE Official Account<br> ↓<br>LINE Webhook Event<br> ↓<br>Webhook Proxy<br> ↓<br>Developer Tools Builder</pre><p>Webhook Proxy จึงเปรียบเหมือน <strong>ประตูที่รับ Event จาก LINE เข้ามาใน Developer Tools Builder</strong></p><h4>ตั้ง Webhook URL ให้ LINE Messaging API Channel</h4><p>ในหน้า Webhook Proxy เราจะเห็นสถานะประมาณว่า</p><pre>LINE Status: Not Set</pre><p>หมายความว่า <strong>LINE Messaging API Channel </strong>ของเรายัง<strong>ไม่ได้ตั้งให้ส่ง Webhook</strong> มาที่ URL นี้</p><ol><li>Copy : <strong>Your Webhook URL</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ttbr1xGF05YfXIDJk37UOA.png" /></figure><p>2. เข้า <strong>LINE Developers Console </strong>เลือก Messaging API Channel ของเรา</p><p>แล้วไปที่ <strong>Messaging API → Webhook settings</strong></p><p>นำ URL ไปใส่ใน</p><blockquote><strong>Webhook URL</strong></blockquote><p>จากนั้นตรวจสอบ Verify และเปิด <strong>Use webhook</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/688/1*Axamxh2rDoFjKPoLlTQjsg.png" /></figure><p>เมื่อ Webhook พร้อมแล้ว Flow ทั้งหมดของเราจะกลายเป็น</p><pre>User<br> ↓<br>LINE Official Account<br> ↓<br>LINE Messaging API<br> ↓<br>Webhook Proxy<br> ↓<br>Developer Tools Builder<br> ↓<br>Role / Prompt<br> ↓<br>Gemini 3.5 Flash-Lite<br> ↓<br>Generate Response<br> ↓<br>LINE Reply<br> ↓<br>User</pre><p>ตอนนี้ทุกอย่างพร้อมแล้วครับ 🎉</p><pre>LINE Messaging API Channel ✅<br>Gemini API Key ✅<br>Gemini 3.5 Flash-Lite ✅<br>Role / Prompt ✅<br>Auto Reply ✅<br>Webhook Proxy ✅</pre><p>เหลือคำถามเดียว…<strong>มันตอบจริงไหม? 😆 </strong>ไปลองกันครับ</p><h3>Step 9 ทดลองคุยกับ AI ผ่าน LINE 🎉</h3><p>มาถึง Step สุดท้ายแล้วครับ</p><p>อันนี้คือ Step ที่สนุกที่สุด 😆</p><p>เปิด LINE แล้วเข้า Official Account ที่เราเพิ่งตั้งค่าไว้</p><p>เริ่มง่าย ๆ ด้วยคำว่า</p><blockquote><strong>สวัสดี</strong></blockquote><p>จากที่ผมลอง LINE Chatbot ตอบกลับมาว่า</p><blockquote><em>สวัสดีค่ะ ยินดีให้บริการค่ะ 😊<br>ไม่ทราบว่ามีเรื่องอะไรให้ช่วยดูแลในวันนี้คะ?</em></blockquote><p>จากนั้นลองถามต่อว่า</p><blockquote><strong>คุณทำอะไรได้บ้าง</strong></blockquote><p>AI ก็จะตอบกลับตาม Character และ Role / Prompt ที่เรากำหนดเอาไว้</p><p>Flow ที่เกิดขึ้นเบื้องหลังจริง ๆ คือ</p><pre>&quot;สวัสดี&quot;<br>    ↓<br>LINE<br>    ↓<br>Webhook Proxy<br>    ↓<br>Developer Tools Builder<br>    ↓<br>Gemini 3.5 Flash-Lite<br>    ↓<br>AI Response<br>    ↓<br>LINE</pre><p>🎉 <strong>เรียบร้อยครับ! เรามี LINE AI Chatbot ที่สามารถตอบ User ได้จริงแล้ว</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/746/1*NNiV5_ZNVBHBXGz76K57sw.png" /></figure><h3>สรุปทั้งหมดที่เราทำ</h3><p>ย้อนกลับไปตั้งแต่ต้น เราทำทั้งหมดนี้ครับ</p><pre>Step 0 เตรียของให้พร้อมก่อนเริ่ม<br>Step 1 เข้า Developer Tools Builder<br>Step 2 Connect LINE Messaging API Channel<br>Step 3 Create Gemini API Key<br>Step 4 Connect Gemini เข้ากับ Developer Tools Builder<br>Step 5 Select Gemini 3.5 Flash-Lite<br>Step 6 Role / Prompt<br>Step 7 Enable AI Auto Reply<br>Step 8 Setup Webhook Proxy<br>Step 9 ทดลองคุยกับ AI ผ่าน LINE 🎉</pre><p>จาก LINE Official Account ธรรมดา เราเพิ่ม</p><pre>Developer Tools Builder<br>        +<br>Gemini 3.5 Flash-Lite<br>        +<br>Role / Prompt<br>        +<br>Webhook Proxy</pre><p>จนสุดท้ายกลายเป็น</p><blockquote><strong>LINE AI Chatbot ที่สามารถรับข้อความและตอบกลับ User ได้จริง</strong></blockquote><p>และสำหรับการทดลองหรือทำ Prototype เรายังสามารถเริ่มต้นจาก Free Tier / Free Quota ของบริการที่เกี่ยวข้องก่อนได้ครับ</p><p>แน่นอนว่า</p><blockquote><strong><em>Free Tier ไม่ได้หมายถึง Unlimited</em></strong></blockquote><p>ถ้า LINE Chatbot เริ่มมี User จริงจำนวนมาก หรือมี AI Request เพิ่มขึ้น ก็ควรกลับมาตรวจสอบ Quota, Rate Limit และ Cost ของแต่ละ Service อีกครั้ง</p><h3>ขอบคุณทุกคนที่อ่านมาจนถึงตรงนี้นะครับ 🙏</h3><p>หวังว่าบทความนี้จะช่วยให้เห็นว่า การเริ่มต้นทำ <strong>LINE AI Chatbot</strong> ไม่จำเป็นต้องเริ่มจากระบบที่ซับซ้อนเสมอไป เราก็สามารถเปลี่ยน LINE Official Account ธรรมดา ให้กลายเป็น AI Chatbot ที่ตอบ User ได้จริงแล้วครับ</p><p>ถ้าใครลองทำตามแล้วติดตรงไหน หรือมี Use Case สนุก ๆ ที่อยากเอา AI ไปต่อกับ LINE ลองเอาไปทดลองกันดูนะครับ 😆</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c5c2dbb88f8f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-line-ai-chatbot-%E0%B8%9F%E0%B8%A3%E0%B8%B5%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-developer-tools-builder-gemini-%E0%B9%81%E0%B8%9A%E0%B8%9A-step-by-step-c5c2dbb88f8f">สร้าง LINE AI Chatbot ฟรีด้วย Developer Tools Builder + Gemini แบบ Step by Step</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LINE DEV CONF 2026: Registration is now open — นักพัฒนายุค Agentic AI ห้ามพลาด!]]></title>
            <link>https://medium.com/linedevth/linedevconf2026-registration-is-now-open-e561250336a0?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/e561250336a0</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[linedevth]]></category>
            <category><![CDATA[linedevconf2026]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[tech-conference]]></category>
            <dc:creator><![CDATA[Tan Warit]]></dc:creator>
            <pubDate>Tue, 01 Sep 2026 05:01:01 GMT</pubDate>
            <atom:updated>2026-09-03T03:53:46.136Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PXelQiOjE0ixd_1FJT6M9A.jpeg" /></figure><p>การพัฒนา Software ในยุค 2026 เราก้าวข้ามจุดที่ AI เป็นเพียงผู้ช่วยเขียนฟังก์ชันสั้นๆ ไปสู่ยุค AI Coding Agents ที่ AI กลายเป็น ‘หนึ่งในทีมพัฒนา’ สิ่งที่ตามมาก็คือเมื่อความเร็วในการเขียนโค้ดไม่ใช่ข้อจำกัดอีกต่อไป แล้วเราจะออกแบบ Architecture, ตรวจสอบโค้ด, ควบคุมความปลอดภัย และผสาน AI บน Production อย่างไรให้มัน Seamless และทำงานด้วยกันอย่างราบรื่นที่สุด</p><p>งาน <strong>LINE THAILAND DEVELOPER CONFERENCE 2026 </strong>กลับมาพร้อมธีม <strong>Build the Next Frontier</strong> เพื่อพานักพัฒนาไปหาคำตอบเหล่านี้ผ่าน 2 Track หลัก <strong>Deep Tech</strong> และ <strong>Real World Usecase</strong></p><h4><strong>Deep Tech Stage</strong></h4><ul><li>สถาปัตยกรรม AI และ Cloud Infrastructure สู่ 10x Engineering: ครอบคลุมตั้งแต่ Harness &amp; Loop Engineering, การคุมฝูง AI ด้วย Work Graph, การใช้ MCP และ Sandboxing ไปจนถึง Flex-Security Network บน AWS ที่รองรับสเกลระดับหมื่น RPS อย่างมั่นคง โดยไม่ทิ้ง Human Clarity</li><li>เจาะลึกวิธี “สอนงาน” AI Agent ให้เข้าใจการทำงานของทีม ผ่านการออกแบบ Feedback Loop, Hook และการแยก Subagent เพื่อให้ได้ผลลัพธ์ที่ใช้งานได้จริง โดย<strong>คุณไมค์ </strong><a href="https://medium.com/u/16c4a5efa97f"><strong>Tanitphon Paniwan</strong></a><strong> Mikelopster</strong></li><li>เปิดเฟรมเวิร์กการออกแบบสถาปัตยกรรมสำหรับทีมขนาดเล็ก เมื่อความท้าทายไม่ใช่การเขียนโค้ด แต่คือวิธีวาง Guardrails เพื่อรับมือและตรวจสอบโค้ดมหาศาลที่ AI สร้างขึ้นอย่างปลอดภัย โดย<strong>แอดเปรม </strong><a href="https://medium.com/u/295743d8a0b3"><strong>Kittikorn Prasertsak</strong></a><strong> Born to Dev</strong></li><li>ทบทวนจุดยืนของนักพัฒนาในวันที่อัลกอริทึมฉลาดขึ้นทุกวัน พร้อมแนวคิดการสร้างโปรดักต์และธุรกิจที่ยั่งยืนโดยมี “Humanity” เป็นศูนย์กลาง <strong>โดยพี่ทอย </strong><a href="https://medium.com/u/158b88ccebd8"><strong>Kasidis Satangmongkol</strong></a><strong> DataRockie</strong></li></ul><h4><strong>Real World Use Case Stage</strong></h4><ul><li>โชว์เคสจริงที่เทคโนโลยีพลิกโฉมประสบการณ์ผู้ใช้: ตั้งแต่เปลี่ยนบทสนทนา Group Chat เป็น Automation Workflow, ผสาน Multimodal LLM (Vision + Text) ออกใบเสนอราคาประกันใน 10 วินาที, และเบื้องหลังโซลูชัน O2O อย่าง MINI Eats ที่จับมือกับ LINE MAN Wongnai</li><li>ก้าวข้ามขีดจำกัดการพิมพ์ ด้วยการสร้าง AI ที่ให้ลูกค้าย้ายจากการแชทมาเป็นเสียงพูด (Voice) ได้แบบลื่นไหล โดยที่ระบบยังจดจำบริบทเดิมได้ทั้งหมด <strong>โดยพี่วิน </strong><a href="https://medium.com/u/f9725b09d0e5"><strong>Dr. Winn Voravuthikunchai</strong></a><strong> Botnoi</strong><br>◾ ถอดบทเรียนการทรานส์ฟอร์มองค์กรเทค LMWN สู่ยุค AI-Native และการปรับโครงสร้างการทำงานเมื่อโค้ดกว่า 80% ถูกสร้างด้วย AI โดย<strong>พี่ต้า </strong><a href="https://medium.com/u/b71ddbf76c88"><strong>Ta Virot Chiraphadhanakul</strong></a></li></ul><p>🔥 ห้ามพลาด Panel Discussion พิเศษ: <strong>“NEXT-GEN Survival Guides from Tech Leaders in the AI Era” </strong>เหมาะกับน้องๆ เด็กจบใหม่สาย Dev/Tech และคนทำงานทุกคนที่แอบกังวลว่าจะโดน AI แย่งงาน หรือยังหาทางปรับตัวไม่เจอในวันที่เทคโนโลยีวิ่งเร็วกว่าที่เคย</p><h4>Event Activities</h4><p>นอกจากนี้ยังจัดเต็มกิจกรรมตลอดวัน ทั้ง Hands-on Workshop, Student Consultation ให้น้องๆ นักศึกษาและสาย Junior ได้พูดคุยใกล้ชิดกับพี่ๆ LINE Engineer, Hackathon กิจกรรมประลองฝีมือ, พร้อม Lunch Buffet และ Coffee Break ให้ได้ Network และเติมพลังกันแบบจุใจตลอดงาน!<br><br>👕 แน่นอนว่าในงานสามารถร่วมกิจกรรมแลกเสื้อ LINE DEV T-shirt สุด Limited กลับบ้านไปเป็นที่ระลึก<br>ยังไม่พอ! กิจกรรมพิเศษปีนี้ LINE DEV Escape Room ห้องปริศนาสุดท้าทายที่จะทดสอบทั้งไหวพริบและการแก้โจทย์แบบทีมเวิร์ก ใครชอบชาเลนจ์ห้ามพลาด!<br><br><strong>FREE Register:</strong> <a href="https://www.line-website.com/linedevconf2026">https://www.line-website.com/linedevconf2026</a></p><p><strong>Agenda:</strong> <a href="https://www.line-website.com/linedevconf2026-agenda">https://www.line-website.com/linedevconf2026-agenda</a></p><p>📅 เสาร์ที่ 17 ต.ค 10:00–17:00 น.</p><p>📍BITEC (BTS บางนา ออกประตู 1)</p><p>🇹🇭 บรรยายไทย</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e561250336a0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/linedevconf2026-registration-is-now-open-e561250336a0">LINE DEV CONF 2026: Registration is now open — นักพัฒนายุค Agentic AI ห้ามพลาด!</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ ส่งข้อความรูปภาพ แบบไม่มีพื้นหลัง ง่ายๆ ด้วย Dev Tools Builder]]></title>
            <link>https://medium.com/linedevth/line-dev-tools-builder-d954331d7ec8?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/d954331d7ec8</guid>
            <category><![CDATA[messaging-apis]]></category>
            <category><![CDATA[linedevth]]></category>
            <category><![CDATA[devtoolsbuilder]]></category>
            <category><![CDATA[linedevtool]]></category>
            <dc:creator><![CDATA[Thepnatee Phojan]]></dc:creator>
            <pubDate>Mon, 17 Aug 2026 16:29:18 GMT</pubDate>
            <atom:updated>2026-08-08T01:33:32.198Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VdMYB3mQzMPlK1jiLmOGWg.png" /></figure><p>เคยไหมครับ? อยากส่งข้อความ Broadcast หรือส่งรูปใน LINE Official Account (LINE OA) ให้ดูว้าว ดูพรีเมียมกว่าการส่งรูปสี่เหลี่ยมธรรมดา วันนี้ผมมีเทคนิคการส่งข้อความรูปภาพ <strong>แบบไม่มีพื้นหลัง (Transparent)</strong> มาฝากครับ ซึ่งจะทำให้ตัวการ์ตูนหรือสินค้าของเราดูเหมือนลอยออกมาอยู่บนหน้าแชทเลย!</p><p>โดยเราจะใช้เครื่องมือฟรี 2 ตัวหลักๆ คือ <strong>Remove.bg</strong> สำหรับลบพื้นหลัง และ <strong>Dev Tools Builder</strong> สำหรับสร้างและส่งข้อความครับ มาดูขั้นตอนกันเลย!</p><h4>สิ่งที่ต้องเตรียม</h4><ol><li>รูปภาพที่ต้องการส่ง (เช่น รูปสินค้า, รูป Mascot)</li><li>เครื่องมือลบพื้นหลัง: <a href="https://www.remove.bg/th">https://www.remove.bg/th</a></li><li>เครื่องมือสร้างและส่งข้อความ: <a href="https://ldt-short.web.app/e3vlnz">https://devtoolsbuilder.cloudea.tech</a></li></ol><blockquote>Dev Tools Builder เป็นบริการให้ใช้ฟรีโดยยังไม่ต้อง ผูกกับ Channel ของคุณก็สามารถใช้งานได้ แต่หากต้องการฝากรูป และใช้บริการเต็มรูปแบบแนะนำให้ทำทุกขั้นตอน</blockquote><h4>Step 1: เตรียมภาพให้พื้นหลังโปร่งใส</h4><p>อันดับแรก เราต้องทำให้ภาพของเราไม่มีพื้นหลังก่อนครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gn0uHGKB-GzI2HNoeX1viQ.png" /><figcaption><a href="https://www.remove.bg/th">https://www.remove.bg/th</a></figcaption></figure><ol><li>เข้าไปที่เว็บไซต์ <a href="https://www.remove.bg/th">https://www.remove.bg/th</a></li><li>อัปโหลดรูปภาพของคุณลงไป ระบบจะตัดพื้นหลังออกให้อัตโนมัติอย่างรวดเร็ว</li><li>กดดาวน์โหลดภาพที่เป็น .png (พื้นหลังโปร่งใส) เก็บไว้</li></ol><h4>Step 2: ลงทะเบียนและตั้งค่าเชื่อมต่อ Developer Tools Builder</h4><p>ก่อนจะเริ่มสร้าง Imagemap เราต้องเข้ามาตั้งค่าเครื่องมือให้รู้จักกับ LINE OA ของเราก่อนครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*x2_p2-4yubH1LuyEvrq2UQ.png" /><figcaption><a href="https://ldt-short.web.app/e3vlnz">https://devtoolsbuilder.cloudea.tech</a></figcaption></figure><ol><li>เข้าไปที่ <a href="https://ldt-short.web.app/e3vlnz">https://devtoolsbuilder.cloudea.tech</a></li><li>กดปุ่ม <strong>Login with LINE</strong> เพื่อเข้าสู่ระบบ</li><li>ไปที่เมนู <strong>Setting</strong> ด้านบน</li><li>คุณจะเจอช่องให้กรอก <strong>Channel ID</strong> และ <strong>Channel Secret</strong> ซึ่งเราต้องไปเอาข้อมูลนี้มาจาก <a href="https://developers.line.biz/console/">LINE Developers console</a> ครับ</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XZlU7QykeV-WXfXTyaH7YQ.png" /></figure><p><strong>วิธีหา Channel ID และ Channel Secret: (ใครที่รู้อยู่แล้วไปข้อถัดไปได้เลย)</strong></p><ul><li>ให้ทำตาม Codelab ขั้นตอน ที่ 1–3 <a href="https://codelab.line.me/codelabs/chatbot">https://codelab.line.me/codelabs/chatbot</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GGrgp8YUhAT3WdySMjrLUw.png" /></figure><h4>Step 2: สร้าง Imagemap URL</h4><p>เมื่อได้ภาพไฟล์ PNG ที่ไม่มีพื้นหลังแล้ว เราต้องนำภาพนี้ไปสร้าง Imagemap ครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_qYISKJjtsH5e9nS7gC7CQ.png" /></figure><ol><li>เข้าไปที่เมนู <strong>Imagemap Builder</strong> หรือ ผ่านลิงก์นี้: <a href="https://ldt-short.web.app/3824lu">LINK</a></li><li>ทำการ Upload รูป PNG ที่เราเตรียมไว้จาก Step 1 ลงไปในช่องที่กำหนด</li><li>ตั้งค่า Action Area (จุดที่คลิกได้) ตามต้องการ หากต้องการให้คลิกแล้วลิงก์ไปที่ไหน</li><li>เมื่อตั้งค่าเสร็จแล้ว ให้กดปุ่ม “สร้าง Imagemap ” ข้อมูลจะถูกบันทึกเรียบร้อย</li><li>จะได้ JSON ที่ให้นำไปใช้ต่อได้แล้วครับ 🎉</li><li>สามารถดูประวัติที่เคยได้ด้วยที่เมนู existing-imagemaps</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R84Zk7GH9CzDZDvFDB0TnA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m4lQ7Nk_RgWVzJeOgC-aKg.png" /></figure><h4>Step 3: ส่งข้อความเข้า LINE (Optional)</h4><p>ขั้นตอนสุดท้าย คือการนำ Code หรือข้อมูลที่ได้ มายิงเข้าสู่ห้องแชทครับ<br>เนื่องเพื่อนๆต้องต้องลงทะเบียน Channel ก่อน จึงจะสามารถส่งข้อความได้</p><ol><li>ไปที่เมนู <strong>Send Message</strong> ผ่านลิงก์นี้: <a href="https://ldt-short.web.app/9v5im3">LINK</a></li><li>เลือกประเภทข้อความเป็น <strong>Imagemap</strong></li><li>เลือก Imagemap ที่สร้างไว้ หรือ JSON ที่ได้จาก Step 2 มาใส่ในช่องข้อมูล</li><li>ตรวจสอบความถูกต้อง แล้วกด <strong>Send</strong> ได้เลย!</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hyRKMvSFVNqmkl5SXxD7Bg.png" /></figure><h3>ผลลัพธ์ที่ได้</h3><p>เมื่อกดส่งเรียบร้อย ลองเปิดมือถือดูใน LINE ครับ ภาพที่ส่งมาจะเป็น Imagemap ที่ไม่มีกรอบสี่เหลี่ยมกวนใจ ตัวละครหรือสินค้าจะดูลอยเด่นขึ้นมาบนหน้าจอแชทแบบสวยงามมากครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CSqSQzFub0-L9Ux4OLu5ww.png" /><figcaption><em>ภาพผลลัพธ์ในหน้าแชท LINE ที่โชว์รูปแบบไม่มีพื้นหลัง</em></figcaption></figure><p>ลองเอาไปปรับใช้กันดูนะครับ วิธีนี้ช่วยเพิ่มลูกเล่นให้ LINE OA ของเราดูไม่น่าเบื่อและมีความเป็นมืออาชีพขึ้นเยอะเลยครับ!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d954331d7ec8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/line-dev-tools-builder-d954331d7ec8">🎉 ส่งข้อความรูปภาพ แบบไม่มีพื้นหลัง ง่ายๆ ด้วย Dev Tools Builder</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Short Links เครื่องมือใหม่ฟรีใน Dev Tools Builder ย่อ URL + Track ที่มาของ Follower…]]></title>
            <link>https://medium.com/linedevth/short-links-%E0%B9%80%E0%B8%84%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88%E0%B9%83%E0%B8%99-line-dev-tools-builder-%E0%B8%A2%E0%B9%88%E0%B8%AD-url-track-%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8%B2%E0%B8%82%E0%B8%AD%E0%B8%87-follower-cc97eb97f24d?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/cc97eb97f24d</guid>
            <category><![CDATA[utm]]></category>
            <category><![CDATA[short-link]]></category>
            <category><![CDATA[devtoolsbuilder]]></category>
            <category><![CDATA[linedevtool]]></category>
            <dc:creator><![CDATA[Thepnatee Phojan]]></dc:creator>
            <pubDate>Mon, 17 Aug 2026 16:26:24 GMT</pubDate>
            <atom:updated>2026-08-21T08:34:15.415Z</atom:updated>
            <content:encoded><![CDATA[<h3>🎉 Short Links เครื่องมือใหม่ฟรีใน Dev Tools Builder ย่อ URL + Track ที่มาของ Follower ได้ในตัวเดียว</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*scKf3Fz9PBpU808LAPxuiA.png" /></figure><p>สวัสดีครับเพื่อนๆ ชาว LINE Developers วันนี้ผมมีคำถามชวนคิดมาฝากครับ…</p><p>“ลูกค้าที่กด Add LINE OA ของเรา มาจากช่องทางไหนกันแน่?”</p><p>มาจากโฆษณา Facebook? Instagram Story? QR code หน้าร้านสาขา A หรือสาขา B? Influencer คนไหน? Email Broadcast? หรือเพื่อนแชร์ต่อ?</p><p>ถ้าเพื่อนๆ ตอบไม่ได้ก็ไม่ต้องตกใจครับ เพราะส่วนใหญ่ก็ตอบไม่ได้เหมือนกัน 555+ (ผมเองก็เคยตอบไม่ได้นะครับ)</p><p>แต่ปัญหาคือ.. ถ้าเราไม่รู้ว่า traffic มาจากไหน เราก็ไม่รู้ว่าจะทุ่มงบโฆษณาไปทางไหนถึงจะคุ้ม ใช่มั๊ยล่ะครับ?</p><p>บริษัทใหญ่ๆ เค้าใช้ Google Analytics + Bitly แบบจ่ายรายเดือน เพื่อแก้ปัญหานี้ครับ</p><p>แต่.. ถ้าผมบอกว่า “มีเครื่องมือเริ่มต้นใช้งานฟรี ที่ทำได้ครบในตัวเดียว แถมยังบอกได้ด้วยว่า User คนนี้ใน LINE คือใคร” เพื่อนๆ จะลองมั๊ยครับ?</p><p>แท่น แท๊นนน 🎉</p><h4>วันนี้ผมอยากแนะนำฟีเจอร์ <strong>Short Links</strong> บน <a href="https://devtoolsbuilder.cloudea.tech/">Dev Tools Builder</a> ครับ</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LsJM0uTjw9WEJNY76UksEw.png" /><figcaption><a href="https://devtoolsbuilder.cloudea.tech/short-links">https://devtoolsbuilder.cloudea.tech/short-links</a></figcaption></figure><p>🎯 Short Links คืออะไร? ทำอะไรได้บ้าง?</p><p>หลายคนคงคุ้นกับ <a href="https://bitly.com/pages/th">Bitly</a>, <a href="https://tinyurl.com/">TinyURL</a> ใช่มั๊ยครับ? ที่เอา URL ยาวๆ มาย่อให้สั้น</p><p>Short Links บน Dev Tools Builder ทำได้แบบนั้นแหละครับ.. แต่ทำได้มากกว่า</p><p>มาดูกันเลยว่ามีอะไรบ้าง:</p><p>✅ ย่อ URL ยาว ให้สั้นและจำง่าย (custom code ได้)</p><p>✅ สามารถกำหนด UTM Parameters ได้เลย</p><p>✅ Track click แบบ real-time กี่คลิก, มาจาก OS อะไร, browser อะไร</p><p>✅ เชื่อมกับ <a href="https://developers.line.biz/en/docs/liff/">LIFF</a> เพื่อจับ LINE User ID รู้เลยว่า user คนไหนใน LINE เป็นคนคลิก</p><p>✅ Export CSV ทั้ง link list และ click logs ไปวิเคราะห์ต่อใน Excel ได้</p><p>✅ ปิด/เปิด link ได้ตลอด ไม่ต้องลบทิ้ง</p><p>✅ ตั้งวันหมดอายุได้</p><p>✅ Generate QR Code ในตัว ไม่ต้องไปหาเว็บอื่น</p><p>เป็นไงครับเพื่อนๆ ดูครบเครื่องดีมั๊ยล่ะ 😎</p><h4><strong>💡 ตัวอย่างเคส ก่อนลงมือทำ</strong></h4><p>เพื่อให้เห็นภาพชัดขึ้น ผมยกตัวอย่างเคสที่เพื่อนๆ น่าจะเอาไปใช้จริงได้เลย:</p><p><strong>เคสที่ 1: รู้ว่าโฆษณาตัวไหน convert ดีสุด</strong></p><p>ยิงแอด Facebook กับ Instagram พร้อมกัน 2 ตัว แต่ขี้เกียจดู Ads Manager?</p><p>เราสามารถสร้าง short link 2 อันแยก utm_source ทันที จบ</p><p><strong>เคสที่ 2: QR Code หน้าร้านแต่ละสาขา</strong></p><p>เปิดร้าน 5 สาขา อยากรู้ว่า QR Code Add LINE สาขาไหนคนสแกนเยอะสุด แปะ short link คนละตัวกับ utm_campaign คนละชื่อ ดูจบในหน้าเดียว</p><p><strong>เคสที่ 3: เช็คประสิทธิภาพ Rich Menu vs Broadcast</strong></p><p>ปล่อยลิงก์โปรโมชั่นเดียวกัน ทั้งใน Rich Menu และ Broadcast + utm_medium ต่างกัน รู้เลยว่าช่องทางไหนคนกดเยอะกว่า</p><p><strong>เคสที่ 4: ตามรอย KOL/Influencer</strong></p><p>แจก short link คนละตัวให้ Influencer 10 คน เห็นชัดว่าคนไหนเอาเงินไปแล้วเงียบ คนไหนทำงานคุ้มค่า 🔥 (เคสนี้แอบโหดนะครับ 555+)</p><p><strong>เคสที่ 5 (เคสเด็ดของวันนี้): รู้ว่า Add LINE มาจากไหน</strong></p><p>นี่คือเคสที่ทำให้ผมรักฟีเจอร์นี้ครับ — เดี๋ยวเราจะลงรายละเอียดในส่วนถัดไป</p><p>🚀 เริ่มใช้งาน มาดูทีละขั้นกันครับ</p><h4><strong>Step 1: เพิ่ม Channel เข้าระบบก่อน</strong></h4><p>ก่อนจะใช้ Short Links ได้ เราต้อง Connect LINE OA ของเราเข้ามาที่ <a href="https://devtoolsbuilder.cloudea.tech/">Dev Tools Builder</a> ก่อนครับ</p><p>1. เข้าไปที่หน้า “Channels” หรือเมนูซ้ายมือ</p><p>2. กดปุ่ม “+ Add Channel”</p><p>3. กรอก Channel ID, Channel Secret Token จาก <a href="https://developers.line.biz/console/">LINE Developers Console</a></p><p>4. ระบบจะ verify credential ให้อัตโนมัติ ถ้าผ่าน ขึ้นไฟเขียวเลยครับ ✅</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Flf4aWEaXNdtSlhNutlgAA.png" /></figure><p>(ถ้าใครยังไม่มี LINE OA หรือไม่รู้จะหา credential จากไหนให้เริ่มต้นได้จาก <a href="https://codelab.line.me/codelabs/n8n-line-ai-agent/index.html#0">LINE Codelab </a>หัวข้อที่ 3 Step ที่ 7 นี้)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rzlWWJiOSdel8E-pDuSQ8g.png" /><figcaption><a href="https://manager.line.biz/">LINE Official Account Manager</a></figcaption></figure><h4><strong>Step 2: เปิดหน้า Short Links</strong></h4><p>เมื่อมี Channel แล้ว ไปที่เมนูซ้ายมือ คลิก “Short Links”</p><p>จะเห็นหน้าจอว่างๆ ใส่ตัวอย่าง Use Case ให้ดู กดปุ่ม “<strong>+ Create Short Link</strong>” ที่มุมขวาบนได้เลยครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hOv_dRLUrZN7s1Xg0KxbSQ.png" /></figure><h4><strong>Step 3: สร้าง Short Link แรก</strong></h4><p>Dialog เปิดมา จะมีฟิลด์ให้กรอกประมาณนี้:</p><p>🔹 <strong>Destination URL</strong> (จำเป็น) URL ปลายทางที่จะให้ redirect ไป เช่น</p><pre>https://lin.ee/XGcZYNU (Add Friend URL ของ LINE OA)</pre><p>🔹 <strong>Short Code </strong>(ไม่จำเป็น) ถ้าไม่กรอก ระบบ <strong>random ให้ 6 ตัว </strong>อยากให้สื่อความ ก็กรอกเองได้ เช่น `<strong>fb-jan2026</strong>`, `<strong>ig-promo</strong>`, `<strong>qr-siamparagon</strong>`</p><p>🔹 <strong>Title / Description </strong>ใส่ไว้กันลืม ไม่งั้นเปิดมา 50 ลิงก์ จำไม่ได้ครับ 555+</p><p>🔹 <strong>UTM Parameters section</strong> (อันนี้แหละครับ พระเอก)</p><ul><li>Source มาจากไหน เช่น<strong> facebook, instagram, line, email</strong></li><li>Medium มาแบบไหน เช่น <strong>chat, broadcast, rich_menu, social</strong></li><li>Campaign แคมเปญอะไร เช่น <strong>“add_friend_jan2026”</strong></li><li>Term / Content ใส่เพิ่มได้ถ้าทำ A/B Test</li></ul><p>🔹 <strong>Settings</strong></p><ul><li><strong>LIFF ID ถ้าใส่ จะจับ LINE User ID ของคนคลิกได้ด้วย (สำคัญมาก!)</strong></li><li>Open External บังคับเปิดใน browser นอก LINE app</li><li>Expiry Date วันหมดอายุ (optional)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DsnYVDBc0AU1NhCVbzrrQA.png" /></figure><h4><strong>Step 4: คัดลอกไปใช้งาน</strong></h4><p>พอกด Save จะได้ URL หน้าตาประมาณนี้ครับ:</p><pre>https://ldt-short.web.app/line-may-2026</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZNBj6EoagCYcrHqCZvjYhQ.png" /></figure><p>สั้น สวย น่ากด 😎</p><p>กดปุ่ม <strong>QR Code</strong> จะ generate รูปออกมาให้ ใช้พิมพ์ใบปลิวต่อได้เลย</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cTcAd9kORV8WBVhNkqextA.png" /></figure><h4><strong>🔥 เคสเด็ด: รู้ว่า Add LINE มาจากช่องทางไหน</strong></h4><p>เอาล่ะ มาที่เคสที่ผมรอจะเล่าให้ฟัง</p><p>สมมติว่าเดือนนี้ผมเปิดแคมเปญ Add LINE OA ของร้าน ปล่อยพร้อมกัน 4 ช่องทาง:</p><p>1. โฆษณา Facebook</p><p>2. Instagram Story</p><p>3. QR Code ในไลฟ์ Tiktok</p><p>4. Email Broadcast ส่งหาลูกค้าเก่า</p><p>ปกติเราจะไม่รู้เลยว่าคนที่ Add มาวันนี้ 100 คน มาจากช่องไหนกันแน่</p><p>วิธีที่ผมทำ:</p><p>สร้าง Short Link 4 อัน ทุกอันชี้ไปที่ LIFF Add Friend URL เดียวกัน แต่ใส่ UTM ต่างกัน</p><pre>| Short Code   | Destination    | utm_source | utm_medium | utm_campaign |<br>| `addline-fb` | Add Friend URL | facebook   | paid_ads   | jan_2026     |<br>| `addline-ig` | Add Friend URL | instagram  | story      | jan_2026     |<br>| `addline-tt` | Add Friend URL | tiktok     | live       | jan_2026     |</pre><p>เสร็จแล้วก็เอาแต่ละ short link ไปวางในช่องทางของตัวเอง ผ่านไป 1 อาทิตย์ เข้ามาดูได้เลย ผ่าน Dashboard</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Egl2mR-IfbTFbYlW5WvtFQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SCtuBcz2Tkgl6gpsxiXSDg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zWgedcg5gvuIMRuh2pk3Qg.png" /></figure><p>แถมเพราะใส่ <strong>LIFF ID</strong> ไว้ ระบบจับ LINE User ID ของคนที่คลิกได้ด้วย</p><p>ที่เด็ดกว่านั้น — เพื่อนๆ ส่ง broadcast เฉพาะคนที่มาจาก IG ก็ทำได้ครับ ถ้าจับคู่กับฟีเจอร์ <a href="https://devtoolsbuilder.cloudea.tech/audience">Audience</a> ของ Dev Tools Builder (อันนี้ผมจะเขียนแยกอีกบทความนึง 😉)</p><p>แน่นอนว่ามันคือข้อมูลล้วนๆ ที่ใช้ตัดสินใจ ว่าเดือนหน้าจะทุ่มงบไปทาง IG หรือ TikTok ดี</p><h4>เป็นไงครับเพื่อนๆ Short Links บน Dev Tools Builder ตอบโจทย์มั๊ย?</h4><p>สรุปข้อดี:</p><p>✅ ฟรี เริ่มใช้ได้เลย ไม่ต้องจ่ายอะไรก่อน</p><p>✅ ทำได้ทั้งย่อ URL + Track ทุกอย่าง ไม่ต้องสลับเครื่องมือไป-มา</p><p>✅ เชื่อมกับ LINE User ID ได้ → รู้ลึกว่า “ใคร” คลิก ไม่ใช่แค่ “กี่คน”</p><p>✅ Export CSV ไปวิเคราะห์ต่อใน Excel / Google Sheets / Looker Studio ได้</p><p>ถ้าเพื่อนๆ กำลังจะปล่อย campaign Add LINE OA, ยิงโปรโมชั่นข้ามหลายช่องทาง, หรืออยากรู้ว่าโฆษณาตัวไหนคุ้มที่สุด ฟีเจอร์นี้ตอบโจทย์มากครับ</p><p>ลองสร้าง Short Link แรกแล้วเอาไปทดสอบดูครับ ใช้เวลาแค่ 2 นาที 🚀</p><p>แล้วเดี๋ยวบทความหน้า ผมจะพาไปลึกขึ้น เอา Short Link มาเชื่อมกับ Audience + Broadcast เฉพาะกลุ่ม (segment marketing แบบเท่ๆ ไม่ต้องจ่าย Bitly Pro)</p><p>ใครติดปัญหา หรืออยากให้รีวิวฟีเจอร์ไหนเพิ่ม คอมเมนต์มาคุยกันได้นะครับ 😉</p><p>แล้วพบกันใหม่ในบทความหน้าครับ</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cc97eb97f24d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/short-links-%E0%B9%80%E0%B8%84%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88%E0%B9%83%E0%B8%99-line-dev-tools-builder-%E0%B8%A2%E0%B9%88%E0%B8%AD-url-track-%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8%B2%E0%B8%82%E0%B8%AD%E0%B8%87-follower-cc97eb97f24d">🎉 Short Links เครื่องมือใหม่ฟรีใน Dev Tools Builder ย่อ URL + Track ที่มาของ Follower…</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[จัดการ Rich Menu บน LINE ด้วย LINE Bot SDK​ Python แบบครบวงจร]]></title>
            <link>https://medium.com/linedevth/rich-menu-line-bot-sdk-python-bc304bc59ae2?source=rss----6d98077302db---4</link>
            <guid isPermaLink="false">https://medium.com/p/bc304bc59ae2</guid>
            <category><![CDATA[line-bot]]></category>
            <category><![CDATA[linemessagingapi]]></category>
            <category><![CDATA[rich-menu]]></category>
            <category><![CDATA[line-chatbot]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Punsiri Boonyakiat]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 07:47:08 GMT</pubDate>
            <atom:updated>2026-07-14T07:55:04.891Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BMm9ZhRy2PTWZBOMwq83NA.png" /></figure><blockquote>อยากให้ <strong>Rich Menu</strong> สร้าง–ลบ–สลับได้อัตโนมัติจากโค้ด <strong>Python</strong> ไหม?<br>ในบทความนี้ บีทจะมาต่อยอดด้วยการรวมทุกฟังก์ชันการจัดการ <strong>Rich Menu</strong> ไว้ครบ ผ่าน <a href="https://github.com/line/line-bot-sdk-python"><strong>LINE Bot SDK Python</strong></a><strong> </strong>เพื่อแบ่งปันให้เพื่อน ๆ ได้ลองใช้จริง</blockquote><blockquote>แถม!! <a href="https://github.com/punsiriboo/line-rich-menu-python/">มี GitHub Repo ทีรวมโค้ดมาให้แล้ว</a> clone ไปใช้ได้เลย!!</blockquote><blockquote>และที่สำคัญใหม่ล่าสุด! ✨ เราสามารถดูข้อมูล สถิติการใช้งาน Rich Menu ของเราผ่าน Python SDK ได้เช่นกัน !!</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BuvQFookFaeUork1.png" /><figcaption>Ref: “<a href="https://medium.com/linedevth/%E0%B9%80%E0%B8%81%E0%B9%88%E0%B8%87-rich-menu-%E0%B9%83%E0%B8%99-line-messaging-api-%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%84%E0%B8%A3%E0%B8%9A%E0%B8%AA%E0%B8%B9%E0%B8%95%E0%B8%A3-6cf12b394f38">เก่ง Rich Menu ใน LINE ให้ครบสูตร</a>”</figcaption></figure><blockquote>สำหรับใครที่ยังไม่เคยเรียนรู้พื้นฐานเกี่ยวกับ LINE Rich Menu บีทแนะนำให้อ่านบทความ <strong>“</strong><a href="https://medium.com/linedevth/%E0%B9%80%E0%B8%81%E0%B9%88%E0%B8%87-rich-menu-%E0%B9%83%E0%B8%99-line-messaging-api-%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%84%E0%B8%A3%E0%B8%9A%E0%B8%AA%E0%B8%B9%E0%B8%95%E0%B8%A3-6cf12b394f38"><strong>เก่ง Rich Menu ใน LINE ให้ครบสูตร</strong></a><strong>”</strong> ควบคู่ไปด้วยนะคะ จะได้เห็นภาพครบทุกมิติ</blockquote><blockquote>ถ้าพร้อมแล้วมาดูเนื้อหากัน !</blockquote><pre>#Table of Contents <br>1. Introduction to LINE Rich Menu<br>2. Rich Menu JSON Schema<br>3. Rich Menu Life Cycle<br>4. Rich Menu Management in Python<br>      4.1 Start Using LINE Bot SDK Python<br>      4.2 Validate &amp; Create Rich Menu in Python<br>      4.3 List &amp; Get Detail  to Rich Menu in Python<br>      4.4 Upload &amp; Get Images to Rich Menu in Python<br>      4.5 Set a Default Rich Menu in Python<br>      4.6 Link &amp; Unlink Per-User Rich Menu in Python<br>      4.7 Check Rich Menu Insight<br>      4.8 Delete Rich Menu<br><br>5. ส่งท้าย!!</pre><h3>1. Introduction to LINE Rich Menu</h3><blockquote>“LINE Chatbot ที่ไม่มี Rich Menu ก็เหมือนเดินเข้าร้านอาหารแล้ว ไม่มีรายการอาหารให้ หรือ ไปเที่ยวแล้วไม่มีแผนที่” — กล่าวโดย Tech Evangelist ท่านหนึ่ง</blockquote><h4>1.1 What is a Rich Menu?</h4><p>เชื่อว่านักพัฒนา LINE Developer ส่วนใหญ่คงรู้จัก Rich Menu กันเป็นอย่างดี ซึ่งเป็นเมนูแบบโต้ตอบ (Interactive Menu) ที่ปรากฏอยู่ด้านล่างหน้าต่าง chat ของ LINE Official Account (LINE OA) ช่วยให้ผู้ใช้งานสามารถเข้าถึง feature หรือบริการต่าง ๆ ได้อย่างรวดเร็วผ่านปุ่มเมนูที่สามารถออกแบบเองได้ เช่น ปุ่มดูโปรโมชั่น ปุ่มเปิดกล้อง ปุ่มติดต่อเจ้าหน้าที่ หรือปุ่มเปลี่ยนภาษา โดยการออกแบบ Rich Menu ที่ดีนั้น ไม่เพียงแต่ช่วยเพิ่มความสะดวกให้กับผู้ใช้งาน แต่ยังช่วยยกระดับประสบการณ์การใช้งาน LINE Chatbot ของเราอีกด้วย</p><h4>1.2 How to Design a Rich Menu</h4><blockquote>แล้วเราควรจะออกแบบ Rich Menu ของเราอย่างไรดี?</blockquote><p>จากภาพด้านล่างคือเว็บไซต์ <a href="https://manager.line.biz/">LINE OA Manager</a> ที่เราสามารถเข้าไปสร้างหรือแก้ไข Rich Menu ได้โดยตรง สำหรับผู้เริ่มต้น แนะนำให้ศึกษาจาก <a href="https://static.line-scdn.net/biz-app/16bd9ea9e03/manager/static/LINE_rich_menu_design_template.zip">Design Template</a> ที่ใช้ในการออกแบบ Rich Menu ซึ่งมีให้เลือกใช้งานอยู่ 2 ขนาดหลัก ได้แก่ Large (ขนาดใหญ่) และ Compact (ขนาดเล็ก) โดยทั้งสองขนาดนี้สามารถแบ่งพื้นที่เป็นปุ่มย่อยได้ตามรูปแบบมาตรฐานที่ LINE กำหนดไว้ หรือจะเลือกใช้แบบ Free Style เพื่อออกแบบตำแหน่งปุ่มเองก็ได้เช่นกัน ซึ่งหากเรา ดาวน์โหลด <a href="https://static.line-scdn.net/biz-app/16bd9ea9e03/manager/static/LINE_rich_menu_design_template.zip">Design Template</a> ก็จะมีรูปภาพที่สามารถใช้เป็น Guideline ในการออกแบบได้ค่ะ</p><p>แต่หากเพื่อน ๆ ยังไม่มั่นใจในการออกแบบ Rich Menu ด้วยตนเอง ก็สามารถใช้เครื่องมือชื่อว่า <a href="https://lineforbusiness.com/richmenumaker/?source=post_page-----6cf12b394f38---------------------------------------">Rich Menu Maker</a> ซึ่งเป็นบริการของ LINE for Business ที่ช่วยให้การออกแบบ Rich Menu เป็นเรื่องง่ายและสะดวกมากยิ่งขึ้น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uDIArY3X_shDbOZRVjAZwQ.png" /><figcaption><a href="https://static.line-scdn.net/biz-app/16bd9ea9e03/manager/static/LINE_rich_menu_design_template.zip">Design Template</a> in Rich Menu in OA Manager</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WIh_13TsrRJbTTosUFIaqw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a8hqzJqPAEgMCP0ELmNOSQ.png" /><figcaption><a href="https://static.line-scdn.net/biz-app/16bd9ea9e03/manager/static/LINE_rich_menu_design_template.zip">Design Template</a> for Rich Menu</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dwUfXW5wfUgFirVJ6dzVaA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XRtv8vGZMIX0NBKpLKa6RQ.png" /><figcaption><a href="https://lineforbusiness.com/richmenumaker/?source=post_page-----6cf12b394f38---------------------------------------">Rich Menu Maker</a></figcaption></figure><blockquote>เลือก Rich Menu Template ที่ออกแบบมาแล้วใน Canva</blockquote><p>อีกหนึ่งเว็บไซต์ที่อยากแนะนำสำหรับการออกแบบกราฟิกเพื่อใช้สร้าง Rich Menu ก็คือ <a href="https://www.canva.com/templates/?query=LINE-Rich-Menu">Canva</a> ซึ่งหากลองค้นหาด้วยคำว่า “LINE Rich Menu” จะพบว่ามีตัวอย่าง Template กราฟิก ให้เลือกมากมาย ซึ่งสามารถนำมาดัดแปลง แก้ไขให้เหมาะกับ LINE Official Account ของเราได้ทันที</p><p>ปัจจุบันมีผู้ออกแบบ Template ไว้หลากหลาย ครอบคลุมแทบทุกประเภทธุรกิจ ไม่ว่าจะเป็นความงาม สุขภาพ อาหาร ร้านกาแฟ บริการขนส่ง หรือแม้แต่คาร์แคร์ ก็มีให้เลือกใช้งานครบถ้วน พร้อมให้เรานำไป ปรับใช้กับ LINE Chatbot ของเราได้อย่างสะดวกและรวดเร็ว</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GDxc4oYuIVqVgiEApYmdUg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HRGF6LagP3S2KWAyVYnEvA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FPhVXMn-9XjQssSPkXTc8A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2YkMXfhhIXiK2dS-lZYilw.png" /><figcaption>ตัวอย่าง Graphic Design ของ​ LINE Rich Menu จาก Canvas</figcaption></figure><h3>2. Rich Menu JSON Schema</h3><blockquote>ต่อจาก ข้อ 1 ที่เรามี Graphic Design สวย ๆ ของ Rich Menu แล้ว</blockquote><blockquote><strong>คำถาม</strong>: “จะรู้ได้อย่างไรว่าเวลาผู้ใช้กดตรงไหน จะเกิดอะไรขึ้น?”<br><strong>คำตอบ</strong>: เราต้อง กำหนดตำแหน่งและคำสั่งของปุ่ม แต่ละปุ่มไว้ใน areas ของ <strong>Rich Menu JSON Schema</strong> ค่ะ ​ ซึ่งในหัวข้อนี้จะมาขยายความในส่วนนี้ค่ะ</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uKBeXw1mB4pfW2F76sBmRg.png" /><figcaption>Rich Menu Areas editor from <a href="https://devtoolsbuilder.cloudea.tech/rich-menu-builder">Rich Menu Builder</a></figcaption></figure><h4>2.1 Action &amp; Bounding Box</h4><p>นักพัฒนา LINE Chatbot จะทราบดีว่า การสร้าง <strong>Rich Menu JSON Schema </strong>นั้น เราจำเป็นต้องระบุ bounding box ของแต่ละส่วนใน Rich Menu ว่าพื้นที่ใดจะทำงานอย่างไร ซึ่งแต่ละส่วนสามารถกำหนด <a href="https://developers.line.biz/en/reference/messaging-api/#action-objects">Action</a> ที่แตกต่างกันได้ตามความต้องการ</p><p>โดย Action ที่รองรับมีหลายรูปแบบ เช่น:</p><pre>1.message → ส่งข้อความอัตโนมัติกลับไปยังผู้ใช้<br>2.postback → ส่งข้อมูลลับๆ (hidden data) กลับไปที่ server ใช้ใน logic ต่อไป<br>3.uri → เปิด link เช่น เว็บไซต์หรือแอปพลิเคชัน<br>4.richmenuswitch → สลับไปมายัง Rich Menu อื่นที่ถูกกำหนดไว้<br>5.datetimepicker → เปิดตัวเลือกวันที่และเวลาให้ผู้ใช้เลือก<br>6.camera → เปิดกล้องถ่ายรูปเพื่อส่งภาพ<br>7.cameraRoll → เปิดคลังภาพ (gallery) ให้ผู้ใช้เลือกภาพ<br>8.location → เปิดหน้าต่างให้ผู้ใช้แชร์ตำแหน่งที่ตั้งปัจจุบัน<br>9.clipboard → คัดลอกข้อความที่กำหนดไว้ไปยังคลิปบอร์ดของผู้ใช้</pre><p><strong>ตัวอย่าง Rich Menu JSON Schema</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L7_Plo6HIprBYKX4Dqdelg.png" /></figure><h4>2.2 Example Schema Generation with Gemini</h4><p>Trick &amp; Tip — นอกจากการเขียนโค้ดด้วยตนเองแล้ว ปัจจุบันเรายังสามารถใช้ AI อย่าง <a href="https://gemini.google.com/app">Gemini</a> มาช่วยสร้าง Rich Menu JSON Schema ได้อีกด้วย เพียงแค่เราออกแบบ Rich Menu ให้เสร็จ แล้วส่งภาพพร้อมเขียน Prompt บอก AI ว่าต้องการให้สร้าง JSON Schema โดยระบุ Bounding Box และ Action ของแต่ละปุ่ม AI ก็จะช่วยร่างโครงสร้างออกมาให้ทันที</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tvTVTd5IR4geUf6sQXzr0Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A7V9c1tXGcYOyPSsXiiT_Q.png" /><figcaption>ตัวอย่างการส่งรูป RichMenu ที่เราทำการออกแบบแล้วเพื่อให้ Gemini ช่วยในการสร้าง Rich Menu Schema</figcaption></figure><p>จากรูปด้านบนจะเห็นว่า บีทได้ส่งภาพ Rich Menu ที่ออกแบบเสร็จเรียบร้อยแล้วไปยัง <a href="https://gemini.google.com/app">Gemini</a> พร้อมทั้งเขียน Prompt เพื่อสั่งให้ AI ช่วยสร้าง JSON Schema โดยระบุ Bounding Box สำหรับการกดปุ่มแต่ละตำแหน่ง และให้แสดงผลใน Canvas ของ <a href="https://gemini.google.com/app">Gemini</a></p><h3>3. Rich Menu Life Cycle</h3><p>ในกระบวนการการจัดการ Rich Menu นั้นมีตั้งแต่เริ่มออกแบบไปจนถึงทำการสร้างละตั้งค่าให้ผู้ใช้ทุกคน หรือบางคน</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*x6P-hz1JFi_ewKudkkOgEQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GXL9Bvh0Re3ZEYhXWN0UjA.png" /><figcaption>Ref: <a href="https://developers.line.biz/en/reference/messaging-api/#rich-menu">https://developers.line.biz/en/reference/messaging-api/#rich-menu</a></figcaption></figure><p>การจัดการ Rich Menu หลายคนอาจมองว่าเป็นเรื่องง่าย แต่เมื่อได้ลองลงมือทำจริง ๆ จะพบว่ามีหลายขั้นตอนและกระบวนการที่ต้องเข้าใจ หากต้องการทำงานอย่างมืออาชีพบน LINE Messaging API เราควรรู้จักวงจรชีวิต (Life Cycle) ของ Rich Menu ซึ่งสามารถแบ่งออกได้เป็นขั้นตอนหลัก ๆ ตาม API ของ LINE Messaging API ได้ดังนี้</p><ol><li><strong>Validate/ Create — ตรวจสอบโครงสร้าง Rich Menu และสร้าง Rich Menu</strong></li></ol><pre>POST /v2/bot/richmenu → สร้าง Rich Menu<br>POST /v2/bot/richmenu/validate → ตรวจสอบว่า JSON Schema ถูกต้องก่อนใช้งานจริง</pre><p><strong>2. Upload / Get Content — ใส่รูปตามโครงสร้างของ Rich Menu ที่สร้างไว้</strong></p><pre>POST /v2/bot/richmenu/{richMenuId}/content → อัปโหลดรูปภาพเข้า Rich Menu ตาม richMenuId ที่ระบุ<br>GET /v2/bot/richmenu/{richMenuId}/content → ดึงรูปภาพของ Rich Menu ออกมา ตาม richMenuId ที่ระบุ</pre><p><strong>3. List/ Read — เรียกดู Rich Menu ทั้งหมด หรือบางตัว</strong></p><pre>GET /v2/bot/richmenu/list → เรียกดู Rich Menu ทั้งหมดในระบบ<br>GET /v2/bot/richmenu/{richMenuId} → อ่านข้อมูลของ Rich Menu เฉพาะตัว ตาม richMenuId ที่ระบุ</pre><p><strong>4. กำหนด Default Rich Menu ให้ผู้ใช้ทุกคน หรือเฉพาะคน</strong></p><pre>POST /v2/bot/user/all/richmenu/{richMenuId} → กำหนด Default Rich Menu ให้ผู้ใช้ทุกคน<br>GET /v2/bot/user/all/richmenu → ตรวจสอบ Default Rich Menu ปัจจุบัน<br>POST /v2/bot/user/{userId}/richmenu/{richMenuId} → กำหนด Rich Menu ให้ผู้ใช้ตาม UserID ที่กำหนด<br>DELETE /v2/bot/user/{userId}/richmenu/{richMenuId} → ยกเลิก Rich Menu ให้ผู้ใช้ตาม UserID ที่กำหนด</pre><p><strong>5. Delete — ลบ Rich Menu หรือ ยกเลิก Default Rich Menu</strong></p><pre>DELETE /v2/bot/richmenu/{richMenuId} → ลบ Rich Menu<br>DELETE /v2/bot/user/all/richmenu → ยกเลิก Default Rich Menu</pre><p>6. <strong>Insight — ดูสถิติการใช้งาน Rich Menu</strong></p><pre>GET /v2/bot/insight/richmenu/{richMenuId}/summary -&gt; ดูสถิติแบบสรุป<br>GET /v2/bot/insight/richmenu/{richMenuId}/daily -&gt; ดูสถิติรายวัน</pre><h3>4. Rich Menu Management in Python</h3><p>แน่นอนว่า การจัดการ Rich Menu ตลอดทั้ง Life Cycle นั้น สามารถดำเนินการได้ครบถ้วนผ่าน REST API ของ LINE Messaging API อย่างไรก็ตาม สำหรับนักพัฒนาที่คุ้นเคยกับภาษา Python ก็ไม่ต้องกังวล เพราะในบทความส่วนนี้ เราจะเลือกใช้ <a href="https://github.com/line/line-bot-sdk-python">LINE Bot SDK Python</a> เพื่อจัดการ Rich Menu ครบทุกขั้นตอน ตั้งแต่การสร้าง แก้ไข การลบและการผูก Rich Menu กับผู้ใช้งาน จบถึงดูสถิติโดยเนื้อหาในหัวข้อนี้จะแบ่งออกเป็นหัวข้อย่อยดังต่อไปนี้</p><pre>4.1 Start Using LINE Bot SDK Python<br>4.2 Validate &amp; Create Rich Menu in Python<br>4.3 List &amp; Get Detail to Rich Menu in Python<br>4.4 Upload &amp; Get Images to Rich Menu in Python<br>4.5 Create Rich Menu Alias in Python<br>4.6 Set a Default Rich Menu in Python<br>4.7 Link &amp; Unlink Per-User Rich Menu in Python<br>4.8 Check Rich Menu Insight<br>4.9 Delete Rich Menu</pre><p>โดยอยากบอกทุกคนว่า Source code ของ Python ทั้งหมดบีทได้รวบรวมไว้ให้ใน <a href="https://github.com/punsiriboo/line-rich-menu-python/">GitHub Repo นี้แล้วกดๆ ได้เลยค่ะ</a></p><h4>4.1 Start Using LINE Bot SDK Python</h4><p>LINE Bot SDK for Python เป็น libary ที่ช่วยให้นักพัฒนาสามารถเชื่อมต่อและใช้งาน LINE Messaging API ได้สะดวกขึ้น โดยไม่จำเป็นต้องเรียก API โดยตรง เหมาะสำหรับคนที่อยากพัฒนา LINE และถนัดในการใช้ภาษา Python</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1K493vzaC-2h4XoE.png" /><figcaption><a href="https://github.com/line/line-bot-sdk-python">https://github.com/line/line-bot-sdk-python</a></figcaption></figure><p>เราสามารถติดตั้งแพ็กเกจผ่านคำสั่ง pip install line-bot-sdk ซึ่งปัจจุบันรองรับ <strong>LINE Bot SDK v3</strong> โดยหากต้องการพัฒนาและจัดการ <strong>Rich Menu</strong> คลาสหลักที่ใช้งานจะอยู่ภายใต้ linebot.v3 ซึ่งในบทความนี้จะใช้งานอยู่ 3 คลาสหลัก ได้แก่ <strong>MessagingApi</strong>, <strong>MessagingApiBlob</strong> และ <strong>Insight</strong></p><ul><li><strong>MessagingApi</strong> ใช้สำหรับสื่อสารกับผู้ใช้งานและควบคุมการทำงานหลักของ LINE Chatbot ที่ไม่เกี่ยวข้องกับไฟล์หรือรูปภาพ เช่น การส่งและตอบข้อความ การดึงข้อมูลผู้ใช้ การจัดการ Rich Menu และ Rich Menu Alias</li><li><strong>MessagingApiBlob</strong> ใช้สำหรับจัดการข้อมูลประเภทไฟล์ โดยเฉพาะการอัปโหลดรูปภาพสำหรับ Rich Menu และการดึงรูปภาพของ Rich Menu กลับมาใช้งาน</li><li><strong>Insight</strong> เป็นคลาสสำหรับเรียกดูสถิติต่าง ๆ ของ LINE Official Account เช่น ข้อมูลเชิงประชากร (Demographic) ของผู้ใช้งาน จำนวนข้อความที่ส่งผ่านบัญชี และสถิติการใช้งานหรือการคลิก Rich Menu</li></ul><p>ทั้งสามคลาสนี้ครอบคลุมการทำงานหลักที่จำเป็นสำหรับการสร้าง จัดการ และวิเคราะห์การใช้งาน Rich Menu ผ่าน LINE Bot SDK for Python</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qYhYLgpzkO2oQj4Q2JhDwA.png" /></figure><p>ในการเริ่มต้นใช้งาน เราสามารถติดตั้งแพ็กเกจ line-bot-sdk จากนั้นจึง Import คลาสที่เกี่ยวข้อง และเชื่อมต่อกับบริการของ LINE ผ่านค่า CHANNEL_ACCESS_TOKEN</p><p>จากตัวอย่างโค้ดด้านบน จะเห็นว่ามีการสร้างตัวแปร messaging_api สำหรับเรียกใช้งานฟังก์ชันทั่วไปในการจัดการ Rich Menu ขณะที่ messaging_api_blob ใช้สำหรับจัดการข้อมูลประเภทไฟล์ เช่น รูปภาพและ Content ต่าง ๆ</p><p>ส่วนสำคัญคือการกำหนดค่าใน Configuration โดยส่ง CHANNEL_ACCESS_TOKEN เข้าไป เพื่อใช้ยืนยันตัวตนและเชื่อมต่อกับ LINE Messaging API</p><p><strong>ตัวอย่างโค้ดในการ Import คลาส และ </strong><strong>Configuration :</strong></p><pre>import os<br>from pathlib import Path<br>from dotenv import load_dotenv<br>from linebot.v3.messaging import Configuration, ApiClient, MessagingApi, RichMenuRequest<br>from linebot.v3.insight import Insight<br><br>load_dotenv(override=True, dotenv_path=Path(__file__).resolve().parent / &quot;.env&quot;)<br><br>configuration = Configuration(access_token=os.getenv(&quot;CHANNEL_ACCESS_TOKEN&quot;))<br>api_client = ApiClient(configuration)<br>messaging_api = MessagingApi(api_client)</pre><h4>4.2 Validate &amp; Create Rich Menu in Python</h4><p>ในส่วนนี้เราจะเรียนรู้การสร้าง Rich Menu ผ่าน LINE Bot SDK for Python ซึ่งประกอบด้วยฟังก์ชันที่เกี่ยวข้องได้แก่</p><ul><li>ตรวจสอบความถูกต้องของ JSON Structure — messaging_api.validate_rich_menu_object</li><li>สร้าง Rich Menu — messaging_api.create_rich_menu</li></ul><p>จากตัวอย่างโค้ดด้านล่าง จะเห็นว่ามีการเรียกใช้ validate_rich_menu_object() เพื่อตรวจสอบความถูกต้องของโครงสร้าง JSON ก่อน จากนั้นจึงเรียก create_rich_menu() เพื่อสร้าง Rich Menu โดยอ่านรายละเอียดจากไฟล์ JSON ซึ่งกำหนดข้อมูลต่าง ๆ เช่น ขนาด (Size), พื้นที่กด (Areas) และ Action ของแต่ละเมนู ก่อนส่งไปสร้าง Rich Menu บน LINE Official Account</p><p><strong>ตัวอย่างโค้ดในการตรวจสอบ และ สร้าง Rich Menu :</strong></p><pre>def create_rich_menus(rich_menu_file: str):<br>    try:<br>        with open(rich_menu_file, &quot;r&quot;) as f:<br>            richmenu_json = f.read()<br>        rich_menu_request = RichMenuRequest.from_json(richmenu_json)<br>        messaging_api.validate_rich_menu_object(rich_menu_request=rich_menu_request)<br>        api_response = messaging_api.create_rich_menu(rich_menu_request=rich_menu_request)<br>        print(f&quot;Successfully created rich menu from {rich_menu_file} with ID: {api_response.rich_menu_id}&quot;)<br>        return api_response.rich_menu_id<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br>        return None</pre><p>ข้อดีของการเรียกใช้ฟังก์ชัน Validate คือช่วยตรวจสอบความถูกต้องของ JSON Structure ของ Rich Menu ก่อนทำการสร้างจริง หากโครงสร้างมีข้อผิดพลาด ระบบจะแจ้งรายละเอียดของข้อผิดพลาด พร้อมระบุบรรทัดหรือจุดที่เกิดปัญหา ทำให้สามารถแก้ไขได้อย่างรวดเร็วและตรงจุด</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LwaFO9DCGsYnEIM4ro4olA.png" /><figcaption>ตัวอย่างการ Validate Rich Menu ซึ่งจะแจ้งว่ามีข้อผิดผพลาดตรงไหน</figcaption></figure><p>หากการ​​สามารถตรวจสอบและสร้าง Rich Menu ได้สำเร็จก็จได้ ID ของ Rich Menu</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ntTj-q7NrSoS09Nq7isdYw.png" /><figcaption>ตัวอย่างหลังรันสำเร็จ</figcaption></figure><h4><strong>4.3 List &amp; Get Detail to Rich Menu in Python</strong></h4><p>ในการตรวจสอบจำนวน Rich Menu ที่มี และรายละเอียดของ Rich Menu แต่ละตัวเราสามารถที่จะใช้ฟังก์ชันดังต่อไปนี้</p><ul><li>แสดงรายการ Rich Menu ทั้งหมด — messaging_api.get_rich_menu_list</li><li>ดู Rich Menu — messaging_api.get_rich_menu</li></ul><p><strong>ตัวอย่างโค้ดในการดู Rich Menu ทั้งหมด และ รายละเอียด Rich Menu ด้วย ID:</strong></p><pre>from linebot.v3.messaging import Configuration, ApiClient, MessagingApi<br><br>load_dotenv(override=True, dotenv_path=Path(__file__).resolve().parent / &quot;.env&quot;)<br>configuration = Configuration(access_token=os.getenv(&quot;CHANNEL_ACCESS_TOKEN&quot;))<br>api_client = ApiClient(configuration)<br>messaging_api = MessagingApi(api_client)<br><br>def get_rich_menu_list():<br>    try:<br>        response = messaging_api.get_rich_menu_list()<br>        print(f&quot;Total rich menus: {len(response.richmenus)}&quot;)<br>        for rm in response.richmenus:<br>            print(f&quot;- {rm.rich_menu_id}: {rm.name}&quot;)<br>        return response<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br><br>def get_rich_menu(rich_menu_id: str):<br>    try:<br>        response = messaging_api.get_rich_menu(rich_menu_id)<br>        print(f&quot;Rich menu ID: {response.rich_menu_id}&quot;)<br>        print(f&quot;Name: {response.name}&quot;)<br>        print(f&quot;Chat Bar Text: {response.chat_bar_text}&quot;)<br>        print(f&quot;Size: {response.size.width}x{response.size.height}&quot;)<br>        print(f&quot;Areas: {len(response.areas)}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><p>เมื่อรันโค้ดด้านบน จะได้รายการ Rich Menu ทั้งหมดที่ถูกสร้างไว้ใน LINE Official Account ของเรา จากนั้นสามารถนำค่า rich_menu_id ไปเรียกใช้งานฟังก์ชัน get_rich_menu เพื่อดึงรายละเอียดของ Rich Menu แต่ละรายการได้ ไม่ว่าจะเป็นชื่อ (Name), ขนาด (Size), จำนวนพื้นที่กด (Bounding Box) รวมถึง Action ของแต่ละพื้นที่ที่กำหนดไว้ใน JSON Schema</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VjlEILNWDz3yTRjAOpRBFA.png" /><figcaption>ตัวอย่างผลลัพธ์ของการ List Rich Menu</figcaption></figure><h4><strong>4.4 Upload &amp; Get Images to Rich Menu in Python</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UtXWxvJef-r-cd7BjXFWNg.png" /></figure><p>หลังจากมีโครงสร้างแล้วเราจะต้องทำการอัพโหลด และตรวจสอบรูปของ Rich Menu ด้วย โดยใช้ function ดังนี้</p><ul><li>อัปโหลดรูปภาพ — messaging_api.set_rich_menu_image</li><li>ดูรูปภาพปัจจุบัน — messaging_api.get_rich_menu_image</li></ul><p>จากในตัวอย่างโค้ดด้านล่างจะเห็นการสร้างฟังก์ในการสร้าง Rich Menu โดยเรียกคำสั่ง set_rich_menu_image ซึ่งเราจะต้องระบุ rich_menu_id และ file path ของรูปที่เราต้องการจะใช้เพื่อสร้าง Rich Menu</p><p><strong>ตัวอย่างโค้ดในการ upload รูปภาพของ Rich Menu :</strong></p><pre><br>from linebot.v3.messaging import Configuration, ApiClient, MessagingApiBlob<br><br>load_dotenv(override=True, dotenv_path=Path(__file__).resolve().parent / &quot;.env&quot;)<br>configuration = Configuration(access_token=os.getenv(&quot;CHANNEL_ACCESS_TOKEN&quot;))<br>api_client = ApiClient(configuration)<br>messaging_api_blob = MessagingApiBlob(api_client)<br><br>def upload_richmenu_image(rich_menu_id: str, image_path: str):<br>    try:<br>        with open(image_path, &quot;rb&quot;) as f:<br>            image_bytes = f.read()<br>        messaging_api_blob.set_rich_menu_image(<br>            rich_menu_id,<br>            body=image_bytes,<br>            _headers={&quot;Content-Type&quot;: &quot;image/jpeg&quot;},<br>        )<br>        print(f&quot;Uploaded: {image_path}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><p>หลังจากสร้าง Rich Menu เรียบร้อยแล้ว หากต้องการตรวจสอบรูปภาพที่อัปโหลดไว้ สามารถใช้ฟังก์ชัน get_rich_menu_image เพื่อเรียกดูรูปภาพที่เราทำการอัปโหลดไปแล้วได้ โดยผลลัพธ์ที่ได้จะอยู่ในรูปแบบ bytearray ของตัวรูปภาพ และเราสามารถใช้ Python library ที่ชื่อว่า Pillow ทำการเปิดภาพออกมาแสดงโดยใช้ฟังก์ชันImage.open เพื่อแปลงและแสดงรูปภาพของ Rich Menu ได้ตามตัวอย่างโค้ดด้านล่าง</p><p><strong>ตัวอย่างโค้ดในการดึงรูปภาพของ Rich Menu ด้วย ID :</strong></p><pre><br>def get_richmenu_image(rich_menu_id: str, show: bool = False):<br>    try:<br>        image_data = messaging_api_blob.get_rich_menu_image(rich_menu_id)<br>        img = Image.open(BytesIO(image_data))<br>        print(f&quot;Downloaded: {len(image_data)} bytes, Size: {img.size}, Mode: {img.mode}&quot;)<br>        if show:<br>            img.show()<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><p>เมื่อรันฟังก์ชันด้านบน จะได้ผลลัพธ์เป็นรูปภาพของ Rich Menu ตาม rich_menu_id ที่ระบุ พร้อมรายละเอียดของรูปภาพ เช่น ขนาด (Width, Height), รูปแบบไฟล์ (Format) และโหมดสี (Color Mode) ซึ่งช่วยให้สามารถตรวจสอบได้ว่ารูปภาพที่อัปโหลดไปยัง LINE Official Account ถูกต้องและพร้อมใช้งาน</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QS_hos6JSWxMBYBnzKr8oQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rVg674iAYxmNktpqYvU1Qg.png" /><figcaption>ตัวอย่างผลลัพธ์การรันเพื่อดูรูปของ Rich Menu โดยระบุ ID</figcaption></figure><h4>4.5 Create Rich Menu Alias in Python</h4><p>นอกเหนือกจากสร้าง Rich Menu แล้วเราสามารถ ตั้งชื่อเล่นให้กับ Rich Menu ของเราได้ด้วย โดยใช้ฟังก์ชัน create_rich_menu_aliasมีหน้าที่ สร้าง Rich Menu Alias ซึ่งเป็นชื่ออ้างอิง (Alias) ให้กับ Rich Menu ID จริง เพื่อให้เราสามารถอ้างอิง Rich Menu ด้วยชื่อที่จำง่าย และรองรับการ Rich Menu Switching ได้สะดวกในอนาคต</p><ul><li>สร้าง Rich Menu Alias — messaging_api.create_rich_menu_alias</li><li>แก้ไข Rich Menu Alias — messaging_api.update_rich_menu_alias</li><li>ลบ Rich Menu Alias — messaging_api.delete_rich_menu_alias</li></ul><p><strong>ตัวอย่างการจัดการ Rich Menu Alias:</strong></p><pre>def create_rich_menu_alias(rich_menu_alias_id: str, rich_menu_id: str):<br>    try:<br>        messaging_api.create_rich_menu_alias(<br>            CreateRichMenuAliasRequest(<br>                rich_menu_alias_id=rich_menu_alias_id,<br>                rich_menu_id=rich_menu_id,<br>            )<br>        )<br>        print(f&quot;Created alias {rich_menu_alias_id} -&gt; {rich_menu_id}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br><br><br>def delete_rich_menu_alias(rich_menu_alias_id: str):<br>    try:<br>        messaging_api.delete_rich_menu_alias(rich_menu_alias_id)<br>        print(f&quot;Deleted alias: {rich_menu_alias_id}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><h4>4.6 Set a Default Rich Menu in Python</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eIAtTYZRYJyFvb-CpGhZSA.png" /></figure><p>หากต้องการกำหนด Rich Menu หลัก (Default Rich Menu) ให้แสดงกับผู้ใช้งานทุกคนใน LINE Official Account สามารถใช้งานฟังก์ชันสำหรับกำหนดและยกเลิก Rich Menu หลักได้ โดย Rich Menu นี้จะถูกแสดงเป็นค่าเริ่มต้นสำหรับผู้ใช้ทุกคนที่ยังไม่ได้กำหนด Rich Menu แบบรายบุคคล ซึ่งมีฟังก์ชันที่ใช้งานดังต่อไปนี้</p><ul><li>ตั้งค่า Rich Menu — messaging_api.set_default_rich_menu</li><li>ตรวจสอบ Rich Menu หลัก — messaging_api.get_default_rich_menu</li><li>ยกเลิก Rich Menu หลัก — messaging_api.cancel_default_rich_menu</li></ul><p><strong>ตัวอย่างโค้ดของการตั้งค่า Default Rich Menu:</strong></p><pre>def set_default_rich_menu(rich_menu_id: str):<br>    try:<br>        messaging_api.set_default_rich_menu(rich_menu_id)<br>        print(f&quot;Set default rich menu: {rich_menu_id}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br><br>def get_default_rich_menu():<br>    try:<br>        response = messaging_api.get_default_rich_menu_id()<br>        print(f&quot;Default rich menu ID: {response.rich_menu_id}&quot;)<br>        return response.rich_menu_id<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br>        return None<br><br>def cancel_default_rich_menu():<br>    try:<br>        messaging_api.cancel_default_rich_menu()<br>        print(&quot;Canceled default rich menu&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><h4>4.7 Link &amp; Unlink Per-User Rich Menu in Python</h4><p>อีกหนึ่งความสามารถที่น่าสนใจของ LINE Messaging API คือ การกำหนด Rich Menu รายบุคคล (Per-user Rich Menu) ซึ่งสามารถนำไปประยุกต์ใช้กับ Rich Menu Switching เพื่อสลับหน้า Rich Menu ตามเงื่อนไขต่าง ๆ เช่น สถานะผู้ใช้งาน สิทธิ์การใช้งาน หรือเมื่อผู้ใช้กดเมนูบางรายการ ทำให้ผู้ใช้แต่ละคนสามารถเห็น Rich Menu ที่แตกต่างกันได้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sjh3_K46y6Q4PJ2RYDx83A.png" /></figure><p>ฟังก์ชันที่ใช้สำหรับกำหนด Rich Menu รายบุคคลมีดังนี้</p><ul><li>Link Rich Menu ให้แต่ละคนด้วย user ID — messaging_api.link_rich_menu_to_user</li><li>Unlink Rich Menu — messaging_api.unlink_rich_menu_from_user</li><li>ตรวจสอบ Rich Menu ที่ใช้งานอยู่ด้วย user ID — messaging_api.get_rich_menu_id_of_user</li></ul><p><strong>ตัวอย่างโค้ดของการจัดการ Rich Menu รายบุคคล:</strong></p><h4>4.8 Check Rich Menu Insight</h4><p>🚨🚨🚨 ข่าวใหม่ล่าสุดปี 2026! LINE เปิดตัว 2 API ใหม่ ที่ช่วยให้นักพัฒนาสามารถดึงข้อมูลสถิติของ Rich Menu ที่สร้างผ่าน Messaging API ได้แล้ว 🎉</p><p>ข่าวนี้ถือเป็นข่าวดีมาก ๆ สำหรับนักพัฒนา เพราะที่ผ่านมา Rich Menu ที่สร้างผ่าน API ยังมีข้อจำกัดด้านการดูสถิติ แต่ตอนนี้เราสามารถตรวจสอบข้อมูลการใช้งานและจำนวนการคลิกในแต่ละพื้นที่ของ Rich Menu ได้โดยตรงผ่าน LINE Messaging API ที่สำคัญบทความนี้มาพร้อมโค้ด Python ที่บีทเอามาให้ดูด้วย :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T5gJWl_4tpiIeANJ3YnK2g.png" /><figcaption>ข่าวจาก LINE Developers Thailand</figcaption></figure><p>โดยใน line-bot-sdk จะต้องทำการ import คลาสของ Insight เข้ามาใช้งานก่อนซึ่ง คลาสนี้จะจัดการเกี่ยวกับการดึงของมูลทางสถิติของ LINE OA ทั้งหมด</p><p><strong>ตัวอย่างโค้ดการ import คลาส Insight มาใช้งาน:</strong></p><pre>from linebot.v3.insight import ApiClient, Configuration, Insight<br><br>load_dotenv(override=True, dotenv_path=Path(__file__).resolve().parent / &quot;.env&quot;)<br>configuration = Configuration(access_token=os.getenv(&quot;CHANNEL_ACCESS_TOKEN&quot;))<br>api_client = ApiClient(configuration)<br>insight_api = Insight(api_client)</pre><p>ก่อนจะดึงข้อมูลสถิติของ Rich Menu เรามาทำความรู้จักกับ API ที่ใช้สำหรับ Insight กันก่อน ซึ่งใน LINE Bot SDK จะมีอยู่ 2 รูปแบบหลัก ดังนี้</p><ul><li>Get rich menu insight totals — สำหรับดูสถิติแบบสรุป insight_api.get_rich_menu_insight_summary</li><li>Get rich menu insight by day — การใช้งานแบบรายวัน insight_api.get_rich_menu_insight_daily</li></ul><p>จากตัวอย่างโค้ดด้านล่าง จะเห็นว่าในการเรียกใช้งาน API ทั้งสองรูปแบบ จำเป็นต้องระบุ rich_menu_id ของ Rich Menu ที่ต้องการวิเคราะห์ และสำหรับการดึงข้อมูลแบบรายวัน (get_rich_menu_insight_daily) จะต้องกำหนด วันที่เริ่มต้น (start) และ วันที่สิ้นสุด (end) ของช่วงเวลาที่ต้องการดูสถิติด้วย เพื่อให้สามารถวิเคราะห์แนวโน้มการใช้งานในแต่ละวันได้อย่างละเอียด โดยตัวอย่างโค้ดในการดึงข้อมูลสถิติของการใช้งาน Rich Menu มีดังนี้</p><pre>def get_rich_menu_summary(rich_menu_id: str, from_date: str, to_date: str):<br>    try:<br>        response = insight_api.get_rich_menu_insight_summary(rich_menu_id, from_date, to_date)<br>        print(f&quot;Summary {rich_menu_id} ({from_date} - {to_date})&quot;)<br>        pprint(response)<br>        return response<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br>        return None<br><br>def get_rich_menu_daily(rich_menu_id: str, from_date: str, to_date: str):<br>    try:<br>        response = insight_api.get_rich_menu_insight_daily(rich_menu_id, from_date, to_date)<br>        print(f&quot;Daily {rich_menu_id} ({from_date} - {to_date})&quot;)<br>        pprint(response)<br>        return response<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br>        return None</pre><p>จากตัวอย่างด้านล่างจะเป็นผลลัพธ์ที่ได้จากการดึงข้อมูลสถิติ ซึ่งมาในรูปแบบของ Python Object​ ซึ่งก็ทำให้ดูยาก เราสามารถที่จะแปลงเป็น JSON หรือ สร้างเป็น Visualization ให้ดูง่ายขึ้นได้เช่นกัน</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PCVeVpl6HelnpGkwrNEqSQ.png" /><figcaption>ผลลัพธ์จากฟังก์ชัน get_rich_menu_insight_summary</figcaption></figure><p>ในบทความนี้ เราได้เอาผลของget_rich_menu_insight_summary() หรือ get_rich_menu_insight_daily() มาจัดรูปแบบเป็น DataFrame และส่งต่อให้ไลบรารี Plotly เพื่อสร้างกราฟแสดงผลแบบ Interactive ได้</p><p>การแสดงผลในรูปแบบกราฟจะช่วยให้เรามองเห็นภาพรวมและแนวโน้มการใช้งาน Rich Menu ได้ชัดเจนยิ่งขึ้น เช่น จำนวนครั้งที่ผู้ใช้งานกด Rich Menu ในแต่ละวัน หรือเปรียบเทียบจำนวนการกดของแต่ละปุ่ม bounding boxใน Rich Menu เพื่อดูว่าปุ่มหรือเมนูใดได้รับความสนใจมากที่สุด ข้อมูลเหล่านี้สามารถนำไปใช้ประกอบการวิเคราะห์และปรับปรุงการออกแบบ Rich Menu ให้สอดคล้องกับพฤติกรรมของผู้ใช้งานได้อย่างมีประสิทธิภาพมากขึ้น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EwK4HdatdiO2HK_DQdfy1g.png" /><figcaption>การทำงานของ line-bot-sdk Insight ในบทความนี้</figcaption></figure><p><strong>ตัวอย่างขอโค้ดที่ทำการส่งต่อผลสถิติไป plot เพื่อแสดงผลเป็นกราฟ:</strong></p><pre>def plot_summary(response):<br>    rows = [<br>        {&quot;label&quot;: &quot;Impressions&quot;, &quot;metric&quot;: &quot;Count&quot;, &quot;value&quot;: response.impression.metrics.count},<br>        {&quot;label&quot;: &quot;Impressions&quot;, &quot;metric&quot;: &quot;Unique users&quot;, &quot;value&quot;: response.impression.metrics.unique_users},<br>    ]<br>    for i, click in enumerate(response.clicks or []):<br>        rows.append({&quot;label&quot;: f&quot;Area {i + 1}&quot;, &quot;metric&quot;: &quot;Count&quot;, &quot;value&quot;: click.metrics.count})<br>        rows.append({&quot;label&quot;: f&quot;Area {i + 1}&quot;, &quot;metric&quot;: &quot;Unique users&quot;, &quot;value&quot;: click.metrics.unique_users})<br><br>    fig = px.bar(<br>        pd.DataFrame(rows),<br>        x=&quot;label&quot;,<br>        y=&quot;value&quot;,<br>        color=&quot;metric&quot;,<br>        barmode=&quot;group&quot;,<br>        title=f&quot;Rich Menu Summary ({response.metrics_from} - {response.metrics_to})&quot;,<br>        labels={&quot;label&quot;: &quot;&quot;, &quot;value&quot;: &quot;Count&quot;, &quot;metric&quot;: &quot;Metric&quot;},<br>    )<br>    fig.show()<br><br><br>if __name__ == &quot;__main__&quot;:<br>    rich_menu_id = &quot;richmenu-1d2e62eb1e49dc5e98de2a3a72ae4369&quot;<br>    from_date, to_date = &quot;20260701&quot;, &quot;20260711&quot;<br>    summary = get_rich_menu_summary(rich_menu_id, from_date, to_date)<br>    daily = get_rich_menu_daily(rich_menu_id, from_date, to_date)<br>    plot_summary(summary)<br>    plot_daily(daily)</pre><p>เมื่อส่งข้อมูลสถิติการใช้งาน Rich Menu ไปสร้างกราฟด้วย Plotly เราก็จะได้ Interactive Graphs ที่สามารถโต้ตอบกับข้อมูลได้ ไม่ว่าจะเป็นการซูม, เลื่อนดูข้อมูล, แสดงรายละเอียดของแต่ละจุดข้อมูลเมื่อเลื่อนเมาส์ตามข้อมูลที่สนใจได้ตามตัวอย่างรูปด้านล่าง</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ctnua94pK2PNKSjJP-Z8oA.png" /><figcaption>ตัวอย่าง Interactive Graph ที่ได้จาก ของ get_rich_menu_insight_summary</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RferQVm7TB6YlJ_Gf2lR6w.png" /><figcaption>ตัวอย่าง Interactive Graph ที่ได้จาก ของ get_rich_menu_insight_daily</figcaption></figure><h4>4.8 Delete Rich Menu</h4><p>หลังจากใช้งาน Rich Menu เสร็จแล้ว หรือไม่ต้องการใช้งานอีกต่อไป เราสามารถลบทั้ง Rich Menu และ Rich Menu Alias ผ่าน LINE Bot SDK ได้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H3jYHTIgnVCvB6J4BXYIpA.png" /></figure><ul><li>ลบ Rich Menu — messaging_api.delete_rich_menu</li><li>ลบ Rich Menu Alias — messaging_api.delete_rich_menu_alias</li></ul><p>จากตัวอย่างโค้ดด้านล่าง จะเห็นว่ามีการเรียกใช้ delete_rich_menu โดยระบุ rich_menu_id ที่ต้องการลบ และ delete_rich_menu_aliasโดยระบุ rich_menu_alias_id ที่ต้องการลบ</p><pre>def delete_rich_menu(rich_menu_id: str):<br>    try:<br>        messaging_api.delete_rich_menu(rich_menu_id)<br>        print(f&quot;Deleted rich menu: {rich_menu_id}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)<br><br>def delete_rich_menu_alias(rich_menu_alias_id: str):<br>    try:<br>        messaging_api.delete_rich_menu_alias(rich_menu_alias_id)<br>        print(f&quot;Deleted alias: {rich_menu_alias_id}&quot;)<br>    except Exception as e:<br>        print(f&quot;Error: {e}&quot;)</pre><h3>5. ส่งท้าย!!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*b9rStGNjy_vQ7Nb-19DzGA.png" /></figure><p>ท้ายที่สุดแล้ว ในยุคที่ AI สามารถเข้ามาช่วยเราเขียนโค้ดได้อย่างมีประสิทธิภาพ หลายคนอาจตั้งคำถามว่า “เรายังจำเป็นต้องเขียนบทความอยู่ไหม”</p><p>สำหรับบีท คำตอบคือ ทั้งการทำความเข้าใจโค้ดและการเขียนบทความยังคงสำคัญเสมอ💚 AI ช่วยให้เราเขียนโค้ดได้เร็วขึ้น แต่การทำความเข้าใจว่าโค้ดนั้นทำงานอย่างไร ยังคงเป็นทักษะที่ขาดไม่ได้ ขณะเดียวกัน การเขียนบทความก็เป็นวิธีที่ดีที่สุดวิธีหนึ่งในการทบทวนความรู้ และแบ่งปันให้กับคนอื่น บีทเชื่อว่า ความรู้ที่ถูกแบ่งปันจะสร้างคุณค่าได้เสมอ และหวังเป็นอย่างยิ่งว่าบทความนี้จะเป็นประโยชน์กับใครสักคนที่กำลังศึกษาเรื่องเดียวกันอยู่ค่ะ</p><blockquote>หากบทความนี้ถูกใจ หรือมีส่วนช่วยให้คุณได้ไอเดียใหม่ ๆ อย่าลืมกด 👏 ปรบมือ และ แชร์บทความ เพื่อเป็นกำลังใจให้บีทด้วยนะคะ ขอบคุณมาก ๆ ที่ติดตามอ่านมาจนถึงตรงนี้ 💚</blockquote><h3>Reference:</h3><ul><li><a href="https://developers.line.biz/en/docs/messaging-api/switch-rich-menus/">https://developers.line.biz/en/docs/messaging-api/switch-rich-menus</a></li><li><a href="https://medium.com/linedevth/richmenu-swich-action-ba3aa0a9f80a">เพิ่ม Speed การสลับริชเมนูใน LINE แบบ Personalize ให้เร็วระดับแสงด้วย Richmenu Switch Action</a></li><li><a href="https://medium.com/linedevth/%E0%B9%80%E0%B8%81%E0%B9%88%E0%B8%87-rich-menu-%E0%B9%83%E0%B8%99-line-messaging-api-%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%84%E0%B8%A3%E0%B8%9A%E0%B8%AA%E0%B8%B9%E0%B8%95%E0%B8%A3-6cf12b394f38">เก่ง Rich Menu ใน LINE ให้ครบสูตร</a></li><li><a href="https://medium.com/linedevth/line-richmenu-insight-api-c75bea97fdee">ดูสถิติ Rich Menu ที่สร้างผ่าน LINE Messaging API แบบละเอียดได้ง่าย ๆ เพียงปลายนิ้ว</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bc304bc59ae2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/linedevth/rich-menu-line-bot-sdk-python-bc304bc59ae2">จัดการ Rich Menu บน LINE ด้วย LINE Bot SDK​ Python แบบครบวงจร</a> was originally published in <a href="https://medium.com/linedevth">LINE Developers Thailand</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>