Skip to content

Instantly share code, notes, and snippets.

@Bowbaq
Last active August 29, 2015 14:11
Show Gist options
  • Save Bowbaq/db7792b3a5cf0814e6e5 to your computer and use it in GitHub Desktop.
Save Bowbaq/db7792b3a5cf0814e6e5 to your computer and use it in GitHub Desktop.
Fetch Google Contacts, authenticate with oauth2
import argparse
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client import tools
from oauth2client.tools import run_flow
import gdata.contacts.data
import gdata.contacts.client
SCOPE = 'https://www.google.com/m8/feeds/'
def create_client():
flow = flow_from_clientsecrets('client_secrets.json', scope=SCOPE, redirect_uri='http://localhost')
storage = Storage('oauth-credentials.dat')
credentials = storage.get()
parser = argparse.ArgumentParser(parents=[tools.argparser])
flags = parser.parse_args()
if credentials is None or credentials.invalid:
credentials = run_flow(flow, storage, flags)
auth2token = gdata.gauth.OAuth2Token(
client_id=credentials.client_id,
client_secret=credentials.client_secret,
scope=SCOPE,
access_token=credentials.access_token,
refresh_token=credentials.refresh_token,
user_agent='contact-cleanup/1.0'
)
gd_client = gdata.contacts.client.ContactsClient(source='contact-cleanup', auth_token=auth2token)
auth2token.authorize(gd_client)
return gd_client
def update_contacts(gd_client, feed):
if not feed.entry:
print '\nNo contacts in feed.\n'
return
for i, entry in enumerate(feed.entry):
if entry.name is not None:
family_name = entry.name.family_name is None and " " or entry.name.family_name.text
full_name = entry.name.full_name is None and " " or entry.name.full_name.text
given_name = entry.name.given_name is None and " " or entry.name.given_name.text
# Skip non-standard names
if len(full_name.split(" ")) > 2 or given_name == " " or family_name == " ":
continue
if given_name != given_name.title() or family_name != family_name.upper():
print '\n%s %s -> %s %s (%s)' % (given_name, family_name, given_name.title(), family_name.upper(), full_name)
given_name = given_name.title()
family_name = family_name.upper()
if not entry.name:
entry.name = gdata.data.Name()
entry.name.given_name = gdata.data.GivenName(text=given_name)
entry.name.family_name = gdata.data.FamilyName(text=family_name)
entry.name.full_name = gdata.data.FullName(text=given_name + " " + family_name)
gd_client.Update(entry)
gd_client = create_client()
feed = gd_client.GetContacts()
while feed:
update_contacts(gd_client, feed)
next = feed.GetNextLink()
if next:
feed = gd_client.GetContacts(uri=next.href)
else:
feed = None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment