English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE คนไทย Français русский

回答

收藏

Telegram 小程序 | GoLang init-data-golang

开源社区 开源社区 8282 人阅读 | 0 人回复 | 2025-02-28

该软件包提供用于处理 Telegram 迷你应用程序初始化数据的实用程序。 要了解 有关初始化数据及其用法的更多信息,请参阅 文档.2 h4 ?, ~; z8 r5 f
1 M) I  L; W% ^, E" y
安装
  1. go get github.com/telegram-mini-apps/init-data-golang
复制代码
验证

如果过期时间设置为 0,函数将跳过过期时间检查。 不过,建议指定一个非零值,因为这一检查对于防止 使用被盗的旧初始化数据非常重要。

  1. package main8 }) C, s3 P% k* o& {' t$ `

  2. , H4 r  y4 B9 o! G, J0 T
  3. import (
    - R/ B! _8 E: l+ o
  4.         "fmt". R. d# }' U" g1 U% A8 x. J
  5.         "github.com/Telegram-Mini-Apps/init-data-golang"
    . F! y8 c6 ]3 s6 A8 q5 ]& b# I
  6.         "time"
    6 \: h" ]% L+ m
  7. )
    8 O% a/ y1 f' j6 q( `4 G  H  Z9 m

  8. # v$ H6 a& N" ^3 q
  9. func main() {
    0 @" A1 u8 n9 n. R$ z
  10.         // Init data in raw format.8 [/ W, m; ]+ b' ^# n  j
  11.         initData := "query_id=AAHdF6IQAAAAAN0XohDhrOrc&..."
    6 P# r, T( w7 ]  `: O( S2 }
  12. 3 X" K0 C, q; w% n
  13.         // Telegram Bot secret key.
    7 v4 F( {5 y4 X% I9 F" o. i9 I5 r
  14.         token := "627618978:amnnncjocxKJf"
    . b0 J7 O0 }, L( [- h

  15. % R0 @" A! X$ Y& M
  16.         // Define how long since init data generation date init data is valid.
    1 a; ]6 e/ o" z; t
  17.         expIn := 24 * time.Hour. X/ }- a) v; S7 Y  m

  18.   l! t. [; b, ?* G) g' ~7 A! U+ W( h8 E
  19.         // Will return error in case, init data is invalid. To see,
    : B/ X# J2 t: N1 }
  20.         // which error could be returned, see errors.go file.' @0 Q. z+ Y3 Q$ n" K- A1 ?2 ?, T
  21.         fmt.Println(initdata.Validate(initData, token, expIn))
    1 R. c3 r9 x% {! u
  22. }
复制代码
解析

需要注意的是,Parse 函数不会执行与 Validate 函数相同的检查。 因此,该函数只对输入数据进行解析,而不对 哈希值或过期时间进行验证。

  1. package main
    " z( X* `/ i/ y4 ]$ L) \1 X

  2. 0 e; Q0 a, N# s6 T
  3. import (
    ( M: n; T. A- T4 ~: U
  4.     "fmt"! t# C$ ~/ s- _: Y
  5.     "github.com/Telegram-Mini-Apps/init-data-golang"1 \- D& K, x# T" k' W  V1 c
  6. )
    7 \: j$ ^/ I4 Z$ W% ?2 Q# ?

  7. 7 d# P( l8 F# U7 M  ?
  8. func main() {( K# q( E" ~  D9 K, F! e4 O  S0 l$ r
  9.         // Init data in raw format.
    / W# c3 b1 I/ D( t5 N2 n
  10.         initData := "query_id=AAHdF6IQAAAAAN0XohDhrOrc&..."
    ) o9 c" z" |" S5 b5 w2 b
  11.         0 B$ d/ `, `+ z2 M9 u
  12.         // Will return 2 values.
    8 r' S( y; d2 u7 I& q! Z7 D: h" e
  13.         // 1. Pointer to InitData in case, passed data has correct format.
    ; e/ P5 |# R5 T: ~4 c
  14.         // 2. Error in case, something is wrong.
    2 z0 Q( q2 Q$ I" U3 w
  15.         fmt.Println(initdata.Parse(initData))
    7 }3 G% w( T2 f( \- _$ Q
  16. }
复制代码
签名

签署数据的函数会删除hash和auth_date等参数,因为假定 ,hash将由函数返回,auth_date将由函数 本身设置。

  1. package main, x  l4 I  X+ ^& Z

  2. : u. Y5 x1 X0 c- z) l  |
  3. import (6 M2 `( ~* e6 }1 G5 z
  4.         "fmt"3 s7 t4 Y: R8 v  l% c
  5.         "github.com/Telegram-Mini-Apps/init-data-golang"
    ' Y  E! G3 T3 s% H: C) m3 w' _' w- E
  6.         "time"
    * w. G% `- v- g+ v7 r  p! v9 y
  7. )
    : S  b* A! ?3 F' l
  8.   W* A# F# W: h$ G$ o' E
  9. func main() {5 X# W. O: _8 ?  C7 b/ Y3 X
  10.         // Init data in raw format.
    ; M% ^7 p+ e- l( ?/ C1 s: M- {& l
  11.         initData := "query_id=AAHdF6IQAAAAAN0XohDhrOrc&..."
    4 M3 M% R  Z0 B5 y' u

  12. + V/ e: d! E# }9 M0 Y
  13.         // Telegram Bot secret key.
    # i9 b8 u+ c3 v; f
  14.         token := "627618978:amnnncjocxKJf"8 ^4 _+ V6 x) X

  15. ) ^9 B' F3 y& J* x
  16.         // Signing timestamp.( i# c9 V! C6 l# h
  17.         authDate := time.Now()
    + e# ~' e. J, I$ d, H/ j2 a3 U6 o1 c5 e
  18. # P7 q- u$ `7 _: r3 M
  19.         // The first value is parameters sign result ("hash" init data property).* K4 S  U4 z/ q0 e0 C% O. z
  20.         // The second one is error which could occur while parsing query string as4 q) u- p* L8 I2 B% E: @8 x5 q
  21.         // query parameters.: T, ?! P0 G0 U, T: i! c/ a
  22.         fmt.Println(initdata.SignQueryString(initData, token, authDate))
    2 P+ I, L4 C4 H3 p% F/ G1 X
  23.         // or2 ?7 T( L5 z4 R% I
  24.         fmt.Println(initdata.Sign(map[string]string{
    & |7 i9 D1 _1 a% U
  25.                 "query_id": "AAHdF6IQAAAAAN0XohDhrOrc",
    & {- X6 K. x: s# Q, \
  26.                 // ...3 L6 k0 F7 l. H& x: u
  27.         }, token, authDate))8 k2 }, P! i) A" s. ?1 a% C
  28. }
复制代码
GoDoc

要查看 GoDoc 文档,请访问 此链接

- }& [  l% W1 Y' E9 R4 r
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则