Andrew Ferrier

Economics; Travel; Film; and Technology.

Archive for the ‘python’ tag

Highrise Backup

with 2 comments

I no longer use Highrise, but when I did, I used this Python script to back up my contacts. Hope it’s helpful to someone.

Updated 2009-12-14: Added license

#!/usr/bin/python
#
# Copyright (c) 2009, Andrew Ferrier All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * The name of Andrew Ferrier may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
 
import httplib2
import getopt
import sys
 
try:
    opts, args = getopt.getopt(sys.argv[1:], "a:d:", ["user-auth-token=", "domain="])
except getopt.GetoptError, err:
    print str(err)
    sys.exit(2)
userauthtoken = None
domain = None
for o, a in opts:
    if o in ("-a", "--user-auth-token"):
        userauthtoken = a
    elif o in ("-d", "--domain"):
        domain = a
    else:
        assert False, "unhandled option"
 
if userauthtoken == None or domain == None:
    print "You must specify both the user-auth-token and the domain"
    sys.exit(2)
 
url = "http://" + domain + ".highrisehq.com/people.xml"
 
http = httplib2.Http()
 
http.add_credentials(userauthtoken, "x")
 
offset = 0
content = ""
 
while True:
    response, newContent = http.request(url + "?n=" + str(offset))
 
    if response.status != 200:
        sys.exit(response.status)
 
    numContacts = newContent.count("<person>")
    offset += numContacts
    content += newContent
 
    if numContacts < 500:
        break
 
print content

Written by andrewferrier

December 4th, 2009 at 12:40 pm

Tagged with , ,

Connecting Google Reader and podget

with 2 comments

For some time, I’ve had a Perl script that runs regularly, backing up my Google Reader subscriptions using the standard OPML format:

#!/usr/bin/perl
#
# Usage:
#  backup-google-reader-opml file-to-write-to.opml google.user.name@domain google-password
 
use strict;
use warnings;
 
use WWW::Mechanize;
 
my $mech = WWW::Mechanize->new();
 
$mech->get("http://reader.google.com")
    or die "Cannot reach Google Reader Homepage";
 
$mech->submit_form(
    form_number => 1,
    fields =>
    {
        Email => $ARGV[1],
        Passwd => $ARGV[2]
    }
)
    or die "Cannot submit form";
 
$mech->get("http://www.google.com/reader/subscriptions/export");
$mech->save_content($ARGV[0]);

However, I recently wrote another script (this time Python) that then takes this OPML, parses out all the URLs that are tagged with ‘podcast’, and outputs a serverlist file for podget (an automated console-based podcast downloader). This enables me to subscribe to a podcast in Google Reader, and have the podcast automatically added to the download list. The script looks like this:

#!/usr/bin/python
#
# Pass in the OPML file as the first command-line parameter. Will output the
# podget serverlist on stdout.
 
import re
import sys
import xml.dom.minidom
 
doc = xml.dom.minidom.parse(sys.argv[1])
 
body = doc.getElementsByTagName("body")[0]
 
p = re.compile('^\W+')
 
for outline in doc.getElementsByTagName("outline"):
    if outline.getAttribute("text") == "podcast":
        for subOutlines in outline.getElementsByTagName("outline"):
            title = subOutlines.getAttribute("title")
            title = p.sub("", title)
            print subOutlines.getAttribute("xmlUrl") + " NoCategory " + title

Feel free to use and adapt to your needs.

Written by andrewferrier

November 23rd, 2008 at 9:08 pm

online purchase proscarbuy proscar no prescription buy proscar fed ex fedex proscar without priscription non rx cheap Flomax Tamsulosin cheap mexican buy Flomax on line amex where can i buy Flomax without prescription buy cheap Flomax online free consult canada Flomax buy brand Flomax purchase Tamsulosin pay pal without rx where can i buy finpecia without a rx wholesale finpecia cheap 10 mg Buspar canada prednisone no prescription purchasing accutane 40 mg online without prescription free fedex delivery accutane 40 mg buy Finpecia without rx Flomax bestellen 5 mg Maxalt Lasix u.p.s shipping cod buy cheap generic Lasix online order prescription free Lasix buy cheap generic Lasix online order no online rx finpecia buy Maxalt online no prescription purchase maxalt prescription online what does valtrex look like buy Crestor no prescription low cost Valtrex espana Valtrex purchased online without prescription where to buy generic Amitriptyline online without a rx valtrex canada buy Buspar drugs Buspar no prescription overnight how to purchase valtrex how to get a prednisone prescription buy online Lasix without rx purchasing Antabuse without a script order Orlistat no visa buy Proscar online purchase Proscar online Buspar online without prescription best Buspar online pill valtrex generic cheapest cheapest place to buy Buspar buy Prednisone american express Cytotec online order saturday delivery purchase Cytotec online with overnight delivery purchase cheap online Valtrex buy Valtrex legally how to buy Buspar without a prescription purchase finpecia pay pal online without prescription purchase Flomax without prescription needed buy Proscar now Buspar effects generic Orlistat uk comprare Buspar generico cheap order rx Valtrex buy valtrex where where can i buy herbal finpecia can you buy Cytotec in mexico buy cod Valtrex where can i buy herbal finpecia order finpecia no visa buy Valtrex no prescription low cost Valtrex tabletten how to buy Maxalt online without rx buy Bupropion uk 60 mg Orlistat buy cheap generic Orlistat online finpecia 1mg Valtrex buy fedex Rosuvastatin order online where to buy generic Cytotec online in canada how to buy Proscar online without rx non rx cheap Orlistat order finpecia overnight delivery buspar online consultant buy Orlistat online no rx no prescriptions needed for Prednisone Buy prednisone without a perscription to ship overnight Crestor precio buy valtrex free consultation valtrex for sale Crestor buy buy Crestor without doctor buy Prednisone with no prescription where to buy Zithromax Zithromax buy Zithromax no prescription Prednisone overnight buy Crestor no scams Crestor without rx order generic Crestor purchase Buspar money purchase Zithromax online order saturday delivery order Zithromax for cash on delivery order Valtrex on line Buy Valtrex online no membership U.S. pharmacies for prednisone without rx prednisone no script required express delivery Buspar pharmacy purchase Buspar pay pal without rx buy online Valtrex where can i buy Valtrex buy discount Valtrex on line Valtrex bestellen Valtrex online purchase overnight xenical without a rx free xenical Arimidex purchase buy 1 g mg Arimidex Orlistat without rx buy Valtrex no visa online without rx purchase Valtrex without a prescription overnight shipping cheap Buspar by money order