he.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # coding=utf-8
  2. """
  3. Hurricane Electric (he.net) API
  4. @author: NN708, NewFuture
  5. """
  6. from ._base import SimpleProvider, TYPE_FORM
  7. class HeProvider(SimpleProvider):
  8. API = "https://dyn.dns.he.net"
  9. content_type = TYPE_FORM
  10. accept = None # he.net does not require a specific Accept header
  11. decode_response = False # he.net response is plain text, not JSON
  12. def _validate(self):
  13. self.logger.warning(
  14. "HE.net provider 缺少充分的真实环境测试,如遇问题请及时在 GitHub Issues 中反馈: %s",
  15. "https://github.com/NewFuture/DDNS/issues",
  16. )
  17. if self.auth_id:
  18. raise ValueError("Hurricane Electric (he.net) does not use `id`, use `token(password)` only.")
  19. if not self.auth_token:
  20. raise ValueError("Hurricane Electric (he.net) requires `token(password)`.")
  21. def set_record(self, domain, value, record_type="A", ttl=None, line=None, **extra):
  22. """
  23. 使用 POST API 更新或创建 DNS 记录。Update or create DNS record with POST API.
  24. https://dns.he.net/docs.html
  25. """
  26. self.logger.info("%s => %s(%s)", domain, value, record_type)
  27. params = {
  28. "hostname": domain, # he.net requires full domain name
  29. "myip": value, # IP address to update
  30. "password": self.auth_token, # Use auth_token as password
  31. }
  32. try:
  33. res = self._http("POST", "/nic/update", body=params)
  34. if res and res[:5] == "nochg" or res[:4] == "good": # No change or success
  35. self.logger.info("HE API response: %s", res)
  36. return True
  37. else:
  38. self.logger.error("HE API error: %s", res)
  39. except Exception as e:
  40. self.logger.error("Error updating record for %s: %s", domain, e)
  41. return False