LINE Messaging API を使って C# で LINE にメッセージを送る

LINE の Messaging API アカウントを使って、C# からメッセージを送る方法のメモです。これは前回の記事の内容にも関連しています。

Messaging API を作る

まずはこれがないと何もできません。LINE Developers にアクセスして作成します。

developers.line.biz

作成方法はこちらを参考にしてください。

developers.line.biz

こんな感じに作成できれば OK です。

f:id:takunology:20210301143556p:plain

リファレンスを読む

Messaging API は Webhook を投げることで動かすことができます。今回はブロードキャストメッセージ(友達登録した相手にメッセージを送る)を使用します。まずはリファレンスを読んで、どんな形式で Webhook を投げれば良いかを確認しておきます。

developers.line.biz

リファレンスの目次に、「ブロードキャストメッセージを送る」という項目があるので確認します。

f:id:takunology:20210301153329j:plain

どうやらこんな感じに JSON 形式で送れば良さそうです。

//ここはヘッダー
{
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}

-h と書いてあるのはリクエストヘッダーで、-d はリクエストボディーです。

C# プログラムを書く

まずは Messaging API アカウントのチャネルアクセストークンをコピーしておきましょう。Messaging API 設定 のタブを選択し、下にスクロールするとあります。

f:id:takunology:20210301155123j:plain

あとはリファレンスに沿った形式で Webhook を投げれるように、JSONシリアライズしていきます。シリアライズに関してはこの記事を参考にどうぞ。

blog.takunology.jp

WebClient を使うと簡単に POST できます。また、Headers.Add メソッドを使ってリクエストヘッダーを指定しています。 UploadString にて LINE のブロードキャスト(共通の)アドレスへ接続し、シリアライズされた JSON 文字列がアップロードされます。Headers.Add にはチャネルアクセストークンがあるので、アカウントを識別してメッセージが送信されます。

using System.Collections.Generic;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Net;
using System.Text;

class Program
{
    public static string LineToken = @"チャネルアクセストークンの文字列";
    public static string LineURL = @"https://api.line.me/v2/bot/message/broadcast";

    static void Main(string[] args)
    {
        SendMessage("やぁ、たくのろじぃだよ");
        SendMessage("C# が好きなイカだよ");
    }

    public static void SendMessage(string TextMessage)
    {
        var LineMessage = new LineMessage();
        LineMessage.Message.Add(new Message { Type = "text", Text = TextMessage });

        var Serializer = new DataContractJsonSerializer(typeof(LineMessage));
        var ms = new MemoryStream();
        Serializer.WriteObject(ms, LineMessage);

        using (WebClient client = new WebClient())
        {
            client.Encoding = Encoding.UTF8;
            client.Headers.Add("Content-Type", "application/json");
            client.Headers.Add("Authorization", $"Bearer {LineToken}");
            client.UploadString(LineURL, Encoding.UTF8.GetString(ms.ToArray()));
        }
    }

    [DataContract]
    public class LineMessage
    {
        [DataMember(Name = "messages")]
        public IList<Message> Message { get; set; } = new List<Message>();
    }

    [DataContract]
    public class Message
    {
        [DataMember(Name = "type")]
        public string Type { get; set; }
        [DataMember(Name = "text")]
        public string Text { get; set; }
    }
}

実行結果

イカからメッセージが送られてくるのってなかなかにシュールですね(笑)。ちなみに、このイカは「いかのろじぃ」といいます。(聞いてない)

f:id:takunology:20210301154927p:plain

f:id:takunology:20210301154940p:plain

実はSDKがあった

今回は全て自分の手でコーディングしましたが、どうやら LINE 用の拡張機能があったみたいです。

github.com

おわりに

チャネルアクセストークンを用いて C# からメッセージを送ることができました。これを Azure Functions と組み合わせたのが前回の記事の内容でした。もしよろしければご覧ください。

blog.takunology.jp

宣伝的なもの

LINE Developers Community の方々による LINE API を用いた開発や最新情報などを共有するコミュニティがあります。私も先日、コミュニティのイベントに参加してきました。

linedevelopercommunity.connpass.com

また、学生による学生のためのMicrosoft技術勉強会コミュニティ Microsoft Student Partners Japan もあります。日本に所属する Microsoft Learn Student Ambassadors が月1でイベントを開催しています。

mspjp.connpass.com

私も今年から Ambassador として活動し始めました。一応専門は Minecraft を用いた C# プログラミングなのですが、どのようにイベントを企画しようか検討中です。

また、Minecraft を使いながら楽しく学べるコンテンツも製作中です。

www.mcwithcode.com