iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

讓 C# 也可以很 Social - 在 .NET 6 用 C# 串接 LINE Services API 的取經之路系列 第 19

[Day 19] .NET 6 C# 與 Line Services API 開發 - Rich Menu 製作(四) 總整理

  • 分享至 

  • xImage
  •  
tags: .NET6 C#, LineBot, Line Messaging API, C#, dotnet core

[Day 19] 讓 C# 也可以很 Social - .NET 6 C# 與 Line Services API 開發 - Rich Menu 製作(四) 總整理

前言

Hello 大家好,今天的這篇文章,會把Line Bot Messaging 相關的API 介紹到一段落了,當然 Line Bot 還有不少功能還來不及介紹/實作。不過一路看到這邊的各位應該也對官方文件越來越熟悉了吧,還有很多有趣的內容可以留給各位自行探索~
當然真的很想要我們來介紹的話 可以留言讓我們知道,有機會的話再幫各位補上。

那今天這篇的內容就是走完 rich menu 剩下的 API,讓我們開始吧。

APIs

尚未實作的 API 共有下幾支 :

  1. Download Rich Menu Image : 取得指定 rich menu 的圖片。
  2. Get Rich Menu By ID : 取得指定 rich menu 的格式內容。
  3. Delete Rich Menu : 刪除指定 rich menu。
  4. Get Default Rich Menu ID: 取得預設 rich menu 的 ID。
  5. Cancel Default Rich Menu : 取消目前的預設 rich menu。
  6. Get Rich Menu ID of User : 取得目前綁定至使用者的 rich menu。
  7. Link/Unlink Rich Menu To User : 綁定/解除綁定 某一位使用者看到的 rich menu。
  8. Link/Unlink Rich Menu To Multiple User : 綁定/解除綁定 多位使用者看到的 rich menu。
  • 在 RichMenuService 宣告需要的 request uri
private readonly string getRichMenuUri = "https://api.line.me/v2/bot/richmenu/{0}";
private readonly string defaultRichMenuUri = "https://api.line.me/v2/bot/user/all/richmenu";
// 個人的 linked rich menu 操作
private readonly string linkedRichMenuOfUserUri = "https://api.line.me/v2/bot/user/{0}/richmenu";
// 多人的 linked rich menu 操作
private readonly string linkedRichMenuOfMultipleUserUri = "https://api.line.me/v2/bot/richmenu/bulk/";

Download Rich Menu Image

Line 提供之 API 會將我們上傳的 rich menu image 檔案內容傳回,格式與上傳時相同,皆是 Byte[] 類別,我這裡不做特別的處理,一樣直接將檔案內容傳出,使 swagger 上可直接看到圖片就好。

  • 文件內容

    • 這支 api 會回傳圖片的二進制資料。
  • RichMenuService

public async Task<FileContentResult> DownloadRichMenuImage(string richMenuId)
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);
    // 直接取得回傳的 Byte Array
    var bytes = await client.GetByteArrayAsync(String.Format(richMenuImageUri, richMenuId));
    // 
    return new FileContentResult(bytes, "image/png");
}
  • LineBotController
[HttpGet("RichMenu/DownloadImage/{richMenuId}")]
public async Task<FileContentResult> DownloadRichMenuImageById(string richMenuId)
{
    return await _richMenuService.DownloadRichMenuImage(richMenuId);
}

Delete Rich Menu

使用 Message api 的話,一個 Line Bot 最多可以存放 1000 張 rich menu 在 Line 的平台中,若存滿時,則需刪除多餘的 rich menu 才能再新增 rich menu。

  • 文件內容

    • 成功則回傳空物件 {}
  • RichMenuService

public async Task<string> DeleteRichMenu(string richMenuId)
{
    var request = new HttpRequestMessage(HttpMethod.Delete, string.Format(getRichMenuUri, richMenuId));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}
  • LineBotController
[HttpDelete("RichMenu/Delete/{richMenuId}")]
public async Task<IActionResult> DeleteRichMenu(string richMenuId)
{
    return Ok(await _richMenuService.DeleteRichMenu(richMenuId));
}

Get Rich Menu By ID

以 richMenuId 搜尋,回傳該 rich menu 上傳的格式內容。

  • 文件內容

    • 回傳 rich menu 物件
  • RichMenuService

// 回傳物件直接使用 RichMenuDto,就不另外宣告了。
public async Task<RichMenuDto> GetRichMenuById(string richMenuId)
{
    var request = new HttpRequestMessage(HttpMethod.Get, string.Format(getRichMenuUri, richMenuId));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);
    var richMenu = _jsonProvider.Deserialize<RichMenuDto>(await response.Content.ReadAsStringAsync());
    return richMenu;
}
  • LineBotController
[HttpGet("RichMenu/Get/{richMenuId}")]
public async Task<IActionResult> GetRichMenuById(string richMenuId)
{
    return Ok(await _richMenuService.GetRichMenuById(richMenuId));
}

Get Default Rich Menu ID

取得目前設為 default rich menu 的 richMenuId。

  • 文件內容

    • 回傳內容
  • RichMenuService

public async Task<RichMenuDto> GetDefaultRichMenuId()
{
    var request = new HttpRequestMessage(HttpMethod.Get, defaultRichMenuUri);
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return _jsonProvider.Deserialize<RichMenuDto>(await response.Content.ReadAsStringAsync());
}
  • LineBotController
