【非エンジニアが挑む】仮想通貨価格監視Bot、実際にコードを書いて動かしてみた

【非エンジニアが挑む】仮想通貨価格監視Bot 実際にコードを書いて動かしてみたの構成

Node.js土台構築の記事

前回の準備の記事

Tomoya

前回の記事で、テーマの選定と必要な準備を済ませました。

ここからが本題、実際の開発フェーズです!!


目次

今回の仕組み全体図

定期トリガーからCoinGecko APIでのデータ取得、条件判定、Discord通知までの仕組み全体を示すフロー図
定期的なトリガーからCoinGecko APIでの暗号資産データ取得、条件判定、Discordアラート通知までの処理の流れを図解しています。
STEP

価格を取得するコードを書く

Tomoya

まずは、CoinGeckoのAPIキーがちゃんと機能するのかを確かめるところから始めました。

cd ~/crypto-watcher
nano fetch-price.js
↓
※コード記入・保存後、実行
node fetch-price.js
require('dotenv').config(); //※.envファイルの中身を読み込む一文

const API_KEY = process.env.COINGECKO_API_KEY;

async function getBitcoinPrice() {
  const url = 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=jpy';

  const response = await fetch(url, {
    headers: {
      'accept': 'application/json',
      'x-cg-demo-api-key': API_KEY
    }
  });

  const data = await response.json();
  return data.bitcoin.jpy;
}

getBitcoinPrice().then((price) => {
  console.log(`現在のビットコイン価格:${price}円`);
});
Tomoya

AIにサポートしてもらいながらコードを組み立てましたが、コピペで済ませず、学習のためにあえて自分の手で1文字ずつ入力していきました。

Node.js導入編で書いたごく短いコードと比べると、量が一気に増えて少し圧倒されましたが、何とか書き切ることができました。

Tomoya

特に気をつけたのはインデント(字下がり)の量です。

ツールによってはインデントが1つズレただけでもエラーになることがあると聞いていたので、慎重に記述していきました。

実際に動かしてみると、価格を表示する部分の${price}のところを、うっかり%{price}と打ち間違えてしまい、計算されるべき数字ではなく文字列がそのまま出力されてしまう、というタイプミスがありました。

Tomoya

すぐに気づいて修正し、無事にビットコインの現在価格を取得できることを確認しました。

今回はひとまずビットコインのみを対象にしています。

fetch-price.js のテンプレート文字列の記述ミス(%を$へ修正)と node fetch-price.js の実行結果
fetch-price.jsのコード内で変数の展開ミスを修正し、Node.jsで実行して現在のビットコイン価格が出力されることを確認します。
STEP

Discordに通知が届くかの実験

次に、通知が実際に届くかどうかの実験です。同じようにnanoエディタで記述していきました。

nano notify-test.js
↓
※コード記入・保存後、実行
node notify-test.js
require('dotenv').config();

const WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;

async function sendDiscordNotification(message) {
  await fetch(WEBHOOK_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ content: message })
  });
}

sendDiscordNotification('テスト通知:この文章が届けば成功です!');
notify-test.js でDiscord送信テスト用プログラムコードを編集している画面
Discordへのテスト通知を送信するため、fetch関数を用いたJavaScriptプログラム(notify-test.js)を作成します。
Tomoya

今回はタイプミスもなく、無事にDiscordへメッセージが送られました。

Discordチャンネルに「テスト通知:この文章が届けば成功です!」というメッセージが正常に届いた確認画面
Webフック設定のテスト送信後、Discordのチャット画面にテスト通知メッセージが届いているか確認します。
知った事と思った事

この過程で、Discordには「contentという項目にメッセージを入れて送る」という決まったルールがあることを知りました。

サービスやツールごとに細かなルールがあり、それを一つひとつ調べながら進めるのはなかなか大変だなと感じつつ、ここでもAIのサポートのおかげでスムーズに理解できたことに、あらためて感動しました。

STEP

条件を加えたロジックの設計

Tomoya

次に、条件を組み込んだロジックを設計します。

仕組みとしては単純でも、同じ条件のまま何度も連続で通知が来てしまうのはうっとうしいので、ここをどう防ぐかを考えました。

「ある条件を満たした時にだけ通知する」

「一度通知したら、条件が解除されるまでは連続で送らない」

というルールを設定していきました。

シンプルなルールですが、実際に運用する上ではとても重要な部分だと感じています。

STEP

本番用のコードを作成する

ここまでの要素を組み合わせて、本番用のコードを作成しました。

nano index.js
↓
※コード記入・保存後、実行
node index.js
require('dotenv').config();
const cron = require('node-cron');

const API_KEY = process.env.COINGECKO_API_KEY;
const WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;

const ALERT_THRESHOLD = 15000000; // ← ここが今回つまずいたポイント(後述)
let alreadyNotified = false;

async function getBitcoinPrice() {
  const url = 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=jpy';
  const response = await fetch(url, {
    headers: {
      'accept': 'application/json',
      'x-cg-demo-api-key': API_KEY
    }
  });
  const data = await response.json();
  return data.bitcoin.jpy;
}

async function sendDiscordNotification(message) {
  await fetch(WEBHOOK_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ content: message })
  });
}

