FastDDNS 用戶端 API

每當 IP 位址變更時,自動更新你的動態 DNS 主機名稱。

概述

FastDDNS 用戶端 API 允許任何支援 HTTP 的裝置——路由器、IP 攝影機、腳本或專用更新軟體——都能讓你的 DNS 主機名稱指向你目前的 IP 位址。 API 採用簡單的 GET 請求設計:客戶端傳送憑證和主機名稱,伺服器會以簡短的狀態碼回應結果。

伺服器會自動偵測到用戶端的公共 IP 位址。指定 IP 不需要額外參數。

i️ 同時支援 HTTPHTTPS。強烈建議使用 HTTPS 來保護你在傳輸過程中的憑證。

認證

API 支援兩種認證方法。兩者都一樣被接受——選擇在你的裝置或路由器上較容易設定的那個。

🔑 每個主機名稱的憑證:你在 FastDDNS 建立的每個主機名稱都會被分配專用的 user_nameuser_pass。這些憑證可以只有 更新該特定主機名稱,無法登入 FastDDNS 管理儀表板。這種設計限制了裝置憑證一旦被洩漏時的影響。

方法一 — HTTP 基本認證(URL 嵌入)

憑證會以標準的 user:password@host 格式嵌入網址中。這在路由器、攝影機和 HTTP 用戶端函式庫中被廣泛支援。用儀表板上的更新器客戶端金鑰當作密碼。

https://{user_name}:{user_pass}@client.fastddns.net/?hostname={hostname}


場地 描述 在哪裡可以找到
{user_name} 使用者名稱是在建立時指派給這個特定主機名稱的。 FastDDNS 儀表板→主機名稱→詳細資訊
{user_pass} 密碼是在建立時分配給這個特定主機名稱的。 FastDDNS 儀表板→主機名稱→詳細資訊
{hostname} 更新的完全限定主機名稱,例如:testhost.fastddns.org FastDDNS 儀表板→主機名稱→詳細資訊

方法二 — 查詢字串參數

憑證以純查詢參數的形式傳遞,與 hostname 一同傳遞。這對於無法設定 HTTP Basic Auth 標頭但允許完全自訂 URL 字串的裝置和韌體非常有用。

https://client.fastddns.net/?hostname={hostname}&user_name={user_name}&user_pass={user_pass}
參數 類型 描述
{user_name}


string 這個主機名稱是在建立時分配給的。
{user_pass} string 這個主機名稱在建立時就被分配了密碼。
{hostname} string 要更新的完全限定主機名稱,例如 testhost.fastddns.org

使用查詢字串驗證的範例:

https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832
⚠️ 使用查詢字串認證時,務必偏好 HTTPS,以避免憑證以明文形式傳送。 HTTP 可用,但應僅用於受信任的區域網路或測試。

執行更新

發送一個 GET 請求,更新你帳號註冊的主機名稱的 IP 位址。每次請求會更新一個主機名稱

終點

GET https://client.fastddns.net/
也可透過純 HTTP 存取——將 https 替換成 http

URL 格式 — 方法一:HTTP 基本認證

https://{user_name}:{user_pass}@client.fastddns.net/?hostname={hostname}

URL 格式 — 方法二:查詢字串

https://client.fastddns.net/?hostname={hostname}&user_name={user_name}&user_pass={user_pass}

查詢參數

參數 類型 描述
hostname 必修 string 更新的完全限定主機名稱(FQDN),例如 myhome.fastddns.nettesthost.fastddns.org。每個請求只支援一個主機名稱。
user_name 方法二 string 這個主機名稱的用戶名稱。使用查詢字串認證(方法二)時必須。使用 HTTP Basic Auth(方法一)時不需要。
user_pass 方法二 string 這個主機名稱的密碼。使用查詢字串認證(方法二)時必須。使用 HTTP Basic Auth(方法一)時不需要。
IP 自動偵測:伺服器會利用進來 TCP 連線的來源 IP 來判斷你的公共 IP 位址。你不需要提供 myip 參數。

