Skip to content

Instantly share code, notes, and snippets.

@tucanae47
Last active August 29, 2015 14:14
Show Gist options
  • Save tucanae47/3824254a7fbd3f434360 to your computer and use it in GitHub Desktop.
Save tucanae47/3824254a7fbd3f434360 to your computer and use it in GitHub Desktop.
Tracking package numbers easy way
#required.... you will find out fast in google :P.... any question is welcome. cmsvalenzuela at gmail
import smtplib
from rq_scheduler import Scheduler
from datetime import datetime, timedelta
from redis import Redis
import re, requests, json
import json,sys
def jobSendInfo(receiver, packageNumber):
#i was simply tired of adding a daily task to check for china packages
# (lost packages, returned to sender, etc ), because i always forgot to check on tracking numbers...
#unofficial 17£track api :-)
payload = {'num': packageNumber, 'callback': 'a'}
path='/r/handlertrack.ashx'
url='http://www.17track.net'
r = requests.get(url+path, params=payload)
#json string extraction from response.
json_str=re.findall(r'a\((.+)\)',str(r.text.encode('utf-8')))[0]
data = json.loads(json_str)
index=0
info=''
print json_str
# from what i have tested, the json object key data['dat'][z#] is the actual event updates for the package
while data['dat'].get('z'+str(index),[])!=[]:
events= data['dat']['z'+str(index)]
if type(events)==list:
for event in events:
info=info+'DATE: '+event['a'] + ', INFO: '+ event['z'] + ', PLACE: '+ (event['c'] if event['c'] else 'NA') +' \n\n'
else:
info=info+'DATE: '+events['a'] + ', INFO: '+ events['z'] + ', PLACE: '+ (events['c'] if events['c'] else 'NA') +' \n\n'
index+=1
#print areThereUpdates
#TODOS
#-missing a redis or other db, to check last state of package for the user, and generate an alarm, when a new event come, instead of perodic update,
#-add mobile application to generate push msg instead of email
#send an email, it could be a push notificacion too.
to = receiver
gmail_user = 'your gmail here'
gmail_pwd = 'your gmail pwd here'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\r\n' + 'From: <your email here>\r\n' + 'Subject:There is an update in your tracking package '+packageNumber+'\r\n'
print header
msg = header + '\n RAW: '+ json_str +'\n\n' + info.encode('utf-8')
smtpserver.sendmail('your gmail here', to, msg)
print 'done!'
smtpserver.close()
class alarmsAdmin:
def scheduleSendEmails(self, packageNumber):
content= ''
scheduler = Scheduler('default',connection=Redis('localhost', port=6379))
email='receiver of alarm email'
# as it is now, scheduler will send you state of package every day by email.
job=scheduler.schedule(datetime.now(),func= jobSendInfo,args=[email,packageNumber], interval=(60*60*24), repeat=None)
#scheduler.enqueue_periodic(datetime.now(), (60*60*24), None, jobSendInfo, email, packageNumber)
list_of_job_instances = scheduler.get_jobs(with_times=True)
print list_of_job_instances,'<---jobs'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment