はじめに
こちらはRaspberry Pi と LINE messaging API で作る監視カメラシリーズ第13弾です。
ここではconfig.txtというテキストファイルにチャネルトークン等のプログラム内に直接書きたくない情報を書き込み、ファイルから読み込めるようにします。
※コードをGitHubにアップロードした際に、他人に知られる危険を避ける事と、URLなどの変更が楽になることを目的としています。
config.txtの作成
line_botディレクトリに移動し
cd /home/pi/projects/line_bot
config.txtを作成します
vim config.txt
次のテキストを貼り付けて、=の右側に自分のチャネルトークン、ユーザーID、Ngrokホスト名を入れてください。
# 余分な空白(スペース)は入れない
# チャンネルアクセストークン
CHANNEL_ACCESS_TOKEN=
# LINEのユーザーID
USER_ID_TO_SEND=
# ngrokで取得したホスト名
NGROK_URL_BASE=
次の点に注意してください。
・余分なスペースは入れない
・コメントを入れるときは頭に#を付ける
・Ngrokのホスト名はURLのhttps://を除いた部分だけを書く
↓❌ ↓❌
CHANNEL_ACCESS_TOKEN= aaaaaaaaaaa aaaa
USER_ID_TO_SEND=bbbbbbbbbbbbbb
↓⭕️必要
# ngrokで取得したホスト名
↓↓↓↓↓↓↓↓❌
NGROK_URL_BASE=https://xxxx.xxxx.xx
std::mapとは
まず、今回はmapを使用してキーと値を紐付けて管理し、コード内で使用します。
mapとは
「キー(合言葉)」と「値(データ)」をセットで管理する便利な機能です。
今回のconfig.txtで考えると次のようになります。
こちらのセットを管理するとした場合、
# チャンネルアクセストークン
CHANNEL_ACCESS_TOKEN=aaaaaaaaaa
# LINEのユーザーID
USER_ID_TO_SEND=bbbbbbbbbb
# ngrokで取得したホスト名
NGROK_URL_BASE=cccccccccc
次のような {キー,値} のセットで管理してくれます。
{CHANNEL_ACCESS_TOKEN,aaaaaaaaaa}
{USER_ID_TO_SEND,bbbbbbbbbb}
{NGROK_URL_BASE,cccccccccc}
これをプログラム内で使うときに
「USER_ID_TO_SENDの値を表示」とした場合、
bbbbbbbbbb
と、ペアになっている値を表示してくれます。
このように値を直接さわる事なく、キーに結びつけるような感じで扱えるのが特徴です。
つまり、コード内で扱いやすくなるメリットがあります。
config.txtで読み込んだ内容を表示するコードです。
line_botディレクトリに移動し
cd /home/pi/projects/line_bot
main.cppを作成します
vim main.cpp
テキストエディタに次のコードを貼り付けます。
#include <iostream>
#include <fstream>
#include <string>
#include <map>
// 設定ファイルを読み込んで、キーと値のmapを返す関数
std::map<std::string, std::string> load_config(const std::string& filename) {
std::map<std::string, std::string> config;
std::ifstream file(filename);
std::string line;
if (!file.is_open()) {
std::cerr << "設定ファイルを開けません: " << filename << std::endl;
return config;
}
// 一行ずつ取り出す
while (std::getline(file, line)) {
// 空行やコメント(#で始まる行)はスキップ
if (line.empty() || line[0] == '#')
continue;
// 「キー=値」を分解
size_t pos = line.find('=');
if (pos == std::string::npos)
continue;
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 1);
config[key] = value;
}
return config;
}
int main() {
auto config = load_config("/home/pi/projects/line_bot/config.txt");
if (config.empty()) {
std::cerr << "設定ファイルの読み込みに失敗しました。" << std::endl;
return 1;
}
std::cout << "CHANNEL_ACCESS_TOKEN: " << config["CHANNEL_ACCESS_TOKEN"] << std::endl;
std::cout << "USER_ID_TO_SEND: " << config["USER_ID_TO_SEND"] << std::endl;
std::cout << "NGROK_URL_BASE: " << config["NGROK_URL_BASE"] << std::endl;
}
ESCキーを押して、:wqを入力してEnterで保存して閉じます。
buildディレクトリに移動し、
cd build
makeコマンドでビルドします。
make
実行ファイルのmain_appが生成されていますので./で実行します。
./main_app
キー:値のように表示されればOKです。
さいごに
これで読み込んだ内容をプログラム内で使用する準備ができました。
記事もだいぶ進んできて安心しています。