Nameslio:修订间差异

(创建页面,内容为“Nameslio是一家域名注册商和网络托管公司。 ==API== ===使用API示例=== 使用python,添加或修改域名主机的A记录,如abc.abc.com设置ip为x.x.x.x: <syntaxhighlight lang="python" > import urllib.request import urllib.parse import json import os BASE_URL = "https://www.namesilo.com/api/" # ========== 辅助函数 ========== def load_dotenv(filepath=".env"): """手动解析 .env 文件""" if not os.path.exists(filepath)…”)
 
 
(未显示同一用户的1个中间版本)
第3行: 第3行:


==API==
==API==
* https://www.namesilo.com/api-reference#domains/register-domain
===使用API示例===
===使用API示例===
使用python,添加或修改域名主机的A记录,如abc.abc.com设置ip为x.x.x.x:
使用python,添加或修改域名主机的A记录,如abc.abc.com设置ip为x.x.x.x:
第31行: 第33行:
     if code != 300:
     if code != 300:
         raise Exception(f"API失败: code={code}, res={res}")
         raise Exception(f"API失败: code={code}, res={res}")
    else:
        # print(f'成功返回:{res["reply"].get("resource_record", [])}')
        return True


def _request(endpoint, params):
def _request(endpoint, params):
第43行: 第48行:


     url = BASE_URL + endpoint + "?" + urllib.parse.urlencode(params)
     url = BASE_URL + endpoint + "?" + urllib.parse.urlencode(params)
     print(f"正在请求:{url}")
     # 测试使用,链接含有APIkey
    # print(f"正在请求:{url}")


     req = urllib.request.Request(
     req = urllib.request.Request(
         url,
         url,
         headers={
         headers={
             "User-Agent": "Mozilla/5.0"  # 不加请求头,namesilo会拒绝
             "User-Agent": "Mozilla/5.0"  # 关键!
         }
         }
     )
     )
第57行: 第63行:


def upsert_a_record(domain, host, ip, ttl=3600):
def upsert_a_record(domain, host, ip, ttl=3600):
    full_host = f"{host}.{domain}" if host != "@" else domain


     # 1️⃣ 查询记录
     # 1️⃣ 查询记录
第74行: 第79行:
     # 2️⃣ 查找已有记录
     # 2️⃣ 查找已有记录
     for r in records:
     for r in records:
         if r["type"] == "A" and r["host"] == full_host:
         if r["type"] == "A" and r["host"] == host:
            if r["value"] == ip:
                print("记录已存在, 无需更新")
                return True
             record_id = r["record_id"]
             record_id = r["record_id"]
            break


     # 3️⃣ 更新
     # 3️⃣ 更新
第107行: 第114行:
     # 加载 .env 文件
     # 加载 .env 文件
     load_dotenv()
     load_dotenv()
   
    # 配置参数
    DOMAIN = os.getenv("DOMAIN")
    SUBDOMAIN = os.getenv("SUBDOMAIN")
    IP_ADDRESS = os.getenv("IP_ADDRESS") 


     upsert_a_record(
     upsert_a_record(
         domain=DOMAIN,
         domain=os.getenv("DOMAIN"),   # 如: example.com
         host=SUBDOMAIN,
         host=os.getenv("SUBDOMAIN"), # 如: www
         ip=IP_ADDRESS
         ip=os.getenv("IP_ADDRESS"),  # 如: 100.100.100.100
     )
     )
</syntaxhighlight>
</syntaxhighlight>

2026年4月17日 (五) 12:18的最新版本

Nameslio是一家域名注册商和网络托管公司。


API

使用API示例

使用python,添加或修改域名主机的A记录,如abc.abc.com设置ip为x.x.x.x:

import urllib.request
import urllib.parse
import json
import os

BASE_URL = "https://www.namesilo.com/api/"

# ========== 辅助函数 ==========
def load_dotenv(filepath=".env"):
    """手动解析 .env 文件"""
    if not os.path.exists(filepath):
        return
    with open(filepath, "r") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            if "=" in line:
                key, value = line.split("=", 1)
                os.environ[key.strip()] = value.strip().strip("\"'")

def check_success(res):
    code = res.get("reply", {}).get("code")
    if code != 300:
        raise Exception(f"API失败: code={code}, res={res}")
    else:
        # print(f'成功返回:{res["reply"].get("resource_record", [])}')
        return True

def _request(endpoint, params):
    api_key = os.getenv("NAMESILO_API_KEY")
    if not api_key:
        raise ValueError("请在 .env 中设置 NAMESILO_API_KEY")    
    params.update({
        "version": "1",
        "type": "json",  # 推荐用 json,比 xml 好处理
        "key": api_key
    })

    url = BASE_URL + endpoint + "?" + urllib.parse.urlencode(params)
    # 测试使用,链接含有APIkey
    # print(f"正在请求:{url}")

    req = urllib.request.Request(
        url,
        headers={
            "User-Agent": "Mozilla/5.0"  # 关键!
        }
    )

    with urllib.request.urlopen(req) as resp:
        return json.loads(resp.read().decode())


def upsert_a_record(domain, host, ip, ttl=3600):

    # 1️⃣ 查询记录
    res = _request("dnsListRecords", {
        "domain": domain
    })

    check_success(res)

    records = res["reply"].get("resource_record", [])
    if isinstance(records, dict):  # 只有一条时会是 dict
        records = [records]

    record_id = None

    # 2️⃣ 查找已有记录
    for r in records:
        if r["type"] == "A" and r["host"] == host:
            if r["value"] == ip:
                print("记录已存在, 无需更新")
                return True 
            record_id = r["record_id"]

    # 3️⃣ 更新
    if record_id:
        res = _request("dnsUpdateRecord", {
            "domain": domain,
            "rrid": record_id,
            "rrhost": host,
            "rrvalue": ip,
            "rrttl": ttl
        })

        check_success(res)

    # 4️⃣ 新增
    else:
        res = _request("dnsAddRecord", {
            "domain": domain,
            "rrtype": "A",
            "rrhost": host,
            "rrvalue": ip,
            "rrttl": ttl
        })

        check_success(res)

# ========== 使用示例 ==========

if __name__ == "__main__":
    # 加载 .env 文件
    load_dotenv()

    upsert_a_record(
        domain=os.getenv("DOMAIN"),   # 如: example.com
        host=os.getenv("SUBDOMAIN"),  # 如: www
        ip=os.getenv("IP_ADDRESS"),   # 如: 100.100.100.100 
    )

密钥不放程序文件里,放.env文件:

NAMESILO_API_KEY=xxx
DOMAIN=xxx
SUBDOMAIN=xxx
IP_ADDRESS=xxx