Pagine

sabato 3 luglio 2010

Google Gadgets Developer Guide

What are Gadgets?

Gadgets are simple HTML and JavaScript applications that can be embedded in webpages and other apps.

Simple to build

Built-in JavaScript libraries make it easy to create gadgets that include tabs, Flash content, persistent storage, dynamic resizing, and more. Use the Google Gadgets Editor to build gadgets quickly and easily.

Multiple sites

Your gadget can run on multiple sites and products including iGoogle, Google Maps, Orkut, or any webpage. Write your gadget once, and with minor changes it can run in multiple places.

Reach millions of users

Many gadgets are viewed millions of times per week and generate significant traffic for their authors. When users add your gadget to their iGoogle homepage for instance, they'll see your content each time they visit Google.


How do I start?

1. Check out our Getting Started doc.
2. Read the gadgets.* Developers Guide to learn more.
3. Test your gadget for common errors like XML, HTML, character sets, and more.
4. Submit your gadget to the directory.

More information

* Concepts and Examples - Read our design principles and examples for building better gadgets.
* OpenSocial - Make your gadgets social.

Resources

* Google Gadgets Editor - Host your gadget.
* Gadget Checker - Test your gadget for common errors.

Getting Started
http://code.google.com/intl/it-IT/apis/gadgets/docs/gs.html

Getting Started: gadgets.* API

Welcome to the gadgets API! To learn more about different types of gadgets and where they run, see the gadgets API Overview.

This developers guide is intended for people who want to use the gadgets API to write gadgets. Gadgets are so easy to create that they are a good starting point if you are just learning about web programming.
Contents

1. "Hello, World"
2. What's In a Gadget?
3. Where to Go From Here

"Hello, World"

The simplest gadget is just a few lines of code. This gadget displays the message "Hello, world!":





Hello, world!
]]>



Note the following about the "Hello World" example:

* Gadgets are specified in XML. The first line is the standard way to start an XML file. This must be the first line in the file.
* The tag indicates that this XML file contains a gadget.
* The tag contains information about the gadget such as its title, description, author, and other optional features.
* The line indicates that the gadget's content type is HTML.
* is used to enclose HTML when a gadget's content type is html. It tells the gadget parser that the text within the CDATA section should not be treated as XML. The CDATA section typically contains HTML and JavaScript.
*
signifies the end of the Content section.
*
signifies the end of the gadget definition.

What's In a Gadget?

The gadgets API consists of a few simple building blocks: XML, HTML, and JavaScript. To get started, all you need is a basic understanding of HTML. We will teach you all you need to know about XML to write gadgets. Later, as you write more sophisticated gadgets, you will probably want to learn some JavaScript if you're not familiar with it already.

XML is a general purpose markup language. It describes structured data in a way that both humans and computers can read and write.

XML is the language you use to write gadget specifications. A gadget is simply an XML file, placed somewhere on the internet where Google can find it. The XML file that specifies a gadget contains instructions on how to process and render the gadget. The XML file can contain all of the data and code for the gadget, or it can have references (URLs) for where to find the rest of the elements.

HTML is the markup language used to format pages on the internet. The static content of a gadget is typically written in HTML. HTML looks similar to XML, but it's used to format web documents rather than to describe structured data.

JavaScript is a scripting language you can use to add dynamic behavior to your gadgets.
Where to Go From Here

For general gadget programming information, go to Writing Your Own Gadgets. From there you can go to Development Fundamentals, or back to the documentation home page for an overview of sections and topics.

If you're interested in developing OpenSocial gadgets, here are a few places to start getting some hands-on experience:

* OpenSocial Tutorial for iGoogle
* iGoogle Sandbox Developers Guide, for information on developing gadgets for the iGoogle sandbox.
* Orkut Sandbox Developers Guide, for information on developing gadgets for the Orkut sandbox.


gadgets.* Developers Guide

gadgets.* API Developer's Guide

This is the developers guide for the gadgets.* API.
Sections Selected Topics
Getting Started "Hello, World"
What's in a Gadget?

Writing Your Own Gadgets Basic Steps
Anatomy of a Gadget
Development Fundamentals Choosing a Content Type
Turning an Existing Web Page or Application into a Gadget
Working with Userpref Data Types
Specifying a Geographical Location
Saving State
Writing Gadgets that Require Login or Cookies
Developer Tools Programming and Debugging Tips
Hosting through the Google Gadgets Editor
Hosting on Google Code
Creating a User Interface Managing Gadget Height
Setting a Gadget's Title
Tabs
MiniMessages
Flash
Working with Remote Content Working with Text
Working with XML
Working with Feeds
Working with JSON
Writing OAuth Gadgets
Internationalization Creating a Localized Gadget
Message Bundles
Using Message Bundles in a Gadget
Non-English Gadgets Where Can I Find Non-English Gadgets?
Writing Non-English Gadgets
Publishing Your Gadget Where Can I Put My Gadget?
Preparing for Publication
Publishing to the iGoogle Content Directory
XML Reference ModulePrefs Elements and Attributes
User Preferences
Content Section
JavaScript Reference JSDoc for the JavaScript API

Authentication and Authorization for Google APIs

What are authentication and authorization?

Third-party applications often require limited access to a user's Google Account for certain types of activity. To ensure that user data is not abused, all requests for access must be approved by the account holder. Access control has two components, authentication and authorization.

Authentication services allow users to sign in to your application using a Google Account. Some services also allow users to sign in using another account, such as an OpenID login. Authentication allows you to identify users, for example to provide a customized experience when using your application.

Authorization services let users provide your application with access to the data they have stored in Google applications. Google takes privacy seriously, and any application that requires access to a user's data must be authorized by the user.

Authentication: Allow users to sign-in

Authorization: Access users' data

OpenID for Google Account Users, based on the OpenID 2.0 protocol, allows users to log into your website or web application with their Google account. When Google authenticates a user's account, it returns a user ID to your application, which allows you to collect and store user information. OpenID also allows you to get access to certain user account information, with user approval.


The OAuth open-standard protocol allows users to authorize access to their data, after they have been authenticated. When you use OAuth, the user is presented with a screen asking them to give your application access to the data you request. If they agree, OAuth returns a token which you can use to access that data. OAuth is available for web applications and for installed applications.

* The hybrid protocol uses both OpenID and OAuth, to provide both authentication and authorization in a single-step process.
* Google's proprietary AuthSub API offers access control features similar to those available using OAuth. AuthSub is not used widely outside the Google APIs, so we recommend that you migrate to OAuth where possible.

The Authentication and Authorization APIs can be used with both regular Google accounts and Google Apps hosted accounts. Although the user experience varies slightly, the process of managing authorization and/or authentication programmatically is the same for both types of accounts.


Getting Started
I want to...

* Choose an auth mechanism that will work for my application.
* Authorize my app to access data using a Google API.
* Let users sign in to my website using their Google Account.
* Register my application with Google.
* Get help! Join our community and participate in the discussion group.

http://code.google.com/intl/it-IT/apis/accounts/docs/GettingStarted.html
piazzare i seguenti link nel punto giusto ... un poco di confusione!
http://code.google.com/intl/it-IT/apis/accounts/docs/OpenID.html
http://code.google.com/intl/it-IT/apis/accounts/docs/RegistrationForWebAppsAuto.html
http://groups.google.com/group/Google-Accounts-API?pli=1

Choosing an Auth Mechanism

Authentication and Authorization for Google APIs allow third-party applications to get limited access to a user's Google accounts for certain types of activities. This document explains the available auth mechanisms and what each one provides for your application.

* OAuth provides authorization for all Google APIs. This allows your application to request access to data associated with a user's Google Account.
* Hybrid protocol provides authentication and authorization for web applications, allowing users to log in and authorize access to their data in a single step. This protocol uses OpenID to provide authentication services, and OAuth to provide authorization to Google APIs.
* OpenID authenticates a user with their Google Account. This allows users to log in to your web site without having to sign up for a new account.

AuthSub and ClientLogin are Google's proprietary authorization APIs, available as an alternative to OAuth for most Google APIs. If possible, you should migrate applications using these auth mechanisms to one of the recommended options above.
OAuth - authorization for web and installed applications

Many Google services allow third-party access to user-generated data, such as Calendar or feed data, so long as access is authorized by the user. This feature allows users to share and exchange data between their Google applications and third-party applications for a variety of purposes. Google supports several options for getting authorized access to a user's Google data, offering access to both web applications and installed applications.

OAuth is an open standard. It can be used for authorization with services provided by Google, or by other companies that have implemented the standard.

OAuth allows users to log in using the familiar Google login box, promoting confidence in security. It also offers great flexibility; it allows the user to select which account to use if more than one is logged in, it supports SAML-enabled hosted domains, it handles login errors and suspicious activity in the familiar Google environment, and it allows users to create a Google account if they don't already have one.
OAuth for web applications

Web applications that need authorized access to data associated with a Google Account or a Google Apps Account can use Google's implementation of the OAuth API. For help implementing OAuth for a web-based application, see the OAuth for Web Apps guide.
OAuth for installed applications

