Showing posts with label Google ClientLogin. Show all posts
Showing posts with label Google ClientLogin. Show all posts

Saturday, 7 January 2012

PHP to Paper.......... Getting a list of Printers

If you've read the first part of this little series of posts, you'll know the aim is to allow a PHP web app to print, the web app has just Authenticated with Google and is now ready to start working with the Google Cloud Print Interfaces.

In this post, we'll take the next step to get things up and running, getting a list of the users printers, so we have the needed ID to send print jobs to.
This is really the first stage, really getting stuck into the Google Cloud Print service. When you add a printer to your Google Cloud Print Manager (using the user details which the web app is getting the Authentication Token for) it is given an ID which up till this point is kept hidden but the system will need it.
HINT: To help things out down the line, I would strongly suggest, whenever you add a printer to the Google Cloud Print Manager you rename it to something nice and friendly - you'll see why shortly.
Ok now for a little bit of code. We will start with setting up the client object which will be used for communicating with the interfaces:

// Google User Email:
$G_Email = "your_google_acount@googlemail.com";
// Google User Password:
$G_Pass = "your_google_acount_password";
// Create a Gdata client for the Google Cloud Print service:
$client = Zend_Gdata_ClientLogin::getHttpClient($G_Email, $G_Pass, 'cloudprint');

You'll notice, this is the same object we used when we got the authentication token. But we now need to add the following two lines, these need to be present for the Google Cloud Print servers to interact with us.:

// Add the hadders to the Client:
$client->setHeaders('Authorization','GoogleLogin auth='.$Client_Login_Token);
$client->setHeaders('X-CloudPrint-Proxy','a-name-for-your-system');

Now that's done, we are ready to start using the interfaces. The next step towards being able to print, is getting a list of the printers which the user account can use. You need this list to get hold of the Google appointed ID for the printer you want to use. To get the list we need to use the search interface. The request will return a JSON object:

// GCP Interface to list printers:
$client->setUri('http://www.google.com/cloudprint/interface/search?output=json');
// Request the list of printers:
$response = $client->request(Zend_Http_Client::POST);

We can now perform a quick test on the object to see if there was an authentication error for example:

// Test the response for an auth error:
if ($response->getStatus() == 403) {
    // Handle the error here.........
}

Now we have the JSON object which contains a couple of details of each of the users printers we can decode it into a PHP Array and we have our list. If however you wanted to allow your user to select a printer to use, you could process the array a little to make it easier to work with, and make it a little more user friendly for your user:

// Decode the result:
$result = json_decode($response->getBody(), true);
// Store an array of printers:
$printerList = array();
// Loop through the printers and to get capabilities:
foreach ($result['printers'] as $printer) {
    // Store details about this printer:
    $currentPrinter = array();
    // Store the printers ID:
    $currentPrinter['id'] =  $printer['id'];
    // Try getting the display name, else get the default name:
    $currentPrinter['name'] = (empty($printer['displayName']))?$printer['name']:$printer['displayName'];
    // Add this printer to the overall list:
    $printerList[] = $currentPrinter;
}

Now remember above I said rename your printer in the Google Cloud Print Manager, if you did your user will see a user friendly name, if you didn't, they will get the generic printer name, normally its make and model.

So up to now we have:
The next step is......sending though something to print!

Thursday, 29 December 2011

PHP to Paper.......... Where to Start - Authenticating with Google

After being tasked with getting a PHP web application to print for itself, and deciding Google Cloud Print was looking like the best solution, I set about finding the solution to my problem.

After reading the official doc's and deciding either this really isn't how Google currently intended for the service to be used or they really just hadn't had chance to put much into the doc's I widened my search.
I came across a very useful chap called Kin Lane, he has made some excellent blog posts on the subject and turns out he works in the field of printing. After a quick email and him agreeing that I *should* be able to achieve what I wanted with Google Cloud Print, I set about solving my puzzle.

At the time of writing this, there is very little in the way of code examples using Google Cloud Print, in fact the only one I had found focusing on submitting a job was this sample. This however left some questions to which I found no useful answers!

To start with, Google have provided some interfaces for working with the service. Kin Lane has covered connecting to some these services (receiving print jobs, rather than submitting print jobs, but it was a very good jump start) with PHP on his blog. The solution focuses on the use of the Zend Framework, which was handy with it being the framework the web app uses!

The Pseudo Answer:
  • The web app has a dedicated Google user account (in my case, this is one of the Google App accounts which is a group email address) 
  • Setup some printers for the user account as described here.
  • The system requests an Authentication Token from Google to allow use of the service.
  • The system can now access the printers and use the interfaces.
    • The system can now get a list of printers, and
    • The system can now submit jobs to be printed!
The Start of the Real Answer:

After setting up the printers for a user account, as described here.
The first step the system needs to take is getting an Authentication Token from Google which allows us to use the users services, in this case, the printers you have setup.

// Google User Email:
$G_Email = "your_google_acount@googlemail.com";
// Google User Password:
$G_Pass = "your_google_acount_password";
// Create a Gdata client for the Google Cloud Print service:
$client = Zend_Gdata_ClientLogin::getHttpClient($G_Email, $G_Pass, 'cloudprint');
// Get the Authentication Token:
$Client_Login_Token = $client->getClientLoginToken();

Picture taken from Google

You'll notice, the use of the Zend Framework makes getting the Authentication Token extremely easy, however, and this is quite a big however, there is the potential Google will deny an Authentication Token, and instead request a captcha to be completed, this is covered by the Zend Doc's and other guides on the web, but I will try to come back to it later due to this causing an error for an automated system.
Another thing to note is, once Google has served an Authentication Token, it remains valid for several days, I have read this can be anywhere from 14 days to 28 days, so to play it safe, I request a new token every 10 days to play it safe.

In the next entry I will cover the use of the different interfaces to allow us to print.
Scroll to Top