【バックヤード】WindowsアプリからLINEにメッセージを送信してみました

バックヤード

 2023年12月時点のLINEの国内ユーザー数は9,600万人以上と言われています。ちなみに2024年1月1日時点の日本の人口は、1億2409万人です。約77%が利用していることになります。例えば、人に何かを連絡したいと思ったときは、LINEを使うと効果的ということがわかります。

 そこで、アプリから仲間(グループ)に連絡できれば、何かと便利ではということで、WindowsアプリからLINEにメッセージを送信してみました。

LINE Notifyによるメッセージ送信

 LINEには、LINE Notifyというサービスがあります。「LINE Notify(ラインノーティファイ)」は、LINEとWebサービスやアプリを連携して、ユーザーが通知を受け取れるサービスです。LINEアカウントを持っているユーザーであれば誰でも利用でき、グループでの通知設定も可能です。

 LINE Notifyには大きく2つの手順があります。1つは、認証を行ってからメッセージ送信を行うものと、もう一つはあらかじめ認証しておいて、メッセージ送信を行うものです。一見同じに見えますが、アプリ部分の作り込みが随分異なります。前者を実現しようとすると認証部分とメッセージ送信部分の作りこみが必要ですが、後者の場合はメッセージ送信部分のみの作りこみで済みます。

 LINE Notifyを使ってメッセージを送信するには、アクセストークンが必要です。アクセストークンとは、ユーザー名やパスワードの代わりに使用される資格情報で、サーバー(LINE)に対して認証済みユーザーを表すものです。つまり、前者の「認証を行ってから」というのは、アクセストークンを取得するということです。後者の「あらかじめ認証しておいて、」というのは、アクセストークンを用意しておいてね、ということです。

 なぜ、2つの手順があるかというと、アプリの機能によって使い分けるためです。ひとりがアプリを使うだけなら、後者の方法、あらかじめ利用者のアクセストークンを用意しておけば事足りますが、複数人がアプリを使うとなると、前者のように利用者ごとに認証(アクセストークンを取得)して、そのアクセストークンを使ってメッセージ送信を行う必要があります。

 LINE Notifyでは、認証を行う相手はWebサービス(サーバー)を想定しています。したがって、Windowsアプリだけは、前者の「認証を行ってからメッセージ送信を行うもの」を作成するのは難しいです。今回は、後者の「あらかじめ認証しておいて、メッセージ送信を行うもの」を作ってみたいと思います。

LINE Notify公式アカウントと友達になる

 LINE Notiryを使うには、あらかじめLINEのアカウントが必要です。また、スマホにLINEアプリをインストールしておきます。約77%がアカウントを持っているので問題ないと思います。

 早速、LINE Notify公式アカウントページを開き、右上のログインをクリックします。

  ログインページが表示されるので、「QRコードログイン」をクリックします。

 スマホのLINEアプリのQRコードリーダーで読み取るとログインできます。

 名前をクリックして表示されるメニューの[マイページ]をクリックします。

 「トークンを発行する」をクリックします。

 トークンを発行する画面で、区別が付くトークン名(20文字まで)を入力します。次にトークルームを選択します。ここでは、「1:1でLINE Notifyから通知を受け取る」を選択します。グループを選択すれば、グループのメンバーにメッセージを通知できます。最後に「発行する」ボタンを押下します。

 発行されたトークンです。なくさないようにメモして保管しておきます。

 トークン発行画面を閉じると、連携中サービスに連携済みのサービスが表示されます。連携の解除もこの画面から行うことができます。

通知を送信するトークルームでグループを選択した場合

 トークを発行する画面で、「1:1でLINE Notifyから通知を受け取る」ではなくグループを選択した場合は、別途、スマホ側で選択したグループに「LINE Notify」を招待する必要があります。招待すると、LINE Notifyからの通知をグループで受け取ることができるようになります。

Power shellからメッセージを送信する

 Windowsアプリからメッセージを送る前に、LINE Notifyの設定がうまくいっているか事前に確認しておきます。WindowsのPower shellのコマンドを実行するだけで通知を確認することができます。

$ curl -X POST -H ‘Authorization: Bearer <access_token>’ -F ‘message=foobar’ \ https://notify-api.line.me/api/notify {“status”:200,”message”:”ok”}

