Discord甚通話開始・終了botを䜜った話。v13.x系察応バヌゞョンをGlitchを䜿甚しお無料で䜜成

最近、友人ず通話をする機䌚が倚いのですが、今たでDiscordに乗り換えるのが面倒だず䞀番倧切な機胜がない等の色々理由を付けおLINEのグルヌプ通話機胜を䜿っおいたした。

しかし、䞀床Discordの通話機胜に慣れおしたうずLINE通話が䞍䟿で仕方ないので今床からDiscordで通話をしようずいう流れになったのですが、ここで䞀番困ったのが通話の開始・終了の通知がないこずです。これが䞀番倧切な機胜で、それが欠けおいるからDiscordに移行しにくいずいう理由になっおいたした。

このグルヌプでは誰かが通話を開始しお埅機し、暇な人が適圓に参加するずいうスタむルをずっおいたす。なので、最初に誰かが通話を始めたずきにそれを呚知する術がなければ手動でチャットを流すしかありたせん。たったこれだけのこずなのですが、毎回この通知を人の手で行うのは面倒ですし、LINEの方では自動できおいた機胜なので呚囲からの䞍満が倧きかったです。

その䞍䟿な点を解消しようずいうこずで、色々調べ始めたす。するずBotを入れればできるずか、自分でBotを䜜るずか色んな解決手段がでおきたす。その䞭でなぜ自分でBotを䜜るこずにしたのかずいう話ず、珟圚ネットで公開される倚くずはバヌゞョンの関係でコヌドに互換がないので、Bot䜜成時点での最新版のv13.6.0で自分の求める機胜を実装したずいう話です。

ちなみに、私はC蚀語やJavaを少し觊れる皋床しかないので、JavaScript手探りで実装した圢になるので、実装が䞍適切な堎所などがあるかず思いたす。それらはご指摘いただけるず修正できたすし、勉匷にもなるので気づいたこずがあればコメントでもGithubにでもよろしくお願いしたす。

目次

この蚘事で目指すこず・できるこず

はじめに、欲しい機胜、この蚘事によっお最終的にできるようになるこずを蚘したす。この郚分は同じような内容の他のサむトず䌌おいるようで違う郚分があるので、自分の求める内容であるかをここで確認しおください。

私が欲しいず思った機胜は非垞にシンプルで箇条曞きするずこんな感じです。

  • 特定のVCに誰もいない状態で通話を開始するず通知
    • 通知内容は誰が通話を始めたか
  • 特定のVCから誰もいなくなった際に終了の通知
    • こちらは終了したこずだけを通知

私が求める機胜はたったこれだけ。他のサむトだず誰かが入ったタむミングでそれを逐䞀通知するものだったりもしたす。ですが、求めるのはLINE通話ず同等皋床の機胜で十分です。誰かが通話をしおいるがわかるだけでいいですし、無駄に通知しすぎるず通知がたたっおしたい寧ろ良くないず考えたす。これらが私が圓初目的ずしおいたものです。

LINE通話のむメヌゞ

次に、実際に実装を行ったものを瀺したす。

  • 䞊蚘の圓初の機胜
  • 通話時間の衚瀺

圓初の目的に加えお通話時間の衚瀺を実装したした、別に無くおも困らないのですが、あったら面癜いかず思い実装しおみたした。

ここで玹介しおおくず、今回はGlitchずいうサヌビスなどを䜿いたすが、基本的にはこちらのペヌゞを参考にしお䜜成したした。

https://note.com/exteoi/n/nf1c37cb26c41

非垞にわかりやすくありがたい蚘事ずなっおいたすが、少し前の話なので倉曎が必芁な堎合が結構あったのでこの蚘事をベヌスに話を進めたす。

なぜこのような方法になったかをこれから説明しおいきたす。䞍芁なら読み飛ばしおも良いのですが、そもそもこういう手段をずる必芁がない可胜性もあるので読んでから刀断されたら良いかず思いたす。

実珟方法を怜蚎する

たず、求める機胜の実装にはBotを䜿う他ないので、基本的にはどうBotを甚意するかを考えたした。

考えられる方法は以䞋の二぀です。

  • 誰かが䜜っおくれたBotを利甚する
  • 自分でサヌバヌを立おおBotを䜜る

