165 lines
5.9 KiB
Python
165 lines
5.9 KiB
Python
|
from datetime import datetime, timedelta
|
||
|
from email.mime.multipart import MIMEMultipart
|
||
|
from email.mime.text import MIMEText
|
||
|
from email.mime.base import MIMEBase
|
||
|
from email import encoders
|
||
|
import time
|
||
|
import requests
|
||
|
import json
|
||
|
import csv
|
||
|
import math
|
||
|
import smtplib, ssl
|
||
|
import sys
|
||
|
|
||
|
def sendreport(message):
|
||
|
context = ssl.create_default_context()
|
||
|
with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
|
||
|
server.login(sender_email, password)
|
||
|
server.sendmail(sender_email,receiver_email,message)
|
||
|
time_msg=datetime.today()
|
||
|
time_msg = time_msg.strftime("%m/%d/%Y, %H:%M:%S")
|
||
|
print('Message sent at time {}'.format(time_msg))
|
||
|
|
||
|
def getships():
|
||
|
"""
|
||
|
Retrieves MarineTraffic.com Extended Data from the API, using the ACF.ShipTracker@gmail.com API key.
|
||
|
Collates the data, records the request time.
|
||
|
If a vessel has a speed over 10 kts, the estimated wave height at distance 1m, 1000m, 2000m, and 3000m, are recorded.
|
||
|
This is to be used in concert with the rest of ACF_ShipTracker python script to save as a CSV and email once a day.
|
||
|
"""
|
||
|
response = requests.get(
|
||
|
'https://services.marinetraffic.com/api/exportvessels/v:8/ea1f4a05afbd000ba30772a9979bf7aa743092cb/timespan:60/msgtype:extended/protocol:json')
|
||
|
json_data=response.content
|
||
|
redata=json.loads(json_data)
|
||
|
req_time0=datetime.today()
|
||
|
req_time=req_time0.strftime("%m/%d/%Y, %H:%M:%S")
|
||
|
for XX in range(len(redata)) :
|
||
|
speed_0=float(redata[XX][5])
|
||
|
ship_speed_kts=speed_0/10 #in kts
|
||
|
if ship_speed_kts>max_speed:
|
||
|
shipdata = redata[XX]
|
||
|
lat = shipdata[3]
|
||
|
lon = shipdata[4]
|
||
|
parameters = {'latitude': lat, 'longitude': lon}
|
||
|
depth_request = requests.get('https://www.gmrt.org/services/PointServer?', params=parameters)
|
||
|
depth = float(str(depth_request.content, 'utf-8'))*-1 # depth in m
|
||
|
shipdata.extend([req_time])
|
||
|
shipdata.extend([depth])
|
||
|
ship_speed_ms=ship_speed_kts/1.944
|
||
|
froude=ship_speed_ms/math.sqrt(9.8*depth)
|
||
|
if shipdata[23]=='Tug':
|
||
|
alpha_1=1
|
||
|
else:
|
||
|
alpha_1=0.35
|
||
|
alpha_1=float(alpha_1)
|
||
|
distance_interest=[1, 1000, 2000, 3000]
|
||
|
for II in distance_interest:
|
||
|
wave_height=depth*alpha_1*((II/depth)**-0.33)*froude**4
|
||
|
shipdata.extend([round(wave_height,2)])
|
||
|
matrix.append(shipdata)
|
||
|
time_ships=datetime.today()
|
||
|
time_ships = time_ships.strftime("%m/%d/%Y, %H:%M:%S")
|
||
|
print('Ship data collected at {}'.format(time_ships))
|
||
|
|
||
|
|
||
|
exe_question=1
|
||
|
max_speed=10
|
||
|
|
||
|
port = 465 # For SSL
|
||
|
sender_email='acf.shiptracker@gmail.com'
|
||
|
password = 'ACFships123'
|
||
|
|
||
|
#receiver_email=input('Where should the email be sent? ')
|
||
|
#send_hour=input('When should the email be sent? (0-23) ')
|
||
|
receiver_email=sys.argv[1]
|
||
|
|
||
|
|
||
|
print('At 0:00, an email will be sent to {}'.format(receiver_email))
|
||
|
|
||
|
message_start = MIMEMultipart()
|
||
|
message_start["From"] = sender_email
|
||
|
message_start["To"] = receiver_email
|
||
|
message_start["Subject"] = "Starting ACF ShipTracker"
|
||
|
|
||
|
body_start = """
|
||
|
This is an automated ACF ShipTracker Email, which has begun tracking ships.\n
|
||
|
|
||
|
An email containing information about these vessels will be sent to this email ({}).\n
|
||
|
|
||
|
This email will contain a CSV file listing all of the information about these vessels for the previous day.\n
|
||
|
|
||
|
Please do not respond to this email. For assistance, please contact Justin Blancher (jeblancher@gmail.com) for any
|
||
|
troubleshooting.
|
||
|
""".format(receiver_email)
|
||
|
|
||
|
message_start.attach(MIMEText(body_start, 'plain'))
|
||
|
text_start = message_start.as_string()
|
||
|
sendreport(text_start)
|
||
|
|
||
|
x=datetime.today()
|
||
|
start_time=x.strftime("%m/%d/%Y, %H:%M:%S")
|
||
|
y = x.replace(day=x.day, hour=x.hour, second=0, minute=0, microsecond=0) + timedelta(hours=1)
|
||
|
delta_t=y-x
|
||
|
secs=delta_t.total_seconds()
|
||
|
#print(secs)
|
||
|
|
||
|
|
||
|
rowheadings=[
|
||
|
'MMSI', 'IMO', 'SHIP_ID', 'LAT', 'LON', 'SPEED',
|
||
|
'HEADING', 'COURSE', 'STATUS', 'TIMESTAMP', 'DSRC', 'UTC_SECONDS',
|
||
|
'SHIPNAME', 'SHIPTYPE', 'CALLSIGN', 'FLAG', 'LENGTH', 'WIDTH', 'GRT', 'DWT',
|
||
|
'DRAUGHT', 'YEAR_BUILT', 'ROT', 'TYPE_NAME', 'AIS_TYPE_SUMMARY',
|
||
|
'DESTINATION', 'ETA', 'Request Time', 'DEPTH','Est Wave Height 1m', 'Est Wave Height 1000m',
|
||
|
'Est Wave Height 2000m', 'Est Wave Height 3000m'
|
||
|
]
|
||
|
|
||
|
time.sleep(secs)
|
||
|
matrix = []
|
||
|
counter=0
|
||
|
|
||
|
while exe_question>0:
|
||
|
x2=datetime.today()
|
||
|
y2 = x2.replace(day=x2.day, hour=x2.hour, minute=0, second=0, microsecond=0) + timedelta(hours=1)
|
||
|
delta_t2 = y2 - x2
|
||
|
secs2 = delta_t2.total_seconds()
|
||
|
#print(secs2)
|
||
|
time.sleep(secs2)
|
||
|
getships()
|
||
|
if x2.hour == 23:
|
||
|
csv_name = "ACFshipdata_{}_{}_{}.csv".format(x2.month, x2.day,x2.year)
|
||
|
with open(csv_name, 'w') as outfile:
|
||
|
writer = csv.writer(outfile)
|
||
|
writer.writerow(rowheadings)
|
||
|
writer.writerows(matrix)
|
||
|
outfile.close()
|
||
|
attachment = open(csv_name, "rb")
|
||
|
p = MIMEBase('application', 'octet-stream')
|
||
|
p.set_payload((attachment).read())
|
||
|
encoders.encode_base64(p)
|
||
|
p.add_header('Content-Disposition', "attachment; filename= %s" % csv_name)
|
||
|
attachment.close()
|
||
|
message = MIMEMultipart()
|
||
|
message.attach(p)
|
||
|
message["From"] = sender_email
|
||
|
message["To"] = receiver_email
|
||
|
message["Subject"] = "Mobile Bay Ship information from ".format(x2.minute)
|
||
|
|
||
|
body = """
|
||
|
This is an automated ACF ShipTracker Email, which has been running since {}.\n
|
||
|
\n
|
||
|
In the past {} hours, a total of {} ships were detected as going faster than {} kts.\n
|
||
|
\n
|
||
|
Attached is the information for these ships. \n
|
||
|
\n
|
||
|
Please do not respond to this email. For assistance, please contact Justin Blancher (jeblancher@gmail.com) for any
|
||
|
troubleshooting.
|
||
|
""".format(start_time,counter,len(matrix),max_speed)
|
||
|
|
||
|
message.attach(MIMEText(body, 'plain'))
|
||
|
text = message.as_string()
|
||
|
sendreport(text)
|
||
|
matrix = []
|
||
|
counter+=1
|
||
|
|
||
|
|