[HttpGet("RichMenu/Default/GetId")]
public async Task<IActionResult> GetDefaultRichMenuId()
{
    return Ok(await _richMenuService.GetDefaultRichMenuId());
}

Cancel Default Rich Menu

取消目前 default rich menu 的設定。

  • 文件內容

    • 成功則回傳空物件
  • RichMenuService

public async Task<string> CancelDefaultRichMenu()
{
    var request = new HttpRequestMessage(HttpMethod.Delete, defaultRichMenuUri);
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}
  • LineBotController
[HttpGet("RichMenu/Default/Cancel")]
public async Task<IActionResult> CancelDefaultRichMenu()
{
    return Ok(await _richMenuService.CancelDefaultRichMenu());
}

Get Rich Menu ID of User

取得目前綁定給該 User 的 richMenuId。

  • 文件內容

    • 回傳內容使用 richMenuDto 物件接收即可
  • RichMenuService

public async Task<RichMenuDto> GetRichMenuIdLinkedToUser(string userId)
{
    var request = new HttpRequestMessage(HttpMethod.Get, string.Format(linkedRichMenuOfUserUri, userId));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return _jsonProvider.Deserialize<RichMenuDto>(await response.Content.ReadAsStringAsync());
}
  • LineBotController
[HttpGet("RichMenu/GetLinkedId/{userId}")]
public async Task<IActionResult> GetRichMenuIdLinkedToUser(string userId)
{
    return Ok(await _richMenuService.GetRichMenuIdLinkedToUser(userId));
}

Link/Unlink Rich Menu To User

  • Link api 文件

    • 成功則回傳空物件
  • Unlink api 文件

    • 回傳內容
  • RichMenuService

 public async Task<string> LinkRichMenuToUser(string userId, string richMenuId)
{

    var request = new HttpRequestMessage(HttpMethod.Post, string.Format(linkedRichMenuOfUserUri + "/{1}", userId, richMenuId));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}

public async Task<string> UnlinkRichMenuFromUser(string userId)
{
    var request = new HttpRequestMessage(HttpMethod.Delete, string.Format(linkedRichMenuOfUserUri, userId));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}
  • LineBotController
[HttpGet("RichMenu/Link/{userId}/{richMenuId}")]
public async Task<IActionResult> LinkRichMenuToUser(string userId, string richMenuId)
{
    return Ok(await _richMenuService.LinkRichMenuToUser(userId, richMenuId));
}

[HttpDelete("RichMenu/Unlink/{userId}")]
public async Task<IActionResult> UnlinkRichMenuFromUser(string userId)
{
    return Ok(await _richMenuService.UnlinkRichMenuFromUser(userId));
}

Link/Unlink Rich Menu From Multiple User

  • RichMenuService
public async Task<string> LinkRichMenuToMultipleUser(LinkRichMenuToMultipleUserDto dto)
{
    var request = new HttpRequestMessage(HttpMethod.Post, linkedRichMenuOfMultipleUserUri + "link")
    {
        Content = new StringContent(_jsonProvider.Serialize(dto), Encoding.UTF8,"application/json")
    };
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}

public async Task<string> UnlinkRichMenuFromMultipleUser(LinkRichMenuToMultipleUserDto dto)
{
    var request = new HttpRequestMessage(HttpMethod.Post, linkedRichMenuOfMultipleUserUri + "unlink")
    {
        Content = new StringContent(_jsonProvider.Serialize(dto), Encoding.UTF8, "application/json")
    };
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", channelAccessToken);

    var response = await client.SendAsync(request);

    return await response.Content.ReadAsStringAsync();
}
  • LineBotController
[HttpPost("RichMenu/Link/Multiple")]
public async Task<IActionResult> LinkRichMenuToMultipleUser(LinkRichMenuToMultipleUserDto dto)
{
    return Ok(await _richMenuService.LinkRichMenuToMultipleUser(dto));
}

[HttpPost("RichMenu/Unlink/Multiple")]
public async Task<IActionResult> UnlinkRichMenuFromMMultipleUser(LinkRichMenuToMultipleUserDto dto)
{
    return Ok(await _richMenuService.UnlinkRichMenuFromMultipleUser(dto));
}

結語

整套關於 rich menu 的 API 都實作完了,也代表著本系列中規劃的 Line Bot Messaging API 內容告一段落了,接下來會依照 Line Login、LIFF、Line Pay 的順序來繼續介紹 Line 的其它服務囉~ 下次見。

腦筋急轉彎

  • 整理一下閱讀到現在,看過的LineBot技術文件,哪項功能/哪支API 你覺得最不好上手以及原因

範例程式碼

如果想要參考今天範例程式碼的部份,下面是 Git Repo 連結,方便大家參考。

Day19_Rich Menu Rest of APIs


上一篇
[Day 18] .NET 6 C# 與 Line Services API 開發 - Rich Menu 製作(三) 建立 rich menu alias
下一篇
[Day 20] .NET 6 C# 與 Line Services API 開發 - Line Login API (一) 起手式
系列文
讓 C# 也可以很 Social - 在 .NET 6 用 C# 串接 LINE Services API 的取經之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
applefi87
iT邦新手 5 級 ‧ 2023-03-01 15:35:08

好多阿! 辛苦了!

我要留言

立即登入留言