Improvement: the code uses White pages Developer API to perform reverse lookup and retrieve caller's name. White pages' reverse lookup is only used if the caller's name wasn't found in local CNAM table. That is, local CNAM always overrides Whitepages.
Update: teddy_b's code is writing caller's name by setting values on req object (req.Header.From.FromName = CNAM[@num] if (CNAM[@num])). This no longer works (been replaced with fd, fu, fh and sys.SetFromHeader). Read more in this thread. This code is using SetFromHeader and fu to accommodate these changes.
If you wish to use my code, You'll need to register on White pages Developer API and get API key. Insert key value where indicated in the code below:
Code: Select all
WP_key = 'Your_API_KEY_VALUE' # White Pages API key
# CNAM Hash Table (phonebook)
CNAM = {
'12221234567' => 'Office',
'12221231234' => 'Boss',
'12221232233' => "Wife's Cell",
# ...etc...
'12221233333' => 'Home'
}
if sys.In # If incoming call...
name = req.Header.from.FromURI.User.to_s # Get caller ID
# Prepend 10-digit numbers with "1" (US country code),
# remove 011 prefix (if present) and save back to headers
name = ('1' + name) if name =~ /^[2-9]\d\d[2-9]\d{6}$/
name.sub!(/^(011|\+)/,'')
# Check CNAM first. If not found and US number, try to lookup caller's name in Whitepages
if !(cname = CNAM[name]) && name =~ /^1([2-9]\d\d[2-9]\d{6})$/
url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fapi.whitepages.com%2Freverse_phone%2F1.0%2F%3Fphone%3D#{$1}%3Bapi_key%3D#{WP_key}'%20and%20itemPath%3D'wp.listings.listing.displayname'&format=json"
cname = $1 if sys.WebGet(url,4).to_s =~ /"displayname":(?:\[)?"([^"]+)"/
end
sys.Log("Caller's number: '#{name}'"); sys.Log("Caller's name = '#{cname}'") if cname
sys.SetFromHeader(cname || name, nil, nil) # Set FromName for sys.Dial
# Forward call to bindings. Change FromURI when forwarding to
# @local, or else Bria won't find contact in its phonebook!
sys.Dial("#{sys.Username}@local[fu=#{name}]",45)
sys.Respond(480, "#{sys.Username} Not online") # switch to voice mail
else # Outbound call ...
#... your outbound call processing here
end