1. 发布自己的公网IP(更新版)

之前的在这里

http://wiki.woodpecker.org.cn/moin/nickcheng/2007-02-02

这次做了一些更新, 先看代码

#coding=utf-8
import urllib
import re
import libgmail
import time
import os
import sys

# 基本配置
url = 'http://uid:[email protected]/status.htm'   # 路由器管理界面中有公网IP的页面
gmailUID = '[email protected]'                   # gmail帐号
gmailPWD = '123456'                                 # gmail密码
mailtoAddr = '[email protected]'                 # 发送邮件的目地方地址
mailSubject = 'HOME IP'                                 # 邮件标题
mailPostfix = '\nGetPublicIPNew.py b20070308'           # 邮件正文的后缀
logFileName = 'IP.ini'                                  # 本地保存IP地址的文件的文件名

# Get the page content
# 从路由器的管理界面获取有公网IP页面的源码
data = urllib.urlopen(url)
pageContent = data.read()

# Filter & Get the IP
# 从网页源码中过滤出IP地址
begin = pageContent.find('IP 地址', 3000)+21
end = pageContent.find('&', begin)
IP = pageContent[begin: end - 1]
print 'New IP: ' + IP

## 判别IP是否已经发送过邮件

lastIP = ''
# 如果存在本地文件, 则读取本地文件中保存的上次IP地址
if os.path.exists(logFileName):
        print 'The file %s is Exist!' % logFileName
        rFile = open(logFileName)
        lastIP = rFile.readline()
        rFile.close()

# 判断两次IP地址是否一致, 如果一致, 则不发送邮件, 程序结束
print 'Old IP: ' + lastIP
if IP == lastIP:
        sys.exit()

## 准备发送邮件
print "It's a brand new IP"
print "Sending mail......"

# Get current time
# 获取当前时间
t = time.localtime()
datetime = "-".join([str(a) for a in t[:3]]) + ' ' + ":".join([str(a) for a in t[3:6]])

# Generate content
# 生成要发送邮件的文本
content = IP + ' - ' + datetime
content += mailPostfix

# Send mail
# 发送邮件
ga = libgmail.GmailAccount(gmailUID, gmailPWD)
gcm = libgmail.GmailComposedMessage(mailtoAddr, mailSubject, content)
ga.login()
ga.sendMessage(gcm)

# 因为本次读出的IP地址和上次不同, 所以发送邮件后要把新的IP更新到本地文件
wFile = file(logFileName, 'w')
wFile.write(IP)
wFile.close()

print "Done!"

主要的修改是增加了本地文件记录IP地址, 如果获取到的IP地址与本地的一样, 就意味着已经通知过这个IP地址, 就不再重复发送通知邮件了! 只有当获取到的IP和本地文件存储的IP不同时, 才发送通知邮件!