2016年5月23日 星期一

關於LineBot (1) - 用c#建立一個LineBot

注意,本篇部分內容已過時,新版Line bot申請流程,請參考這篇

前面說過,不知道發生了什麼事情,全球幾個大廠幾乎在同一個時間announce各家的機器人技術或介面,包含Microsoft 的bot API,還有FB、Line…到最近的Google,總之突然間,原本封閉的IM突然都支援建構bot了…這會是巧合嗎? 我猜並不是…

但不管如何,對技術人員來說,如何串接各家的bot,是一個重點。

C#程式設計師要怎麼連結Line最近提供的API呢? 其實很簡單,只有幾個動作,首先,你必須申請LineBot開發帳號,申請的位置在底下這裡:
https://business.line.me/zh-hant/products/4/introduction (已過時)
(更新: 新版的Line Bot叫做 Messaging API ,申請位置位於 https://business.line.me/zh-hant/services/bot)

更新2 : 新版Line bot申請流程,請參考這篇

相關的新聞訊息可以參考這邊:
https://business.line.me/news/3/detail (已過時)

申請的過程不是我們想講的重點,請自行上去申請,申請時建議您申請 Developer Trial:

完成申請之後,在LineBot管理畫面,你會得到底下幾組關鍵的資料,包含Channel ID, Secret, 以及MID (新版的重點應該是Channel Access Token):

有了這些資料你就可以建立一個LineBot來收發line訊息了。你測試的時候,可以先透過上面的QR Code將這個LineBot帳號加為好友,以便於後續的測試。另外,上面有一個CallbackURL,就是接收訊息用的URL。

透過C#該如何開發呢? (btw, 本篇沒用到Microsoft bot framework,雖然都是介紹bot,但和先前介紹的bot framework無關,是剛好順手寫一下這系列)

基本上只需要呼叫Line提供的REST API就可以發送Line訊息,而接收訊息我們只需要建立一個WebAPI即可,如果你想自己K一下document,相關的資料可以參考底下這邊:
https://developers.line.me/bot-api/overview (舊版)
https://developers.line.me/messaging-api/overview (新版請參考這裡)

K完文件,你會發現他已經有Java、Ruby、以及Perl的SDK,真是貼心啊,對,偏偏就是沒有.NET的。

可能官方覺得REST API已經太簡單了,.NET 開發人員應該都能自己搞定才對。這讓人有點不是很愉快,為了簡化我們團隊的開發,我順手寫了一個LineBotSDK放上nuget。在各位沒有更好的選擇前,可以將就點用…

接著,就來看看如何透過C#開發LineBot。
(底下開始是Line V1舊版,V2新版請參考更新後的文章,分別在 這裡這裡)

首先,為了接收訊息,請用ASP.NET建立一個空白的專案,並在其中建立一個chatController:

接著,請在專案中透過unget安裝LineBotSDK套件(選最新穩定版…寫這篇文的時候,應該是0.0.7):
(聲明:這個套件是提供我們開發團隊自己使用的,目前是僅支援發送訊息和取得訊息內容的alpha版本,未來Line應該會(也應該要)提供官方的SDK,因此請自行斟酌使用。)
安裝完成之後,我們先來看看如何發送訊息,其實程式碼只有底下這樣:

      

    //LineBot Helper
    LineBot.LineBotHelper LineBotHelper = new LineBot.LineBotHelper(
            "你的Channel ID", "你的Channel Secret", "你的MID");   

    //發送訊息
    var ret = LineBotHelper.SendMessage(
        new List<string>() { 發送對象ID }, 發送訊息); 
}

我們建立了一個LineBotHelper,提供Channel ID、Channel Secret、MID等訊息,接著就可以透過SendMessage方法發送訊息。

如果你需要LineBotHelper幫你記錄一些log,可以透過提供Application Insights的InstrumentationKey,LineBotHelper會幫你紀錄實際送出的JSON以及LineAPI的Response,像是:

LineBotHelper.AppInsightsInstrumentationKey = "你的InstrumentationKey ";

接著,我們來看如何接收訊息,當有訊息傳遞給我們的LineBot時,LineBot會呼叫你設定的CallbackURL,因此,我們先得先建立這個CallbackURL,先在chatController中,改寫Post Method,撰寫一個接收post訊息用的的method:

      
// POST: api/chat
[HttpPost]
public HttpResponseMessage Post()
{
    LineBot.LineBotHelper LineBotHelper = new LineBot.LineBotHelper(
            "你的Channel ID", "你的Channel Secret", "你的MID");

    //Get  Post RawData
    string postData = Request.Content.ReadAsStringAsync().Result;

    //取得LineBot接收到的訊息
    var ReceivedMessage = LineBotHelper.GetReceivedMessage(postData);

    //發送訊息
    var ret = LineBotHelper.SendMessage(
        new List<string>() { ReceivedMessage.result[0].content.from },
            "你剛才說了 " + ReceivedMessage.result[0].content.text);
            
    //如果給200,LineBot訊息就不會重送
    return Request.CreateResponse(HttpStatusCode.OK, ret);
}

就只有上面這樣。

我們在程式碼中,先透過Request.Content.ReadAsStringAsync().Result取得完整的Post資料,丟給LineBotHelper取得Parsing後的Message,該Message就是用戶送給你的LineBot的訊息,其中ReceivedMessage.result[0].content.from是用戶ID,ReceivedMessage.result[0].content.text是用戶傳送的訊息。

我們接著把一樣的訊息透過SendMessage Echo回去,that’s it。一個簡單的LineBot就這樣成了…

別忘了,要把這個專案部署到internet上的WebSite上,並且把該URL填入你的LineBot的CallbackURL。 (留意CallbackURL必須是 https://…)

就這樣,你的LineBot可以跟客戶說話囉…

10 則留言:

Clone 提到...

請問如何將此API佈署至Azure?

Hung-Hsiang Wu 提到...

是否我可以透過API的方式,呼叫API,然後發訊息給我的好友呢??
只是單純可以透過API的方式發訊息給我的好友呢??

David 提到...

@Clone,

它本身就只是一個asp.net webapi的網站,透過publish就可以直接發佈到auzre。

@HHW,
當然可以,但前題是你的LineBot必須跟你的好友做朋友。而透過LinBot API你是無法控制你自己的私人帳號透過程式碼發訊息給你的好友的。

紫龍 提到...

我設了一個button 想按下去 由linebot 送訊息給我的line (line id 是ttrking )
但ret 回傳的是statusCode 422 statusMessage invalid users
不知是不是沒完全照你的打..

1 protected void Button1_Click(object sender, EventArgs e)
2 {
3 //LineBot Helper xxx是個人資料去掉XD
4 LineBot.LineBotHelper LineBotHelper = new LineBot.LineBotHelper(
5 "14xxxxx", "2exxxx", "u35xxxxx");
6
7 //發送訊息 blog 下面那行, 用vs 2015 .net 4.5 很多錯誤, 依提示修改為第二行
8 // var ret = LineBotHelper.SendMessage( new List< string > () { "ttrking" }, "哇哈哈");
9 var ret = LineBotHelper.SendMessage(new List() { "ttrking" } , "哇哈哈");
10 }

CHRIS 提到...

我也出現 invalid users

Lai Felix 提到...

請問有辦法將LineBOT與Line@連結嗎? 讓LintBOT能夠收到跟回覆Line@的訊息,官網上說明是可以,但是卻找不到方法,謝謝

Clone 提到...

如何使用新的Messaging API?

David 提到...

新版 Line Messanging API請參考:
https://www.facebook.com/DotNetWalker/posts/1308046072568296

Steven Ho 提到...

不好意思,我在安裝LineBotSDK時,發生錯誤,好像寫說不能安裝在.net4.0

所以安裝底線就是要上vs2012嗎??謝謝老師~~

isDavid 提到...

@Steven Ho, 至少要 VS 2015 & .net 4.5.2喔...