So, now I’ve got this shiny new Milestone with Android 2.1 on board. And as a consequence of this fact, I have up2date contacts on google to sync the address book with. I also have a voicemail implementation on my own asterisk that sends me an email with wav attached in case of a missed call ( using voicemail “redirect” of the provider with my own number ). Why not to use both of these and get some fun like I was getting with Google Calendar and Asterisk?
So here we go, first of all I do it in python because there is a library ready to use and coding in python is fast. you gonna need to download and setup.py this.
The “program” is trivial when you know how it works and it is also very quick and dirty, “works for me” style:
#!/usr/bin/python import atom,re,sys import gdata.contacts import gdata.contacts.service def PhoneInFeed(feed,nphone): for i, entry in enumerate(feed.entry): for phone in entry.phone_number: if re.findall(nphone,phone.text): return entry.title.text return False def main(): email = "[email protected]" password = "and your pass" phone = sys.argv[1] name = None #here I check that the number is more than 4 digits #otherwise it is to simple and will match too much if phone.__len__() > 4: #and here i'd like to remove leading zeroes, pluses and country codes #so if you have two contacts with the same numbers but in different areas #then you will get what you ask for :) phone = re.sub('^[0+]+[0-9]{2}', '', phone) gd_client = gdata.contacts.service.ContactsService() gd_client.email = email gd_client.password = password gd_client.source = 'gcontact2ast' gd_client.ProgrammaticLogin() query = gdata.contacts.service.ContactsQuery() #oh, yeah I know, and don't care to get 1k of results (189 here and works) query.max_results = 1000 feed = gd_client.GetContactsFeed(query.ToUri()) name = PhoneInFeed(feed,phone) if not name: #here is how I call the unknown numbers calling in name = "Caller" sys.stdout.write(name) if __name__ == "__main__": main()
and it can be used like this:
> ./mycontracts.py 333444555 A contact
At this point you should be able to find a contact name by a phone numer. So far so good. How would you use it with Asterisk? Well, there is more than one way to do it but I have app_backticks and I’m not afraid to use it, so my dialplan looks like this:
[somewhere-in-voicemail] exten => s,2,BACKTICKS(CALLERID(name)|/usr/local/bin/mycontacts.py ${CALLERID(num)}) ;the above sets callerid name to what was found exten => s,3,Swift(Lawrence^Hello ${CALLERID(name)}, Please leave your message for Michael after the tone) ;and the above prompts the caller with his name (oh boy!) using cepstral TTS exten => h,1,System( sendfilevoicemail.pl 'New voicemail for Michael from ${CALLERID(all)}' /tmp/${CALLERID(num)}-${TIMESTAMP}.wav & ) ;and at some point i send the file to where it belongs
And my callers get prompted by name if found and also I get email that has the name in subject.
Googluck!