An application installed on a user's machine—whether it's a desktop computer or a mobile device—can also use OAuth to authorize access to data associated with a Google Account. For help implementing OAuth for installed applications, see the OAuth for Installed Applications guide.
Hybrid Protocol - authentication & authorization for web applications

Some applications require both authentication, for example, to handle sessions or store data provided directly to the application, and authorization, to access the data associated with a user's Google Account.

The hybrid protocol combines OpenID with OAuth to provide these services. This allows the user to authenticate and authorize access to their data in a single step.

For help implementing the hybrid solution, see Implementing OAuth with OpenID.
OpenID - authentication for web applications

Using Google's OpenID services, web applications can hand off user authentication tasks to Google. This feature frees you up from having to manage log-in information and security measures, and also avoids forcing your users to set up yet another login account.

When you use OpenID, your application does not handle any login information. After a user successfully logs in to their Google Account, the OpenID server returns a persistent user identifier that your application can use to recognize that user, handle sessions, store user-specific data, and so on.

Google's OpenID service is based on the open-source OpenID 2.0 protocol. You can use the same interface to accept logins from any OpenID provider.

OpenID is designed for web applications only. For more information about implementing a login solution, see the following documents:

* OpenID for Google Account Users
* OpenID for Google Apps (hosted) Account Users.

Marketplace applications

Applications built for the Google Apps Marketplace can use Google's OpenID service to provide OpenID-based Single Sign-On, and handle authorization requests using two-legged OAuth.

For details on implementing OpenID-based SSO, see OpenID Federated Login Service for Google Apps. For details on two-legged OAuth, see OAuth for Google Apps domains. You should also read the Marketplace Best Practices for SSO.

OAuth for Web Applications

This document describes how to get started using Google's implementation of the OAuth protocol to authorize a web application's requests for access to a user's data. If instead your application is installed on a computer or a mobile device, you should read the documentation on OAuth for Installed Apps.

If you want to allow users to sign in to your application using OpenID, you can find more information about implementing the Hybrid Protocol (OAuth+OpenID) in the OpenID documentation.
Prerequisites

This document is written for web application developers using the Google Data APIs to access a user's data. It assumes that you have read the documentation for the API you are using and are aware of any service-specific authorization issues. The document also assumes that you are familiar with the principles behind OAuth. For more background information, see the Beginner's Guide to OAuth
Contents

http://code.google.com/intl/it-IT/apis/accounts/docs/OAuth.html

1. The OAuth authorization process
2. Getting ready for OAuth
1. Deciding whether or not to register your web application
2. Determining the scope of the data to which you require access
3. Setting up a mechanism to manage OAuth tokens
4. Setting up a mechanism to request access to a Google service
5. Implementing OpenID (optional)
3. Working with OAuth tokens
1. Setting a callback URL
2. Identifying your application to users
3. Working with Google Apps domains
4. OAuth for Google Apps domains
5. Migrating from AuthSub to OAuth

The OAuth authorization process

The OAuth authorization process involves a series of interactions between your web application, Google's authorization servers, and the end user.

At a basic level, the process is as follows:

1. Your application gets an unauthorized request token from Google's authorization server.
2. Google asks the user to grant you access to the required data.
3. Your application gets an authorized request token from the authorization server.
4. You exchange the authorized request token for an access token.
5. You use the access token to request data from Google's service access servers.

When your application initially requests access to a user's data, Google issues an unauthorized request token to your application.

Google prompts the user to log into their account if they are not already logged in. Google then displays an authorization page that allows the user to see what Google service data your application is requesting access to.

If the user approves your application's access request, Google issues an authorized request token. Each request token is valid for only one hour. Only an authorized request token can be exchanged for an access token, and a request token can be exchanged for an access token only once.

An access token is, by default, long-lived. It is specific to the user account specified in the original request for authorization, and grants access to only the services specified in that request. Your application should store the access token securely, as it is required for all access to a user's data.
Getting ready for OAuth

Before you can set up your application to use the Google Authorization service with OAuth, you must complete the following tasks.
Deciding whether or not to register your web application

To provide your users with additional assurances of the security of their data, you can choose to register your web application with Google and sign your requests with the registered security certificate. Some Google Data API feeds are available to registered applications only.

Your application must sign each OAuth request it makes. If you choose to use a RSA-SHA1 signature to sign your requests, you must upload a security certificate as part of the registration process.

Alternatively, you can use a HMAC-SHA1 signature to sign your requests. No certificate is required for HMAC-SHA1 signatures. Instead, Google generates an OAuth consumer secret value, which is displayed on your domain's registration page after you have registered.

For more information on the registration process, see Registration for Web Applications.
Determining the scope of the data to which you require access

Each Google service sets limits on the access it will allow through the Google Data APIs. This access is expressed as a scope value. Some services provide a variety of scope values, to allow a user to choose which applications should have access to which data. For information about the available scope values for the Google service you want to access, see the documentation for that service.

You should generally request a token for the broadest scope you expect to need. For example, if your application requires access to a user's Google Calendar feed, you should usually request a token for the scope http://www.google.com/calendar/feeds/, which grants access to all of Calendar's feeds.

If you request a token for the scope http://www.google.com/calendar/feeds/default/allcalendars/full, your application will have access to the user's "All Calendars" feed only, and will not have access to the feeds for individual calendars.
Setting up a mechanism to manage OAuth tokens

When you obtain an OAuth access token for a user's data, you must use that access token for all future interactions with the specified Google service on behalf of the user.

Your application should manage token storage securely, including tracking the Google service for which each token is valid. If you require access to more than one Google service, you can obtain multiple access tokens, but no more than ten access tokens per user and application can be outstanding at any time.

If your application supports multiple user accounts, you must also track the account for which each token is valid. Each OAuth token is specific to the user who authorized access. Therefore, your application must be able to associate a token with the correct user. The recommended option is to issue a cookie to the user before making the token request. After the user grants access to the requested data, Google sends an authorized request token and redirects the user to your application. You can then use your application's cookie to associate the token with the correct user.
Setting up a mechanism to request access to a Google service

Every request to a Google service must be signed, and must include a valid OAuth access token. In general, each request is made in the form of a HTTP GET request, with the access token and signature included in the header. Requests that write new data should use a HTTP POST.

For more information on the proper request format for each Google Data API, refer to the documentation of that API.
Implementing OpenID (optional)

If you're implementing OpenID for user authentication, you might want to use the hybrid protocol to combine the two processes. With OpenID+OAuth, the tasks of getting a request token and authorizing it are handled as part of the OpenID request with OAuth extensions. As with OAuthGetRequestToken, these extensions are used to identify the Google services to be accessed. A successful response to the OpenID request contains an authorized request token. Once this token is received, use OAuthGetAccessToken to exchange it for an access token.
Working with OAuth tokens

To use OAuth, your application must generate well-formed, signed token request calls, and handle the responses, for the following sequence:

1. Get an unauthorized request token (OAuthGetRequestToken)
2. Authorize the request token (OAuthAuthorizeToken)
3. Exchange the authorized request token for an access token (OAuthGetAccessToken)

All OAuth requests must be signed, whether or not your application is registered. For further information, see Signing OAuth Requests.

You can experiment with requesting and receiving authorization tokens in the OAuth Playground.

For detailed documentation, see the OAuth API Reference.
Setting a callback URL

You can specify a value for oauth_callback in an OAuthGetRequestToken request, to determine where Google redirects the user after they authorize your access request. The callback URL can include query parameters. The redirect will include the same query parameters, as well as the authorized request token, which your application must be able to parse.

For example, when supporting multiple languages, you can include a query parameter that identifies the version of the application that a user is viewing. An oauth_callback value of "http://www.yoursite.com/Retrievetoken?Lang=de would result in the redirect "http://www.yoursite.com/Retrievetoken?Lang=de&oauth_token=DQAADKEDE". Parsing the token and the language parameter ensures that the user is redirected back to the correct version of the site.

If the oauth_callback parameter is not included, Google will direct the user to a web page that displays a verification number (see example), after authorizing your access request. The user must manually return to your application and enter the verification number before you can obtain an authorized request token.
Identifying your application to users

Google normally displays the name of an application when requesting access consent from the user (see example).

If your application is not registered, use the xoauth_displayname parameter in your OAuthGetRequestToken request to specify the name of your application. If that parameter is not specified, Google displays the domain name of the URL provided by the oauth_callback parameter. If no callback URL is provided, Google displays the string "anonymous".

Do not set this parameter if your application is registered. By default, Google shows the display name specified during registration. If you set a display name in your OAuthGetRequestToken request, Google will use this instead of your registered display name, and will include a message that the identity of your application cannot be verified.

Note: To set the xoauth_displayname parameter in the OAuth Playground, check the "Advanced" box before fetching the request token.
Working with Google Apps domains

If your application is designed for users on a hosted Google Accounts domain, consider using the hd parameter when authorizing a token. For more information on the hd parameter, see Handling Users with Multiple Accounts.
OAuth for Google Apps domains

Using 2-legged OAuth allows for domain-wide delegation of authority. A domain administrator can authorize access requests for all users. An application that has the OAuth consumer key and secret (roughly equivalent to a role account username and password) is allowed to act as any user in the domain when accessing Google Data APIs.

