ทดลองสร้าง Line @ Bot แบบมั่วๆ

Sunday, October 9, 2016 9:21 PM 57 Comments , ,

Line ได้ออก API สำหรับ Line @ และ Line Official มาได้สักพักนึงแล้วโดยใช้ชื่อว่า Messaging Api ซึ่งวันนี้เพิ่งมีโอกาสได้ลองเล่น API แบบจริงจังเลยมาเขียนบล็อกแชร์ประสบการณ์การใช้งาน API ของ Line ในการสร้าง Chat Bot แบบขำๆขึ้นมา

สิ่งที่ต้องการในการสร้าง Bot

- Server 1 ตัว (ใช้ Ubuntu 14.04)
- Nginx  (ใช้อะไรก็ได้แล้วแต่ถนัด)
- HTTPS ที่ valid cert อันนี้ต้องมีไม่งั้นใช้ไม่ได้ ในที่นี้ใช้ Let's Encrypt (ลองใช้ Cloudflare ที่ใช้ค่า - Default แล้วโดนบล็อกข้อมูลที่ส่งมาจาก Line เลยขี้เกียจหาวิธีแก้)
- PHP 5
- Python 3
ChatterBot (เอาไว้สร้าง Bot Chat)
MongoDB (เอาไว้เก็บข้อมูลของ ChatterBot)
Sample-Line-Bot (https://github.com/kittinan/Sample-Line-Bot)

ติดตั้ง Nginx, php และ config https ไว้ให้พร้อมใช้งาน

Line Messaging API Architecture


ขออนุญาติก็อบรูปใน Line Developer มาให้ดู ซึ่งการทำงานก็ไม่มีไรมาก
เมื่อผู้ใช้ส่งข้อความมาที่ Line @ เรา Line ก็จะส่งข้อความนั้นมายัง Server ที่เราเซตเอาไว้



สมัครใช้งาน Line Messaging API

ตาม Link นี้เลย https://developers.line.me/messaging-api/getting-started ค่อยๆอ่าน แล้วทำตามอย่าข้ามขั้นตอนเด็ดขาด ไม่งั้นปวดหัวสุดๆ

สร้าง Chat Bot ด้วย ChatterBot

Install MongoDB

วิธีการตาม Link นี้เลย https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-14-04


sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
sudo echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

เสร็จสิ้นการลง MongoDB

Install Python 3

ใน Ubuntu 14.04 นั้นลง Python 3 มาไว้อยู่แล้ว โดยแค่ลงเพิ่มอีก 2 package คือ python pip กับ python levenshtein

sudo apt-get install python3-pip python3-levenshtein python3-nltk python3-setuptools

Install ChatterBot ผ่าน python pip

sudo pip3 install chatterbot
sudo python3 -m nltk.downloader -d /usr/local/share/nltk_data brown movie_reviews conll2000 punkt averaged_perceptron_tagger

เมื่อลง Package ที่ต้องการต่างๆเรียบร้อยแล้วให้ clone https://github.com/kittinan/Sample-Line-Bot มายังเครื่อง เพื่อที่เราจะเริ่มทำการ train bot ให้ตอบแชทได้

เมื่อ clone มาเสร็จแล้วให้ไปยัง folder python แล้วรัน

python3 trainer.py sample_conversation.json

โดย sample_conversation.json นั้นเป็นตัวอย่างข้อมูลการสนทนา ถาม-ตอบ ซึ่งอยู่ใน format json array โดยส่วนตัวผมใช้ข้อมูลการ Chat กับเพื่อนใน Facebook ในการ train model ของ chat bot


เมื่อ train model เสร็จแล้วให้ทดสอบว่า chat bot ทำงานได้ถูกต้องโดยการรัน

python3 chat.py "ดีครับ"
python3 chat.py "ชื่อไร"

Bot ก็จะตอบมาดังภาพ


ดูรายละเอียด ChatterBot  เพิ่มเติม ได้ที่ http://chatterbot.readthedocs.io/en/stable/

ประกอบร่าง  Line API กับ ChatterBot

เข้าไป Line Business Center แล้วเข้า Messaging API Developer


ตั้งค่า Webhook URL ให้ชี้มายัง Domain Server ของเรา (Line บังคับให้ใช้ได้เฉพาะ https ที่  valid เท่านั้น) ดังภาพ

แล้ว Copy Channel Access Token มาใส่ในไฟล์ config.yml

แล้ว Install Dependencies ของ code php ให้เรียบร้อย ผ่านทาง composer

composer install

ลองไปคุยกับ bot ใน Line  bot ก็จะตอบข้อความเราตาม model ที่ train ไว้ดังภาพ



ปล.
- กราบขออภัยที่ไม่ได้ลงลึกในรายละเอียดการติดตั้งในส่วนต่างๆ
- คราวหน้าเราจะมาสร้าง model ของ chatbot จาก ข้อความที่เราเคย chat กับเพื่อนใน facebook กัน

57 comments:

  1. พี่ค่ะอยากสอบถามอ่ะค่ะ มีช่องทางติดต่อไหมค่ะ

    ReplyDelete
    Replies
    1. สามารถสอบถามได้ในนี้เลยครับ

      Delete
  2. สอบถามครับ นอกจากโต้ตอบด้วยข้อความ สามารถ เตะ ดึง คนได้ไหมครับ หรือสั่งปิดลิ้งถ้ามีคนเปิดประมาณนี้นะครับ

    ReplyDelete
    Replies
    1. ตอนนี้ Line API ทำได้แค่ ตอบข้อความ (Text, Sticker, Image, Video, Audio, ...) เท่านั้นครับ

      Delete
  3. This comment has been removed by the author.

    ReplyDelete
  4. มีวิธีการตอบกลับของbotเป็นรูปภาพจาก HDDไหมครับ

    ReplyDelete
    Replies
    1. ตาม API ของ LINE ตอนนี้ ยังไม่สามารถอัพโหลดรูปจากเครื่องได้นะครับ

      ต้องระบุเป็น URL ของรูปภาพนั้นแทนครับ

      https://devdocs.line.me/en/#send-message-object

      Delete
  5. พอมีโค้ดตัวอย่างไหมครับ เรื่อง image ไหมครับ ตอนนี้ผมพัฒนาโดย php อยู่อะครับ

    ReplyDelete
    Replies
    1. ผมได้เพิ่มตัวอย่างเข้าไปใน https://github.com/kittinan/Sample-Line-Bot แล้วนะครับ ไฟล์

      https://github.com/kittinan/Sample-Line-Bot/blob/master/hook_reply_image.php

      ดู Document API ของ Line ได้ที่ https://devdocs.line.me/en/#send-message-object

      สำหรับรูปภาพ
      - รูปที่ต้องการส่งต้องอยู่บน https://.... เป็นไฟล์ JPEG ขนาดภาพไม่เกิน 1024 x 1024 ขนาดไฟล์ไม่เกิน 1 MB
      - ต้องมีรูป Preview อยู่บน https://.... เป็นไฟล์ JPEG ขนาดภาพไม่เกิน 240 x 240 ขนาดไฟล์ไม่เกิน 1 MB

      Delete
    2. ขอบคุณมากครับ ทำลงเยอะๆ นะครับ ผมติดตามอยู่ <3

      Delete
  6. พอมีcode ตัวอย่างเรื่องการ push message ไหมครับ เเล้ว ตรง ต้องหาค่ามาอย่างไงครับ PHP นะครับ

    ReplyDelete
    Replies
    1. เเล้ว จะหาค่ามาใส่ ใน "to" อย่างไงครับ

      Delete
    2. ค่า to ใน API Push คือค่า userId ที่ได้จากตอน User ส่งข้อความมาอ่ะครับ

      ตัวอย่าง hook ที่ Line ส่งข้อมูลมายัง Server เรา
      https://gist.github.com/kittinan/ad63e7dc5b52bd157c361fe2f1bdc302

      Delete
  7. Replies
    1. ผิดตรง userId ครับต้องเป็น

      $userid = $event['source']['userId'];

      ลองสังเกตุจาก hook ที่ Line ส่งมาให้ครับ https://gist.github.com/kittinan/ad63e7dc5b52bd157c361fe2f1bdc302

      ปล. access_token ไม่ควรเปิดเผยนะครับ
      ปล2. ถ้าจะให้บอทตอบข้อความเลยควรใช้ API Reply Message (https://devdocs.line.me/en/#reply-message) ครับ ถ้าเราใช้ API Push เดี๋ยวอาจจะเจอปัญหา API Rate Limit ได้

      Delete
  8. ได้เเล้วครับ พี่ ขอบคุณมากๆๆ ครับ

    ReplyDelete
  9. พี่ครับ เเล้วจะสั่งให้bot join group อะครับ พอมีตัวอย่างไหมครับ

    ReplyDelete
    Replies
    1. เราต้องเป็นคนกด Invite Bot เข้ามาใน Group เองครับ

      Delete
  10. ผม Invite Bot เเล้วครับ เเต่ว่าฝั่งบอทไม่มีที่กดรับอะครับ

    ReplyDelete
  11. ของผมแค่กด Invite Bot เข้ามาใน Group มันก็เข้ามาเลยนะครับ ไม่ต้องกดรับอะไร

    ปล. ใน 1 Group จะมี Bot ได้แค่ 1 ตัวเท่านั้น

    ReplyDelete
  12. สอบถามหน่อยคะ ถ้าอยากให้ Reply message เป็น Sticker ต้องทำอย่างไรอะคะ

    ReplyDelete
    Replies
    1. https://devdocs.line.me/en/#sticker

      สามารถดู Sticker List ไดที่ https://devdocs.line.me/files/sticker_list.pdf

      ตัวอย่าง

      ['type' => 'sticker', 'packageId' => 1, 'stickerId' => 1]

      Delete
  13. สอบถาม Let's Encrypt มันใช้กับ iis ใน window 2012 server ได้หรือไม่ครับ

    ReplyDelete
    Replies
    1. ลองอันนี้ดูครับ

      https://www.youtube.com/watch?v=r9PB94oWz34

      https://letsencrypt.org/docs/client-options/#windows

      Delete
  14. ไม่ได้รับครับผม ต้องขอโทษด้วยนะครับ

    ReplyDelete
  15. จากหน้านี้ครับ https://business.line.me/en/services/bot
    ตอนที่จะสร้าง messaging มันให้เลือก Start using messaging API กับ Start using Developer Trial

    ในหน้านี้มันบอกว่า ถ้าเป็น Start using Developer Trial จะ limit แอดเพื่อนได้ 50 คน
    พี่พอทราบไหมครับว่า ถ้าเลือก Start using messaging API จะ limit แอดเพื่อนได้เท่าไหร่ ผมกะจะศึกษาไปใช้จริงๆ แต่กลัวมันจะ limit แอดเพื่อนครับ


    ReplyDelete
    Replies
    1. อันนี้ไม่ทราบเหมือนกันครับ

      Delete
  16. ตอนลองใน terminal นี่ได้นะครับ แต่พอเชื่อมต่อกับ LINE แล้วได้ error แบบนี้ครับ
    Traceback (most recent call last):
    File "./python/chat.py", line 3, in
    from chatterbot import ChatBot
    ImportError: No module named 'chatterbot'

    ReplyDelete
    Replies
    1. จาก Error มันหา Module chatterbot ไม่เจอครับ ถ้าลง chatterbot แล้วอาจจะเป็นเพราะ Path Environment Variable ครับ

      Delete
  17. อยากทราบกว่าคุณ Tun ใช้ heroku รึเปล่าครับ เพราะผมดีพลอยลง heroku ละมันก็ขึ้น error แบบที่บอกไปอ่ะครับ ก็แบบที่คุณ Tun บอกแหละครับ มันไม่น่ามี module chatterbot ให้ แต่ผมก็ไม่รู้จะลงมันยังไงอ่ะครับ พอจะไกด์ได้มั้ยครับ ขอบคุณครับ

    ReplyDelete
    Replies
    1. ผมไม่ได้ใช้ Heroku อ่าครับ ส่วนตัวผมใช้ Digitalocean ครับ

      Delete
  18. พี่ ครับ เคยเขียน แนว Multicast ที่ให้เวลาข้อมูลมันเปลียนแปลงแล้วให้แจ้งเตื่อนไหมคีรับ พอดีเขียนเป็น php แต่ทำไงก็ไม่ออก อะ

    ReplyDelete
  19. นอกจาก https แล้วมีช่องทางอื่นอีกมั้ยครับ กรณี server ไม่ได้ติดตั้ง ssl

    ReplyDelete
    Replies
    1. ไม่มีครับ Line บังคับให้ใช้ https ครับ

      Delete
  20. ต่อไปเขาจะเก็บเงินเราไหมครับ

    ReplyDelete
    Replies
    1. อันนี้ไม่ทราบเหมือนกันครับ

      Delete
  21. สอบถามครับ ถ้ามีการเพิ่มข้อมูลใหม่เข้ามาแล้วให้แจ้งเตือนไลน์กลุ่ม เขียน php+mysql มีตัวอย่างไหม คับ

    ReplyDelete
    Replies
    1. ถ้าเป็นการแจ้งเตือนเฉยๆ ใช้ Line Notify จะง่ายกว่าครับ

      https://kittinanx.blogspot.com/2017/01/line-notify-php.html


      แต่ถ้าอยากใช้เป็น Line@ แล้วส่งเข้าไปในกลุ่ม สามารถใช้ API Push message ส่งเข้าไปได้ครับ

      https://devdocs.line.me/en/#push-message

      Delete
  22. อยากทราบวิธีทำให้ไลน์บอท ตอบกลับมาเป็น template message ขอตัวอย่างคร่าวๆก็ได้ครับ

    ReplyDelete
    Replies
    1. โทษทีครับที่ตอบช้า พอดีเพิ่งเห็น comment ครับ

      ถ้าเกี่ยวกับ template message ลอง mustache ดูครับเอาไว้ Render Template ได้ยอดเยี่ยม

      https://mustache.github.io/

      Delete
  23. สอบถามครับ คือผมอยากจะเก็บค่าที่ User พิมพ์ คุยกับบอท เข้า DB พอจะมีวิธีใหมครับ

    ReplyDelete
    Replies
    1. เขียน code ต่อ database แล้ว insert เข้าไปได้เลยครับ

      Delete
  24. This comment has been removed by the author.

    ReplyDelete
  25. อยากจะสอบถามครับคือผมได้สร้าง app เพื่อการศึกษา แล้วอยากดึง bot chat ของline เข้าไปเป็นส่วนหนึ่งของ app แล้วมีการเชื่อมต่อ databaseของMicrosoft azure เพื่อทำการ Machine learning พอจะเป็นไปได้ไหมครับ

    ReplyDelete
    Replies
    1. ผมไม่เคยใช้งาน Microsoft Azure แต่คิดว่าทำได้ครับ

      Delete
    2. แต่ถ้าดึง apiของline bot chat มาใช้ในappที่ผมกำลังพัฒนาได้ใช่ไหมคร้บ ขอบคุณสำหรับการตอบกลับนะครับช่วยได้เยอะเลย :)

      Delete
    3. เราต้องเข้าใจก่อนว่า Line Messaging API มันทำได้ไรบ้าง ซึ่งความสามารถที่ทำได้ก็คือ รับ / ส่ง ข้อความ เราก็จะนำความสามารถตรงนี้ไปเชื่อมต่อกับระบบอะไรก็ได้ตามแต่เราจะจินตนาการได้โดยผ่าน API Line Messaging อย่างผมก็เอาไปเชื่อมต่อกับระบบ Home automation ในบ้าน ใช้สั่ง เปิด-ปิดแอร์ในบ้านได้

      Delete
  26. Bot สามารถ block บางคนได้ไหมคะ ถ้าได้ต้องทำยังไงเหรอคะ

    ReplyDelete
    Replies
    1. เท่าที่ตรวจสอบ Line Messaging API ไม่พบ API ในการ Block ครับ

      https://developers.line.me/en/docs/messaging-api/reference/

      Delete
    2. ขอบคุณมากค่ะ

      Delete
  27. อยากทราบว่า Bot สามารถ Forward message ที่ได้รับมา ไปให้ อีกกลุ่ม หรืออีกคนได้รึป่าวครับ

    ขอบคุณมากครับ

    ReplyDelete
    Replies
    1. Line Messaging API ไม่มี API สำหรับการ Forward Message โดยตรงครับ แต่เราสามารถทำได้เองไม่ยากโดยใช้ API Send push message ครับ

      https://developers.line.me/en/docs/messaging-api/reference/#send-push-message

      โดย Send push message API นั้นเราสามารถส่งข้อความไปหาใครก็ได้ที่เคยส่งข้อความมายังบอทของเรา โดยใช้ userId หรือ groupId ที่บอทได้รับมาตอนรับข้อความครับ

      https://developers.line.me/en/docs/messaging-api/reference/#source-user

      Delete
  28. This comment has been removed by the author.

    ReplyDelete
  29. สวัสดีครับ จะขอรายละเอียดวิธีทำ ในส่วนนี้ "Install Dependencies ของ code php ให้เรียบร้อย ผ่านทาง composer" ได้มั้ยครับ เทรนบอทเรียบร้อยร้อย เหลือแค่ส่วนนี้ที่ไม่เข้าใจ

    ReplyDelete
    Replies
    1. เบื้องต้นลอง Google ดูก่อนนะครับ น่าจะมีคนเขียนวิธีการติดตั้งและการใช้งาน Composer อยู่พอสมควร พอดีช่วงนี้ผมยุ่งๆยังไม่มีเวลาเขียน Blog ครับ ต้องขออภัยด้วยนะครับ

      หรือจะลองศึกษาจากเวปหลักดูครับ https://getcomposer.org/doc/00-intro.md

      Delete
  30. อยากสอบถามว่า สามารถเอา ภาพจากเว็ปที่อัพเดท real time มาตอบคำถามใน lineยังไงครับ

    ReplyDelete
    Replies
    1. - Download รูปจากเวปที่เราต้องการมาเก็บที่ Server เราเองก่อน
      - เอา Link รูปจาก Server เรา ไปตอบครับ

      Delete