請求範例

方法一 — HTTP基本認證(HTTPS over HTTPS):

https://fastddnstest:569832@client.fastddns.net/?hostname=testhost.fastddns.org

方法二 — 透過 HTTPS 查詢字串:

https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832

使用純 HTTP(僅限測試/受信任網路):

http://fastddnstest:569832@client.fastddns.net/?hostname=testhost.fastddns.org

退回代碼

所有更新回應都會回傳 HTTP 狀態200 OK 正文是純文字。 你的客戶必須解析此文字內容,以判斷更新的實際結果。

good {ip}

更新成功

主機名稱紀錄已更新為偵測到的 IP 位址。回應中包含實際的 IP 位址,例如 good 203.0.113.45。這是 IP 變更時的預期反應。

nochg {ip}

無需更改

主機名稱已經指向偵測到的 IP 位址——不需要更新。目前的 IP 包含在內,例如 nochg 203.0.113.45。這是正常且無錯誤的回應。

badauth

認證失敗

用戶名或更新者客戶端金鑰錯誤或已被撤銷。請在 FastDDNS 儀表板中驗證你的憑證。不要自動重試——先修正憑證。

nohost

主機名稱未找到

指定的主機名稱不存在於你的帳號中,或不符合動態更新的資格。檢查主機名稱拼寫,確認它是否已登記在你的帳號下。

911

伺服器錯誤

FastDDNS 伺服器端發生內部錯誤。至少等5分鐘再重試。如果問題依舊,請查看 FastDDNS 狀態頁面或聯絡客服。

回應摘要

回應文字 HTTP 狀態 意義 需要採取行動
good {ip} 200 IP 已成功更新 沒有 — 更新完成
nochg {ip} 200 IP 未更改,也沒有更新 沒有——已經是最新的
badauth 200 無效憑證 檢查使用者名稱/客戶端金鑰
nohost 200 主機名稱未註冊 在儀表板中確認主機名稱
911 200 伺服器端錯誤 5+分鐘後重試
⚠️ 自動化的重要性:一定要解析回應,正文 ,不只是 HTTP 狀態碼。API 總是回傳 200 — 文字正文告訴你更新是否真的成功。

取得用戶端 IP

FastDDNS 提供一個簡單的工具端點,回傳伺服器所見的公共 IP 位址。 這對於除錯、驗證裝置從哪個 IP 發送,或是在呼叫更新端點前的自訂腳本中非常有用。

終點

GET https://client.fastddns.net/dyndns/getip
不需要驗證。也可以透過純 HTTP 存取。

回應

回傳 HTTP200 OK 在回應文中,偵測到的公共 IP 位址以明文形式呈現。

# Example response body
203.0.113.45RESPONSE

請求範例

https://client.fastddns.net/dyndns/getip
http://client.fastddns.net/dyndns/getip

使用 curl

curl https://client.fastddns.net/dyndns/getipSHELL

程式碼範例

殼層 / cURL

# Method 1: HTTP Basic Auth (HTTPS, IP auto-detected)
curl "https://fastddnstest:[email protected]/?hostname=testhost.fastddns.org"
# Method 2: Query string credentials
curl "https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832"
# Check what IP the server sees from your device
curl "https://client.fastddns.net/dyndns/getip"SHELL

Python

import requests
HOSTNAME  = "testhost.fastddns.org"
USER_NAME = "fastddnstest"
USER_PASS = "569832"
# Method 1: HTTP Basic Auth
resp = requests.get(
    "https://client.fastddns.net/",
    auth=(USER_NAME, USER_PASS),
    params={"hostname": HOSTNAME}
)
# Method 2: Query string
# resp = requests.get("https://client.fastddns.net/", params={
#     "hostname": HOSTNAME, "user_name": USER_NAME, "user_pass": USER_PASS
# })
body = resp.text.strip()
if body.startswith("good"):
    print(f"Updated successfully: {body}")
