Home » Php » PHP GMAIL Contacts XML Parsing with DOMDocument and cURL

PHP GMAIL Contacts XML Parsing with DOMDocument and cURL

Posted by: admin July 12, 2020 Leave a comment

Questions:

What I am trying to get currently is just the attribute of gd:email that is the “address=” only nothing else as of the moment. Which I can get to the xml portion, heck I can even get any given think per say as long as its within tags like but to get the attribute of any given one like in my case.. I am completely confused on. I used to know how to do it but its been so long since I did anything that wasn’t simple for XML useage. so I done messed my own self up..

<?xml version='1.0' encoding='UTF-8'?>
    <feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005'>
        <id>[email protected]</id>
        <updated>2011-06-30T00:07:48.706Z</updated>
        <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
        <title type='text'>Taco Bells's Contacts</title>
        <link rel='alternate' type='text/html' href='http://www.google.com/'/>
        <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full'/>
        <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full'/>
        <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/batch'/>
        <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full?max-results=5'/>
        <link rel='next' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full?start-index=6&max-results=5'/>
        <author>
            <name>Taco Bell</name>
            <email>[email protected]</email>
        </author>
        <generator version='1.0' uri='http://www.google.com/mate/feeds'>Contacts</generator>
        <openSearch:totalResults>90</openSearch:totalResults>
        <openSearch:startIndex>1</openSearch:startIndex>
        <openSearch:itemsPerPage>5</openSearch:itemsPerPage>
        <entry>
            <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/0</id>
            <updated>2010-01-27T00:11:57.430Z</updated>
            <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
            <title type='text'>Taco B</title>
            <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/0/8_XL_JoAPon1k7SNixI2iA'/>
            <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/0'/>
            <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/0'/>
            <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/0/1264551117430000'/>
            <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/>
        </entry>
        <entry>
            <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/1</id>
            <updated>2007-08-01T18:02:04.410Z</updated>
            <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
            <title type='text'></title>
            <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/1/1B2M2Y8AsgTpgAmY7PhCfg'/>
            <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/1'/>
            <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/1/1185991324410001'/>
            <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/>
        </entry>
        <entry>
            <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/2</id>
            <updated>2010-01-27T00:11:57.430Z</updated>
            <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
            <title type='text'>Steve Sattler</title>
            <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/2/1B2M2Y8AsgTpgAmY7PhCfg'/>
            <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/2'/>
            <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/2/1264551117430000'/>
            <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/>
        </entry>
        <entry>
            <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/3</id>
            <updated>2010-01-27T00:11:57.430Z</updated>
            <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
            <title type='text'>Michael Montana</title>
            <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/3/1B2M2Y8AsgTpgAmY7PhCfg'/>
            <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/3'/>
            <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/3/1264551117430000'/>
            <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/>
        </entry>
        <entry>
            <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/4</id>
            <updated>2007-08-01T18:02:04.410Z</updated>
            <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
            <title type='text'></title>
            <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/4/1B2M2Y8AsgTpgAmY7PhCfg'/>
            <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/4'/>
            <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/4/1185991324410001'/>
            <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/>
        </entry>
    </feed>

with code that looks like (this is the whole script (currently))

$user = "[email protected]";
$password = "xxxxxxxxxxxx";

// ref: http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html

// step 1: login
$login_url = "https://www.google.com/accounts/ClientLogin";
$fields = array(
    'Email' => $user,
    'Passwd' => $password,
    'service' => 'cp', // <== contact list service code
    'source' => 'test-google-contact-grabber',
    'accountType' => 'GOOGLE',
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$login_url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$fields);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($curl);

$returns = array();

foreach (explode("\n",$result) as $line)
{
    $line = trim($line);
    if (!$line) continue;
    list($k,$v) = explode("=",$line,2);

    $returns[$k] = $v;
}

curl_close($curl);

// step 2: grab the contact list
$feed_url = "http://www.google.com/m8/feeds/contacts/$user/full?&max-results=5";

$header = array(
    'Authorization: GoogleLogin auth=' . $returns['Auth'],
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $feed_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($curl);
curl_close($curl);

$doc = new DOMDocument();
$doc->load($result);
$arrFeeds = array();
foreach ($doc->getElementsByTagName('entry') as $node) {
    $monkey = $node->getAttribute('{gd:email}');
    $itemRSS = array($monkey->nodeValue);
array_push($arrFeeds, $itemRSS);
}
array_unique($arrFeeds);
How to&Answers:

Have a look at DOMDocument and DOMXPath. In order to get nodes that are part of a particular namespace, like the email node which is part of the gd namespace, you need to register the namespace with the DOMXPath object using DOMXPath::registerNamespace(). The namespace URI can usually be found at the top of the XML document.

Example:

$doc = new DOMDocument;
$doc->recover = true;
$doc->loadXML($result);

$xpath = new DOMXPath($doc);
$xpath->registerNamespace('gd', 'http://schemas.google.com/g/2005');

$emails = $xpath->query('//gd:email');

foreach ( $emails as $email )
{
  echo $email->getAttribute('address');

  // To get the title.
  // This could also be done using XPath.
  // You can also use ->nodeValue instead of ->textContent.
  echo $email->parentNode->getElementsByTagName('title')->item(0)->textContent;
}

In the example above, $result is the result of $result = curl_exec($ch);.

Answer:

$url = 'https://www.google.com/m8/feeds/contacts//full?max-results='.$max_results.'&oauth_token='.$accesstoken.'&alt=json&updated-min=2007-03-16T00:00:00';
function curl_file_get_contents($url)
{

$curl = curl_init();
$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
//The URL to fetch. This can also be    set    when initializing a session with curl_init().
curl_setopt($curl,CURLOPT_URL,$url);    
curl_setopt($curl, CURLOPT_HTTPHEADER,array('GData-Version: 2.0'));
curl_setopt($curl,CURLOPT_RETURNTRANSFER,TRUE); //TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly.
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,5);    //The number of seconds to wait while trying to connect.    
curl_setopt($curl,CURLOPT_HTTPGET,true);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);  //The contents of the "User-Agent: " header to be used in a HTTP request.
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); //To follow any "Location: " header that the server sends as part of the HTTP header.
//curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);    //To automatically set the Referer: field in requests where it follows a Location: redirect.
curl_setopt($curl, CURLOPT_TIMEOUT, 10);    //The maximum number of seconds to allow cURL functions to execute.
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);    //To stop cURL from verifying the peer's certificate.

$contents = curl_exec($curl);

curl_close($curl);
return $contents;
}