服务器获取外网IP,并发送到钉钉
python
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
# === 请填入你的钉钉机器人配置 ===
access_token = 'XXXX'
secret = 'XXXX'
# 获取公网 IP
def get_public_ip():
try:
response = requests.get("https://api.ipify.org", timeout=5)
return response.text.strip()
except Exception as e:
return f"获取公网 IP 失败: {e}"
# 生成签名
def generate_signature(secret):
timestamp = str(round(time.time() * 1000))
secret_enc = secret.encode('utf-8')
string_to_sign = f'{timestamp}\n{secret}'
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign
# 发送消息到钉钉
def send_dingding_message(ip_address):
timestamp, sign = generate_signature(secret)
url = f'https://oapi.dingtalk.com/robot/send?access_token={access_token}×tamp={timestamp}&sign={sign}'
headers = {'Content-Type': 'application/json'}
message = {
"msgtype": "markdown",
"markdown": {
"title": "服务器公网 IP 通知",
"text": f"### 新加坡服务器公网 IP\n\n当前公网 IP 地址为:`{ip_address}`\n\n发送时间:{time.strftime('%Y-%m-%d %H:%M:%S')}"
}
}
response = requests.post(url, headers=headers, json=message)
if response.status_code == 200 and response.json().get("errcode") == 0:
print("钉钉消息发送成功 ✅")
else:
print(f"发送失败 ❌: {response.text}")
if __name__ == '__main__':
ip = get_public_ip()
send_dingding_message(ip)