🖼️

【.NET】Twitter APIを使って推しの画像に溺れたい④

2022/06/04に公開

こんにちは。
日本ダービーでワイド2点当てました🎯アスクビクターモアくんありがとう!!
イクイノックスは親父と同じく菊花賞取ってくれよ!!!

今回は設定関連です。
ちょっと味気ないですが、もしかしたら同じ悩みを持っている人がいるかもしれないので...ね?

更新(2023/02/07)

設定値をクラスにバインドしていましたが、不要になったため実装を撤去しました。
下記の通りキー名から取得する方式に切り替えました。

それにより内容が少なくなったため、ログ出力を追加しました。

設定ファイル作成&読み込み

ここは大して派手な内容ではないので、サラっと終わらせます。

参考サイト
https://zenn.dev/higmasu/articles/b3dab3c7bea6db

パッケージ追加

  • Microsoft.Extension.Configuration
  • Microsoft.Extension.Configuration.Binder
  • Microsoft.Extension.Configuration.Json

設定内容

以下ファイルをプロジェクト直下に配置します。

appsettings.json
{
  "ApiKey": "AAA",
  "ApiKeySecret": "BBB",
  "AccessToken": "CCC",
  "AccessTokenSecret": "DDD"
}

appsettings.jsonをビルドディレクトリに追加

VisualStudioで、appsettings.jsonを右クリックしプロパティを開きます。

プロパティ

右下に出てくるプロパティウィンドウで、「出力ディレクトリにコピー」に「常にコピーする」を選びます。

出力ディレクトリにコピー:常にコピーする

VSCode使ってて「そんなメニューねぇよ!」って場合は、csprojファイルを直接書き換えることもできます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.5" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.5">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.1" />
    <PackageReference Include="TweetinviAPI" Version="5.0.4" />
  </ItemGroup>

+  <ItemGroup>
+    <None Update="appsettings.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
</Project>

設定呼び出し

Program.cs
static async Task Main(string[] args)
{
    // IConfigurationクラスで取得できます
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();

    // GetValue<T>で設定値を取得できます
    TwitterClient userClient = new(
        configuration.GetValue<string>("ApiKey"),
        configuration.GetValue<string>("ApiKeySecret"),
        configuration.GetValue<string>("AccessToken"),
        configuration.GetValue<string>("AccessTokenSecret")
    );
    
    // ...
}

NLogでログ出力

デバッグ時はよくConsole.WriteLineで出力させますが、稼働開始したとき標準出力はちょっと心もとないです。
そこでログ出力のライブラリの力を借りて、稼働後でも綺麗なログを出せるようにします。

参考サイト
https://sabakunotabito.hatenablog.com/entry/2021/11/01/015133

パッケージ追加

  • NLog

NLogの設定ファイル作成

プロジェクト直下にnlog.configを作成します。
参考サイトではNLog.configとなっていますが、公式サイトでは全て小文字で命名するように指示されています。
https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application#2-create-a-nlogconfig-file

そしてappsettings.jsonと同様に、出力ディレクトリにコピーを「常にコピーする」にします。

中身は参考サイトのものをそのままお借りします。
NLogViewerは使わないので、Viewer用の設定は削除してあります。
ひとまず開発中はこのまま使用して、デプロイ時に書き換えようと思います。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwExceptions="true"
      internalLogLevel="Off" internalLogFile="../logs/nlog_internal.log">

	<targets>
		<!-- ファイル -->
		<target name="logFile"
                xsi:type="File"
                encoding="UTF-8"
                writeBom="true"
                lineEnding="Default"
                layout="${longdate} ${level:uppercase=true:padding=-5} [${threadid}] ${logger} - ${message} ${exception:format=tostring}"
                fileName="../logs/${processname}.log"
                archiveFileName="../logs/backup/${processname}_{###}.log"
                archiveEvery="Day"
                archiveNumbering="Sequence"
                maxArchiveFiles="100" />

		<!-- Console -->
		<target name="console" xsi:type="ColoredConsole" layout="${longdate} ${level:uppercase=true:padding=-5} ${message}" />
	</targets>
	<rules>
		<logger name="*" minlevel="Trace" writeTo="logFile" />
		<logger name="*" minlevel="Trace" writeTo="console" />
	</rules>
</nlog>

ログ出力

Program.csのトップでロガーを呼び出します。

Program.cs
internal class Program
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    private static async Task Main(string[] args)
    {
        // ...
    }
}

ログレベルは5段階から選べます。
◯谷学院の個別指導に比べたら大したことないですね。

こんな感じで出力されます。
色をつけてくれるところがロガーの強みですね。
ただまぁテキストファイルに書き出したら色はつかないので、NLogViewer用の出力も作るか、ログテキストをVSCodeで見るかすれば着色できるかもしれないです。

次回

画像を一括で保存するところまで実装します。
ここまでできればひとまず完成となります。

Discussion