The domain administrator can revoke the key, change the secret, and control which APIs accept domain-wide delegation.

2-legged OAuth can be used, for example, to integrate with a document management system, enable third-party workflow applications, centralize backup of documents and contacts, or monitor document sharing inside and outside of the company.

Administrators for Google Apps Premier and Education Edition domains can enable 2-legged OAuth for their domains. This differs from the normal authorization flow, also known as 3-legged OAuth, in that no access token is required. All applications using 2-legged OAuth must be registered with Google.

Note: This feature is only available to Google Apps Premier and Education Edition domains.

Three key groups can use 2-legged OAuth, and the access controls can be set individually for each group.

Google Apps domain administrators

Administrators can build scripts and custom applications to manage user data for their domain using Google Data APIs. For example, an administrator can use the Google Documents Data List feed and 2-legged OAuth to provide every user in their domain with a Google Docs folder named "Human Resources", populated with common employee forms. Some Google Apps applications, such as the Google Apps Connector for BlackBerry Enterprise Server, also require OAuth to be enabled.

To learn about managing the domain administrator's key and secret associated with your Google Apps domain, and granting global access control, see "Managing the OAuth key and secret".
Third-party software vendors

Vendors can offer applications that use 2-legged OAuth to integrate with Google Apps. If the vendor has registered their own consumer key and secret with Google, you can grant their application access to a limited set of resources within your domain using the Manage API client page.

To learn about setting up third-party or internal access to a specific set of Google Data APIs, see "Managing Client API access".
Marketplace applications

Applications built for the Google Apps Marketplace can access Google APIs using 2-legged OAuth. A Marketplace application includes the API scope required in its application manifest. When the application is installed in a domain, the domain administrator must explicitly approve access to the declared scope. This gives the application access to the required scope, for that domain, using the application's 2-legged OAuth consumer key and secret.

For an example of how to use 2-legged OAuth with the Google Data API client libraries, see the Google Data OAuth documentation.
Example: Accessing a Google Data API feed

When sending access requests to Google services with 2-legged OAuth, you do not need an OAuth access token to access a user's data. Instead, include the xoauth_requestor_id query parameter in the request URL and set its value to the email address of the user whose data you are trying to access. Next, send the signed OAuth request using the HMAC-SHA1 signature method (the consumer key and secret are provided in the administrative control panel) or upload a public certificate to use RSA-SHA1. For more information on signing requests, see the Signing OAuth Requests section of this document.

The example below is used to upload an empty document, titled 'Company Perks', to the Google Docs account for j.doe@example.com. This request will succeed only if 2-legged OAuth has been enabled for the domain.

POST /feeds/documents/private/full?xoauth_requestor_id=j.doe%40example.com HTTP/1.1
Host: docs.google.com
Content-Type: application/atom+xml
Authorization: OAuth
oauth_version="1.0",
oauth_nonce="1c4fbbe4387a685829d5938a3d97988c",
oauth_timestamp="1227303732",
oauth_consumer_key="example.com",
oauth_signature_method="HMAC-SHA1",
oauth_signature="lqz%2F%2BfwtusOas8szdYd0lAxC8%3D"


term="http://schemas.google.com/docs/2007#document" />
Company Perks


The Authorization header should be contained on a single line. Newlines have been inserted here for clarity.

The xoauth_requestor_id must be included as a query parameter for requests using 2-legged OAuth. The oauth_token query parameter should not be used.
Migrating from AuthSub to OAuth

AuthSub is Google's proprietary authorization API. We recommend that you migrate to the open OAuth standard where possible. For more information about the differences between the two protocols, see Using OAuth with the Google Data APIs.

If you're already registered with Google to use AuthSub, you do not need to re-register to use OAuth. However, you must specify which signature method you'll use to sign your requests. If you are using an RSA-SHA1 signature, you must also upload a security certificate as part of your domain's registration record.

If you've been using secure tokens under AuthSub, these tokens are equivalent to OAuth access tokens. These secure tokens can be used with OAuth requests.


http://code.google.com/intl/it-IT/apis/accounts/docs/OpenID.html

http://code.google.com/intl/it-IT/apis/accounts/docs/RegistrationForWebAppsAuto.html
http://groups.google.com/group/Google-Accounts-API?pli=1

http://code.google.com/intl/it-IT/apis/accounts/docs/RegistrationForWebAppsAuto.html
Registration for Web-Based Applications

Developers of web applications using Google's Authorization service can opt to register their application domain with Google. There are several advantages to registering your domain. Registered applications:

* are recognized by Google. The Google "Access Consent" page, which asks users to grant/deny access to their account when requested by third-party applications, omits default text cautioning that the site is not trusted.
* can provide a better level of security for their users.
* get access to certain services (such as some Google Data API feeds) that require third-party applications to be registered.
* enables "2-legged" OAuth access for Google Apps domain administrators.

Note: Applications are NOT added to the Google search engine as part of the registration process and do not get preferential treatment in search result pages. If you're trying to add your site to the Google search engine, visit the Add your URL to Google page.

Web applications that opt not to register with Google can still use either the OAuth or AuthSub interfaces and conduct transactions using a lower level of security; at this level, Google does not automatically recognize the calling web application and adds a caution to the Google login page (see example).
Contents

1. Registering your web application
1. Registering a new domain
2. Updating an existing registration

Registering your web application

Registration involves giving Google some basic information about your web application. In addition, if you've opted to enhance the security of your requests to Google services by signing them, you may need to upload a security certificate. There are three levels of registration:

* Unregistered: Application is not recognized by Google. The Access Request page, which prompts your users to either grant or deny access for your application, displays this caution highlighted in yellow: "This website has not registered with Google. We recommend that you continue the process only if you trust this destination."
* Registered: Application is recognized by Google. The Access Request page displays this caution: "This website is registered with Google to make authorization requests, but has not been configured to send requests securely. We recommend that you continue the process only if you trust the following destination ."
* Registered with enhanced security: Registered applications with a security certificate on file can use secure tokens. The Access Request page removes cautions, displaying this message: " Google is not affiliated with , and we recommend that you grant access only if you trust the site."

Registration is optional but recommended. For more information on requirements for signing requests, see Signing AuthSub Requests or Signing OAuth Requests. Registered applications are considered "recognized" by Google and this is reflected in the messaging displayed on the Google Access Consent page, which is displayed to users when a third-party application requests access to a Google service and prompts users to grant/deny access for the application. The messaging differs depending on whether or not the application is registered and signs requests. For unregistered applications, a yellow background is displayed to indicate a caution.

Application domain registration with Google is now automated using a free Google account. If you don't have an account appropriate for registering your application, sign up for one here.
To register a new domain:

Go to the Google Manage Your Domains page. Make sure you're using the appropriate Google account. If you're not logged in at all, you'll be prompted to do so. If you start this process and quit without completing, return to the Manage Your Domains page and click on the Manage link for your domain. The site will remember where you left off.

Note: If you want to be able to use different sub-domains, you'll need to register each sub-domain separately.

1. Add your domain.

Under the heading "Add a New Domain", enter the URL for your domain and click the "Add Domain" button. A new link for the domain is added under the "Manage Registrations" heading. You can register up to eight different domains using one Google account. At this point in the process, your domain has been identified but not yet registered.
2. Verify your domain.

Under the heading "Manage Registrations", click on the link for the domain you just added. The interface walks you through the process of verifying that you have administrator access to the domain. Choose between one of two verification methods: upload an HTML file or add a specific meta tag to your home page.
* Uploading a file: With this method, Google specifies a file name starting with "google". Create an empty file with this name, using the html extension, and upload it to your domain. Be sure to place the file at the domain root. Check that the new file has been published, and return to the Manage Your Domains page for this domain. Click the "Verify" button. If you are unable to verify using this method (for example, there may be a conflict with your web server configuration), use the meta tag method.
* Adding a meta tag: With this method, Google specifies a tag to be added to your domain's home page. Add the tag anywhere in the section of the page and upload it to your domain. Check that the new file has been published, and return to the Manage Your Domains for this domain. Click the "Verify" button.

If verification is successful, you'll be prompted to accept Google's terms of service.
3. Provide domain information.

Once you've accepted the terms of service, Google requests two pieces of information to complete registration:
* Target URL path prefix: This value enables Google to reject all authorization requests ostensibly from your domain that use an incorrect domain or prefix. If you're making an AuthSub request, this URL must be identical to the prefix value of the next parameter used in your authorization requests. For example, if your next values will be something like http://example.com/authsub and/or http://example.com/feed/authsub, your prefix should be http://example.com. If you're using the OAuth interface, this URL must match the value of the oauth_consumer_key parameter.
* Domain description: This optional value should briefly describe the domain you're registering. In the future, this description may be displayed on the Google Access Consent page to provide additional information for your users. You always have the option of changing this description or leaving it blank.

At this point, you have provided all the information required for registration. Click the "Save" button to complete registration.
4. Upload a security certificate.

If your application is using AuthSub or OAuth with the RSA-SHA1 signature method, you need to upload a security certificate.

Note: If you're using OAuth with the HMAC-SHA1 signature method, you do not need to upload a certificate; instead, an OAuth "consumer secret" value is automatically generated when you register your domain.