elif body.startswith("nochg"):
    print(f"No change needed: {body}")
elif body == "badauth":
    print("Authentication failed. Check credentials.")
elif body == "nohost":
    print("Hostname not found.")
elif body == "911":
    print("Server error. Try again later.")PYTHON

PHP

<?php
$hostname  = 'testhost.fastddns.org';
$user_name = 'fastddnstest';
$user_pass = '569832';
// Method 1: HTTP Basic Auth embedded in URL
$url = "https://{$user_name}:{$user_pass}@client.fastddns.net/?hostname=" . urlencode($hostname);
// Method 2: Query string credentials
// $url = "https://client.fastddns.net/?hostname=" . urlencode($hostname)
//      . "&user_name=" . urlencode($user_name)
//      . "&user_pass=" . urlencode($user_pass);
$ctx = stream_context_create(['http' => ['timeout' => 10]]);
$body = trim(file_get_contents($url, false, $ctx));
switch (true) {
    case str_starts_with($body, 'good'):
        echo "Updated: {$body}\n"; break;
    case str_starts_with($body, 'nochg'):
        echo "No change: {$body}\n"; break;
    case $body === 'badauth':
        echo "Auth failed. Check hostname credentials.\n"; break;
    case $body === 'nohost':
        echo "Hostname not found.\n"; break;
    case $body === '911':
        echo "Server error, retry later.\n"; break;
}PHP

Bash(Cron / 路由器腳本)

#!/bin/bash
HOSTNAME="testhost.fastddns.org"
USER_NAME="fastddnstest"
USER_PASS="569832"
# Method 1: HTTP Basic Auth
RESULT=$(curl -s "https://${USER_NAME}:${USER_PASS}@client.fastddns.net/?hostname=${HOSTNAME}")
# Method 2: Query string (uncomment to use instead)
# RESULT=$(curl -s "https://client.fastddns.net/?hostname=${HOSTNAME}&user_name=${USER_NAME}&user_pass=${USER_PASS}")
case "$RESULT" in
  good*)   echo "[OK] $RESULT" ;;
  nochg*)  echo "[OK] $RESULT" ;;
  badauth) echo "[ERR] Bad credentials — check hostname user/pass"; exit 1 ;;
  nohost)  echo "[ERR] Hostname not found"; exit 1 ;;
  911)     echo "[ERR] Server error, retry later"; exit 1 ;;
  *)       echo "[WARN] Unknown response: $RESULT" ;;
esacBASH

故障排除

我收到badauth

所提供的 user_nameuser_pass 與該主機名稱所分配的憑證不符。 每個主機名稱都有獨立的憑證——可以在你的儀表板下找到主機名稱→細節 . 請注意,這些憑證是針對主機名稱的,無法用來登入 FastDDNS 管理入口網站。 如果你最近重設了憑證,請更新所有使用該主機名稱的裝置。

我收到nohost

hostname 參數中的主機名稱不存在,或不屬於所提供憑證所識別的帳號。 檢查主機名稱有沒有錯字,確認它在你的儀表板上有列出,並確認 user_nameuser_pass 是否相符那個特定的主機名稱 .

伺服器偵測到錯誤的 IP

伺服器會使用 TCP 連線的來源 IP。如果你的裝置在 NAT 路由器後面,路由器的公共 IP 會被偵測到——這通常是理想的行為。如果你在 VPN 或代理伺服器上,伺服器會看到 VPN/代理的出口 IP。 用 getip endpoint 來確認伺服器從你的裝置看到的是哪個 IP。

我收到911

這表示伺服器端存在暫時性問題。至少等5分鐘再重試。請勿快速迴圈請求——這可能會觸發速率限制。請查看FastDDNS狀態頁面是否有任何活躍事件。

我應該多久輪詢一次更新端點?

我們建議每5分鐘檢查一次IP變更。當你的 IP 沒有變動時,伺服器會回傳 nochg,這是輕量級的 no-op。不建議每分鐘超過一次輪詢,且可能導致速率限制。