telegram bot webapp initData() is empty on Google app script and MainButton.onClick is not working

3 min read 03-09-2024
telegram bot webapp initData() is empty on Google app script and MainButton.onClick is not working


Debugging Telegram Web App Issues: Empty initData and Non-Functional MainButton.onClick

This article delves into the common problems encountered when building Telegram web apps using Google Apps Script, specifically the empty initData and non-functional MainButton.onClick event. We'll analyze the provided code, explain the underlying issues, and offer solutions to overcome these challenges.

Understanding the Code:

The provided HTML snippet utilizes the Telegram Web App JavaScript library to create a basic web app within a Telegram chat. It aims to:

  1. Retrieve user data: Attempting to fetch user information using window.Telegram.WebApp.initData and window.Telegram.WebApp.initDataUnsafe.
  2. Implement a button: The MainButton is configured to display progress, change text, and trigger an alert on click.

The Problems and Solutions:

1. Empty initData and initDataUnsafe:

  • Cause: The initData object is empty because you are attempting to access it before the Telegram Web App is fully loaded and ready to communicate.
  • Solution: Use the ready() event to access initData only after the Telegram Web App is initialized.
window.Telegram.WebApp.ready(() => {
  // Access initData and initDataUnsafe here
  let initData = window.Telegram.WebApp.initData;
  let initDataUnsafe = window.Telegram.WebApp.initDataUnsafe;

  // Rest of your code...
});

2. Non-Functional MainButton.onClick:

  • Cause: The onClick event is likely being attached before the MainButton is fully rendered.
  • Solution: Use the ready() event to ensure the MainButton is ready to receive event listeners.
window.Telegram.WebApp.ready(() => {
  // ... your other code ...

  window.Telegram.WebApp.MainButton.onClick(() => {
    alert('submitted');
  });
});

Additional Considerations:

  • Google Apps Script Context: You are using Google Apps Script to host your Telegram web app. This means you'll need to understand how Apps Script handles HTML and JavaScript. Be sure to familiarize yourself with the limitations and capabilities of the platform.
  • Security: The initData object contains user information. When working with sensitive data, ensure proper security measures are in place to prevent unauthorized access.
  • User ID Retrieval: You can retrieve the user ID from the initData object once it's available. Here's how:
window.Telegram.WebApp.ready(() => {
  const initData = window.Telegram.WebApp.initData;
  if (initData.user) {
    const userId = initData.user.id;
    console.log("User ID:", userId);
    // Use userId for further processing
  } else {
    console.error("User information not found in initData.");
  }
});

Example Usage with Google Apps Script:

function doGet() {
  return HtmlService
    .createHtmlOutputFromFile('index.html')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

//index.html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://telegram.org/js/telegram-web-app.js"></script>
    <base target="_self" />
  </head>
  <body>
    <div class="container">
      <h1>My Telegram Web App</h1>
      <div class="row" id="tg"></div>
      <div class="row">
        <button id="btn">Submit</button>
      </div>
    </div>
    <script>
      window.Telegram.WebApp.ready(() => {
        window.Telegram.WebApp.expand();

        let initData = window.Telegram.WebApp.initData;
        let initDataUnsafe = window.Telegram.WebApp.initDataUnsafe;

        // Access user information
        if (initData.user) {
          console.log('User ID:', initData.user.id);
        }

        window.Telegram.WebApp.MainButton.showProgress();
        window.Telegram.WebApp.MainButton.setText('Submit').show().enable();

        window.Telegram.WebApp.MainButton.onClick(() => {
          alert('Submitted!');
          // Send data to your Google Apps Script endpoint
          // Example using fetch API
          fetch('/yourScriptEndpoint', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ 
              userId: initData.user.id,
              // ... other data to send ...
            })
          })
          .then(response => response.json())
          .then(data => {
            console.log('Response from server:', data);
          })
          .catch(error => {
            console.error('Error sending data:', error);
          });
        });
      });
    </script>
  </body>
</html>

Key Takeaways:

By understanding the proper timing of event handlers and ensuring the Telegram Web App is fully initialized before interacting with its API, you can successfully overcome the common issues of empty initData and non-functional MainButton.onClick events. This will pave the way for building robust and engaging Telegram web apps.