0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

テキストファイルからチャネルトークンなどを読み込む

Posted at

はじめに

こちらは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ホスト名を入れてください。

config.txt
# 余分な空白(スペース)は入れない

# チャンネルアクセストークン
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

テキストエディタに次のコードを貼り付けます。

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です。

さいごに

これで読み込んだ内容をプログラム内で使用する準備ができました。
記事もだいぶ進んできて安心しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?