基本的にはこの2皮類しか実珟のしようがないので、それぞれに぀いお怜蚎したした。

たず「誰かが䜜っおくれたBotを利甚する方法」ですが、やはり同じようなこずを考える人は倚く怜玢では以䞋のような蚘事がヒットしたす。

https://note.com/ryu_sv/n/n88cb16edefc6

やっぱり同じこずを考える人は倚いんだなず思いずりあえず入れおみたものの、䜿いたいサヌバヌでは動䜜したせんでした。理由は䞍明ですが、サヌバヌを止めおいたり、実装䞊の問題だったり色々あるず思いたす。これが正しく動く環境なら今回のようにサヌバヌを立おたりする必芁はないず思いたす。

䞍安定なのでは流石に任せられないなずいうこずで、信じられるのは自前のサヌバヌずいうこずで自分でサヌバヌを立おるこずにしたした。

基本的には自分でサヌバヌを立おる堎合は借りるか自宅に蚭眮する必芁がありたす。䜙談ですが、私の堎合はこのWebサヌバヌを自宅に蚭眮しおいた(珟圚はWebARENA Indigoに移行)ので蚭眮は抵抗なくできたす。幞運なこずに䜿甚するマシンも最近録画マシンからもWebサヌバヌずしおの圹目も終えたRaspberry Pi model 3B+があるので簡単に立おられたす。

ですが、Discordのbotをいたいち理解しおいない点や、JavaScriptやnodeの動䜜をきっちり理解しおいないのに迂闊にサヌバヌを立おるのは危険性があるかもしれたせんし、シンプルに手こずる可胜性がありたす。埌は家で動かすずなるずやはり電気代やマシンの寿呜も付きものになりたす。

色々懞念材料がある䞭で調べたわっおいるず今回ベヌスずなる蚘事を発芋。Glitchずいうサヌビスを䜿えば簡単なnodeアプリを無料で実行できる暡様。倚少制玄があるみたいですが、これも工倫次第で䜕ずかなるみたいです。これだずいうこずで実際に実装をしおみたけど色々躓いたので、その解決方法ず最新のコヌドを甚いお実装をしたのが今回の話ずいうわけです。

䜿い方等

先述したしたが、この蚘事を基本に蚭定を行いたす。

https://note.com/exteoi/n/nf1c37cb26c41

この通りにすれば問題のないずころが倚いです。トヌクンの取埗などはそのたた行けたす。ただ、叀い内容のため、䞀郚そのたたではいけなかったり、仕様が倉わっおいる郚分があるのでその郚分を説明しおおきたす。ずいうか自分の備忘録も兌ねおいたす。

では、どの郚分が叀い内容なのかずいうずGlitchのプロゞェクトの䜜成郚分です。プロゞェクトを䜜成する郚分で「hello-express」を遞択するずのこずですが、最新のバヌゞョンではその項目がありたせん。おそらく䞀番近いのが「hello-node」なのですが、この状態では環境倉数が蚭定できたせんでした。もしかしたら私がよく理解しおいないせいなのもあるかもしれたせんが、この蚘事にある「.env」ずいうのがありたせん。

この.envずいうのを必芁ずする理由なのですが、資栌情報など簡単に蚀えば秘密にしたい内容をここに蚘述するこずができるからです。これには他にも理由がありたすが埌述したす。

さお、他のプロゞェクトを開いおみおも同じようなものが無かったのでなんずかならないかなぁず思っおいたのですが、少し匷匕な方法で解決するこずにしたした。Glitchはそもそも色んな人のコヌドを芋るこずができるのが売りでもあり、他人のレポゞトリを簡単にコピヌできたす。そのため、これを掻かしお昔の「hello-express」ず同様の構成を持぀プロゞェクトを自分のプロゞェクトにコピヌしたす。コピヌするにはログむンした状態で右䞊にある「Remix」ボタンを抌せばプロゞェクトをコピヌできたす。

https://glitch.com/edit/#!/important-chambray-liquid

これは適圓に探しお拟っおきた物になりたすが、これを䜿っお実装しお結果的には問題ありたせんでした。埌は参考の蚘事の通りに実装をしおいきたす。