To create a certificate, generate a public key. The public key must be a 1024-bit RSA key encoded in an X.509 certificate in PEM format. We suggest creating a self-signed certification rather than getting one from a central certificate authority.

If you have multiple sub-domains registered, you can use the same X.509 certificate for all of them.

For more information on creating and using certificates, see these resources:

Generating X.509 Certificates (from IPsec how-to)
X.509 Certificates and Certificate Revocation Lists (from Sun, Java specific but includes good general info)
5. Test your registration status.

Once you've provided the required information and uploaded a security certificate (if desired), use the Manage Your Domains test link to verify that your registration status is accurate. The test link is located on the Manage Your Domains page specific to the domain you're working on. If you've left this site, return to Manage Your Domains and click on the Manage link for the domain you want to test.

The test link essentially makes an AuthSubRequest call using the next URL value you provided for registration. This call prompts a redirect to the Google authorization server's Access Request page. Here you can view what your users are shown when you make an authorization request from your own application. Verify that the message provided is appropriate to your registration status.

To update an existing registration:

1. Go to the Google Manage Your Domains page. Make sure you're using the appropriate Google account.
2. Click on the "Manage" link for the domain you want to update.
3. Make your changes and click Save.
4. If desired, test your registration status using the test link.


http://groups.google.com/group/Google-Accounts-API

The group has been moved to the Google Apps APIs Help Forum. Posts will no longer be accepted here. Please post in the new forum.

At Google, we welcome the development of third-party applications that rely on and communicate with Google services. Many of these services require users to log into their Google Accounts, which means your application needs some way to manage user authentication. The Google Accounts APIs help streamline this task by validating requests for access and issuing authentication tokens. All of the Google Data APIs support these authentication services.



BEFORE YOU POST:

- Please search our documentation for possible answers.

- Search this group! Someone may have already asked the same question before.

- If you're a new member, your post may not appear immediately.

- To report a bug or submit a feature request, use the Public Issue Tracker.


This group is regularly read by various Google employees who will make announcements, answer questions, or solicit feedback.



Enjoy posting, and welcome to the community!

What is the Google Data Protocol?

The Google Data Protocol is a REST-inspired technology for reading, writing, and modifying information on the web.

Many services at Google provide external access to data and functionality through APIs that utilize the Google Data Protocol. The protocol currently supports two primary modes of access:

* AtomPub: Information is sent as a collection of Atom items, using the standard Atom syndication format to represent data and HTTP to handle communication. The Google Data Protocol extends AtomPub for processing queries, authentication, and batch requests.
* JSON: Information is sent as JSON objects that mirror the Atom representation.

Developer's Guide

The Developer's Guide contains general information about the Google Data Protocol and its uses. For more information about a specific Google API, visit the API Directory.

API Directory

The API Directory lists of all of the Google APIs that use the Google Data Protocol. For example, if you're looking for information about the YouTube Data API, it's listed here.
Client Libraries

The Google Data client libraries provide tools and an abstraction layer so that you don't have to deal with HTTP requests or parse raw XML. Libraries are available for Java, JavaScript, .NET, PHP, and Python.

Articles and Guides

The Articles and Guides section contains "Getting Started" guides, example code, and other support material.

Reference Guide

Reference Guide

This document provides detailed reference documentation for the raw protocol (XML and HTTP) for the Blogger Data API.

This document doesn't contain information about the programming-language client libraries. For client-library reference information, see the links from the programming-language-specific sections of the developer's guide.
Contents

1. Audience
2. Blogger feed types
3. Blogger query parameters reference
4. Blogger elements reference
1. Draft entries
2. Publication dates and updated dates
3. Linking comments to posts
5. Blogger Feeds Schema Reference

Audience

This document is intended for programmers who want to write client applications that can interact with Blogger.

It's a reference document; it assumes that you understand the concepts presented in the developer's guide, and the general ideas behind the Google Data APIs protocol.
Blogger feed types

Blogger provides two representations of blog content in feeds: full feeds and summary feeds. A full feed contains full blog posts, while a summary feed contains only a short snippet of each post.

A blog's owner can specify, using GUI settings, whether the blog supplies a full feed or a summary feed to syndicators and aggregators.

When your client app sends an unauthenticated request for a feed, it receives whichever type of feed the blog owner has specified.

When your client app sends an authenticated request, however, it always receives a full feed, regardless of what the blog owner has specified.
Blogger query parameters reference

The Blogger Data API supports almost all of the standard Google Data API query parameters.

Blogger does not support the q (text search) and author parameters.

The updated-min and updated-max query parameters are ignored unless the orderby parameter is set to updated. For example, the following URL retrieves all of the blog posts which have been updated from March 16, 2008 to March 24, 2008:

http://www.blogger.com/feeds/blogID/posts/default?updated-min=2008-03-16T00:00:00&updated-max=2008-03-24T23:59:59&orderby=updated

Blogger elements reference

The Blogger Data API uses only standard Atom elements; for more information, see the Atom 1.0 syndication format specification and the Atom Publishing Protocol.

The rest of this section provides a couple of specific notes about Blogger's use of some standard elements.
Draft entries

A draft blog entry is marked using the extension element defined in the Atom Publishing Protocol document. Here's an example of a draft entry:


...

yes



If no element is specified, then the entry is not a draft.
Publication dates and updated dates

The timestamp given in the standard Atom element corresponds to the "post date" that a user can set in the Blogger GUI.

When your client creates a new entry, if the client doesn't specify a value for , then Blogger sets the entry's post date to the current server time. When your client edits an entry but doesn't specify a value, Blogger leaves the entry's post date alone.

However, if your client does specify a value for the element when creating or editing an entry, then Blogger sets the entry's post date to the specified value. This can be useful for tasks like importing old entries from another blogging system (while keeping the original creation dates).

Blogger uses the standard Atom element to indicate when an entry was last changed. Your client can't control the value; Blogger always sets the entry's last-updated date to the current server time whenever your client posts or edits an entry.

You can use the standard Google Data API published-min, published-max, updated-min, and updated-max query parameters to request entries based on their or values. However, for notes about querying on updated dates, see Blogger query parameters reference.
Linking comments to posts

The Blogger export format contains both posts and comment entries in one Atom feed document. In order to differentiate between the two types of entries, Blogger utilizes the element. This element will have a term parameter that reflects whether the entry is for a post or a comment.

Furthermore, linking the comment entry to the post entry it belong to is accomplished through the use of the Atom Threading Extension. In the example below, the element in the comment entry will point to the post by using the post entry identifier in the ref parameter. It also links to the post's HTML URL through the href parameter.

xmlns:thr="http://purl.org/syndication/thread/1.0">
...

<-- A blog post entry -->

tag:blogger.com,1999:blog-blogID.post-postID
This is my first post
href="http://blogName.blogspot.com/2007/04/first-post.html">

term="http://schemas.google.com/blogger/2008/kind#post"/>
...


<-- A comment to the blog post entry -->

tag:blogger.com,1999:blog-blogID.post-postID.comment-commentID
This is my first commment
term="http://schemas.google.com/blogger/2008/kind#comment"/>
ref="tag:blogger.com,1999:blog-blogID.post-postID"
type="text/html"/>
...



Blogger Feeds Schema Reference

1. Blogs List Feed
2. Blog Posts Feed
3. Blog Comments Feed
4. Blog Post Comments Feed

Developer's Guide

Developer's Guide: Protocol

The Blogger Data API allows client applications to view and update Blogger content in the form of Google Data API feeds.

Your client application can use the Blogger Data API to create new blog posts, edit or delete existing blog posts, and query for blog posts that match particular criteria.

In addition to providing some background on the capabilities of the Blogger Data API, this document provides examples of basic Data API interactions using raw XML and HTTP. After reading this document, you may want to learn more about interacting with the API using our client libraries by reading the programming-language-specific sections of this developer's guide.
Contents

1. Audience
2. Getting started
1. Creating a Blogger account
3. Authenticating to the Blogger service
1. AuthSub proxy authentication
2. ClientLogin username/password authentication
4. Specifying a version
5. Retrieving a list of blogs
6. Creating posts
1. Publishing a blog post
2. Creating a draft blog post
7. Retrieving posts
1. Retrieving all blog posts
2. Retrieving a blog post again
3. Retrieving posts using query parameters
8. Updating posts
9. Deleting posts
10. Comments
1. Creating comments
2. Retrieving comments
3. Deleting comments
11. Export format

Audience

This document is intended for programmers who want to write client applications that can interact with Blogger using XML and HTTP.

This document assumes that you understand the general ideas behind the Google Data APIs protocol.

If you're using a UNIX system and you want to try the examples in this document without writing any code, you may find the UNIX command-line utilities curl or wget useful; for more information, see the manual pages for those utilities.

For Blogger Data API reference information, see the Protocol reference guide.
Getting started
Creating a Blogger account

You may want to sign up for a Blogger account for testing purposes. Blogger uses Google Accounts, so if you already have a Google account, you're all set.
Authenticating to the Blogger service

