• Stars
    star
    160
  • Rank 234,703 (Top 5 %)
  • Language
    C#
  • License
    MIT License
  • Created over 7 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

LINE Messaging API for .Net

LINE Messaging API

NuGet NuGet

日本語の説明はこちら

This is a C# implementation of the LINE Messaging API.

Getting Started

This repository contains SDK itself, as well as base samples and Visual Studio templates.

.Net Standard Class Library

Use NuGet manager to import the library to your project. NuGet Gallery | Line.Messaging

Samples

There are several samples which uses the SDK. You can find detail instructions in each directory.

Visual Studio Templates

The template can be found in Market Place, but if you want to tweak it, the source is also available.

Usage

Basically, there are three steps to use the SDK.

  • Instantiate LineMessagingClient.
  • Implement a class which inherits WebhookApplication.
  • Override the method to handle the event.

LineMessagingClient Class

This is a class to communicate with LINE Messaging API platform. It uses HttpClient-based asynchronous methods such as followings.

Task ReplyMessageAsync(string replyToken, IList<ISendMessage> messages)
Task ReplyMessageAsync(string replyToken, params string[] messages)
Task PushMessageAsync(string to, IList<ISendMessage> messages)
Task PushMessageAsync(string to, params string[] messages)
Task MultiCastMessageAsync(IList<string> to, IList<ISendMessage> messages)
Task MultiCastMessageAsync(IList<string> to, params string[] messages)
Task<ContentStream> GetContentStreamAsync(string messageId)
Task<UserProfile> GetUserProfileAsync(string userId)
Task<byte[]> GetContentBytesAsync(string messageId)
Task<UserProfile> GetGroupMemberProfileAsync(string groupId, string userId)
Task<UserProfile> GetRoomMemberProfileAsync(string roomId, string userId)
Task<IList<UserProfile>> GetGroupMemberProfilesAsync(string groupId)
Task<IList<UserProfile>> GetRoomMemberProfilesAsync(string roomId)
Task<GroupMemberIds> GetGroupMemberIdsAsync(string groupId, string continuationToken)
Task<GroupMemberIds> GetRoomMemberIdsAsync(string roomId, string continuationToken = null)
Task LeaveFromGroupAsync(string groupId)
Task LeaveFromRoomAsync(string roomId)

Parse and process Webhook-Events

Use GetWebhookEventsAsync extension method for incoming request to parse the LINE events from the LINE platform. See FunctionAppSample/HttpTriggerFunction.sc as an example.

using Line.Messaging;
using Line.Messaging.Webhooks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace FunctionAppSample
{
  public static class HttpTriggerFunction
  {
    static LineMessagingClient lineMessagingClient;

    static HttpTriggerFunction()
    {
      lineMessagingClient = new LineMessagingClient(System.Configuration.ConfigurationManager.AppSettings["ChannelAccessToken"]);
      var sp = ServicePointManager.FindServicePoint(new Uri("https://api.line.me"));
      sp.ConnectionLeaseTimeout = 60 * 1000;
    }

    [FunctionName("LineMessagingApiSample")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
      IEnumerable<WebhookEvent> events;
      try
      {
        //Parse Webhook-Events
        var channelSecret = System.Configuration.ConfigurationManager.AppSettings["ChannelSecret"];
        events = await req.GetWebhookEventsAsync(channelSecret);
      }
      catch (InvalidSignatureException e)
      {
        //Signature validation failed
        return req.CreateResponse(HttpStatusCode.Forbidden, new { Message = e.Message });
      }

      try
      {
        var connectionString = System.Configuration.ConfigurationManager.AppSettings["AzureWebJobsStorage"];
        var tableStorage = await LineBotTableStorage.CreateAsync(connectionString);
        var blobStorage = await BlobStorage.CreateAsync(connectionString, "linebotcontainer");
        //Process the webhook-events
        var app = new LineBotApp(lineMessagingClient, tableStorage, blobStorage, log);
        await app.RunAsync(events);
      }
      catch (Exception e)
      {
        log.Error(e.ToString());
      }

      return req.CreateResponse(HttpStatusCode.OK);
    }
  }

}

Process Webhook-events

Create a class which inherits WebhookApplication class, then overrides the method you want to handle the LINE evnet in your class.

public abstract class WebhookApplication
{
    public async Task RunAsync(IEnumerable<WebhookEvent> events);
    