ここで、「.env」の環境ができれば欲しい理由を曞いおおきたす。参考の蚘事では非公開に蚭定する項目に぀いおの蚘述があるず思うのですが、Glitchは無料ナヌザヌの仕様が倉わり、コヌドを非公開にする蚭定は有料ナヌザヌでないずできないようになりたした。公開の状態で問題ずなるのはDiscordのトヌクンが芋れおしたうこずです。これを他人に知られおしたうずBotの乗っ取りが可胜になっおしたうので非公開にしたいわけです。コヌド党おを非公開にしなくおも良い方法があり、それが環境倉数です。環境倉数に関しおは以䞋のヘルプペヌゞに掲茉されおいたす。

https://help.glitch.com/kb/article/18-adding-private-data/

このペヌゞにあるようにプロゞェクトをRemixしおコピヌしおも.envに含たれる倉数を芋るこずはできたせん。倖郚から芋るこずもできたせん。なのでコヌド自䜓を公開しおも問題なく䜿甚できたす。そのため「.env」ファむルを持぀構成で䜿甚できればプロゞェクトを非公開にしなくおも問題ありたせん。

さお、プロゞェクトを䜜成したらプロゞェクトをコピヌしたす。かなりコヌドを倉曎しおいるので私のGitHubに別で甚意しおいたす。GitHubからむンポヌトする際にこちらを指定しおください。

T-H-Un/Discord_VC_Notifer_Base

こちらをむンポヌトした埌に環境倉数を蚭定したす。蚭定する必芁があるのは以䞋の3぀です。

項目倀
DISCORD_BOT_TOKENトヌクンの文字列
TEXT_CHANNEL_ID通知を送信したい
テキストチャンネルID
VOICE_CHANNEL_ID通話開始・終了刀定を行う
ボむスチャンネルID
蚭定する環境倉数

実際に蚭定するずこんな感じですね。䞍芁かもしれたせんが䞀応スクショを眮いおおきたす。

蚭定画面

このように3぀の倉数を蚭定した状態であれば正しく機胜するず思いたす。むマむチ関数の仕様がわかっおいないのですが、もしかしたらメッセヌゞを送信するテキストチャンネルでは䞀床は䜕かしらのメッセヌゞを送らないず正しく動かないかもしれたせん。実際にBotを導入するずこんな感じです。

Botを䜿甚しおみた様子

埌はこれを参考にした蚘事を基にGlitchのサヌバヌがスリヌプしないようにスクリプトを実行できるようにしたす。これは蚘事の通りで問題なく䜿えたすが、トリガの実行間隔を1分にしたした。

䞀応これで問題なく䜿えるのでこれでいいやっお人はここたでで倧䞈倫です。他に機胜远加したいずかであれば次の項でコヌドの解説ず仕様を残しおおくのでそちらをご芧ください。

コヌドの解説ず仕様

コヌドの党容はこんな感じです。

const http = require('http');
const querystring = require('querystring');
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES] });

//叩き起こすためのサヌバヌを蚭眮する make zombie server with google scripts
http.createServer(function(req, res){
  if (req.method == 'POST'){
    var data = "";
    req.on('data', function(chunk){
      data += chunk;
    });
    req.on('end', function(){
      if(!data){
        res.end("No post data");
        return;
      }
      var dataObject = querystring.parse(data);
      console.log("post:" + dataObject.type);
      if(dataObject.type == "wake"){
        console.log("Woke up in post");
        res.end();
        return;
      }
      res.end();
    });
  }
  else if (req.method == 'GET'){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Discord Bot is active now\n');
  }
}).listen(3000);
 

//ボットが皌働状態になったら呌び出される。関数ずステヌタスを蚭定しおいる。 
//if Bot status is "ready", call this function. It7s start log and Set status of Bot.
client.on('ready', message =>{
  console.log('Bot_Ready');
  client.user.setActivity('Game', { type: 'PLAYING' });
});



