(啊,已經是兩個月前做的東西了,因為這月偷懶沒寫東西,所以在11月底扔一篇出來)
今天主要是分享一個我搗鼓出來的讓使用者自行 遠端控制/以web服務方式 訪問有公網IP地址的機子(大多ADSL使用者有公網IP)的工具。
這個想法起因是偶一個親戚的要訪問他倉庫監控網路攝影機狀態,那個監控裝置在本地開了一個web服務,可以供遠端存取,之前用花生殼作網域名稱綁定動態IP老是失效,火大了,乾脆不用了,因為那邊是電信ADSL接入的,有擷取動態公網IP,所以我想如果做一個工具可以往他郵箱發送那台伺服器的IP就OK了,剛好最近有玩Python,我就把“開發工具”定位到它上面了,這是我第4次碰python,跟之前一樣,成果很快就出來了。
我找了兩段資料,Python擷取本機IP的,還有一個是python發送郵件的,然後搗鼓一下就變成:當本機IP變動時發送IP到指定郵箱,非常容易實現,解釋一下為什麼要有這個“IP變動時發送”,因為電信ADSL擷取的公網IP是隔N天會變的(N=?,貌似系統重啟也會變),定時發送會比較蠢(會有無效郵件,IP沒變發來幹嘛),所以做個IP檢測咯~~
下面請看代碼,包含兩個檔案,一個是設定檔config.py,還有一個是主程式部分sendIP.py
config.py:
#coding=utf-8
smtpServer='smtp.126.com' #郵件發送帳戶的smtp伺服器位址
smtpPort='25' #郵件發送帳戶的smtp伺服器傳送埠
smtpUser='XXXX@126.com' #郵件發送帳戶名稱
smtpPwd='XXXXXX' #郵件發送帳戶密碼,我這裡打X號樣本,但老兄得填真的
sendTo='XXXX@qq.com' #接收郵箱地址
包含一個郵件發送帳戶,和一個接收郵箱地址(這個就是上面提到的"指定郵箱"),當然,兩個可以一樣,我這裡以126郵箱帳戶發送給一個QQ郵箱為例,請自便。
sendIP.py:
#coding=utf-8
import smtplib,config,email,sys,socket,threading
from email.Message import Message
def connect():
try:
server=smtplib.SMTP(config.smtpServer,config.smtpPort)
server.ehlo()
server.login(config.smtpUser,config.smtpPwd)
return server
except Exception:
print 'connect smtp server failed!'
def sendmessage(server,to,subj,content):
msg = Message()
msg['Mime-Version']='1.0'
msg['From'] = config.smtpUser
msg['To'] = to
msg['Subject'] = subj
msg.set_payload(content)
try:
failed = server.sendmail(config.smtpUser,to,str(msg))
except Exception ,ex:
print Exception,ex
print 'Error - send failed'
else:
print 'send succeed!'
#每隔10s檢查一次IP,間隔時間可以適當調大一點
def checkIP():
global text
print text
ipnow=str(socket.gethostbyname_ex(socket.gethostname()))
print ipnow
if text!=ipnow:
text=ipnow
server=connect()
sendmessage(server,to,subj,text)
t = threading.Timer(10.0, checkIP)
t.start()
if __name__=="__main__":
to=config.sendTo
subj='ip changed'
text = str(socket.gethostbyname_ex(socket.gethostname())) #這個就是擷取本機IP的
server=connect()
sendmessage(server,to,subj,text)
t = threading.Timer(10.0, checkIP)
t.start()
上面擷取本機IP是全部IP,當然你也可以寫幾行代碼把公網的分離出來~~
之後讓sendIP.py在開機運行就行了(記得先裝python運行環境),只要把遠端桌面是允許狀態,隨時可以遠端控制。
收工!(11月過了-_-!)
(測試環境:Windows XP SP3,Python 2.52)