使用C#開發LineBot(3) - 使用LineBotSDK發送Line訊息

新版的Line Messaging API,要主動發送訊息給用戶不是很困難,主要是透過Push API,可以參考底下的官方說明 : https://devdocs.line.me/en/#push-message

另外,如果你想申請一個Line Bot,可參考: 關於LineBot (1) - 用c#建立一個LineBot

前陣子說過,我們為了團隊開發方便,做了一個Nuget Package以便於讓撰寫C#的開發人員可以方便的進行Line Messaging API的操作。

所以,如果你想要透過該SDK來發送訊息給用戶,可以透過底下的指令:

isRock.LineBot.Utility.PushMessage(
              UserId, 要傳送的訊息, AccessToken);

別忘了使用前,要先引用linebotSDK這個套件:

當您在.net 4.x的專案中,安裝上述lintbotSDK,即可透過前面提到的指令發送訊息給用戶,但請注意,該用戶必須加你的bot為好友。

你可能在使用時會碰到一個問題,怎麼知道用戶的id呢?
請注意,PushAPI的Line用戶id並非你的line ID,而是一長串項是底下這樣的id:
U6OX388eOX3634X2OX2e341OX06b8OX4123

這個ID會在你的用戶跟你的bot交朋友,或是對談的時候,由系統傳送給你所設定的WebHook網址(其本質上是一個asp.net WebAPI或類似的API服務)。你會在Line傳遞給該WebHook URL的封包中的JSON形式資料內獲得。

也就是說,當你的用戶傳訊息給你的Bot,或是與你的Bot做朋友(或封鎖),你所在你的LineBot後台,所設定的這個WebHook,都會收到這些相關的訊息。其設定位置如下:

訊息內容是以JSON的格式出現。

但是,如果你還不知道怎麼寫一個WebHook,該怎麼辦呢? 寫個WebHook其實很簡單,以asp.net來說,就是寫一個asp.net WebAPI即可。(有空我再說明,但今天比較沒空)

(2017更新,WebHook開發方式請參考這裡)

如果你沒空寫,可以先用底下這個工具(注意這個工具僅限測試使用,我們不保證其穩定性與可用性、與資料安全性):
http://isbaas.azurewebsites.net/WebForms/LineTokenManage.aspx

上面這個工具可以幫你產生一個臨時的WebHook網址,你只要到上面這個網址,把Line後台取得的Access Token輸入,並且順便輸入一個你想監聽該封包的 email(一般來說就是你自己的email啦),按下產生WebHook URL,系統會幫你產生一組像是底下這樣的URL:
https://isbaas.azurewebsites.net/api/LineWebHook?key=677510db-c204-46a0-9c72-d74ffac7e51c
你只需要把上面這組URL貼到你的Line管理後台WebHook URL的位置:

你就有一個公版的測試用WebHook了,這時你就可以跟你的line bot說話:

這個WebHook會echo用戶輸入的訊息,並且把整包JSON mail到你指定的email位置,同時間,你也可以透過跟bot說 /showmyid 取得你的line id,以便於測試。

取得你的用戶id之後,你就可以透過底下的程式碼來發訊息給特定用戶:
isRock.LineBot.Utility.PushMessage(
              UserId, 要傳送的訊息, ChannelAccessToken);

請注意,這個小工具只是為了我們團隊內部測試方便使用,如果可以,我們還是建議你自行建立WebHook,我們並不負責為您保管Channel Access Token,建議您測試完成後,立刻重新Issue你的bot Access Token,以確保安全。

相關課程: http://www.studyhost.tw/NewCourses

留言

鄭袋鼠寫道…
感謝分享作法,已用前輩提供的nuget套件完成了部分功能
現在已申請好Azure的空間
正在著手建立自己的webhook
可是現在卡在幾個部分
請問要如何把Line Channel Access Token轉成key值..
是有什麼function負責處理這塊嗎?

如果前輩有空懇請賜教