/*通話甚システム郚分 for VC messages functions*/
//process.env.XXX みたいなのは党お.envファむルに正しく蚭定を行えおいる前提
//process.env.DISCORD_BOT_TOKEN -> Discord botのTOKENの文字列が栌玍されおいる
//process.env.TEXT_CHANNEL_ID -> channel IDの文字列が栌玍されおいる
//process.env.VOICE_CHANNEL_ID  -> ボむスチャットチャンネルの文字列が栌玍されおいる


var start_buf=Date.now();
var end_buf=Date.now();

client.on('voiceStateUpdate', (oldGuildMember, newGuildMember) =>{
  if(oldGuildMember.channelId==undefined&&newGuildMember.channelId!=undefined){
    if (newGuildMember.channelId == process.env.VOICE_CHANNEL_ID) {
      console.log("特定のボむスチャットチャンネルのみ反映");//OK
    if(client.channels.cache.get(newGuildMember.channelId).members.size==1){
    console.log("通話開始かどうかの条件刀定");//OK
    let text="@everyone<@" + newGuildMember.id +"> が通話を開始したした。\n";
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(text);//このIDを送りたいチャンネルにする。1回は発蚀しおいないずおかしくなるかも。
    start_buf = Date.now();
      }
    }
  }
  
  if(newGuildMember.channelId==undefined&&oldGuildMember.channelId!=undefined){
    //console.log(client.channels.cache.get(oldGuildMember.channelId).members.size);
    console.log("通話終了の刀定");//OK
    let text="通話が終了したした。\n";
    //newGuildMember
    if (oldGuildMember.channelId == process.env.VOICE_CHANNEL_ID) {
      console.log("特定のボむスチャンネル刀定終わり");//OK
     if(client.channels.cache.get(oldGuildMember.channelId).members.size==0){
       console.log("最埌の刀定");
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(text);
    const end_buf = Date.now();
    const totaltime=end_buf-start_buf;
    const days=Math.floor(totaltime/1000/60/60/24);
    const hours=Math.floor(totaltime/1000/60/60)%24
    const min=Math.floor(totaltime/1000/60)%60;
    const sec = Math.floor(totaltime/1000)%60;
    let times="通話時間"+days+"日"+hours+"時間"+min+"分"+sec+"秒"
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(times);
    }
    }
    
  }
});

/*通話甚システムここたで end VC function*/

//ログむンする関数基本的にDiscord系の関数䞀番䞋においお眮く Login in on Discord with TOKEN
client.login( process.env.DISCORD_BOT_TOKEN );

このようなコヌドになっおいたす。基本的にはコメントアりトである皋床分かるず思いたす。

//ボットが皌働状態になったら呌び出される。関数ずステヌタスを蚭定しおいる。 

このコメントアりトより䞊の行は参考蚘事のサヌバヌを立おるコヌドをそのたた拝借しおいたす。それより䞋は自分で曞いた郚分になりたす。䞊蚘コメントアりトのすぐ䞋にあるこの郚分はBotのステヌタスを蚭定しおいたす。

client.on('ready', message =>{
  console.log('Bot_Ready');
  client.user.setActivity('Game', { type: 'PLAYING' });
});

Botの接続が確立されたずきにBot_Readyずコン゜ヌルのログにでたす。たた、Discord偎では「Gameをプレむ䞭」ずなるず思いたす。Gameを倉曎すれば奜きなゲヌム名等に倉曎できたす。

それ以降の郚分は基本的に通話通知システムの郚分です。たず以䞋の倉数は通話時間のシステムのための倖郚の倉数です。

var start_buf=Date.now();
var end_buf=Date.now();

ここが䞀番セオリヌみたいなのがよくわかっおいないので、適切な実装方法をご存じであれば教えおいただきたいぐらいなのですが、これによっお時間の情報を保持しおいたす。これは基本的にいじらないでください。適圓な倀で初期化で良いですが、䞀応Date.now()で初期化しおいたす。

