読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

requests で CyberGate DDNS の IP アドレスを更新する

python

模様替えに伴って自宅にあった 5 年前のサーバの電源を切り、廃棄に向けた検討に入りました。しかしですね、そういえばこのサーバでは DiCE か何かが動いていて、日々 DDNS を更新し続けていた。
もうサーバ立ち上げるのもメンドい(ケーブルとかモニタとかつなぐのがメンドい)のでつくった。Python まだよくわからないのでつらい。

CyberGate の DDNS 更新、当然の如く API とかないから、スクレイピングするかんじになった。register_ddns_id ってヤツがユーザの識別子になってるかんじ。

#!/usr/bin/env python
import keyring
import requests
import re
import sys

class CyberGateHttpClient:
    BASE_URL = 'http://cybergate.planex.co.jp'
    RE_IP_ADDR = r'([1-9]\d{0,2}\.[1-9]\d{0,2}\.[1-9]\d{0,2}\.[0-9]\d{0,2})'

    def __init__(self, user, password):
        self.user     = user
        self.password = password
        
    def update_ipaddr(self):
        def login():
            auth = {
                "account":  self.user,
                "password": self.password,
                "service_name": "cybe",
            }
            res = requests.post( self.BASE_URL + '/cgi-bin/login.cgi', data=auth )
            self.cookies = res.cookies
            
        def get_register_ddns_id():
            res = requests.get( self.BASE_URL + '/cgi-bin/view_ddns.cgi', cookies=self.cookies).text
            return re.search( r"wopen_ddns_modify\((\d+)\)", res ).group(1)

        login()
        register_ddns_id = get_register_ddns_id()

        res = requests.get( self.BASE_URL + '/cgi-bin/mod_ddns_subdomain.cgi?register_ddns_id=' + register_ddns_id, cookies=self.cookies )
        ipaddr = re.search( self.RE_IP_ADDR, res.text ).group(1)

        param = {
            "register_ddns_id" : register_ddns_id,
            "service_name"     : "ddns",
            "confirm"          : "2",
            "ip_address"       : ipaddr
        }
        res = requests.post( self.BASE_URL + '/cgi-bin/mod_ddns_subdomain.cgi', data=param, cookies=self.cookies )
        if not re.search( '変更しました。', res.text):
            sys.exit(1)

if __name__ == '__main__':
    CyberGateHttpClient('kiririmode', keyring.get_password('CyberGate', 'kiririmode')).update_ipaddr()