Keep your social info in sync.
How many "social networks" do you have accounts on? Personally, I've got at least ten. Some of them I visit once a year - some of them every day. Whenever I move, change jobs, or change my bio, I have to update every single one by hand. That's were Biographer comes in.
Biographer is a little Python app that keeps your info in sync. Fill out
info.yml like so:
name: Peter Sobot location: San Francisco / Toronto biography: Musician and software engineering student @uwaterloo.
accounts.yml like so:
Twitter: username: psobot
Et voilà! Biographer will check and ensure that your name, location, and bio are all up to date on whatever services you use.
To get started, run
pip install -r requirements.txt, open up your favourite text editor, and edit the
That seems kind of cool. How does it work?
Biographer uses two libraries to do all of its dirty work:
- requests for interacting with simple APIs.
- mechanize for browser interaction if some of the data isn't easy to modify via an API.
Simply put, Biographer tries to talk to an API if possible - but if not, it pretends to be you and updates all of your data exactly as you would through a browser.
But won't Biographer require my Twitter/Myspace/Friendster password?
Sometimes. If (and only if) Biographer needs to make any changes, it'll prompt you for your password to the required account on the command line. If you're not a fan of password-based auth like that, you're welcome to generate your own OAuth keys for each service and add that (relatively simple) functionality.
I'd like to add another service to Biographer. How do I do that?
Easy. Super easy, actually. Add a file called
./lib/services/ in this repo. Make sure it contains something like the following:
import requests from getpass import getpass from lib.service import * class MyCoolService(Service): def __init__(self, username): self.username = username def authenticate(self, browser): self.password = getpass("Please enter the password " "for the account %s: " % self.username) browser.open("http://example.com/login") browser.select_form("login_form") browser.form['username'] = self.username browser.form['password'] = self.password browser.submit() return browser def check_biography(self): resp = requests.get("http://example.com/" + self.username) return resp.json()['biography'] @requires_authentication def modify_biography(self, value): self.browser.open("https://example.com/settings") self.browser.select_form('my_profile') self.browser['biography'] = value self.browser.submit()
Services can be much more complicated than this, and can contain any parameter you want to automate. For example, you could add a
check_favourite_food method to your service, and add a line like
favourite_food: burritos to your
info.yml, and Biographer will automatically check to make sure that attribute is up to date. (To write to the attribute, you'd also need a
modify_favourite_food method in your service.)
Cool! Should I send you a pull request once I have a new service ready to go?