async function checkPrice() {
  const price = await getBitcoinPrice();
  const now = new Date().toLocaleString('ja-JP');
  console.log(`[${now}] 現在価格:${price}円`);

  if (price < ALERT_THRESHOLD && !alreadyNotified) {
    await sendDiscordNotification(
      `⚠️ ビットコインが${ALERT_THRESHOLD}円を下回りました!\n現在価格:${price}円`
    );
    alreadyNotified = true;
  } else if (price >= ALERT_THRESHOLD && alreadyNotified) {
    alreadyNotified = false;
  }
}

checkPrice();
cron.schedule('*/5 * * * *', checkPrice);
console.log('価格監視を開始しました。');
index.js のコード内容とコード内で価格アラートのしきい値 ALERT_THRESHOLD を変更・設定している画面
index.js内でビットコイン価格監視のアラートしきい値を設定し、Cronにより5分間隔で価格チェックを実行するプログラムです。
Tomoya

定期実行の仕組み(node-cron)と、条件判定を組み合わせて、「指定した金額を下回ったら通知する」というシステムを組み上げていきました。

コード量が多く、書くこと自体はなかなか大変でしたが、流れに乗って何とか記述することができました。定期実行のcron.schedule('*/5 * * * *', ...)という書き方も独特で最初は戸惑いましたが、見本を参考にしながら書くことで、すんなりと進められました。

コードを記述してみて思った事

こうして実際に手を動かしてみると、日頃エンジニアの方々がどれだけのことを頭の中でこなしているのか、あらためて実感します。

ある程度の方針や要件が決まっているとはいえ、そこから何をどう書くかをフルで考えて組み立てていく作業は、本当にすごいことだと思います。AIの登場によって、この「書く」という作業のハードルが大きく下がり、初心者でも参入しやすくなったのは、間違いなく大きな転換点だと感じています。

「初心者でも参入できるようになった分、エンジニアの仕事がなくなるのでは」という意見も耳にしますが、僕はそうは思いません。エンジニアの方々は、すでに持っている知識を活かしてAIを使うことで、本当にやるべきことに集中できるようになるのだと思います。あくまで個人の推測に過ぎませんが、AIによってエンジニアという仕事自体が、より本質的で楽しいものになっていくのではないか、と感じています。

STEP

動作確認でのつまずき

いざ動作確認をしてみると、閾値の設定を現在価格より高くしてしまっていたため、一定間隔で通知が飛んでき続ける、という出来事が起きました。

ここで得た気づき

動作確認としては成功しているが、実運用としては失敗している」ということです。

たった1つの設定値の違いだけで、意図しない動きになってしまう——実際にやってみないとわからないことではありますが、事前にこの視点を持てていれば防げたはずだ、と思うと、こういう視点を持てること自体が、エンジニアへの第一歩なのかもしれないと感じました。

STEP

実際に使える設定値に調整する

その後、実際に運用したい、意味のある設定値に調整しました。

Tomoya

現在のビットコイン価格が1,060万円程なので。
4%程下がったら通知が来るように1,020万円で設定しました。

ただ、この段階ではまだ、ターミナルの画面を閉じるとシステムそのものも消えてしまう状態です。そこで、前回のNode.js編で登場したpm2をここでも活用していきます。

STEP

pm2で常駐化する

前回と同様の手順で、ファイルを常駐化させました。

cd ~/crypto-watcher
pm2 start index.js --name crypto-watcher

今回は、--nameオプションで名前をつけて管理しやすくしています。今後も新しいシステムをどんどん追加していくことを考えると、ぐちゃぐちゃになる前に整理しておく土台を作れたのは良かったと感じています。

pm2 logs crypto-watcher
pm2 save

ログも確認し、再起動後も稼働し続けていることを確認できたので、これで完成です。

pm2 start コマンドでプロセス名を指定してアプリケーションを起動し、PM2のプロセス一覧で稼働状態を確認する画面
PM2でプロセス名を指定してアプリケーションを起動し、プロセス一覧でステータスがonlineになっていることを確認します。

これで、ビットコインが1,020万円(記事執筆時点で現在価格は1,060万円ほど)を下回ったら通知が来る、24時間稼働の監視システムを作ることができました。

AIのサポートがあったからこそ完成させられたシステムですが、それでも実際に完成させたのは自分自身なので、素直に嬉しいです。


まとめ

こうしたちょっとした仕組みでも、自分の代わりに常に見張り、必要な時だけ報告してくれるシステムは、思っている以上に有効なのだと感じました。

アイデア次第では、自分にとって価値のある作業を代行してくれるシステムを開発し、常駐させておくことで、「ある条件のもとで24時間、実行・報告してくれる」という状態を作れます。

これは、まるで小さな会社を経営しているような感覚にも近く、想像するだけでワクワクしてきます。

アルゴリズムだけでは限界がある部分もあるかもしれませんが、そこにAIを組み合わせていくことで、できることの幅はさらに広がっていくのではないでしょうか。VPSを実際に触ってみて、こうした可能性が少しずつ見えてきたのは、間違いなく「体験してみたからこそ」だと思います。

Tomoya

まだVPSを触ったことがない方は、ぜひ一度試してみてください!!

個人の方はもちろん、組織で活用したいという方にも、導入を検討してみる価値があると思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

始めまして。このブログを運営するTomoyaです。
未経験個人開発者。AI×個人開発(Vibe Cording)で学習して参入してくれる人が増えて広がっていくと良いなと思って始めました。

実際に作成→デプロイ(公開)→運営を行ってそれについての問題や疑問を記録していきます。
また行っていく上で内容(セキュリティ・制限など)にもこだわっていきたいなと思っています。

コメント

コメントする

目次