年紀大了有些事容易忘記... 所以.....

星期三, 11月 09, 2016

[LINE] LINE Messaging API for PHP (LINE BOT)

一直都在等LINE出強大的bot要強化我一些工作上鎖碎的事
不過這次發佈之後,唉唉唉要用Push主動發送還是要錢啊!!!! (好貴....)
嘛啊算了....... 加減用了XD


LINE Messaging 申請網址
https://business.line.me/zh-hant/services/bot
API reference
https://developers.line.me/businessconnect/api-reference



※簡單申請設定流程說明
1.新增一個 LINE@ 帳號
2.到 https://business.line.me/zh-hant/companies/ 選擇公司/經營者後會看到你建立的 LINE@ 帳號,先點 LINE@MANAGER,到「帳號設定→BOT設定」去把BOT開啟即可(webhook傳訊記得打勾,下面的加入群組聊天室選允許,自動回應設取消,問後語的部份就看你是不是要跟著LINE@的設定)
3.接著回到2的那頁,該LINE@帳號上面就會多出現一個 Messaging API ,點 LINE Developers 進入設定畫面
4.把 ChannelID 及 Channel Secret 記下來,下面 Webhook URL 則是你接收 LINE 訊息的程式網址(必需為 https:// ,如果沒有SSL可以使用 SSL for Free 請參考此網址教學 https://free.com.tw/ssl-for-free/ )
5.Channel Access Token 點擊後產生,這之後也會用到
6.以上都設定完後就沒事了,再來就程式的部份

申請的部份就不多講了,補充幾個重點
(申請可以看官方影片 https://developers.line.me/messaging-api/getting-started)
1.LINE Messaging 只能用 LINE@ 的帳號
2.可以舊有的 LINE@ 直接轉,不過一但轉了就無法再轉回來人工回覆了喔,要注意!

以下範例是 PHP (注意必需要 PHP 5.6 以上哦)的,其它的就請自行研究 ^^"

line-bot-sdk-php
https://github.com/line/line-bot-sdk-php

不過因為它很肥所以我改了一下 composer.json
{
  "type": "library",
  "homepage": "https://github.com/line/line-bot-sdk-php",
  "license": "Apache License Version 2.0",
  "require": {
    "php": ">=5.6",
    "linecorp/line-bot-sdk":"dev-master"
  },
  "autoload": {
    "psr-4": {
      "LINE\\": "src/"
    }
  }
}

※載入LINEBOT
$bot = new \LINE\LINEBot(
  new \LINE\LINEBot\HTTPClient\CurlHTTPClient('你的Channel Access Token'),
  ['channelSecret' => '你的Channel Secret']
);
(至於 ChannelID 的部份,好像沒地方會用到..........)

※取得即時聊天的內容
$signature = $_SERVER["HTTP_".\LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
$body = file_get_contents("php://input");
try {
  $events = $bot->parseEventRequest($body, $signature);
} catch (Exception $e) {
  var_dump($e); //錯誤內容
}
接下來你就可以把 $events 這個陣列寫到 log 裡去看了,它大概會是下面的一個格式


※補充說明
$replyToken:指的是講話者的回覆token,在1:1聊天、群組聊天、聊天室聊天都會有此參數
$groupId:指群組的id,退出群組時會使用到,僅群組聊天才會有此參數
$roomId:指聊天室的id,退出聊天室時會使用到,僅聊天室聊天才會有此參數
$userId:使用者的id,1:1視窗聊天時才會有此參數
將bot邀到聊天室或群組時,只要你設定裡是將「加入群組聊天室選允許」的話,它是會自動加入的,如果邀了沒馬上加入,那就踢掉再重邀一次XD

接下來下面解說一下常用的回覆功能

※一般文字訊息(有兩種方式)
1.方法1
$bot->sendText($replyToken, "文字訊息");
2.方法2
$msg = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder("文字訊係");
$bot->replyMessage($replyToken,$msg);

※傳送多筆訊息(每次最多5筆)
  
$msg = new \LINE\LINEBot\MessageBuilder\MultiMessageBuilder();
for($i=0;$i<5;$i++)
{
  $_msg = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder("訊息內容".$i);
  $msg->add($_msg);
}
$bot->replyMessage($replyToken,$msg);

※傳送貼圖訊息(貼圖僅能用官方提供的)
貼圖列表 https://devdocs.line.me/en/files/sticker_list.pdf
$msg = new \LINE\LINEBot\MessageBuilder\StickerMessageBuilder($packageId,$stickerId);
$bot->replyMessage($reply_token,$msg);

※傳送座標訊息
$msg = new \LINE\LINEBot\MessageBuilder\LocationMessageBuilder("位址名稱", "地址", 緯度, 經度);
$bot->replyMessage($replyToken,$msg);

※樣版類型(此訊息僅在手機上才看的到)
https://devdocs.line.me/en/#template-messages
補充: 圖片的部份必需走 https 僅接受 png 或 jpg 檔,最大寬度 1024px,檔案上限1MB

actions 分為下列3種,可以混合使用
1) Postback action - PostbackTemplateActionBuilder 互動型,例如使用者點擊後要帶一些參數過去,接收到參數時處理的(例如分頁換頁)
2) Message action - MessageTemplateActionBuilder 一般訊息型,點擊後直接送出回應文字
3) URI action - UriTemplateActionBuilder 網址型,點擊後開啟網頁