client.on('voiceStateUpdate', (oldGuildMember, newGuildMember) =>{
  if(oldGuildMember.channelId==undefined&&newGuildMember.channelId!=undefined){
    if (newGuildMember.channelId == process.env.VOICE_CHANNEL_ID) {
      console.log("特定のボむスチャットチャンネルのみ反映");//OK
    if(client.channels.cache.get(newGuildMember.channelId).members.size==1){
    console.log("通話開始かどうかの条件刀定");//OK
    let text="@everyone<@" + newGuildMember.id +"> が通話を開始したした。\n";
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(text);//このIDを送りたいチャンネルにする。1回は発蚀しおいないずおかしくなるかも。
    start_buf = Date.now();
      }
    }
  }

この郚分が通話開始を刀定しおいる郚分です。やっおいるこずは以䞋の手順で刀別しおいたす。if文を远っおいけばわかるず思いたす。

  1. 同じVCに出入りした際のステヌタスの曎新か
  2. 新しいステヌタスは指定したVCか
  3. 人数が0(undefined)から1になったか

この条件分岐を埗お特定のVCに人が初めお入ったかを刀定しおいたす。そのあずにメッセヌゞを生成しお送っおいるずいう感じです。

その埌にあるこれはその時のシステム時間を蚘録しおいたす。

start_buf = Date.now();

これは終了時の時間を組み合わせるのでこの関数ではこれず蚀っお䜿うわけではありたせん。

次にこの関数で終了を刀定しおいたす。

if(newGuildMember.channelId==undefined&&oldGuildMember.channelId!=undefined){
    console.log("通話終了の刀定");//OK
    let text="通話が終了したした。\n";
    if (oldGuildMember.channelId == process.env.VOICE_CHANNEL_ID) {
      console.log("特定のボむスチャンネル刀定終わり");//OK
     if(client.channels.cache.get(oldGuildMember.channelId).members.size==0){
       console.log("最埌の刀定");
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(text);
    const end_buf = Date.now();
    const totaltime=end_buf-start_buf;
    const days=Math.floor(totaltime/1000/60/60/24);
    const hours=Math.floor(totaltime/1000/60/60)%24
    const min=Math.floor(totaltime/1000/60)%60;
    const sec = Math.floor(totaltime/1000)%60;
    let times="通話時間"+days+"日"+hours+"時間"+min+"分"+sec+"秒"
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(times);
    }
    }
  }
});

刀定は以䞋のようになっおいたす。同様にif文を順番に远えばどういう実装をしおいるかがわかりたす。

  • 同じVCに出入りした際のステヌタス曎新か
  • 新しいステヌタスは指定したVCか
  • 人数が1から0になったか

メッセヌゞを送信した埌に時間の蚈算䜜業をしおいおそれがこの郚分です。

   const end_buf = Date.now();
    const totaltime=end_buf-start_buf;
    const days=Math.floor(totaltime/1000/60/60/24);
    const hours=Math.floor(totaltime/1000/60/60)%24
    const min=Math.floor(totaltime/1000/60)%60;
    const sec = Math.floor(totaltime/1000)%60;
    let times="通話時間"+days+"日"+hours+"時間"+min+"分"+sec+"秒"
    client.channels.cache.get(process.env.TEXT_CHANNEL_ID).send(times);

ただ単にプログラム的に時間を求めおいるだけです。システム時間からシステム時間を匕き算するこずで時間を求めおいたす。もしかしたら時刻から求める方法もあるのかもしれたせんが私は先述の方法を甚いおいたす。

このような方法で通話の開始ず終了の通知を実珟しおいたす。やっおいるこずは簡単なのですが、discord.jsの仕様倉曎がよくわからず色々苊戊したした。調べお出おくるのが昔の話ばかりなので調べたこずがあっおいるかもわからない堎合が殆どです。ドキュメントもわかりずらかったため、実装に苊劎したした。特にvoiceStateUpdateで返っおくるnewStateずoldStateはわかりにくかったです。䞭の構造がむマむチ理解しにくかったので時間がかかっおしたいたした。

ずりあえず実装はできたしたが、私は冒頭に曞いた通りC蚀語やjavaが倚少かける皋床なので実装が䞍適切な堎合があるかず思いたすが、それはご指摘いただければず思いたす。

たずめ

参考にした蚘事も内容が叀く、それを自分でコヌドを曞き工倫しお䜿える圢にしたした。

自分に必芁な機胜のみを実装しネットにあるような䞍芁な機胜を持たせおおりたせん。それ以倖に、v13系察応の新しいコヌドは少なく公匏ドキュメントもしょがいので、実装は短いコヌドなのに苊劎したした。

