[ Team LiB ] |
Hack 25 Create Several Birthday Reminders at OnceYou probably have dozens of birthdays to track. You can speed up the process of adding Amazon event reminders with a script. If you have an entire address book of people's birthdays that you'd like to receive reminders about, it could be a long process to enter them one by one into Amazon's event reminder form. Instead, you can speed up the process considerably with some scripting. This ASP page accepts a text list of names and birth dates and enters them all as Amazon events. This script runs on Windows servers running IIS. 25.1 The CodeAs with other services that require you to be logged in, the event reminder service requires an Amazon session ID that is tied to your account. This script first logs in as you via SSL and sets the session ID. Then it loops through the birthdays, calling the AddEvent subroutine, which sends a form post to Amazon with the event information. <% ' add_reminders.asp ' Turns a supplied list of names and birthdates into Amazon events ' Usage: An ASP page called from any web browser Const YOUR_EMAIL = "insert email address" Const AMZN_PASSWORD = "insert Amazon password" Const WinHttpRequestOption_EnableRedirects = 6 Sub AddEvent(sid,name,e_month,e_day) strURL = "https://www.amazon.com/exec/obidos/reminder-edit-done/" strURL = strURL & strSessionID strPostData = "reminder-id=" & _ "&reminder-frequency=on" & _ "&sort-by=reminder-date" & _ "&customer-email=" & YOUR_EMAIL & _ "&occasion-id=3" & _ "&smart-send-options-enabled=yes" & _ "&time-zone-name=US/Pacific" & _ "&7-days-before=no" & _ "&recipient-customer-id=" & _ "&recipient-name=" & name & _ "&recipient-lower-email=" & _ "&gift-recipient-customer-id=" & _ "&gift-recipient-age-range=00-00" & _ "&gift-recipient-gender=" & _ "&month=" & e_month & _ "&day-of-month=" & e_day & _ "&14-days-before=on" & _ "&0-days-before=no" & _ "&1-days-before=no" & _ "&interest1=" & _ "&30-days-before=no" & _ "&x=63" & _ "&y=7" Set httppost = Server.CreateObject("Msxml2.SERVERXMLHTTP") httppost.Open "POST", strURL, false httppost.setRequestHeader "Content-Type",[RETURN] "application/x-www-form-urlencoded" httppost.Send(strPostData) If Err.Number <> 0 Then 'WScript.Echo httppost.Error End If strText = httppost.ResponseText strHeaders = httppost.GetAllResponseHeaders strStatus = httppost.status Set httppost = Nothing End Sub If Request("txaBirthdays") <> "" Then 'Start an Amazon Session strURL = "https://www.amazon.com/exec/obidos/flex-sign-in-done/" strPostData = "email=" & YOUR_EMAIL & _ "&password=" & AMZN_PASSWORD & _ "&method=get" & _ "&opt=an" & _ "&cont-page=cm/reminders-signed-in-continue" & _ "&cont-type=add-reminder" & _ "&response=reminder-add" & _ "&response=" & _ "stores/gifts/gifts-sign-in-secure.html" & _ "&action=sign-in" & _ "&next-page=" & _ "stores/gifts/gifts-register-secure.html" Set httppost = Server.CreateObject("WinHttp.WinHttpRequest.5") httppost.Open "POST", strURL, false 'Turn off redirects httppost.Option(WinHttpRequestOption_EnableRedirects) = False httppost.setRequestHeader "Content-Type", [RETURN] "application/x-www-form-urlencoded" httppost.setRequestHeader "User-Agent", [RETURN] "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)" httppost.setRequestHeader "Accept", [RETURN] "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*" httppost.Send strPostData If Err.Number <> 0 Then response.write httppost.Error End If strHeaders = httppost.GetAllResponseHeaders strStatus = httppost.status 'response.write "<xmp>" & strStatus & Chr(13) & strHeaders & "</xmp>" Set objRegExpr = New regexp objRegExpr.Pattern = "session-id=(.*?);" objRegExpr.Global = True objRegExpr.IgnoreCase = True Set objMatches = objRegExpr.Execute(strHeaders) If objMatches.Count = 0 Then response.write "Amazon session couldn't be started." response.end Else For Each objMatch In objMatches strSessionID = objMatch.SubMatches(0) Next End If Set objMatches = Nothing Set objRegExpr = Nothing Set httppost = Nothing 'Loop through the Birthdays cntEvent = 0 arBDays = Split(Request("txaBirthdays"),Chr(13)) For x = 0 To UBound(arBDays) arNameDate = Split(arBDays(x),",") strName = arNameDate(0) strDate = arNameDate(1) arMonthDay = Split(strDate,"/") strMonth = arMonthDay(0) strDay = arMonthDay(1) AddEvent strSessionID, strName, strMonth, strDay cntEvent = cntEvent + 1 Next response.write cntEvent & [RETURN] " events added! Check your email for confirmation." Else %> <html> <head> <title>Add Event Reminders</title> </head> <body> Add a list of birthdays below, one on each line:<br> Format: [Name], [Birthday mm/dd] <br> <form action="add_reminders.asp" method="post"> <textarea cols="35" rows="6" name="txaBirthdays"></textarea> <br><input type="submit" value="Add Items"> </form> </body> </html> <% End If %> 25.2 Running the HackAdd the code to an ASP file, add_reminders.asp. Upload the file to your server and point your browser at it: http://your.server/add_reminders.asp
You'll see the simple HTML form waiting for birthdays. Add a list of names and dates separated by carriage returns. If you happen to store your birthdays in a spreadsheet or other electronic format, it should be fairly easy to export them in this format. Click "Add Items," and the script should let you know how many events were added at Amazon. Log in and check your events list [Hack #24] to verify that the script worked. 25.3 Hacking the HackTo understand the form variables that are sent in the AddEvent subroutine, view the source HTML of Amazon's event reminder [Hack #24] form and take a look at the form fields and their values. By playing with values set in strPostData, you could easily turn this script into an anniversary reminder, or change the notification time of the reminders from the default 14 days to any other available value. |
[ Team LiB ] |