
指定したURLにHTTP(S)リクエストを送る、MetaTraderのWebRequest関数というものがあります。
これを使ってスマホのLINEアプリへプッシュ通知を送れないか研究してみたいと思います。
LINEアプリへのプッシュ通知
過去の記事で、MetaTraderのインジケーターからLINEアプリへプッシュ通知を送る試みをしました。
これは、MetaTraderの開発言語であるMQLだけで実現しているのではなく、Windowsの実行モジュールであるDLLとの合わせ技で実現しました。
しかしながら、DLLの開発にC#というプログラミング言語を使用しているため、動作させるには.NET Framework(私が作ったものはVer3.5以降)が必要になります。最近のWindowsは.NET Frameworkは普通にサポート・インストールされているので問題ないと思うのですが、すべての人の環境で問題なく動作するかがイマイチ不安でした。
そこでよくよく調べると、WebRequest関数というHTTP(S)リクエストを送る関数があるのを発見しました。
この関数を使ってLINEアプリへプッシュ通知・メッセージ送信にトライしてみます。
WebRequest関数
まず、WebRequest関数の引数、戻り値を確認しましょう。
1.シンプルなリクエストを送るタイプ
1 2 3 4 5 6 7 8 9 10 11 |
int WebRequest( const string method, // HTTP method const string url, // URL const string cookie, // cookie const string referer, // referer int timeout, // timeout const char &data[], // the array of the HTTP message body int data_size, // data[] array size in bytes char &result[], // an array containing server response data string &result_headers // headers of server response ); |
2.ヘッダをカスタムしてリクエストを送るタイプ
1 2 3 4 5 6 7 8 9 |
int WebRequest( const string method, // HTTP method const string url, // URL const string headers, // headers int timeout, // timeout const char &data[], // the array of the HTTP message body char &result[], // an array containing server response data string &result_headers // headers of server response ); |
引数も多いし、同じ名前で2種類あるし、どっちを使っていいかよくわかりませんね。
どちらの関数を使って、どのように実装すればLINEのメッセージを送ることができるのでしょうか。
LINE Notifyのリクエストを見てみる
LINEでメッセージを送るためには、どのようなHTTPリクエストを送ればよいのかを解析してみます。
LINE Engineering Blogには、以下のように記載されています。
LINE Notifyで発行できる「パーソナルアクセストークン」を使い、
APIのエンドポイントにHTTP POSTリクエストを送るだけで
メッセージを送ることができます。
HTTPリクエストができればどんな方法でも使うことができますが、
ここではコマンドラインで使えるHTTPクライアントである
curlを使ってみることにします。
そして、実際にcurlコマンドを呼び出すことでメッセージを送ることができます。
(macをお使いの方はcurlが最初から入っていますが、Windowsをお使いの方は入っていません)
1 |
curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message=foobar' https://notify-api.line.me/api/notify |
[access_token]に、自分のLINE Notifyのトークンを入れ、foobarにメッセージを入れて実行してください。そうすると、自分のLINE Notifyのトークルームにメッセージが送信されます。
この状態で、どのようなHTTPリクエストが送られているかを詳細にみるために、curlへ”–trace-ascii”オプションをつけて実行します。
1 |
curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message=foobar' https://notify-api.line.me/api/notify --trace-ascii log.txt |
log.txtには、次のようなHTTPリクエストが出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
== Info: Trying 203.104.138.174... == Info: Connected to notify-api.line.me (203.104.138.174) port 443 (#0) == Info: TLS 1.2 connection using TLS_RSA_WITH_RC4_128_MD5 == Info: Server certificate: *.line.me == Info: Server certificate: GeoTrust SSL CA - G3 == Info: Server certificate: GeoTrust Global CA => Send header, 289 bytes (0x121) 0000: POST /api/notify HTTP/1.1 001b: Host: notify-api.line.me 0035: User-Agent: curl/7.49.1 004e: Accept: */* 005b: Authorization: Bearer [access_token] 009e: Content-Length: 146 00b3: Expect: 100-continue 00c9: Content-Type: multipart/form-data; boundary=------------------------da400dacce01097d <= Recv header, 23 bytes (0x17) 0000: HTTP/1.1 100 Continue => Send data, 146 bytes (0x92) 0000: --------------------------da400dacce01097d 002c: Content-Disposition: form-data; name="message" 005c: 005e: foobar 0064: --------------------------da400dacce01097d-- <= Recv header, 17 bytes (0x11) 0000: HTTP/1.1 200 OK |
※見やすくするために、改行の挿入・削除をしています。
LINE NotifyのAPIを叩くには、HTTPリクエストのヘッダを14行目、17行目のようにカスタマイズし、データ本体を25〜29行目のテキストを設定して送る必要があります。
したがって、WebRequset関数は、ヘッダをカスタムして送る方を使うことになります。
2.ヘッダをカスタムしてリクエストを送るタイプ
1 2 3 4 5 6 7 8 9 |
int WebRequest( const string method, // HTTP method const string url, // URL const string headers, // headers int timeout, // timeout const char &data[], // the array of the HTTP message body char &result[], // an array containing server response data string &result_headers // headers of server response ); |
この第3引数のheadersに14行目、17行目、第5引数のdataに25〜29行目のテキストを設定して、WebRequest関数を呼び出します。
なお、行頭の”005b:”などは、curlがログを読みやすくするために挿入しているものなので、”Authorization: Bearer [access_token]”といったテキストを設定します。
さいごに
WebRequest関数はプロトタイプが2種類あり、かつ引数がたくさんあるので一瞬ひるんでしまいます。
しかし、どの引数に、何を設定すればよいかがわかれば、あとは文字列をセットして呼び出すだけです。
ぜひ、チャレンジしてみてください。
質問はコメント欄で受け付けておりますので、お気軽にどうぞ。
YOUさん初めまして。
私もLINEに通知しようとして検索していたらこのページにたどり着きました。
その後の調子はどうですか?
田中たけしさん、コメントありがとうございます。
WebRequestを使ったLINE通知ですが、
一応実装できていますが、まだ動作検証中です。
ちなみに、どのようなシーンでLINE通知を
使おうとしてるのでしょうか?
シグナルをLINE@に登録したメンバーに通知しようとしています。
LINE Messaging API、herokuを使って実装しようとしています。
田中たけしさん
ご返信が遅くなりました。
LINE@へのメッセージ送信プログラムを作ってみました。
herokuではなく、導入の手間がかからないGoogle Apps Scriptで実装したのでご要望にかなってないかもしれないですが、参考にしてください。
https://fx-shakariki.com/lineat_auto1/
あと、LINE@にご登録のメンバーさんにも、ぜひ本ブログを宣伝してください(笑!
また、何かあったらコメントしてくださいね。
はじめまして。
25〜29行目のテキスト設定に関して質問です。
最終的にStringToCharArrayでchar[]にするとおもうんですが、その前に25〜29行目をstringにした形がわからなかったです。改行コードやname=”message”の”はエスケープしないといけないでしょうか。
いきなりですが、ご回答いただけると幸いです。