You can access both public and private feeds using the Blogger Data API. Public feeds don't require any authentication, but they are read-only. If you want to modify blogs, then your client needs to authenticate before requesting private feeds. It can authenticate using either of two approaches: AuthSub proxy authentication or ClientLogin username/password authentication.

For more information about authentication with Google Data APIs in general, see the authentication documentation.

Most of the samples in subsequent sections of this document assume you're supplying the appropriate authentication.
AuthSub proxy authentication

AuthSub proxy authentication is used by web applications that need to authenticate their users to Google Accounts. The website operator and the client code don't have access to the username and password for the Blogger user; instead, the client obtains special AuthSub tokens that allow the client to act on a particular user's behalf. For more detailed information, see the AuthSub documentation.

When a user first visits your application, they have not yet been authenticated. In this case, you need to display some information and a link directing the user to a Google page to authenticate your request for access to their blogs.

The following query parameters are included in the AuthSubRequest URL:

next
The URL of the page that Google should redirect the user to after authentication.
scope
Indicates that the application is requesting a token to access Blogger feeds. The scope string to use is http://www.blogger.com/feeds/ (URL-encoded, of course).
secure
Indicates whether the client is requesting a secure token.
session
Indicates whether the token returned can be exchanged for a multi-use (session) token.

The AuthSubRequest URL might look like this:

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fwelcome.html

The user follows the link to Google's site and authenticates to their Google Account.

After the user authenticates, the AuthSub system redirects them to the URL you specified in the next query parameter of the AuthSubRequest URL. The AuthSub system appends an authentication token to that URL, as the value of the token query parameter. For example:

http://www.example.com/welcome.html?token=yourAuthToken

This token value represents a single-use AuthSub token. In this example, since session=1 was specified, this token can be exchanged for an AuthSub session token by calling the AuthSubSessionToken service with the single-use token in an Authorization header, as follows:

GET /accounts/AuthSubSessionToken HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: AuthSub token="yourAuthToken"
User-Agent: Java/1.5.0_06
Host: www.google.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

The AuthSubSessionToken service response includes a Token header that contains the session token and an Expiration header that indicates how long the token will remain valid.

Your application can then use the session token value in the Authorization header of subsequent interactions with Blogger.

Here's an example of an HTTP request, containing a non-secure token, that you might send to Blogger:

GET /feeds/blogID/blogs/posts/defaults HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: AuthSub token="yourSessionToken"
User-Agent: Java/1.5.0_06
Host: www.blogger.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

ClientLogin username/password authentication

Use ClientLogin authentication if your client is a standalone, single-user "installed" client (such as a desktop application). To request an authentication token using the ClientLogin mechanism, send a POST request to the following URL:

https://www.google.com/accounts/ClientLogin

The POST body should contain a set of query parameters that look like parameters passed by an HTML form, using the application/x-www-form-urlencoded content type. These parameters are:

Email
The user's email address.
Passwd
The user's password.
service
The Blogger service name is blogger. (For other service names, see the service name list.)
accountType
This should always be set to GOOGLE when using the Blogger API. Failure to set this parameter will prevent access by users who also have a Google Apps account.
source
Identifies your client application. Should take the form companyName-applicationName-versionID. The examples use the name exampleCo-exampleApp-1.

For more information about the parameters, see the Authentication for Installed Applications document.

If the authentication request fails, then the server returns an HTTP 403 Forbidden status code.

If it succeeds, then the server returns an HTTP 200 OK status code, plus three long alphanumeric codes in the body of the response: SID, LSID, and Auth. The Auth value is the authorization token that you'll send to Blogger with each of your subsequent requests, so keep a copy of that value. You can ignore the SID and LSID values.

Since all requests to private feeds require authentication, you have to set the Authorization header in all subsequent interactions with Blogger, using the following format:

Authorization: GoogleLogin auth=yourAuthToken

Where yourAuthToken is the Auth string returned by the ClientLogin request.

For more information about ClientLogin authentication, including sample requests and responses, see the Authentication for Installed Applications documentation.

Note: Use the same token for all requests in a given session; don't acquire a new token for each Blogger request.

Note: As described in the ClientLogin documentation, the authentication request may fail and request a CAPTCHA challenge. If you want Google to issue and handle the CAPTCHA challenge, then send the user to https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (rather than to the CAPTCHA-handling URL given in the ClientLogin documentation).
Specifying a version

Every request that you send using the Blogger Data API should specify version 2 of the API.

To specify a version number, use the GData-Version HTTP header:

GData-Version: 2

Alternatively, if you can't set HTTP headers, you can specify v=2 as a query parameter in the URL. But the HTTP header is preferred where possible.

Note: The client libraries supply appropriate version headers automatically, so don't use the v=2 query parameter when you're using a client library.
Retrieving a list of blogs

The Blogger Data API provides a feed that lists the blogs for a particular user; that feed is known as a "metafeed."

Send an HTTP GET to the following URL to retrieve the list of blogs:

http://www.blogger.com/feeds/profileID/blogs

Where the profile ID is the number in the URL for the user's profile page.

Note: You can also substitute default for the user ID, which tells Blogger to return the list of blogs for the user whose credentials accompany the request.

An entry in the metafeed might look like this:


tag:blogger.com,1999:user-userNumber.blog-blogID
2006-08-02T18:44:43.089-07:00
2008-04-17T00:03:33.152-07:00
Lizzy's Diary
Being the journal of Elizabeth Bennet
href='http://www.blogger.com/feeds/profileID/blogs/blogID' />
href='http://blogName.blogspot.com/' />
type='application/atom+xml'
href='http://blogName.blogspot.com/feeds/posts/default' />
type='application/atom+xml'
href='http://www.blogger.com/feeds/blogID/posts/default' />
...

Elizabeth Bennet
http://www.blogger.com/profile/profileID
noreply@blogger.com



For information about what each of those elements means, see the Google Data APIs Protocol Reference document or the Atom 1.0 specification.

If your request fails for some reason, Blogger may return a different status code. More information about HTTP status codes is also available in the Google Data APIs Protocol Reference document.
Creating posts

The Blogger Data API allows you to create and publish new blog entries, as well as creating drafts of entries.
Publishing a blog post

After authenticating, you can publish new blog entries.

First, create an XML representation of the post to publish. This XML needs to be in the form of an Atom element, which might look like this:


Marriage!


Mr. Darcy has proposed marriage to me!


He is the last man on earth I would ever desire to marry.


Whatever shall I do?








Note: Setting a custom author for posts is currently not supported. All new posts will appear as if they were created by the currently authenticated user.

To publish this entry, send it to the blog's post URL as follows. First, place your Atom element in the body of a new POST request, using the application/atom+xml content type. Then find the blog's post URL in the metafeed by locating the element where the rel attribute ends with #post. The blog's post URL is given as the href attribute of this element, which is in this format:

http://www.blogger.com/feeds/blogID/posts/default

Note: This URL is the same as the URL in the tag that appears in the section of the human-readable version of the blog.

Blogger creates a blog post using the entry you sent, then returns an HTTP 201 CREATED status code, along with a copy of the new post in the form of an element. The entry returned is the same one you sent, but it also contains various elements added by Blogger, such as an element.

If your request fails for some reason, Blogger may return a different status code. For information about the status codes, see the Google Data API protocol reference document.
Creating a draft blog post

Draft posts are created in the same way as public posts, but with an element added to the entry indicating that the post shouldn't (yet) be published.

This element should contain a single element as a child:


yes


The data contained in the element must be the string yes in order for the post to be recognized as a draft.

You can turn an existing draft blog post into a published post by retrieving the draft post, setting the element's data to the string no, and then updating the post. Retrieving and updating posts is covered in the next two sections.

Note: For more information on the Atom Publishing Protocol, including the and namespaces, see RFC 5023.
Retrieving posts

The following sections describe how to retrieve a list of blog posts, with and without query parameters.

You can query a Blogger public feed without authentication. Therefore, you don't need to set the Authorization parameter when you retrieve blog posts from a public blog.
Retrieving all blog posts

To retrieve the user's posts, send an HTTP GET request to the blog's feed URL. Blogger then returns a feed containing the appropriate blog entries. For example, to get a list of blog posts for liz@gmail.com, send the following HTTP request to Blogger (with the appropriate value in place of blogID, of course):

GET http://www.blogger.com/feeds/blogID/posts/default

Blogger then returns an HTTP 200 OK status code and a standard Atom 1.0 feed containing the blog posts.

The following is an example of a feed for a blog with only one post. Notice that we've slightly edited this example to make it a little more readable by humans. In particular, a real Blogger feed contains actual IDs and URLs.


type="text/css"?>
xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"D08FQn8-eip7ImA9WxZbFEw."'>
tag:blogger.com,1999:blog-blogID
2008-04-17T00:03:33.152-07:00
Lizzy's Diary

type='application/atom+xml'
href='http://blogName.blogspot.com/feeds/posts/default' />
href='http://www.blogger.com/feeds/blogID/posts/default' />
href='http://blogName.blogspot.com/' />

Elizabeth Bennet
http://www.blogger.com/profile/profileID
noreply@blogger.com

uri='http://www2.blogger.com'>Blogger