1.一般圖片、文字按鈕(actions每項最多4個)
 
$actions = array(
  //一般訊息型 action
  new \LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder("按鈕1","文字1"),
  //網址型 action
  new \LINE\LINEBot\TemplateActionBuilder\UriTemplateActionBuilder("Google","http://www.google.com"),
  //下列兩筆均為互動型action
  new \LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder("下一頁", "page=3"),
  new \LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder("上一頁", "page=1")
);

$img_url = "圖片網址,必需為 https (圖片非必填欄位)";
$button = new \LINE\LINEBot\MessageBuilder\TemplateBuilder\ButtonTemplateBuilder("按鈕文字","說明", $img_url, $actions);
$msg = new \LINE\LINEBot\MessageBuilder\TemplateMessageBuilder("這訊息要用手機的賴才看的到哦", $button);
$bot->replyMessage($replyToken,$msg);

上面範例在手機上看會是像下面的樣子


如果是Postback互動型,則點擊後在$events會收到postback便可以另外做邏輯處理
  
{"userId":"Uc13b7ce6fd52195f122fd78fc9ae86c4","type":"user"},"timestamp":1478658496577,"postback":{"data":"page=3"}}]}

2.確認型(是否的那種)(actions每項最多2個)
$actions = array(
  new \LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder("是", "ans=Y"),
  new \LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder("否", "ans=N")
);
$button = new \LINE\LINEBot\MessageBuilder\TemplateBuilder\ConfirmTemplateBuilder("問題", $actions);
$msg = new \LINE\LINEBot\MessageBuilder\TemplateMessageBuilder("這訊息要用手機的賴才看的到哦", $button);
$bot->replyMessage($replyToken,$msg);

上面範例在手機上看會是像下面的樣子



3.Carousel 多筆型(最多5筆,actions每項最多3個)
//輪播型(僅手機看的到)
$columns = array();
$img_url = "圖片網址,必需為 https (圖片非必填欄位)";
for($i=0;$i<5;$i++) //最多5筆
{
  $actions = array(
    //一般訊息型 action
    new \LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder("按鈕1","文字1"),
    //網址型 action
    new \LINE\LINEBot\TemplateActionBuilder\UriTemplateActionBuilder("觀看食記","http://www.google.com")
  );
  $column = new \LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselColumnTemplateBuilder("標題".$i, "說明".$i, $img_url , $actions);
  $columns[] = $column;
}
$carousel = new \LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselTemplateBuilder($columns);
$msg = new \LINE\LINEBot\MessageBuilder\TemplateMessageBuilder("這訊息要用手機的賴才看的到哦", $carousel);
$bot->replyMessage($replyToken,$msg);

上面範例在手機上看會是像下面的樣子



※退出聊天室或群組
if($event->isRoomEvent()==true || $event->isGroupEvent()==true) //檢查是否為聊天示或群組訊息
{
  //這邊我有另外加了要先顯示訊息才退出,這看個人使用
  $msg = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder("退出聊天室要顯示的訊息");
  $bot->replyMessage($replyToken,$msg);
  if($event->isGroupEvent()==true)
  {
    $bot->leaveGroup($event->getGroupId()); //退出群組
  }
  else if($event->isRoomEvent()==true)
  {
    $bot->leaveRoom($event->getRoomId()); //退出聊天室
  }
}


※取得1:1交談對方的資料(注意僅1:1交談才會有userId)
$response = $bot->getProfile($event->getUserId());
if ($response->isSucceeded()) 
{
  $profile = $response->getJSONDecodedBody();
  //$profile 為陣列,內容裡會有對方的姓名、userId(這不確定是不是會變動)、圖像網址、狀態訊息
}

※將 LINE 回傳訊息寫入至 LOG
file_put_contents("debug.txt", file_get_contents("php://input")."\r\n",FILE_APPEND);