0.使用說明 AliDDNSNet 是基於 .NET Core 開發的動態 DNS 解析工具,藉助於阿裡雲的 DNS API 來實現功能變數名稱與動態 IP 的綁定功能。 使用時請更改同目錄下的 為 文件,同時也可以顯示通過 參數來制定配置文件路徑。例如: 1.配置說明: 通過更改 / 的內容來實現 DDN ...
0.使用說明
AliDDNSNet 是基於 .NET Core 開發的動態 DNS 解析工具,藉助於阿裡雲的 DNS API 來實現功能變數名稱與動態 IP 的綁定功能。
使用時請更改同目錄下的 settings.json.example
為 settings.json
文件,同時也可以顯示通過 -f
參數來制定配置文件路徑。例如:
dotnet ./AliDDNSNet.dll -f ./settings.json2
./AliDDNSNet -f ./settings.json3
1.配置說明:
通過更改 settings.json
/settings.json.example
的內容來實現 DDNS 更新。
{
// 阿裡雲的 Access Id
"access_id": "",
// 阿裡雲的 Access Key
"access_key": "",
// TTL 時間
"interval": 600,
// 主功能變數名稱
"domain": "example.com",
// 子功能變數名稱首碼
"sub_domain": "test",
// 記錄類型
"type": "A"
}
其中 Access Id 與 Access Key 可以登錄阿裡雲之後在右上角可以得到。
2.代碼說明
2.1 核心加密代碼
核心代碼基本上都存放在 Utils.cs
文件裡面,這裡面值得註意的就是 GenerateSignature()
方法,因為阿裡雲所有的 API 介面都需要傳遞簽名參數,這個簽名參數是根據你提交的參數集合 AccessKey 來進行計算的。
/// <summary>
/// 生成請求簽名
/// </summary>
/// <param name="srcStr">請求體</param>
/// <returns>HMAC-SHA1 的 Base64 編碼</returns>
public static string GenerateSignature(this string srcStr)
{
var signStr = $"GET&{HttpUtility.UrlEncode("/")}&{HttpUtility.UrlEncode(srcStr)}";
// 替換已編碼的 URL 字元為大寫字元
signStr = signStr.Replace("%2f", "%2F").Replace("%3d", "%3D").Replace("%2b", "%2B")
.Replace("%253a", "%253A");
var hmac = new HMACSHA1(Encoding.UTF8.GetBytes($"{config.access_key}&"));
return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signStr)));
}
這裡之前我是按照阿裡雲 API 來進行開發的,不過有一點需要註意的是,返回的 Signature 值是不需要進行 URL 編碼的。就因為這一點,我白白浪費了 3 個小時來排查問題,看看官方 API 文檔說的:
說需要將簽名值編碼之後再提交,扯淡,如果編碼之後再提交的話,介面會一直返回:
Specified signature is not matched with our calculation.
這裡直接返回 HMACSHA1 加密結果的 Base64 字元串即可。
2.1 非同步 Main 方法
非同步的 Main 方法需要 C# 7.1 以上版本才能支持,你只需要右鍵你的項目選擇屬性,左側欄選擇生成,找到高級按鈕,更改當前 C# 語言版本即可。
效果如下:
static async Task<int> Main(string[] args)
{
// 代碼....
return await Task.FromResult(0);
}
2.2 好用的 CommandLine 庫
編寫控制台程式,最主要的是接受參數然後處理,而 Microsoft.Extensions.CommandLineUtils
庫提供了方便快捷的方式來為我們處理用戶輸入的參數。
使用方法如下:
using System;
using McMaster.Extensions.CommandLineUtils;
public class Program
{
public static int Main(string[] args)
{
var app = new CommandLineApplication();
app.HelpOption();
var optionSubject = app.Option("-s|--subject <SUBJECT>", "The subject", CommandOptionType.SingleValue);
var optionRepeat = app.Option<int>("-n|--count <N>", "Repeat", CommandOptionType.SingleValue);
// 啟動時執行的委托
app.OnExecute(() =>
{
// 接收參數
var subject = optionSubject.HasValue()
? optionSubject.Value()
: "world";
var count = optionRepeat.HasValue() ? optionRepeat.ParsedValue : 1;
for (var i = 0; i < count; i++)
{
Console.WriteLine($"Hello {subject}!");
}
// 執行完畢返回狀態 0
return 0;
});
// 真正啟動控制台程式
return app.Execute(args);
}
}
3.GITHUB 開源地址:
https://github.com/GameBelial/AliDDNSNet
有興趣的朋友可以 star 關註一下。
4.二進位程式下載地址
程式打包了 Linux-x64 與 Linux arm 環境的二進位可執行文件,你可以直接下載對應的壓縮包解壓到你的路由器或者 NAS 裡面進行運行。
如果你的設備支持 Docker 環境,建議通過 Docker 運行 .NET Core 2.1 環境來執行本程式。