tag:blogger.com,1999:blog-blogID.post-postID
2008-04-07T20:25:00.005-07:00
2008-04-07T20:25:37.132-07:00
Quite disagreeable
<p>I met Mr. Bingley's friend Mr. Darcy
this evening. I found him quite disagreeable.</p>

href='http://www.blogger.com/feeds/blogID/posts/default/postID' />
href='http://www.blogger.com/feeds/blogID/posts/default/postID' />
href='http://blogName.blogspot.com/2008/04/quite-disagreeable.html' />

Elizabeth Bennet
http://www.blogger.com/profile/profileID
noreply@blogger.com




Retrieving a blog post again

If you want to retrieve a post that you've retrieved before, you can improve efficiency by telling Blogger to send the post only if it has changed since the last time you retrieved it.

To do this sort of conditional retrieval, send an HTTP GET request that includes an HTTP If-None-Match header. In the header, specify the entry's ETag, which you can find in the element's gd:etag attribute.

For example:

If-None-Match: W/"D08FQn8-eil7ImA9WxZbFEw."

When Blogger receives this request, it checks to see whether the entry that you requested has the same ETag as the ETag you specified. If the ETags match, then the entry hasn't changed, and Blogger returns an HTTP 304 Not Modified status code.

If the ETags don't match, then the entry has been modified since the last time you requested it, and Blogger returns the entry.

For more information about ETags, see the Google Data APIs reference guide.
Retrieving posts using query parameters

The Blogger Data API lets you request a set of entries that match specified criteria, such as requesting blog posts published or updated in a given date range.

For example, to send a date-range query, add the published-min and published-max parameters to the request URL. To get all the blog entries created between March 16, 2008 to March 24, 2008, send an HTTP request to the blog's feed URL:

GET http://www.blogger.com/feeds/blogID/posts/default?published-min=2008-03-16T00:00:00&published-max=2008-03-24T23:59:59

When you send that GET request, Blogger returns an HTTP 200 OK status code and a feed containing any blog posts that were created in the date range you specified.

The updated-min and updated-max parameters may also be used to get all the blog entries updated within a given range. However, note that these parameters are ignored unless the orderby parameter is also set to updated.

The Blogger Data API supports the following query parameters:

alt
The type of feed to return, such as atom (the default) or rss.
/category
Specifies categories (also known as labels) to filter the feed results. For example, http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie returns entries with both the labels Fritz and Laurie.
max-results
The maximum number of entries to return.
orderby
The order in which to return entries, such as lastmodified (the default), starttime, or updated.
published-min, published-max
The bounds on entry publication dates.
start-index
The 1-based index of the first result to be retrieved (for paging).
updated-min, updated-max
The bounds on entry update dates. These query parameters are ignored unless the orderby parameter is set to updated.

For more information about query parameters, see the Blogger Data API Reference Guide and the Google Data APIs Reference Guide.
Updating posts

To update an existing blog post, first you retrieve the entry you want to update, then you modify it, and then you send a PUT request, with the updated entry in the message body, to the post's edit URL. Be sure that the value in the entry you PUT exactly matches the of the existing entry.

The edit URL is highlighted in the following entry:


tag:blogger.com,1999:blog-blogID.post-postID
2006-11-08T18:10:00.000-08:00
2006-11-08T18:10:14.954-08:00
Quite disagreeable
<p>I met Mr. Bingley's friend Mr. Darcy
this evening. I found him quite disagreeable.</p>

href='http://blogName.blogspot.com/2006/11/quite-disagreeable.html'>

href='http://blogName.blogspot.com/feeds/posts/default/postID'>

href='http://www.blogger.com/feeds/blogID/posts/default/postID'>




Elizabeth Bennet
noreply@blogger.com
http://www.blogger.com/profile/profileID



IMPORTANT: To ensure forward compatibility, be sure that when you PUT an updated entry, you preserve all the XML that was present when you retrieved the entry from Blogger. Otherwise, when we implement new stuff and include elements in the feed, your client won't return them and your users will miss out. The Google Data API client libraries all handle this correctly, so if you're using one of the libraries you're all set.

Note: Modifying the author data associated with posts is currently not supported.

Troubleshooting Tip: Some firewalls block HTTP PUT messages. To get around this, you can include a X-HTTP-Method-Override: PUT header in a POST request. For details, see the Google Data API protocol basics document.
Deleting posts

To delete a post, send a DELETE request to the post's edit URL. This is the same URL used to update posts.

Troubleshooting Tip: Some firewalls block HTTP DELETE messages. To get around this, you can include a X-HTTP-Method-Override: DELETE header in a POST request. For details, see the Google Data API protocol basics document.
Comments

The Blogger Data API allows for creating, retrieving, and deleting comments. Updating comments is not supported (nor is it available in the web interface).
Creating comments

To post a comment, create an Atom element like the following:


This is my first comment
This is my first comment


To publish this comment, place your Atom element in the body of a new POST request, using the application/atom+xml content type. Then send the POST request to the appropriate Blogger URL:

POST http://www.blogger.com/feeds/blogID/postID/comments/default

Note: Currently, you can only post comments to a blog owned by the authenticated user.

Note: Setting a custom author for comments is currently not supported. All new comments will appear as if they were created by the currently authenticated user.
Retrieving comments

You can retrieve the comments for a particular post by sending a GET to this post's comments feed URL:

GET http://www.blogger.com/feeds/blogID/postID/comments/default

Or you can get the comments from all posts by using the blog's comments feed URL:

GET http://www.blogger.com/feeds/blogID/comments/default

These requests return a comments feed that looks like this:


type="text/css"?>
xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"CUYMQ348fyp7ImA9WB9UFkU."'>
tag:blogger.com,1999:blog-blogID.postpostID..comments
2007-12-14T17:46:22.077-08:00
Comments on Lizzy's Diary: Quite disagreeable
type='application/atom+xml'
href='http://blogName.blogspot.com/feeds/postID/comments/default' />
href='http://www.blogger.com/feeds/blogID/postID/comments/default' />
href='http://blogName.blogspot.com/2007/12/quite-disagreeable_5283.html' />

Elizabeth Bennet
http://www.blogger.com/profile/profileID
noreply@blogger.com

uri='http://www.blogger.com'>Blogger
1
1

tag:blogger.com,1999:blog-blogID.post-commentID
2007-12-14T17:46:00.001-08:00
2007-12-14T17:46:00.001-08:00
Darcy FTW!
Darcy FTW!
href='http://www.blogger.com/feeds/blogID/postID/comments/default/commentID' />
href='http://www.blogger.com/feeds/blogID/postID/comments/default/commentID' />
href='http://blogName.blogspot.com/2007/12/quite-disagreeable_5283.html?showComment=1197683160001#ccommentID'
title='' />

Elizabeth Bennet
http://www.blogger.com/profile/profileID
liz@gmail.com

href='http://blogName.blogspot.com/2007/12/quite-disagreeable_5283.html'
ref='tag:blogger.com,1999:blog-blogID.post-postID'
source='http://www.blogger.com/feeds/blogID/posts/default/postID'
type='text/html' />



Deleting comments

To delete a comment, send a DELETE request to the comment's edit URL. This URL is highlighted in the comments feed above.
Export format

Blogger allows users to export and import their blogs using a Blogger export file. This export file contains all of the posts and comments for one blog. The format for the export file is the exact same Atom format that is described in the sections on retrieving posts and comments. This export file will contain the contents of the post feed and the contents of the comments feed combined into one document.

To export or import blog data using the export format, you can visit the Settings page for the blog. To retrieve the export file for a blog using the Data API, use the following URL:

GET http://www.blogger.com/feeds/blogID/archive

To import the export file, create a POST request to the following URL with the contents of the export file as the request data and application/atom+xml as the content type:

POST http://www.blogger.com/feeds/blogID/archive/full

Neither of the URLs for above support query parameters. Both requests must also contain authentication information and only blog administrators will be able to import/export the blog using these feed URLs.

Note: If you are creating your own Blogger export file, there is currently one restriction around the ordering of the post and comment entries. The Blogger export file will list all of the posts first, and then all of the comments. Interleaving post and comment entries is allowed so long as the comment entry comes after the post the comment is for.

For more information about how Blogger uses the Atom format in the export file, see the Protocol reference guide.

Blogger API Overview

The Blogger Data API allows client applications to view and update Blogger content in the form of Google Data API feeds. Your client application can use the Data API to create new blog posts, edit or delete existing posts, and query for posts that match particular criteria.

Here are some of the things you can do with the Blogger Data API:

* Add a running list of blog posts and comments to a site.
* Create a desktop application or plugin that allows users to create and post entries from the desktop.
* Create a blog aggregator application.


How do I start?

If you're new to the Blogger Data API, here's how we recommend you get started:

1. Get familiar with the Google Data APIs.
2. Read the Blogger Data API Developer's Guide.
3. Refer to the Reference Guide as needed.

Protocol Basics

This document describes the basics of the Google Data Protocol used by many Google APIs, including examples of what a query looks like, what results look like, and so on.

For more information about the Google Data Protocol, see the Developer's Guide overview page and the Protocol Reference.
Contents

