这个用于Drupal的gmail联系人导入程序脚本出了什么问题?
-
05-07-2019 - |
题
Drupal有一个gmail联系人导入器模块,现在已经非常接近工作了大约7个月。我没有调试问题,维护者消失了,我认为这是一个重要的工作。所以我转向StackOverflow寻求帮助。
问题:当您填写凭据并告诉脚本恢复您的联系人时,默认情况下它会拉入25.这样可以正常工作。
当您通过更改您要查询的网址告诉它寻找更多联系人时:
http://www.google.com/m8/feeds/contacts/default/thin
到此:
http://www.google.com/m8/feeds/contacts/default/thin?max-results=1000
您收到以下致命错误:
致命错误:在
path / to / site / sites / all / modules / dcl_importer / scripts / importGData.class中的非对象上调用成员函数
getAttribute()
。第97行的PHP
这是脚本:
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;
}
}
第97行是接近结尾的 $ email = $ mnode-&gt; getAttribute('address');
行。
我可以在这里更改为不再出现该错误并让其为Drupal社区工作?我想要提取所有人的联系人列表,而不仅仅是25个。我想如果我发送的数字足够高,它就足够接近了。
解决方案
如果不直接测试,我会尝试用以下代码替换96 - 104行:
$mnode = $enodes->item(0);
if (isset($mnode) && is_object($mnode)) {
$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($email)) {
if (empty($name)) {
$contacts[] = $email;
} else {
$contacts[$name] = $email;
}
}
}
gd:电子邮件是根据 Google Data API 一>。它也是Gmail实施中的可选项。您正在使用的模块假设它存在并且在它不存在时失败。
根据NOTE:comment。
,每个联系人的多个电子邮件地址仍未处理不隶属于 StackOverflow