0

我有一个托管在公共动态 IP 上的家用 PC 上的 Web 服务。我还有一个由 google 域托管的域名(我将在这篇文章中将其称为 www.example.com)。

通过 Google App Engine,我可以将动态 IP 存储在 memcache 上,一旦客户端指向 myhome 子域,它将被重定向到主机 ip(例如 myhome.example.com -> 111.111.1.100)。

这是我在 App Engine 上运行的 python 代码:

import json
from webapp2 import RequestHandler, WSGIApplication
from google.appengine.api import memcache

class MainPage(RequestHandler):
    # Memcache keys
    key_my_current_ip = "my_current_ip"

    def get(self):
        response_text = "example.com is online!"
        # MyHome request
        if (self.request.host.lower().startswith('myhome.example.com') or
            self.request.host.lower().startswith('myhome-xyz.appspot.com')):
            my_current_ip = memcache.get(self.key_my_current_ip)
            if my_current_ip:
                url = self.request.url.replace(self.request.host, my_current_ip)
                # move to https
                if url.startswith("http://"):
                    url = url.replace("http://", "https://")
                return self.redirect(url, True)
            response_text = "myhome is offline!"
        # Default site
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write(response_text)

    def post(self):
        try:
            # Store request remote ip
            body = json.loads(self.request.body)
            command = body['command']
            if command == 'ping':
                memcache.set(key=self.key_my_current_ip, value=self.request.remote_addr)
        except:
            raise Exception("bad request!")

app = WSGIApplication([('/.*', MainPage),], debug=True)

我发现,通过添加“A”域记录,myhome.example.com 将直接指向该 ip 而无需重定向它。

在此处输入图像描述

有没有办法可以使用 Google App Engine 或域 API 更新“A”域记录?

def post(self):
    try:
        # Store request remote ip
        body = json.loads(self.request.body)
        command = body['command']
        if command == 'ping':
            **--> UPDATE "A" Record with this IP: <self.request.remote_addr>**
    except:
        raise Exception("bad request!")
4

1 回答 1

1

正如谷歌所说,您可以使用 https POST 来实现这一点。

您可以通过向以下 url 发出 POST 请求(也允许 GET)来使用 API 手动执行更新: https ://domains.google.com/nic/update

API 需要 HTTPS。这是一个示例请求: https://username:password@domains.google.com/nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4

注意:您还必须在请求中设置用户代理。通过上述 url 进行测试时,Web 浏览器通常会为您添加此内容。无论如何,发送到我们服务器的最终 HTTP 请求应该如下所示:

HTTP 查询示例:POST /nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4 HTTP/1.1 主机:domains.google.com 授权:基本 base64-encoded-auth-string 用户代理:Chrome/41.0 your_email@ yourdomain.com

于 2018-06-20T07:15:23.527 回答