1. Audience
2. Examples
1. Requesting a feed or other resource
2. Inserting a new entry
3. Searching for a string
4. Updating an entry
5. Deleting an entry
6. Requesting partial feeds or entries (Experimental ) New!
7. Updating specific fields (Experimental ) New!
3. Additional resources

Audience

This document is intended for anyone wanting to understand the general idea of the XML format and protocol used by the Google Data APIs.

Even if you just want to write code that uses the language-specific client libraries, you might want to read this document, to understand what's going on beneath the client-library abstraction layer.

This document assumes that you understand the basics of XML, namespaces, syndicated feeds, and the GET, POST, PUT, and DELETE requests in HTTP, as well as HTTP's concept of a "resource." For more information about those things, see the Additional resources section of this document.

This document doesn't rely on any particular programming language; your client can interact with the server using any programming language that lets you issue HTTP requests and parse XML-based responses.

If you want to try the examples in this document without writing any code, you may find the command-line utilities cURL or Wget useful; for more information, see the manual pages for those utilities or the document on Using cURL to interact with services that use the Google Data Protocol.
Examples

The following examples show HTTP requests you might send to a generic service using the Google Data Protocol API protocol directly, and the results you might receive. For examples of how to send the requests using various programming languages, see the language-specific samples and client libraries. For information about using the Google Data Protocol with specific Google services, see the service-specific documentation.
Requesting a feed or other resource

Assume there's a feed called /myFeed, and assume that it currently doesn't happen to contain any entries. To see it, send the following HTTP request to the server:

GET /myFeed

The server responds:

200 OK


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'>
Foo
2006-01-23T16:25:00-08:00
http://www.example.com/myFeed

Jo March




Note that although the feed doesn't contain any entries, it does contain metadata, such as a title and an author's name. It also contains a version identifier, in the form of an HTTP ETag.
Inserting a new entry

To create a new entry, send a POST request, and supply the XML representation of the new entry:

POST /myFeed




Elizabeth Bennet
liz@gmail.com

Entry 1
This is my entry


Note that you don't supply the standard Atom , , or elements; the server creates those in response to your POST request. Also note that the author of a feed doesn't have to be the same person as the author of an entry.

The server responds:

201 CREATED


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='"CUUEQX47eCp7ImA9WxRVEkQ."'>
http://www.example.com/id/1

2006-01-23T16:26:03-08:00

Elizabeth Bennet
liz@gmail.com

Entry 1
This is my entry


Searching for a string

To do a full-text search for a particular string, when using a service that supports full-text searches, send a GET request with the q parameter. For more information about query parameters, see Query requests in the protocol reference document.

GET /myFeed?q=This