謝謝
David寫道…
如果你要建立自己的WebHook,不需要把Line Channel Access Token轉成key值,你只需要寫一個類似底下這樣的WebAPI做為您自己的WebHook即可:

// POST: api/chat
[HttpPost]
public HttpResponseMessage Post()
{

try
{
//Get Post RawData
string postData = Request.Content.ReadAsStringAsync().Result;
var ReceivedMessage = isRock.LineBot.Utility.Parsing(postData);
...略...

透過ReceivedMessage就可以抓取到Line用戶傳遞給bot的Message...
請教一下

Message API 可以抓到 Bot 好友的列表嗎
David寫道…
NO, 你無法知道用戶的好友,bot自己的好友則可在用戶Follow的時候,自行記錄起來。
Unknown寫道…
作者已經移除這則留言。
匿名表示…
想自己寫的不妨參考「一步一步用 .NET Web API 撰寫 LINE Webhook」
http://soldierzx0705.blogspot.com/2017/01/public-string-send-string-result-null.html
匿名表示…
WebHook開發版主也有一篇更簡單的唷
http://studyhost.blogspot.tw/2016/12/linebot4-aspnetlinewebhook.html
丹尼爾寫道…
作者已經移除這則留言。
匿名表示…
你好 我遇到一個問題是,請問是因為公司內部有防火牆之類的關係嗎?

PushMessage API ERROR:Error Code: 407 Proxy Authentication Required. Forefront TMG requires authorization to fulfill the request. Access to the Web Proxy filter is denied. (12209)
Steven Ho表示…
請教大大

我剛剛實驗申請帳號

結果不知怎麼搞得,申請了三個相同名稱的帳號

在帳號清單裡,功能分成
1.Line@免費版
2.Line@Develop
3.Line@Develop+Message API

請問該如何刪除多餘的部分,謝謝


還有,我想參考大大文章來發送訊息,目前不需要接收訊息
我已安裝您提供的API,但是PushAPI的Line這段實在看不懂

請問我有甚麼方法可以很簡單的從我同學的Line看到他真實的id呢
我想先實驗看看,謝謝
Steven Ho表示…
上面的留言就不要看了

我依據大大寫的API

isRock.LineBot.Utility.PushMessage("U4d44887ca7a344104215a5456060ea9b", "OK", "y7083u7A0+s0GL9m8apVSSlJe7Dd4LiAS1SlZ4AvElckAeaERkDY8p1FFaP+xvIehWKbCbfarlNvHPlSOs63Kbcbe6e5J81TbC+2MLyhK2Uf+0aobbpWECZ+DTRsLA2iXlXal4D1zhfP+aWDz3Z9CgdB04t89/1O/w1cDnyilFU=")

id是我建立的bot ID
Token也是我建立的bot(點選Issue產生) Channel Access Token

執行後程式就出問題"使用者未處理NullReferenceException"

請問是哪邊出問題嗎??

Steven Ho表示…
isRock.LineBot.Utility.PushMessage()我大概瞭解了

userID要輸入對方的ID,可是我在加入者(非bot)輸入/showmyid是不會回應的

加入者其實就是我現在在用的Line帳號

還有Token是要用bot的Token嗎??
isDavid寫道…
/showmyid只有在你用了 isBaaS產生的WebHook才有用。
這是幫不熟悉的開發人員做的共用WebHook,僅供測試用。
如果你要自己取得UserId,則要自行建立WebHook,並且透過用戶加入好友或傳遞訊息給你的bot的時候,所得到的JSON來取得。
您好,請問貴團隊有在幫公司寫LINEBOT API串接Server的服務嗎?有的話是否可以給我聯絡資訊,或是您有可以介紹的對象,感謝您!
isDavid寫道…
Hi Pebo,

可以從底下位置找到聯絡方式:
http://www.isrock.com.tw/About-us/Contact-us
可透過Line或Email與我們聯繫。
匿名表示…
請問要分別發送給兩個人如果打兩行isRock.LineBot.Utility.ReplyMessage(.....)
只會發送給第一行程式的人 想問有辦法傳給兩個人嗎
isDavid寫道…
@匿名,

Reply是回覆訊息,因此只會回覆給某一個人(或群組),如果你要分別發給兩個人,要用Push API...
Unknown寫道…
請問一下,我用一個測試帳號test,自己的line和他成為好友,然後以Curl post來push message一直不成功,後來才發現原來UserID是要用test的ID,就OK了。
可是把test加入某個群組後,卻發現只有自己與測試帳號的聊天OK,群組聊天室都沒反應。請問要如何push訊息到群組聊天室?我的json簡單如下:
{
"to":"xxxxx",
"messages":[
{
"type":"text",
"text":"這是由程式發送的LINE TEST訊息"
}
]
}
謝謝您
mfchen寫道…
感謝分享
請問一下 /showmyid 可以取得 user MID
那 bot 加入了一個群組(group)後,要怎麼取得群組 MID 來對群組丟訊息呢
謝謝
isDavid寫道…
@mfchen

bot加入群組之後,依舊是透過 reply API來回覆訊息,因此只需要replyToken即可。
Unknown寫道…
您好,請問是否有辦法由被動轉為主動得pushMessage

例如在整點的時候將時間pushmessage給所有有加入bot好友的人

string ChannelAccessToken = ....
// 取得UserID
String userID = ReceivedMessage.events[0].source.userId;

if(DateTime.Now.Second == 0 & DateTime.Now.Minute == 0)
isRock.LineBot.Utility.PushMessage(userID, DateTime.Now.Hour.ToString(), ChannelAccessToken);

這是我寫的程式,不過執行起來沒有作用,想請教老師是哪個環節出問題

謝謝您
elviselle寫道…
請問有沒有一個方法,可以取得到已經 follow 的所有 user ID ?
因為可能先用了一陣子的 Line@ App ,已經有一些 follower 了,後來才改成用 line bot。
此時怎麼抓所有的 follow user 的 ID 呢?
Unknown寫道…
請問要如何 push 到群組中所有人 ?
對方僅加入 Line@群
沒有發言, 那要如何push 發送
阿豪寫道…
你好
最近在使用的時候,要傳送表情圖案出現問題,
想請問要如何才能傳送Line emoji裡面的圖案?
yhl寫道…
老師:按照您書的步驟到P1-18,發送訊息。得到這樣的錯誤訊息:

System.Exception
HResult=0x80131500
Message=PushMessage API ERROR: {"message":"The property, 'to', in the request body is invalid (line: -, column: -)"}
Source=LineBot
StackTrace:
於 isRock.LineBot.Utility.PushMessage(String ToUserID, String Message, String ChannelAccessToken)
於 isRock.LineBot.Bot.PushMessage(String ToUserID, String TextMessage)
於 LINEBOT0507.Form1.button1_Click(Object sender, EventArgs e) 在 C:\Users\Douglas\Desktop\C#_class\LINE_bot\LINEBOT0507\Form1.cs:行 27 中
於 System.Windows.Forms.Control.OnClick(EventArgs e)
於 System.Windows.Forms.Button.OnClick(EventArgs e)
於 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
於 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
於 System.Windows.Forms.Control.WndProc(Message& m)
於 System.Windows.Forms.ButtonBase.WndProc(Message& m)
於 System.Windows.Forms.Button.WndProc(Message& m)
於 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
於 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
於 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
於 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
於 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
於 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
於 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
於 System.Windows.Forms.Application.Run(Form mainForm)
於 LINEBOT0507.Program.Main() 在 C:\Users\Douglas\Desktop\C#_class\LINE_bot\LINEBOT0507\Program.cs:行 19 中

內部例外狀況 1:
WebException: 遠端伺服器傳回一個錯誤: (400) 不正確的要求。

================================================================

請協助,謝謝!
yhl寫道…
problem solved.

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

精彩(且驚人)的Semantic Kernel入門範例

使用Semantic Kernel 建立自然語言請假系統

在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統

專業的價值...