    protected virtual Task OnMessageAsync(MessageEvent ev);
    protected virtual Task OnJoinAsync(JoinEvent ev);
    protected virtual Task OnLeaveAsync(LeaveEvent ev);
    protected virtual Task OnFollowAsync(FollowEvent ev);
    protected virtual Task OnUnfollowAsync(UnfollowEvent ev);
    protected virtual Task OnBeaconAsync(BeaconEvent ev);
    protected virtual Task OnPostbackAsync(PostbackEvent ev);
    protected virtual Task OnAccountLinkAsync(AccountLinkEvent ev);
    protected virtual Task OnMemberJoinAsync(MemberJoinEvent ev);
    protected virtual Task OnMemberLeaveAsync(MemberLeaveEvent ev);
    protected virtual Task OnDeviceLinkAsync(DeviceLinkEvent ev);
    protected virtual Task OnDeviceUnlinkAsync(DeviceUnlinkEvent ev);
}

Finally, instantiate the class and run RunAsync method by giving the parsed LINE events as shown above.

See Line.Messaging/Webhooks/WebhookApplication.cs as processing event class.

class LineBotApp : WebhookApplication
{
  private LineMessagingClient MessagingClient { get; }
  private TraceWriter Log { get; }
  
  public WebhookApplication(LineMessagingClient lineMessagingClient,TraceWriter log)
  {
      MessagingClient = lineMessagingClient;
      Log = log;
  }

  protected override async Task OnMessageAsync(MessageEvent ev)
  {
    Log.Info($"SourceType:{ev.Source.Type},SourceId:{ev.Source.Id}");
    switch (ev.Message)
    {
      case TextEventMessage textMessage:
        await MessagingClient.ReplyMessageAsync(ev.ReplyToken, textMessage.Text);
        break;
      case ImageEventMessage imageMessage:
        //...
        break;
      case AudioEventMessage audioEventMessage:
        //...
        break;
      case VideoEventMessage videoMessage:
        //...
        break;
      case FileEventMessage fileMessage:
        //...
        break;
      case LocationEventMessage locationMessage:
        //...
        break;
      case StickerEventMessage stickerMessage:
        //...         
        break;
    }
  }
}

See each samples for more detail.

More Repositories

1

PlantUmlClassDiagramGenerator

This is a generator to create a class-diagram of PlantUML from the C# source code.
C#
648
star
2

CsvEditSharp

CsvEditSharp is a CSV editor. You can describe reading and writing settings in CSharp script.
C#
20
star
3

GistsApi

Gists API v3 Library for .Net
C#
17
star
4

blazor-wasm-github-pages-template

A template for Blazor WASM SPA to host on a GitHub pages.
HTML
9
star
5

ReactiveBingViewer

This is a sample application that uses the C # / WPF and ReactiveProperty.
C#
5
star
6

CoreShape

An autoshape-like drawing library.
C#
3
star
7

Mine2DDesigner

This is a tool for designing block placement in Minecraft. (for Java Edition) It displays a 3D space as a three-way section to assist in the placement of blocks.The designed blocks are placed on the Minecraft space via a remote console (RCON).
C#
3
star
8

SharpScript

C# scripting console app, using "Runtime (T4) Text Template" and "Microsoft.CodeAnalysis.CSharp".
C#
2
star
9

XamlRichMenuMaker

XamlRichMenuMaker is a rich menu creation tool for LINE chat bot, which designs rich menus using XAML.
C#
2
star
10

ReadonlyStructGenerator

A source generator of readonly struct.
C#
2
star
11

HandyUtilities.Xsv

.Net C# Xsv (CSV, TSV and any character separated value) data processing library
C#
2
star
12

MyCLI

This repository is a sample of a CLI tool using CySharp/ConsoleAppFramework and CySharp/ProcessX.
C#
2
star
13

liff-todo

HTML
1
star
14

line-account-link-sample

LINE Account Link sample app
C#
1
star
15

line-things-sample

Sample code of LINE things
JavaScript
1
star
16

MarkdownMemo

[WPF/C#] The markdown text editor with HTML preview using MarkdownSharp library.
C#
1
star
17

CalcScript

calculator
C#
1
star
18

line-login-sample-app

LINE Login sample for ASP.NET Core web app
C#
1
star
19

add-liff-web

This is a site for adding LIFF application to Bot.
JavaScript
1
star
20

liff-blazor-todo-app

LINE Front-end Framework (LIFF) を利用したTodo管理アプリケーションをBlazor(client-side)のSPAで実装するサンプルです。
HTML
1
star