https://notify-bot.line.me/doc/ja/

 LINE NotifyのAPIドキュメントには、上記のようなサンプルコマンドが示されています。これを参考にPower Shellでコマンドを実行してみます。

 Invoke-RestMethod -Uri "https://notify-api.line.me/api/notify" -Method Post -Headers @{Authorization="Bearer <access_token>"} -Body @{message="PowerShellからの送信したよ。"}

 こちらがPower Shellのコマンドにしたものです。<access_token>のところを取得したトークンに置き換えます。

 実行した結果です。結果もStatusに200が返ってきており正常完了しています。

 スマホのLINE Notifyのトークルームにメッセージが届きました。

Windowsアプリからメッセージを送信する

 Windowsアプリを作成してメッセージを送信してみます。メッセージ入力できるようにWindows Formsアプリケーションで作成します。

 作成したアプリケーションです。見た通りのユーザーインターフェースです。
操作手順は以下の通りです。
①テキストボックスにメッセージを入力します。
②送信ボタンを押下します。
③実行した結果をレスポンスのテキストボックスに日時付きで表示します。
レスポンスにStatus:200(OK)が表示されています。これは、上述のPower shellのコマンド実行と同じ結果になっています。200はHTTPステータスコードで、正常終了したことを表します。

 LINEにメッセージが通知されました。時刻もあっています。よかったです。

作成したプログラム

 Visual Studio 2019 Communityを使って、プログラム言語:C#、アプリケーション:Windows Formsアプリケーションで作成しています。フォームのデザイン部分は省略してますが、画面と比べていただくとわかると思います。プログラムの12行目の「”アクセストークンを設定します“」の部分に取得したアクセストークンの文字列を設定します。プログラムは80行程度でほとんどのコードは、レスポンスの結果を表示するためのコードになります。メッセージを送信する部分はわずか10行弱です。

using System;
using System.Windows.Forms;
using System.Net.Http;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;

namespace WinToLINE
{
    public partial class Form_SendMsgToLINE : Form
    {
        private static readonly string access_token = "アクセストークンを設定します";

        public Form_SendMsgToLINE()
        {
            InitializeComponent();
        }

        private async void Button_SendMsg_ClickAsync(object sender, EventArgs e)
        {
            string message = textBox_Message.Text;

            // 現在の日時を取得
            DateTime now = DateTime.Now;
            string strNow = now.ToString("yyyy/MM/dd HH:mm:ss");
            if (string.IsNullOrEmpty(message))
            {
                MessageBox.Show("メッセージを入力してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox_Response.AppendText(strNow + ":メッセージを入力してください。" + Environment.NewLine);
                return;
            }

            try
            {
                textBox_Response.AppendText(strNow + ":メッセージを送信しました。" + Environment.NewLine);
                await SendMessageToLineNotify(message);
            }
            catch (Exception ex)
            {
                textBox_Response.AppendText(strNow + $":メッセージの送信中にエラーが発生しました: {ex.Message}" +  Environment.NewLine);
            }
        }

        private async Task SendMessageToLineNotify(string message)
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Authorization", $"Bearer {access_token}");
                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("message", message)
                });
                HttpResponseMessage response = await client.PostAsync("https://notify-api.line.me/api/notify", content);

                // レスポンスステータスを取得
                string responseStatus = $"{(int)response.StatusCode} ({response.StatusCode})";
                // レスポンスヘッダーからDateヘッダーを取得
                string formattedDate = "";
                if (response.Headers.TryGetValues("Date", out var values))
                {
                    // Dateヘッダーの値をDateTimeに変換
                    string dateHeader = values.FirstOrDefault();
                    if (dateHeader != null)
                    {
                        // Dateヘッダーの値をDateTimeに変換
                        DateTime serverDate = DateTime.Parse(dateHeader);
                        formattedDate = serverDate.ToString("yyyy/MM/dd HH:mm:ss");
                    }
                }
                if(formattedDate == "")
                {
                    // 現在の日時を取得
                    DateTime now = DateTime.Now;
                    formattedDate = now.ToString("yyyy/MM/dd HH: mm:ss");
                }
                textBox_Response.AppendText(formattedDate +  string.Format($":Status :{responseStatus}") + Environment.NewLine);
            }
        }
    }
}

まとめ

 今回は、WindowsアプリケーションからLINEにメッセージを送信することをやってみました。やってみると簡単にLINEに通知できることがわかりました。アイデア次第でいろんなことができそうです。Windowsアプリケーションに限らず、WiFiに繋がり、HTTPクライアント(プロトコルスタック)があればどこからでもLINEに通知ができますね。

タイトルとURLをコピーしました