V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
GPU
V2EX  ›  Python

Cloudxns DDNS 更新脚本_基于 Python

  •  
  •   GPU · 2015-06-22 15:56:09 +08:00 · 5091 次点击
    这是一个创建于 3224 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Cloudxns API实现的DDNS脚本

    • 原本是使用dig获取网卡IP
    • 修改直接通过网卡来获取公网IP
    • 最后的syslog日志记录在路由器上面并没有什么卵用,只能用在发行版linux
      • rsyslog 怎么用Python Logging 来记录日志的?

    #!/usr/bin/env python
    
    """Please replace variables written in Capital Letters before using the script"""
    """By https://skylast.com/archives/7293 """
    
    import syslog
    import json
    import time
    import hashlib
    import requests
    from time import gmtime
    import socket 
    import fcntl 
    import struct 
    
    """ ignore urlib3 warnings """
    #requests.packages.urllib3.disable_warnings()
    
    api_url = "https://www.cloudxns.net/api2/record/RECORD_ID"
    api_key = "API_KEY"
    api_secret = "API_SECRET"
    
    def get_ip_address(ifname): 
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
        return socket.inet_ntoa(fcntl.ioctl( 
            s.fileno(), 
            0x8915,  # SIOCGIFADDR 
            struct.pack('256s', ifname[:15]) 
        )[20:24]) 
    
    wan_ip = get_ip_address('INTERFACE')
    
    request_data = {
    "domain_id": DOMAIN_ID,
    "host":"home",
    "value": wan_ip,
    "type": "A",
    "ttl": 600,
    "line_id": 1
    }
    
    request_time = time.strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime())
    hmac = hashlib.md5(api_key+api_url+str(json.dumps(request_data))+request_time+api_secret).hexdigest()
    headers = {
    'API-KEY' : api_key,
    'API-REQUEST-DATE' : request_time,
    'API-HMAC' : hmac,
    'API-FORMAT' : 'json'
    }
    
    try:
        r = requests.put(url=api_url,headers=headers,data=json.dumps(request_data),verify=False)
    except Exception,ex:
        syslog.openlog("xnsCloud", syslog.LOG_PID)
        syslog.syslog("Error : " + str(ex))
    else:
        syslog.openlog("xnsCloud", syslog.LOG_PID)
        response = r.json()
        response_data = response[u'data']
        syslog.syslog("Update_Status : " + response[u'message'])
        syslog.syslog("Domain_name : " + response_data[u'domain_name'])
        syslog.syslog("IPAddress : " + response_data[u'value'])
    
    第 1 条附言  ·  2015-08-08 00:23:13 +08:00
    18 条回复    2016-01-25 20:17:07 +08:00
    shierji
        1
    shierji  
       2015-06-22 16:06:19 +08:00
    要是有openwrt能直接用的就好了
    GPU
        2
    GPU  
    OP
       2015-06-22 16:07:27 +08:00
    @shierji 这个脚本可以在openwrt 里面用啊 ,你把代码保存在 /etc/ppp/ip-up.d/ ,然后设置755权限就可以 。然后拨号后就可以的
    shierji
        3
    shierji  
       2015-06-22 16:42:45 +08:00
    @GPU openwrt默认是没有python的。。。 - -
    Pastsong
        4
    Pastsong  
       2015-06-22 16:47:27 +08:00
    @shierji 用 opkg install 装上就好
    GPU
        5
    GPU  
    OP
       2015-06-22 16:51:11 +08:00
    @shierji 我用的是 Edgerouter Lite 默认有Python 所以就懒得折腾 bash的了。
    zieglar
        6
    zieglar  
       2015-06-22 16:58:56 +08:00
    @GPU ERL 握手
    GPU
        7
    GPU  
    OP
       2015-06-22 17:55:25 +08:00
    @zieglar 握手 。

    最近ERL有一个很困扰我的问题不知道你有没有遇到过 , 当我插上console线 ,如果把另一边的USB不接进电脑 , 重启路由器之后就会进入到Uboot命令行了。

    在Ubnt 官方论坛搜了很多帖子都找不到解决办法 。
    ccbikai
        8
    ccbikai  
       2015-06-22 18:01:54 +08:00 via iPhone
    最好把需要配置的内容放在一起
    zieglar
        9
    zieglar  
       2015-06-22 18:41:11 +08:00
    @GPU 我没有用 console 线。。。对 ERL 的应用还停留在普通级别。。。不过我可以把这个帖子转给 ubnt 的工作人员看看~
    ybf1220
        10
    ybf1220  
       2015-06-22 19:17:22 +08:00
    dnspod 的 api 实现也是很多的。我之前也根据API文档写过 openwrt 的脚本,
    https://support.dnspod.cn/Support/api
    fashioncj
        11
    fashioncj  
       2015-06-22 21:47:33 +08:00
    我的gitbub上有dnspod的ddns脚本= =支持py2和py3以及linux和windows、
    tru
        12
    tru  
       2015-06-23 13:25:30 +08:00
    @GPU 能给个联系方式么,我是UBNT工作人员~
    GPU
        13
    GPU  
    OP
       2015-06-23 14:14:28 +08:00
    @tru 在我v2 的页面联系我微博。我给你即时联系方式吧。
    tru
        14
    tru  
       2015-06-23 14:33:03 +08:00
    @GPU 已pm~
    GPU
        15
    GPU  
    OP
       2015-06-23 15:19:16 +08:00
    @tru 已回复 QQ。
    GPU
        16
    GPU  
    OP
       2015-08-08 00:26:07 +08:00
    更新了 v2 版本,
    聽取了@ccbikai 的意見把需要配置的東西都放在一起了.

    然後考慮都requests 需要另外安裝的 , 所以添加了urllib2 支持.
    urllib2 的支持寫得很爛,還在學習中請見諒 .
    如果有什麼更好的實現方法 ,歡迎指教
    xonze
        17
    xonze  
       2016-01-25 17:48:15 +08:00
    现在 CloudXNS 官方也支持 DDNS 了,官方发布的 Python SDK 已经原生支持了
    http://www.oschina.net/news/70200/cloudxns-api-python-sdk-0-3
    GPU
        18
    GPU  
    OP
       2016-01-25 20:17:07 +08:00
    @xonze 他的 sdk 我也贡献了两行代码 。 定位不同 ,我的是 DDNS 他的是 SDK
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   912 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:56 · PVG 04:56 · LAX 13:56 · JFK 16:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.