Last active
August 29, 2015 14:14
-
-
Save tucanae47/3824254a7fbd3f434360 to your computer and use it in GitHub Desktop.
Tracking package numbers easy way
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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