2016年5月23日 星期一

使用C#開發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可以跟客戶說話囉…

13 則留言:

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喔...

俺不是王子. 提到...

您好,假如機器人加入了2個group,在第一次給某個group發消息(不想給另一個群組發)怎麼樣獲取到groupid呢,哪裡能看到呢,還是說在機器人加入的時候記錄?

isDavid 提到...

Join Group或 在Group中收到訊息 的時候都可以拿到 replyToken,就可以回復訊息。

俺不是王子. 提到...

謝謝了,我又去看了下line notify,在文檔最下方看到以下信息,不知道到底咋收費的,沒有line的聯繫方式。。。
https://notify-bot.line.me/doc/en/

API Rate Limit
There is a limit to the number of times an API can be called on each service.
The default number is set to 1000.

The limit is per access token.

The API Rate Limit status, can be checked on the response header of the API.

Header name Description
X-RateLimit-Limit The limit of API calls per hour
X-RateLimit-Remaining The number of possible remaining API calls
X-RateLimit-ImageLimit The limit of Uploading image per hour
X-RateLimit-ImageRemaining The number of possible remaining Uploading image
X-RateLimit-Reset
The time when the limit is reset (UTC epoch seconds)

ex:1472195604

Related Posts Plugin for WordPress, Blogger...

熱門文章