어떻게 아 리 클 라 우 드 를 통 해 동적 도 메 인 이름 으로 DDNS 를 분석 하 는 방법 을 실현 합 니까?
이 스 크 립 트 의 코드 는 대부분 아 리 클 라 우 드 의 공식 도움말 문 서 를 참고 합 니 다.
1.스 크 립 트 언어 는 python 을 사용 합 니 다.저 는 개인 적 으로 python 만 알 고 깊이 있 는 지식 기반 이 없습니다.
2.스 크 립 트 코드 는 주석 설명 을 최대한 상세 하 게 추가 할 것 입 니 다.문제 가 있 으 면 댓 글 교 류 를 환영 합 니 다.그러나 답장 이 제때에 오지 않 을 수도 있 습 니 다.
선행 조건
1.도 메 인 이름 은 아 리 클 라 우 드 에서 구 매 한 것 입 니 다.(제 도 메 인 이름 자체 가 아 리 클 라 우 드 에서 구 매 한 것 입 니 다.다른 도 메 인 이름 은 테스트 한 적 이 없습니다)
2.주 소 는 반드시 공공 네트워크 주소 여야 합 니 다.그렇지 않 으 면 해석 을 넣 어도 소 용이 없습니다.(이것 은 더 이상 설명 할 필요 가 없습니다)
아 리 운 SDK 설치
세 개의 SDK 라 이브 러 리 를 설치 해 야 합 니 다.하 나 는 아 리 클 라 우 드 핵심 SDK 라 이브 러 리 이 고 하 나 는 아 리 클 라 우 드 도 메 인 이름 SDK 라 이브 러 리 이 며 하 나 는 DNS 라 이브 러 리 입 니 다.
아 리 클 라 우 드 핵심 SDK 라 이브 러 리:pip install aliyun-python-sdk-core
아 리 클 라 우 드 도 메 인 SDK 라 이브 러 리:pip install aliyun-python-sdk-domain
아 리 클 라 우 드 DNSSDK 라 이브 러 리:pip install aliyun-python-sdk-alidns
설명:
1.현재 공식 문서 에서 말 하 는 것 은 앞의 두 개의 SDK 라 이브 러 리 를 설치 해 야 한 다 는 것 이지 만 세 번 째 라 이브 러 리 가 필요 하 다 는 것 을 실측 합 니 다!
2.만약 에 ubuntu 시스템 을 사용 하고 python 2/python 3 과 pip 2/pip 3 가 동시에 있다 면 설치 할 때 앞의 명령 은 버 전,특히 pip 를 정확하게 쓰 십시오.제 시스템 pip 는 기본적으로 2.x 입 니 다.pip install xxx 명령 으로 설 치 된 라 이브 러 리 가 잘못 되 었 습 니 다.pip 3 install xxx 를 사용 해 야 성공 합 니 다.
스 크 립 트 의 구체 적 인 기능
1.외부 네트워크 ip 주소 가 져 오기
2,도 메 인 이름 분석 기록 가 져 오기
3,도 메 인 이름 분석 기록 추가
3,도 메 인 이름 분석 기록 업데이트
4.도 메 인 이름 분석 기록 삭제(이 기능 을 실제 스 크 립 트 에 추가 하 는 것 을 권장 하지 않 음)
5.대량 작업,기록 이 존재 하지 않 으 면 기록 추가,존재 하면 기록 업데이트
스 크 립 트 코드
#!/usr/bin/env python
#coding=utf-8
# SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
# 、 、 、
from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest
#
import json,urllib
# AccessKey Secret RAM KEY SECRET
ID = 'xxxxxxx'
SECRET = 'xxxxxx'
# , , 、 、 、 , API
regionId = 'cn-hangzhou'
#
client = AcsClient(ID, SECRET, regionId)
#
DomainName = 'example.com'
#
SubDomainList = ['a', 'b', 'c']
# IP ip ,3322 , 1 json 2 curl
def getIp():
# : 1, http://pv.sohu.com/cityjson?ie=utf-8 2,curl -L tool.lu/ip
with urllib.request.urlopen('http://www.3322.org/dyndns/getip') as response:
html = response.read()
ip = str(html, encoding='utf-8').replace("
", "")
return ip
#
def getDomainInfo(SubDomain):
request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()
request.set_accept_format('json')
# A A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL ( )
request.set_Type("A")
# 'test.example.com'
request.set_SubDomain(SubDomain)
response = client.do_action_with_exception(request)
response = str(response, encoding='utf-8')
# json
return json.loads(response)
# ( A , set_Type )
def addDomainRecord(client,value,rr,domainname):
request = AddDomainRecordRequest.AddDomainRecordRequest()
request.set_accept_format('json')
# request.set_Priority('1') # MX
request.set_TTL('600') # , 600 - 86400
request.set_Value(value) # ip
request.set_Type('A') #
request.set_RR(rr) #
request.set_DomainName(domainname) #
# , TotalCount , 0 , , 1, 1
response = client.do_action_with_exception(request)
response = str(response, encoding='utf-8')
relsult = json.loads(response)
return relsult
#
def updateDomainRecord(client,value,rr,record_id):
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_accept_format('json')
# request.set_Priority('1')
request.set_TTL('600')
request.set_Value(value) # ip
request.set_Type('A')
request.set_RR(rr)
request.set_RecordId(record_id) # record_id , ,
response = client.do_action_with_exception(request)
response = str(response, encoding='utf-8')
return response
#
def delDomainRecord(client,subdomain):
info = getDomainInfo(subdomain)
if info['TotalCount'] == 0:
print(' , !')
elif info["TotalCount"] == 1:
print(' ')
request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()
request.set_accept_format('json')
record_id = info["DomainRecords"]["Record"][0]["RecordId"]
request.set_RecordId(record_id) # record_id , ,
result = client.do_action_with_exception(request)
print(' , :')
print(result)
else:
# , ,
print(" , !")
# ,
def setDomainRecord(client,value,rr,domainname):
info = getDomainInfo(rr + '.' + domainname)
if info['TotalCount'] == 0:
print(' ')
add_result = addDomainRecord(client,value,rr,domainname)
print(add_result)
elif info["TotalCount"] == 1:
print(' ')
record_id = info["DomainRecords"]["Record"][0]["RecordId"]
cur_ip = getIp()
old_ip = info["DomainRecords"]["Record"][0]["Value"]
if cur_ip == old_ip:
print (" ip ip , !")
else:
update_result = updateDomainRecord(client,value,rr,record_id)
print(' , :')
print(update_result)
else:
# , ,
print(" , !")
IP = getIp()
#
for x in SubDomainList:
setDomainRecord(client,IP,x,DomainName)
#
# delDomainRecord(client,'b.jsoner.com')
#
# setDomainRecord(client,'192.168.3.222','a',DomainName)
#
# print (getDomainInfo(DomainName, 'y'))
#
# for x in SubDomainList:
# print (getDomainInfo(DomainName, x))
# ip
# print ('(' + getIp() + ')')
위 스 크 립 트 를 파일 로 저장 한 후,정시 작업 을 통 해 정기 적 으로 ip 주 소 를 자동 으로 업데이트 할 수 있 습 니 다.구체 적 으로 정시 작업 을 추가 하 는 방법 은 시스템 에 따라 방법 이 다 를 수 있 습 니 다.여기 서 는 설명 이 많 지 않 습 니 다.설명 하 다.
1.삭제 기록 을 실제 사용 하 는 스 크 립 트 에 추가 하지 않 는 것 을 권장 합 니 다.
2.같은 기록 은 같은 하위 도 메 인 이름 의 여러 기록 입 니 다.예 를 들 어 test.example.com 입 니 다.
스 크 립 트 는 기록 형식 을 검증 하지 않 았 기 때문에 같은 하위 도 메 인 이름 의 다른 유형의 기록 도 같은 기록 이 라 고 생각 합 니 다.예 를 들 어:
두 개의 기록 은 각각 test.examlpe.com 의 A 기록 과 test.examlpe.com 의 AAAA 기록 으로 같은 test.example.com 기록 으로 여 겨 진다.
판단 을 통 해 기록 을 되 돌려 받 을 수 있 는 recordid 는 정확 한 일치 기록 을 실현 하지만 저 는 이런 수요 가 없고 시간 도 들 이지 않 았 습 니 다.
아 리 클 라 우 드 를 통 해 동적 도 메 인 네 임 으로 DDNS 를 해석 하 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 아 리 클 라 우 드 동적 도 메 인 네 임 으로 DDNS 내용 을 해석 하 는 방법 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 응원 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
아 리 클 라 우 드 서버 의 총 결 1 - 설정 수정아 리 클 라 우 드 서버 는 미 러 시장 에 가서 환경 을 잘 설정 하 는 시스템 을 선택 할 수 있 습 니 다. 다음은 발생 하 는 문제 와 해결 방법 을 정리 하 겠 습 니 다. 1. nginx 는 pathin...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.