◆PROCESSING 逆引きリファレンス
カテゴリー:Web・通信
WebHookでリクエストを送るには
【概要】
最近はインターネットを活用した便利なサービスが登場していますが、そんなサービスの1つにWebHookがあります。
WebHookとは、http の仕組み(要するにWebページを表示する仕組み)を利用して、あなたのPCからネット上にある別のコンピュータに、いろいろなメッセージ(要求)を送りつける仕組みの事です。
わがんねーぞ!という人には、cybozu 社さんの
という記事が、とてもわかり易いと思います。
WebHookは上記で紹介させて頂いたcybozu 社さんの製品以外にも、LINEやSlack、Discordなどで使うことが可能です。
LINEについての説明は不要ですよね?。
SlackとDiscordはLINEによく似たチャットサービスで、Slackはビジネスシーンで、Discordはゲームなどのエンターテイメントシーンで良く利用されています。
今回はこのWebHookを使って、Discordにメッセージを送る例を紹介したいと思います。
WebHookでメッセージを送るためには、事前に
- 送り先となるサービス窓口のURL
- 送る電文形式
を調べておく必要があります。
今回はDiscordへ送信しますが、送り先となるサービスのURLと電文については、みなさんの環境や要求ごとに調べておいて下さい。
また、本記事のプログラムを作成するにあたっては
を参考とさせていただきました。ありがとうございます。
【詳細】
はじめに
Discordの場合は事前に、送り先となるサーバー(チャネル)を準備し、該当チャネルでWebHookのURLを取得しておく必要があります。
Discordの使い方については、本題から外れるため割愛します。
Discordの場合は、WebHookでJSON形式のメッセージを受け取ることが可能です。受け取り可能なJSONフォーマットについては、上記でも紹介したDISCORD PORTAL Documentation が参考となります。
HTTPコネクションを作成する
JSON形式の電文を送るためには、送信先となるURLへのHttpコネクションを作成します。
ポイントは、リクエストヘッダにContent-TypeとUser-Agentを含める事です。
送りつける電文は、Discordの仕様に則ったJSON形式のメッセージをシリアライズ化したものです。JSON形式のメッセージには、最低限 contentオブジェクトを含める必要があります。
また日本語のメッセージを送るなら、送信するバイトデータはUTF-8である事を指定しましょう。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/** * HTTPリクエストを送る * <pre> * 指定されたURLへ、HTTPリクエストでJSONオブジェクトを送ります。 * </pre> * @param json : 送信電文(主文) * @param url : 送信先URL **/ void requestWeb(String json, String url){ try{ //送信先URLを指定してHttpコネクションを作成する URL sendUrl = new URL(url); HttpsURLConnection con = (HttpsURLConnection)sendUrl.openConnection(); //リクエストヘッダをセット con.addRequestProperty("Content-Type", "application/JSON; charset=utf-8"); con.addRequestProperty("User-Agent", "DiscordBot"); //URLを出力利用に指示 con.setDoOutput(true); //要求方法にはPOSTを指示 con.setRequestMethod("POST"); //要求を送信する // POSTデータの長さを設定 con.setRequestProperty("Content-Length", String.valueOf(json.length())); //リクエストのbodyにJSON文字列を書き込む OutputStream stream = con.getOutputStream(); stream.write(json.getBytes("UTF-8")); stream.flush(); stream.close(); // HTTPレスポンスコード final int status = con.getResponseCode(); if (status != HttpURLConnection.HTTP_OK && status != HttpURLConnection.HTTP_NO_CONTENT) { //異常 println("error:" + status ); } //後始末 con.disconnect(); } catch(MalformedURLException e ){ //例外 e.printStackTrace(); } catch(IOException e){ //例外 e.printStackTrace(); } } |
上記は、HTTPリクエストを送る部分の抜粋です。
JSONオブジェクトを作成する
Discordの場合は送信するJSONメッセージに、最低限contentオブジェクトを含める必要があります。その他の代表的なパラメータには、usernameやavatar_urlがあります。
以下は代表的なパラメータでJSONを作成する例です。
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 |
/** * JSONオブジェクトを生成する * <pre> * Discordでよく使う最低限のJSONオブジェクトを生成します。 * </pre> * @param content : メッセージ * @param username : 送信者名 * @param avatarUrl : 送信者画像URL **/ String setJsonObj(String content, String username, String avatarUrl){ //JSONオブジェクトを生成する JSONObject json = new JSONObject(); json.setString("content",content); if( username != null && username.length() > 0 ){ //送信者名が有効な場合 json.setString("username", username); } if( avatarUrl != null && avatarUrl.length() > 0 ){ //送信者画像URLが有効な場合 json.setString("avatar_url", avatarUrl); } //シリアライズ return json.toString(); } |
PROCESSINGには、JSONオブジェクトを扱うのに便利なJSONObjectクラスがありますので、それを利用すると良いでしょう。
JSONObjectについては「JSONファイルを書き出すには」記事を参照して下さい。
【関連記事】
サンプルプログラム
Discordにメッセージを送信する例:
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import javax.net.ssl.HttpsURLConnection; import java.net.URL; import java.io.IOException; import java.net.MalformedURLException; import java.net.URLEncoder; import java.io.UnsupportedEncodingException; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; /** * PROCESSING WebHook Send Sample * @auther MSLABO * @version 2019/03/14 1.0 **/ //送信先URL //※ここに送信先となるサービスから得たURLを定義します private final String SEND_URL ="https://discordapp.com/api/webhooks/xxxxxxxxx"; void setup(){ size(200,200); //JSONオブジェクトを生成する String message = "てすと :scream:"; String name = "BOTくん"; String avaUrl = "https://img.icons8.com/plasticine/100/000000/elf.png"; String json = setJsonObj( message, name, avaUrl); println("--------送信JSON--------"); println(json); println("------------------------"); //HTTPリクエストを送る requestWeb(json, SEND_URL); println("送信しました"); } void draw(){ } /** * JSONオブジェクトを生成する * <pre> * Discordでよく使う最低限のJSONオブジェクトを生成します。 * </pre> * @param content : メッセージ * @param username : 送信者名 * @param avatarUrl : 送信者画像URL **/ String setJsonObj(String content, String username, String avatarUrl){ //JSONオブジェクトを生成する JSONObject json = new JSONObject(); json.setString("content",content); if( username != null && username.length() > 0 ){ //送信者名が有効な場合 json.setString("username", username); } if( avatarUrl != null && avatarUrl.length() > 0 ){ //送信者画像URLが有効な場合 json.setString("avatar_url", avatarUrl); } return json.toString(); } /** * HTTPリクエストを送る * <pre> * 指定されたURLへ、HTTPリクエストでJSONオブジェクトを送ります。 * </pre> * @param json : 送信電文(主文) * @param url : 送信先URL **/ void requestWeb(String json, String url){ try{ //送信先URLを指定してHttpコネクションを作成する URL sendUrl = new URL(url); HttpsURLConnection con = (HttpsURLConnection)sendUrl.openConnection(); //リクエストヘッダをセット con.addRequestProperty("Content-Type", "application/JSON; charset=utf-8"); con.addRequestProperty("User-Agent", "DiscordBot"); //URLを出力利用に指示 con.setDoOutput(true); //要求方法にはPOSTを指示 con.setRequestMethod("POST"); //要求を送信する // POSTデータの長さを設定 con.setRequestProperty("Content-Length", String.valueOf(json.length())); //リクエストのbodyにJSON文字列を書き込む OutputStream stream = con.getOutputStream(); stream.write(json.getBytes("UTF-8")); stream.flush(); stream.close(); // HTTPレスポンスコード final int status = con.getResponseCode(); if (status != HttpURLConnection.HTTP_OK && status != HttpURLConnection.HTTP_NO_CONTENT) { //異常 println("error:" + status ); } //後始末 con.disconnect(); } catch(MalformedURLException e ){ //例外 e.printStackTrace(); } catch(IOException e){ //例外 e.printStackTrace(); } } |
Discordにシンプルなメッセージを送信します。
<出力サンプル>
(画像URL:icon8 様)
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。