发布于 2026-01-05 3 阅读
0

使用 React 和 Next.js 开发 Telegram Web 应用

使用 React 和 Next.js 开发 Telegram Web 应用

Telegram 最近的一次更新终于将 Web 应用的全部功能集成到了 Telegram Messenger 中。这意味着从现在开始,任何开发者都可以将大型多人在线游戏、票务平台或其他任何应用嵌入到 Telegram 内置浏览器中,并使其可供 7 亿用户使用。没有任何限制,它就像一个内置于 Messenger 中的完整浏览器。

Telegram Web App API 提供用户信息、主题方案、触觉反馈(仅限移动/笔记本电脑设备)以及视频和音频流访问权限。您可以测试此机器人的所有功能,并查看哪些信息会提供给 Web 应用 -- https://t.me/asmico_attach_bot


要使用 React 和 Next.js 构建自己的 Telegram Web 应用,您需要从应用中获取信息。我想分享一些代码片段和技巧,您可以复制粘贴并用于快速入门。

首先,让我们添加数据类型,以便了解您可以访问哪些数据:

// types.ts
export interface ITelegramUser {
  id: number;
  first_name: string;
  last_name: string;
  username: string;
  language_code: string;
}

export interface IWebApp {
  initData: string;
  initDataUnsafe: {
    query_id: string;
    user: ITelegramUser;
    auth_date: string;
    hash: string;
  };
  version: string;
  platform: string;
  colorScheme: string;
  themeParams: {
    link_color: string;
    button_color: string;
    button_text_color: string;
    secondary_bg_color: string;
    hint_color: string;
    bg_color: string;
    text_color: string;
  };
  isExpanded: boolean;
  viewportHeight: number;
  viewportStableHeight: number;
  isClosingConfirmationEnabled: boolean;
  headerColor: string;
  backgroundColor: string;
  BackButton: {
    isVisible: boolean;
  };
  MainButton: {
    text: string;
    color: string;
    textColor: string;
    isVisible: boolean;
    isProgressVisible: boolean;
    isActive: boolean;
  };
  HapticFeedback: any;
}

Enter fullscreen mode Exit fullscreen mode

接下来,我们来为 Telegram Web 应用数据创建上下文提供程序和自定义钩子:

// TelegramProvider
import Script from "next/script";
import { createContext, useContext, useEffect, useMemo, useState } from "react";
import type { ITelegramUser, IWebApp } from "types";

export interface ITelegramContext {
  webApp?: IWebApp;
  user?: ITelegramUser;
}

export const TelegramContext = createContext<ITelegramContext>({});

export const TelegramProvider = ({
  children,
}: {
  children: React.ReactNode;
}) => {
  const [webApp, setWebApp] = useState<IWebApp | null>(null);

  useEffect(() => {
    const app = (window as any).Telegram?.WebApp;
    if (app) {
      app.ready();
      setWebApp(app);
    }
  }, []);

  const value = useMemo(() => {
    return webApp
      ? {
          webApp,
          unsafeData: webApp.initDataUnsafe,
          user: webApp.initDataUnsafe.user,
        }
      : {};
  }, [webApp]);

  return (
    <TelegramContext.Provider value={value}>
      {/* Make sure to include script tag with "beforeInteractive" strategy to pre-load web-app script */}
      <Script
        src="https://telegram.org/js/telegram-web-app.js"
        strategy="beforeInteractive"
      />      {children}
    </TelegramContext.Provider>
  );
};

export const useTelegram = () => useContext(TelegramContext);
Enter fullscreen mode Exit fullscreen mode

最后,让我们将其用于我们的测试 WebApp 页面:

// pages/webapp.tsx
import { TelegramProvider, useTelegram } from "lib/TelegramProvider";

const WebApp = () => {
  const { user, webApp } = useTelegram();
  console.log(user);

  return (
    <div>
      {user ? (
        <div>
          <h1>Welcome {user?.username}</h1>
          User data:
          <pre>{JSON.stringify(user, null, 2)}</pre>
          Eniter Web App data:
          <pre>{JSON.stringify(webApp, null, 2)}</pre>
        </div>
      ) : (
        <div>Make sure web app is opened from telegram client</div>
      )}
    </div>
  );
};

const WithTelegramProvider = () => {
  return (
    <TelegramProvider>
      <WebApp />
    </TelegramProvider>
  );
};
Enter fullscreen mode Exit fullscreen mode

或者通过在顶层提供 Telegram 上下文,使其在全球范围内可用。_app.tsx

// _app.tsx
import { TelegramProvider } from "lib/TelegramProvider";
import type { AppProps } from "next/app";

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <TelegramProvider>
      <Component {...pageProps} />
    </TelegramProvider>
  );
}

export default MyApp;
Enter fullscreen mode Exit fullscreen mode

就是这样!祝你编程愉快 🔥
访问 Telegram 官网了解更多关于 Telegram Web Apps 的信息:https://core.telegram.org/bots/webapps

文章来源:https://dev.to/bitofuniverse/telegram-web-app-with-react-and-nextjs-440i