The server responds with a feed containing all the entries that match the search string This. (In this case there's only one.)

200 OK


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"S0wCTlpIIip7ImA0X0QI"'>
Foo
2006-01-23T16:26:03-08:00
http://www.example.com/myFeed

Jo March



http://www.example.com/id/1

2006-01-23T16:26:03-08:00

Elizabeth Bennet
liz@gmail.com

Entry 1
This is my entry



Updating an entry

To update an existing entry, you need to do the following steps.

1. Retrieve the entry you want to update.
2. Modify it as desired.
3. Send a PUT request, with the updated entry in the message body, to the entry's edit URI. The edit URI appears in the previous example as the href attribute of the element.

You also have to specify the original entry's ETag, to ensure that you don't overwrite anyone else's changes.

In the following example, we're changing the entry's text from its old value ("This is my entry") to a new value ("This is my first entry."):

PUT /myFeed/1/1/


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='"CUUEQX47eCp7ImA9WxRVEkQ."'>
http://www.example.com/id/1

2006-01-23T16:28:05-08:00

Elizabeth Bennet
liz@gmail.com

Entry 1
This is my first entry.


The server responds:

200 OK


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='"FkkOQgZGeip7ImA6WhVR"'>
http://www.example.com/id/1

2006-01-23T16:28:05-08:00

Elizabeth Bennet
liz@gmail.com

Entry 1
This is my first entry.


Note that the ETag has changed. For more information about versions of resources, see the Resource versioning (ETags) section of the protocol reference document.

To see the new entry in context, request the entire resource again:

GET /myFeed

The server responds:

200 OK


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"D08FQn8-eil7ImA9WxZbFEw."'>
Foo
2006-01-23T16:28:05-08:00
http://www.example.com/myFeed

Jo March



http://www.example.com/id/1

2006-01-23T16:28:05-08:00

Elizabeth Bennet
liz@gmail.com

Entry 1
This is my first entry.




Note: If your firewall does not allow PUT, then do an HTTP POST and set the method override header as follows:

X-HTTP-Method-Override: PUT

Deleting an entry

To delete an existing entry, send a DELETE request, using the entry's edit URI (as provided by the server in the previous example).

If your firewall does not allow DELETE, then do an HTTP POST and set the method override header as follows:

X-HTTP-Method-Override: DELETE

When you delete an entry, you can choose whether to do a conditional delete (only delete if the entry hasn't changed since last time you retrieved it) or an unconditional delete. For more information, see the Resource versioning (ETags) section of the protocol reference document. To do an unconditional delete, set the following HTTP header:

If-Match: *

The following example deletes an entry (if headers are set appropriately):

DELETE /myFeed/1/

The server responds:

200 OK

Do another GET to see that the feed now contains no entries:

GET /myFeed

The server responds with a feed that contains nothing but metadata:

200 OK


xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"D0cERnk-eip7ImA9WBBXGEg."'>
Foo
2006-01-23T16:30:11-08:00
http://www.example.com/myFeed

Jo March




If the deletion fails, then the server responds with an error code. For more information, see HTTP status codes in the protocol reference document.
Requesting partial feeds or entries (Experimental )

In contrast to the simple example feed shown in this document, in practice, feeds can be quite complex. With some APIs, you can ask for only the elements or attributes of interest, instead of the full resource representation. When you avoid retrieving and parsing unneeded data, you can significantly improve the efficiency of your client application.

To request a partial response, use the fields query parameter to specify which elements or attributes you want returned. For more information, see Partial response in the protocol reference document.

The following example requests only the feed ID, and the author and title for each feed entry,

GET /myFeed?fields=id,entry(author)

The server responds:

200 OK


xmlns:gd='http://schemas.google.com/g/2005'>
http://www.example.com/myFeed


Elizabeth Bennet
liz@gmail.com

Entry 1



Elizabeth Bennet
liz@gmail.com

Entry 2



You can use the fields parameter with any kind of request that returns data. In addition to GET, this includes POST, and PUT (as well as PATCH, which is used for making partial update requests).

Note: The fields query parameter only controls the data sent back in response to a request; it does not affect the data that you must provide in the body of a PUT, POST, or PATCH request.

Examples for POST and PUT are shown below.

* When you make a POST request for a partial response, you must still provide the same data as described in Inserting a new entry. The following example requests a partial response that contains only the title of the newly created entry:

POST /myFeed?fields=title

...data...

The server responds:

200 OK



Entry 1


* When you make a PUT request for a partial response, you must still provide a modified version of the full resource representation, as described in Updating an entry. The following example requests a partial response that contains only the new ETag value of the modified entry:

PUT /myFeed/1/1?fields=@gd:etag

...data...

The server responds:

200 OK


gd:etag='"FkkOQgZGeip7ImA6WhVR"'/>

Updating specific fields (Experimental )

If the API you are using supports partial response and has editable fields, you can also avoid sending unnecessary data when modifying an entry. Partial update allows you to send data only for the fields that you want to change.

To use partial update, you send a PATCH request to the same edit URI you use with PUT. The data that you send with PATCH must follow certain conventions. However, the semantics are flexible enough for you to replace data in the target resource, add to it, or even make deletions from it, all with a single request.

Note: As with PUT, you have to specify the original entry's ETag, to make sure you don't overwite anyone else's changes.

For more information on PATCH and its semantics, see Partial update in the protocol reference document.

This example shows a partial update request that modifies the entry's title:

PATCH /myfeed/1/1/

xmlns:gd='http://schemas.google.com/g/2005'
gd:etag="EksPTg1Bfyp7IWA6WhJT"
gd:fields='title'>
New Title


When the server receives a PATCH request, it first removes any fields specified by the entry's gd:fields attribute (if present); then it merges any data provided in the request body with the target resource. In this example, the title element is first removed from the target resource; then the new title value is merged. Effectively, this request replaces the old title with the new one.

Note, however, that the semantics of PATCH are to merge the partial representation into the existing resource. You don't always have to remove a field to update its value.

* If field can only exist once in the target entry then, on merging, the field in the partial representation overwrites the corresponding field in the target entry.
* If the field can exist more than once in the target entry then, on merging, the partial field is added to the target entry.

The difference between how repeating and non-repeating fields are merged is shown by the next example, which adds a new title and author to the entry without using the gd:fields attribute to remove either of them first.

PATCH /myfeed/1/1/

xmlns:gd='http://schemas.google.com/g/2005'
gd:edtag="EksPTg1Bfyp7IWA6WhJT">
A new title

Fitzwilliam Darcy
darcy@gmail.com



Since the partial entry representation has no gd:fields attribute, no fields are removed. However, the new values for the and <author> elements are merged with the target resource: <br /> <br /> * Because Atom allows only only one title per entry, the new title overwrites the existing value. <br /> * Because Atom allows multiple authors per entry, the new author is appended to the list of author elements already in the target resource. <br /> <br /> Note: Not all APIs conform to the Atom standard. For example, some APIs allow only a single <author> element per entry; others inherit the entry author from the feed level, making the field read-only. <br /> <br />After the server processes a valid PATCH request, it returns an HTTP 200 status code, along with a copy of the full representation of the updated entry. <br /> <br />If you prefer to have the server return only certain elements or attributes, you can use the fields query parameter with PATCH to request a partial response. <br />Additional resources <br /> <br />You may find the following third-party documents useful: <br /> <br /> * Overview of Atom from IBM <br /> * HTTP 1.1 method definitions; specification for GET, POST, PUT, and DELETE <br /> * HTTP 1.1 status code definitions <br /> * How to Create a REST Protocol <br /> * Building Web Services the REST Way <br /> * A Technical Introduction to XML <br /> * XML Namespaces by Example <br /> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'><span class='post-author vcard'> Pubblicato da <span class='fn'>Cicerone 80</span> </span> <span class='post-timestamp'> alle <a class='timestamp-link' href='https://creareunbloginteressante.blogspot.com/2010/07/blogger-api-overview.html' rel='bookmark' title='permanent link'><abbr class='published' title='2010-07-03T08:21:00-07:00'>08:21</abbr></a> </span> <span class='post-comment-link'> <a class='comment-link' href='https://creareunbloginteressante.blogspot.com/2010/07/blogger-api-overview.html#comment-form' onclick=''>0 commenti</a> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1621670977'> <a href='https://draft.blogger.com/post-edit.g?blogID=1943641633914725031&postID=6998128883450967531&from=pencil' title='Modifica post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons'> <a class='goog-inline-block share-button sb-email' href='https://draft.blogger.com/share-post.g?blogID=1943641633914725031&postID=6998128883450967531&target=email' target='_blank' title='Invia tramite email'><span class='share-button-link-text'>Invia tramite email</span></a><a class='goog-inline-block share-button sb-blog' href='https://draft.blogger.com/share-post.g?blogID=1943641633914725031&postID=6998128883450967531&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='Postalo sul blog'><span class='share-button-link-text'>Postalo sul blog</span></a><a class='goog-inline-block share-button sb-twitter' href='https://draft.blogger.com/share-post.g?blogID=1943641633914725031&postID=6998128883450967531&target=twitter' target='_blank' title='Condividi su X'><span class='share-button-link-text'>Condividi su X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://draft.blogger.com/share-post.g?blogID=1943641633914725031&postID=6998128883450967531&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Condividi su Facebook'><span class='share-button-link-text'>Condividi su Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://draft.blogger.com/share-post.g?blogID=1943641633914725031&postID=6998128883450967531&target=pinterest' target='_blank' title='Condividi su Pinterest'><span class='share-button-link-text'>Condividi su Pinterest</span></a> </div> </div> <div class='post-footer-line post-footer-line-2'><span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'><span class='post-location'> </span> </div> </div> </div> </div> </div></div> </div> <div class='blog-pager' id='blog-pager'> <a class='home-link' href='https://creareunbloginteressante.blogspot.com/'>Home page</a> </div> <div class='clear'></div> <div class='blog-feeds'> <div class='feed-links'> Iscriviti a: <a class='feed-link' href='https://creareunbloginteressante.blogspot.com/feeds/posts/default' target='_blank' type='application/atom+xml'>Post (Atom)</a> </div> </div> </div></div> </div> </div> <div class='column-left-outer'> <div class='column-left-inner'> <aside> </aside> </div> </div> <div class='column-right-outer'> <div class='column-right-inner'> <aside> <div class='sidebar section' id='sidebar-right-1'><div class='widget Profile' data-version='1' id='Profile1'> <h2>Informazioni personali</h2> <div class='widget-content'> <a href='https://draft.blogger.com/profile/06661543299349729157'><img alt='La mia foto' class='profile-img' height='53' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBOXKHbnPnVX9Q2ry9Hbk5W10M1tQ0lSbDSwGbSqX_FT3e8rWkApEcbbWAjvVR3dlkYGQUFl4TfP09gmyooLSv3ul-DFtRCZHjGUJF8ZgXLdsH1b3p3-9JhPvC5diZDbA/s220/DSCF9489.JPG' width='80'/></a> <dl class='profile-datablock'> <dt class='profile-data'> <a class='profile-name-link g-profile' href='https://draft.blogger.com/profile/06661543299349729157' rel='author' style='background-image: url(//draft.blogger.com/img/logo-16.png);'> Cicerone 80 </a> </dt> <dd class='profile-textblock'>L'obiettivo primario della mia vita è stato quello di conoscere e perfezionarmi. Una cosa per me difficile? Capire il senso della vita. Finora non ci sono riuscito, e però ogni giorno tento di svelarlo a me stesso. Descrivermi? Posso dare solo una descrizione banale: una persona seria, che crede nei valori della vita, e però non sa spiegarsi tante cose.</dd> </dl> <a class='profile-link' href='https://draft.blogger.com/profile/06661543299349729157' rel='author'>Visualizza il mio profilo completo</a> <div class='clear'></div> </div> </div></div> </aside> </div> </div> </div> <div style='clear: both'></div> <!-- columns --> </div> <!-- main --> </div> </div> <div class='main-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <footer> <div class='footer-outer'> <div class='footer-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left footer-fauxborder-left'> <div class='fauxborder-right footer-fauxborder-right'></div> <div class='region-inner footer-inner'> <div class='foot no-items section' id='footer-1'></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='foot no-items section' id='footer-2-1'></div> </td> <td class='columns-cell'> <div class='foot no-items section' id='footer-2-2'></div> </td> </tr> </tbody> </table> <!-- outside of the include in order to lock Attribution widget --> <div class='foot section' id='footer-3'><div class='widget Attribution' data-version='1' id='Attribution1'> <div class='widget-content' style='text-align: center;'> Tema Semplice. Powered by <a href='https://draft.blogger.com' target='_blank'>Blogger</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div class='footer-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </footer> <!-- content --> </div> </div> <div class='content-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/654365252-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AAVkm1vwM2BWedSAtZncC_WyJAIJ:1779577639410';_WidgetManager._Init('//draft.blogger.com/rearrange?blogID\x3d1943641633914725031','//creareunbloginteressante.blogspot.com/','1943641633914725031'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '1943641633914725031', 'title': 'Alla ricerca di un layout', 'url': 'https://creareunbloginteressante.blogspot.com/', 'canonicalUrl': 'http://creareunbloginteressante.blogspot.com/', 'homepageUrl': 'https://creareunbloginteressante.blogspot.com/', 'searchUrl': 'https://creareunbloginteressante.blogspot.com/search', 'canonicalHomepageUrl': 'http://creareunbloginteressante.blogspot.com/', 'blogspotFaviconUrl': 'https://creareunbloginteressante.blogspot.com/favicon.ico', 'bloggerUrl': 'https://draft.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': '', 'encoding': 'UTF-8', 'locale': 'it', 'localeUnderscoreDelimited': 'it', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Alla ricerca di un layout - Atom\x22 href\x3d\x22https://creareunbloginteressante.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Alla ricerca di un layout - RSS\x22 href\x3d\x22https://creareunbloginteressante.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Alla ricerca di un layout - Atom\x22 href\x3d\x22https://draft.blogger.com/feeds/1943641633914725031/posts/default\x22 /\x3e\n', 'meTag': '\x3clink rel\x3d\x22me\x22 href\x3d\x22https://draft.blogger.com/profile/06661543299349729157\x22 /\x3e\n', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/8d089198c5fdb3e1', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Ottieni link', 'key': 'link', 'shareMessage': 'Ottieni link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Condividi in Facebook', 'target': 'facebook'}, {'name': 'Postalo sul blog', 'key': 'blogThis', 'shareMessage': 'Postalo sul blog', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Condividi in X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Condividi in Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27it\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Continua a leggere', 'pageType': 'index', 'pageName': '', 'pageTitle': 'Alla ricerca di un layout'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Modifica', 'linkCopiedToClipboard': 'Link copiato negli appunti.', 'ok': 'OK', 'postLink': 'Link del post'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Personalizza', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true, 'variant': 'pale', 'variantId': 'pale'}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Alla ricerca di un layout', 'description': '', 'url': 'https://creareunbloginteressante.blogspot.com/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': true, 'isArchive': false, 'isLabelSearch': false}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_PageListView', new _WidgetInfo('PageList1', 'crosscol', document.getElementById('PageList1'), {'title': 'Pagine', 'links': [{'isCurrentPage': true, 'href': 'https://creareunbloginteressante.blogspot.com/', 'title': 'Home page'}], 'mobile': false, 'showPlaceholder': true, 'hasCurrentPage': true}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/4269602423-lbx__it.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/828616780-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_ProfileView', new _WidgetInfo('Profile1', 'sidebar-right-1', document.getElementById('Profile1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); </script> </body> </html>