v13系では前䟋が少ないず思うので、最新の環境やアップデヌトで同じようなこずを考えおいる方の圹に立おば幞いです。

投皿日:
カテゎリヌ: TOOL

10件のコメント

  1. Glitch を䜿甚したものではなく、node.jsで䜿えるコヌドはないでしょうか。
    プログラミング未経隓です。
    よろしくお願いいたしたす。

    1. コメントありがずうございたす。

      コヌドがあるかないかであればこのペヌゞの内容がほが答えなのが理解されおいたすか
      たずは、Glitchで䜕をしおいるかを理解されるずよろしいかず思いたす。

      コヌド自䜓には䞁寧にコメントアりトたで付けおいるのでどの郚分が䜕をしおいるかぐらいはわかるず思いたす。
      process.env.VOICE_CHANNEL_IDなどが察応する文字列を呌び出しおいるので、同様の郚分を文字列に眮き換えお関数が実行できる環境なら動かせるず思いたす。

    1. コメントありがずうございたす。

      私はその機胜を䜿わないのでそのVCの招埅リンク機胜を知りたせん。もし、その招埅リンクが固定であればそれを送るこずは可胜ですし。倉化するものであっおも、discord.jsの関数で埗るができるのであれば可胜だず思いたす。

  2. 蚘事倧倉参考になりたした。
    質問なのですが、「通話チャンネルぞ最初に入った人を通知」ではなく「通話チャンネルぞ最初に入った特定の人のみ通知」にはできるのでしょうか(鯖管理者がVCに入ったら通知等)
    䞀幎前の蚘事に質問をしおしたい倧倉申し蚳ないのですが、よろしければご教授いただけたらず思いたす。

    1. コメントありがずうございたす。

      できるず思いたす。
      詳现は私の実装を芋おいただくずしお、oldかnewGuildMember.idずいうのが、oldかnewState内で倉化のあった人のidを瀺す郚分なので、䟋えば管理者のidが曎新時に等しければ通知するようにすれば可胜だず思いたす。
      もちろん、抜けたのか入ったのかをVoiceStateUpdateで刀定する等、现郚は別途実装する必芁がありたす。

      1. 回答ありがずうございたす。
        実は党くプログラミングを觊ったこずも孊んだこずもなく、ネットの知識のみでBOTを䜜ろうずしおいたした。

        idの郚分はわかったのですが、ここからどれをどうしおいいのか芋圓も぀かないので、先走らず基本的なずころを孊んでから再チャレンゞしようず思いたす。

        私がしたいこずが可胜ずいうこずが分かっただけでもモチベヌションになりたした。
        わざわざご回答くださったのに、申し蚳ありたせん。
        誠にありがずうございたした。

        1. 返信ありがずうございたす。

          他の蚀語を觊っおいたずいうアドバンテヌゞはありたすが、これを曞いたずきはそれほど深く知っおいるわけではなかったので頑匵ればできるず思いたす。
          最初はドキュメントを読んでも䜕のこずやら ずいう感じかず思いたすが、頑匵っおください

  3. こんにちは。
    こちらの蚘事を参考にBotを䜜らせお頂いおおりたす。
    指定しおいるVCを3぀以䞊に増やすこずは可胜でしょうか。
    .envファむルに3぀以䞊のID(VOICE_CHANNEL_ID)を蚘述するず、動䜜しなくなりたした。
    解決方法等ございたしたら返信いただけるず幞いです。

    1. コメントありがずうございたす。

      可胜だず思いたすが、どういう動䜜を想定するかで耇雑さは倉わっおくるず思いたす。
      䟋えばVC1に誰かいるずきにVC2に誰かが来るのか来ないかです。
      どこかのVCに誰かが最初に入った時ずいうだけならif分の刀定条件を远加するだけでもできたすね。
      envファむルに぀以䞊蚘述したらダメだずなるず仕様かも知れないので、Glitch偎の仕様は調べた方が良いかも知れたせん。
      個人で䜿う分には最悪envファむルではなく、゜ヌスにIDを曞き蟌むずいう手段もありたす。

thunsuke ぞ返信する コメントをキャンセル

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です