-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathAODI.py
134 lines (121 loc) · 4.04 KB
/
AODI.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2020/6/18
# @Author : lin
# @FileName: AODI.py
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import requests
import time
import json
import re
# e-mail config
SMTP_server = "" # mail server
password = "" # mail login password
sender = "" # mail send acount
receiver = "" # mail recieve account
subject = "[RPI]IP INFORM (FROM STMP)"
content = "Your Public IP is : "
# public IP config
headers = {
"DNT": "1",
"User-Agent": "User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
}
url_source = ["http://ipv4.icanhazip.com/",
"https://ip.cn/",
"https://httpbin.org/ip"]
# Router config
url_route = "" # url of gateway login
url_wan = "" # url of infomation with WAN
login_data = {'username':'',
'psd':''} # account and password for router login
class ObtainIP:
def Get_ip(self):
i = 0
while True:
try:
current_ip = self.get(url_source[i])
print("Obtain IP from %s"%url_source[i])
return current_ip
except Exception as ex:
print("Ops Current Error : %s.\n Try other source to obtain public IP..."%ex)
if i == (len(url_source) - 1):
current_ip = self.get_wan()
print("Obtain IP from WAN.")
return current_ip
else:
i += 1
pass
def get(self,url):
'''
:param url: request target url
:return: a list with public ip
'''
response_data = requests.get(url=url).content
ip = re.findall(r"(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])",response_data.decode())
return ip
def get_wan(self):
'''
:return: obtain public IP from router WAN
'''
url = url_route
data = login_data
session = requests.Session()
session.post(url=url,data=data)
response_data = session.get(url=url_wan).text
WAN_ip = json.loads(response_data)["WANIP"]
return WAN_ip
def Verify_Network():
loop_count = 0
while True:
try:
url = "https://www.baidu.com"
response = requests.get(url = url)
return response.status_code
except Exception as ex:
print("Error happen as %s.\n Waiting for network ..."%ex)
time.sleep(5)
loop_count += 1
if loop_count < 10:
pass
else:
return 400
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def Mail_inform(ip):
From_addr = sender
pwd = password
To_addr = receiver
smtp_server = SMTP_server
mail_content = content + str(ip)
msg = MIMEText(mail_content, 'plain', 'utf-8')
msg['From'] = _format_addr('Python-Tool <%s>' % From_addr)
msg['To'] = _format_addr('User <%s>' % To_addr)
msg['Subject'] = Header(subject, 'utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server,465)
server.ehlo(sender)
if server.has_extn('STARTTLS'):
server.starttls()
server.ehlo(sender)
server.set_debuglevel(1)
server.login(From_addr, pwd)
server.sendmail(From_addr, [To_addr], msg.as_string())
server.quit()
return 0
if __name__ == '__main__':
code = Verify_Network()
if code == 200:
print("Network is smooth.")
Obtain_tool = ObtainIP()
ip = Obtain_tool.Get_ip()
try:
Mail_inform(ip)
print("E-mail sends successfully.")
except smtplib.SMTPException as e:
print("error %s.")
else:
print("error code %s and program stopped."%code)