Different server for Google API

This page talks about how to set up and use Google Calendar API. It talks about a Python server. I would like to know is that a must? Or could you use another web server like XAMPP or a live one? Thanks

The answer to my question is no. It is not a must. I just used Docker running XAMMP to connect and use the sample, and I pulled all calendar events!

Hi @philhagen, actually you might not even need docker, or a full XAMPP setup for that matter… as I understand it, they’re using python just for a simple static file server to serve the index.html page. So you might also use the builtin PHP dev server like so:

php -S localhost:8000

… and then open http://localhost:8000 in your browser. Or use any other dev server like e.g. this vscode plugin, which I’m using all the time for such things:

1 Like

Hey, thanks for the reply. I saw that. However, was just trying to stay consistent with the other thing my application is doing. I wanted to use the current server and have another running, simple or not. Thanks

1 Like

If anybody has an idea on how to change the page’s code I link to so it can pull all events and not just the up coming events. Please let me know. Thanks

I don’t know for sure, but in listUpcomingEvents(), they’re setting

request = {
  'calendarId': 'primary',
  'timeMin': (new Date()).toISOString(),
  // ...

So’d probably just need to set timeMin to some date in the past (or maybe omit it entirely).

Edit: Yup seems the timeMin parameter is indeed optional, so leaving it off should give you the full list of events:

Thanks! Super helpful. Funny enough, I tried to eliminate it. I did not realize that these requests also can be affected by caching. I did not see anything until I closed the window and opened a new one. When you said it was working, I realized something weird was happening.

1 Like

Also… would this be what they say should work to insert an event?

<!DOCTYPE html>
    <title>Google Calendar API Quickstart</title>
    <meta charset="utf-8" />
    <p>Google Calendar API Quickstart</p>

    <!--Add buttons to initiate auth sequence and sign out-->
    <button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
    <button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>

    <pre id="content" style="white-space: pre-wrap;"></pre>

    <script type="text/javascript">
      /* exported gapiLoaded */
      /* exported gisLoaded */
      /* exported handleAuthClick */
      /* exported handleSignoutClick */

      // TODO(developer): Set to client ID and API key from the Developer Console
      const CLIENT_ID = '<YOUR_CLIENT_ID>';
      const API_KEY = '<YOUR_API_KEY>';

      // Discovery doc URL for APIs used by the quickstart
      const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest';

      // Authorization scopes required by the API; multiple scopes can be
      // included, separated by spaces.
      const SCOPES = 'https://www.googleapis.com/auth/calendar';

      let tokenClient;
      let gapiInited = false;
      let gisInited = false;

      document.getElementById('authorize_button').style.visibility = 'hidden';
      document.getElementById('signout_button').style.visibility = 'hidden';

       * Callback after api.js is loaded.
      function gapiLoaded() {
        gapi.load('client', initializeGapiClient);

       * Callback after the API client is loaded. Loads the
       * discovery doc to initialize the API.
      async function initializeGapiClient() {
        await gapi.client.init({
          apiKey: API_KEY,
          discoveryDocs: [DISCOVERY_DOC],
        gapiInited = true;

       * Callback after Google Identity Services are loaded.
      function gisLoaded() {
        tokenClient = google.accounts.oauth2.initTokenClient({
          client_id: CLIENT_ID,
          scope: SCOPES,
          callback: '', // defined later
        gisInited = true;

       * Enables user interaction after all libraries are loaded.
      function maybeEnableButtons() {
        if (gapiInited && gisInited) {
          document.getElementById('authorize_button').style.visibility = 'visible';

       *  Sign in the user upon button click.
      function handleAuthClick() {
        tokenClient.callback = async (resp) => {
          if (resp.error !== undefined) {
            throw (resp);
          document.getElementById('signout_button').style.visibility = 'visible';
          document.getElementById('authorize_button').innerText = 'Refresh';
          await listUpcomingEvents();

        if (gapi.client.getToken() === null) {
          // Prompt the user to select a Google Account and ask for consent to share their data
          // when establishing a new session.
          tokenClient.requestAccessToken({prompt: 'consent'});
        } else {
          // Skip display of account chooser and consent dialog for an existing session.
          tokenClient.requestAccessToken({prompt: ''});

       *  Sign out the user upon button click.
	   var event = {
		  'summary': 'Google I/O 2015',
		  'location': '800 Howard St., San Francisco, CA 94103',
		  'description': 'A chance to hear more about Google\'s developer products.',
		  'start': {
			'dateTime': '2023-05-28T09:00:00-07:00',
			'timeZone': 'America/Los_Angeles'
		  'end': {
			'dateTime': '2023-05-28T17:00:00-07:00',
			'timeZone': 'America/Los_Angeles'
		  'recurrence': [
		  'attendees': [
			{'email': 'lpage@example.com'},
			{'email': 'sbrin@example.com'}
		  'reminders': {
			'useDefault': false,
			'overrides': [
			  {'method': 'email', 'minutes': 24 * 60},
			  {'method': 'popup', 'minutes': 10}

	   var request = gapi.client.calendar.events.insert({
		  'calendarId': 'primary',
		  'resource': event

	   request.execute(function(event) {
		  appendPre('Event created: ' + event.htmlLink);

    <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
    <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>

This topic was automatically closed 91 days after the last reply. New replies are no longer allowed.