使用C#開發LineBot(10) - 取得用戶上傳給Linebot的照片

在用戶與你所設計的Linebot對談的過程中,我們常常會需要接收用戶傳遞過來的資料,除了文字之外,最重要的就是圖片(或照片)了。

用戶可以從手機或PC版的Line上面,輕易地上傳圖片給我們的linebot,這圖片來源可以是直接抓取相機拍照的照片,或是從手機上的相簿、圖庫裡面抓取,當然也可以從第三方的資料來源(像是Dropbox)把圖片傳遞給Line。

因此,圖片會有各種不同的格式,但慶幸的是,Line會幫我們把圖片做初步的處理(例如對太大的圖進行縮小、調整格式…等),我們想要抓取處理好的結果,只需要簡單的使用API即可。

透過我們的SDK,可以輕易的使用底下這個API來取得用戶上傳的圖片,回傳的結果是bytes[] 陣列。

當然,從上面你不難發現,要取得圖片時,我們需要傳遞給API一個ContentID參數,這參數怎麼來呢?

透過這樣的方式,就可以順利的取得用戶上傳的圖片資料囉。

補充一:

別忘記一件事情,我們並不能假設用戶上傳的一定就是圖片(搞不好是文字?或是GPS座標位置啊…),因此,採用上面那兩段程式前,你必須先判斷,用戶這次傳遞給我們的訊息是否為圖片:

補充二:

抓到圖片Bytes後,要怎麼辦?
一般來說,我們會在WebHook裡面抓取圖片,而WebHook在.net多半是以WebAPI的方式撰寫,因此,在你抓取到圖片Bytes之後,會有幾個考慮。

  • 該圖片要不要讓其他系統使用?(例如azure影像辨識API,或是後端其他系統)
    如果要,你多半需要把Bytes儲存為實體的檔案,這部分可以透過  System.IO.File.WriteAllBytes(路徑, bytes);
    這樣的Method來完成,如果是圖檔,附檔名直接給png即可。
  • 該圖片要不要讓用戶下載?
    如果要讓用戶下載,則該圖檔不僅僅要儲存,還必須要有一個可公開的URL,這樣我們會建議你把圖檔存放到azure blob,或是在你的WebApi所屬網站上開一個folder,用上述WriteAllBytes指令存檔時,儲存到該公開folder中即可。當然,如果你要把圖檔放到資料庫中也行。

------------------
相關課程: http://www.studyhost.tw/NewCourses/LineBot
LineBotSDK : https://www.nuget.org/packages/LineBotSDK 
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。 

留言

匿名表示…
老師好,
感謝董老師分享許多有關Line bot 文章,受益良多,但有個疑問是,若是拿來運用在公司內部,除了限制50好友外,有侵權問題嗎 還是line bot本身就是開放大家用 不限個人與公司行號 謝謝
isDavid寫道…
限制50個好友本身就是個嚴重的問題。因為bot不能取消好友,因此這50個會越來越多,直到超過,一但超過,你的bot就無法讓任何新用戶加入,而bot也不能把既有用戶移轉給另一個bot,因為UserId不同。然後也不能轉成正式帳號,因此這個bot就...廢了。
匿名表示…
Hi, David,

請教一下,如果BOT被真人加為好友,可以取得這個事件嗎?
另外,可以知道某BOT有被哪些人加為好友嗎?

謝謝
isDavid寫道…
有,當line bot被某人加入好友時,會從WebHook收到follow事件。
匿名表示…
follow事件是不錯用,但unfollow事件就不知道是拿來做什麼了
看官方文件,應該是用來知道誰封鎖了line bot
但我實際用起來卻不是
在我測試下,line用戶封鎖當下,line bot是不會收到unfollow事件的
而是在line用戶解封鎖時,先收到unfollow事件,再收follow事件
最多只能知到那個用戶曾經有封鎖過line bot
Unknown寫道…
我測試是可以即時收到,沒問題
我將unfollow寫在webhook裡,並用郵件通知,如下圖
https://imgur.com/a/nboJ0
匿名表示…
老師好
請問以下這串程式碼
bot.GetUserUploadedContent();
是怎麼運作的 想了很久還是想不到

這個網誌中的熱門文章

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

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

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

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

專業的價值...