Drupal has a gmail contact importer module that's been oh-so-close to working for about 7 months now. I don't have the chops to debug the problem, the maintainer vanished, and I think this is an important piece to have working. So I turn to StackOverflow for help.
The Problem: When you fill in your credentials and tell the script to bring back your contacts, by default it pulls in 25. That works fine.
When you tell it to look for more contacts by changing the URL you're querying from this:
http://www.google.com/m8/feeds/contacts/default/thin
to this:
http://www.google.com/m8/feeds/contacts/default/thin?max-results=1000
You get the following fatal error:
Fatal error: Call to a member function
getAttribute()
on a non-object inpath/to/site/sites/all/modules/dcl_importer/scripts/importGData.class.php
on line 97
Here's the script:
class GDataMailer {
static $url_ClientLogin = 'https://www.google.com/accounts/ClientLogin';
static $url_Feed = 'http://www.google.com/m8/feeds/contacts/default/thin?max-results=65535';
function newCurlSession($URL, $auth = null) {
$curl = curl_init();
$opts = array(
CURLOPT_URL => $URL,
CURLOPT_REFERER => '',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
);
if (null != $auth) {
$opts[CURLOPT_HTTPHEADER] = array(
'Authorization: GoogleLogin auth='.$auth,
);
}
curl_setopt_array($curl, $opts);
return $curl;
}
function useCurlForPost($curl, $params) {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
return $curl;
}
function getAuthToken($login, $password) {
$curl = $this->useCurlForPost($this->newCurlSession(self::$url_ClientLogin), array(
'accountType' => 'HOSTED_OR_GOOGLE',
'Email' => $login,
'Passwd' => $password,
'service' => 'cp',
'source' => 'Drupal-Contact-Importer',
));
$resp = curl_exec($curl);
// Look for the important stuff:
preg_match_all('/Auth=([^\s]*)/si', $resp, $matches);
if (isset($matches[1][0])) {
return $matches[1][0];
} else {
return false;
}
}
function getAddressbook($login, $password) {
// check if username and password was given:
if ((isset($login) && trim($login)=="") || (isset($password) && trim($password)==""))
{
$args = func_get_args();
drupal_set_message('Incorrect login information given: '.print_r($args, true), 'error');
return false;
}
// Get the GData auth token:
$auth = $this->getAuthToken($login, $password);
if (false === $auth) {
drupal_set_message('Login failed', 'error');
return false;
}
$curl = $this->newCurlSession(self::$url_Feed, $auth);
$data = curl_exec($curl);
$doc = new DOMDocument();
$doc->loadXML($data);
$path = new DOMXPath($doc);
$path->registerNamespace('a', 'http://www.w3.org/2005/Atom');
$path->registerNamespace('gd', 'http://schemas.google.com/g/2005');
$nodes = $path->query('//a:entry');
$num = $nodes->length;
$contacts = array();
for ($x = 0; $x < $num; $x++) {
$entry = $nodes->item($x);
$tnodes = $path->query('a:title', $entry);
$nnode = $tnodes->item(0);
$name = $nnode->textContent;
$enodes = $path->query('gd:email', $entry);
$mnode = $enodes->item(0);
$email = $mnode->getAttribute('address');
// NOTE: Keep in mind that $mnode->getAttribute('rel') tells you what kind of email it is.
// NOTE: Also remember that there can be multiple emails per entry!
if (empty($name)) {
$contacts[] = $email;
} else {
$contacts[$name] = $email;
}
}
return $contacts;
}
}
Line 97 is that $email = $mnode->getAttribute('address');
line near the end.
What can I change here to not get that error anymore and get this working for the Drupal community? I want to pull in all of a person's contact list, not just 25. I figure if I sent the number high enough, it'll be close enough to get by.