python3 自動獲取公網ip並傳送郵件通知

2021-06-16 23:24:21 字數 4532 閱讀 5434

花了兩天時間,寫好乙個指令碼,在樹莓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 獲取公網...