花了兩天時間,寫好乙個指令碼,在樹莓pi 啟動的時候,自動傳送郵件通知,並且在後台獲得公網ip,通過郵件通知。
**測試完成。
接著想要,加入日誌,以及改進郵件傳送的過程。
先上原始碼吧。
#coding: gbk
import smtplib
import re
import urllib.request
import pickle
import os.path
import threading
import time
from email.mime.multipart import mimemultipart
from email.mime.text import mimetext
from email.header import header
from_addr = '******[email protected]'
to_addr = '******@qq.com'
db_path = './'
#send mail
def list2str(list_in):
return ''.join(list_in)
def pickle_test():
with open("mydata.pickle",'wb+') as mydata:
pickle.dump([1,2,'there'], mydata)
with open("mydata.pickle",'rb') as mydata:
a_list = pickle.load(mydata)
## print(a_list)
class mailsender:
_subject = ''
_from = ''
_to = ''
def setsubject(self,subject):
self._subject = header(subject, 'utf-8')
def setfrom(self,from_addr):
self._from = from_addr
def setto(self,to_addr):
self._to = to_addr
def send(self,message):
try:
server = smtplib.smtp('smtp.163.com',25)
server.login(from_addr,'userpasswd')
msg=mimemultipart('alternative')
msg['subject'] = self._subject
msg['from'] = self._from
msg['to'] = self._to
msg['cc'] = none
content = mimetext(message, 'plain')
msg.attach(content)
server.sendmail(self._from ,self._to, msg.as_string())
server.quit()
return 'ok'
except smtplib.smtpauthenticationerror as e:
#print('smtp error '+str(e))
server.quit()
return 'faild'
except smtplib.smtpsenderrefused as e:
#print('smtp error '+ str(e))
server.quit()
return 'faild'
except smtplib.smtpdataerror as e:
#print('smtp error '+str(e))
server.quit()
return 'faild'
else:
#print('smtp unknow error')
server.quit()
return 'faild'
class ipmanager:
_file_name = 'ip_addr.pickle'
def __init__(self, path):
self._file_name = path + self._file_name
#print('path '+self._file_name+' is exsits '+str(os.path.exists(self._file_name)))
if os.path.exists(self._file_name):
return
with open(self._file_name,'wb+') as data:
#print('create ip_addr.pickle')
pickle.dump('0.0.0.0', data)
def getpublicip(self):
#url_group=['
','']
myip = self.visit('
')return str(myip)
def visit(self,url):
response = urllib.request.urlopen(url)
html = response.read()
html = html.decode('utf-8')
#print('html '+html)
ip_addr = re.findall('\d+\.\d+\.\d+\.\d+', html)
return ip_addr
def getrecord(self):
try:
with open(self._file_name,'rb') as data:
ip_addr = pickle.load(data)
#print('load ip '+str(ip_addr)+'in path '+self._file_name)
return str(ip_addr)
# return re.findall('\d+\.\d+\.\d+\.\d+', ip_addr).group(0)
except ioerror:
#print('the ip_addr.pickle is missing!')
return 'none'
def record(self, ip):
try:
with open(self._file_name,'wb+') as data:
#print('write ip '+str(ip)+"in "+self._file_name)
pickle.dump(ip, data)
# with open(self._file_name,'rb') as data:
# ip_addr = pickle.load(data)
#print('reload ip '+str(ip_addr)+"in "+self._file_name)
except ioerror:
pass
#print('the ip_addr.pickle is missing!')
def chekcip(mail_sender, ip_manager):
newip = ip_manager.getpublicip()
#print("check ip"+newip)
if newip != ip_manager.getrecord():
mail_sender.setsubject('ip changed!')
mail_sender.send('system start at ip '+list2str(newip)+" time "+getlocaltime())
ip_manager.record(newip)
t = threading.timer(10.0, chekcip(mail_sender, ip_manager))
t.start()
def getlocaltime():
return time.strftime('%y-%m-%d,%h:%m:%s',time.localtime(time.time()))
if __name__ == '__main__':
print("system start")
sender = mailsender()
sender.setfrom(from_addr)
sender.setto(to_addr)
sender.send('system start'+getlocaltime())
manager = ipmanager(db_path)
t = threading.timer(500.0, chekcip(sender, manager))
t.start()
C 獲取公網ip位址
1 通過httpwebrequest獲取網頁資料 2 通過webclient獲取網頁資料 未知的原因httpwebrequest用正則解析不掙錢,只好使用httpwebrequest 3 使用正規表示式獲取ip位址 public static string parsehtml string page...
python 3 爬蟲獲取可用ip位址(小白)
前幾天剛剛把正規表示式看了一些,也是只是稍微懂了一點點,所以想要寫乙個簡單的程式試一下。然後就想到了以前在找免費的 的時候有好多不能用的,所以就嘗試著寫了乙個這樣的爬蟲程式,寫的不是很好,寫的很複雜,等以後再去寫簡潔一些吧。先直接把 弄上,然後再說一下裡面的重點內容。import re import...
日誌獲取公網Ip以及內網穿透
檢視是不是那裡出了問題。要想解決這個問題,就要先找到那些地方插入ip,插入時是怎麼獲取的。順藤摸瓜,找到了getip 這個方法,進入原始方法檢視,發現方法是httpcontext.class中提供的,但是不知道為什麼不生效。於是我決定改變策略,不如自己寫乙個工具類,提供getaddress 獲取公網...