telegram 机器人 URL 授权

问题描述 投票:0回答:1

有tg机器人, 有机会以

webview(iframe)
打开网站, 在电报应用程序内部。当你按下机器人内部的按钮时, 它打开一个具有特定网址的网络视图。 这可以让我们了解打开的网站, 该网址已打开购买
SOME_USER
并且他的身份验证数据是正确的(至少我这么认为)。

网址示例:

https://SOME_WEBSITE/#/login?
user=USER_GUID
&tgWebAppVersion=7.2
&linkBot=https://t.me/SOME_BOT_bot
&tgWebAppData=query_id=QUERY_ID
&user={
   "id":1,
   "first_name":"FirstName",
   "last_name":"LastName",
   "username":"UserName",
   "language_code":"en",
   "allows_write_to_pm":true
}
&auth_date=1713881657
&hash=SOME_HASH
&tgWebAppVersion=7.2
&tgWebAppPlatform=weba
&tgWebAppThemeParams={"bg_color":"#ffffff", ......... , "destructive_text_color":"#e53935"}

此网址不是由机器人生成的。该机器人仅包含

https://SOME_WEBSITE/#/login
这部分位于按钮内部。但当你按下一个按钮时 电报本身将所有这些特定的身份验证数据添加到 url 参数中。 并在网络视图中打开这个网址(我在按下按钮后拦截了这个网址)。

问题“我如何自己生成这样的 URL 参数?”

我已经尝试过的:

  1. 阅读文档并发现也许我需要的东西“https://corefork.telegram.org/api/url-authorization”
  2. 尝试使用这个方法(
    Messages_RequestUrlAuth
    ,
    Messages_AcceptUrlAuth
    ) 来自“wtelegramclient”库。没有成功,可能做错了什么(收到空值)
var resolvedUser = await _client.Contacts_ResolveUsername("someBotUserName");
var msgBase = await _client.Messages_GetHistory(new InputPeerUser(resolvedUser.User.ID, resolvedUser.User.access_hash), limit: 1);

var test1 = await _client.Messages_RequestUrlAuth(url: "https://some_url");
var test2 = await _client.Messages_AcceptUrlAuth(new InputPeerUser(resolvedUser.User.ID, resolvedUser.User.access_hash), msg_id: msgBase.Messages[0].ID, url: "https://some_url");
c# telegram-api wtelegramclient mtproto
1个回答
0
投票

终于!找了好久

telegram api docs
+
gramJS lib
,找到了解决办法!

我们需要使用

Messages_RequestWebView
中的
WTelegramClinet
方法,同样的方法也存在于
gramJS
中。

//some basic theme params, perhaps it may be different per user, but it doesn't matter

var tgThemeParams = new
{
    bg_color = "#ffffff",
    text_color = "#000000",
    hint_color = "#707579",
    link_color = "#3390ec",
    //......
};

var themeParams = JsonConvert.SerializeObject(tgThemeParams);

//resolvedUser is the chat(bot) where you need to sign in

var resolvedUser = await _client.Contacts_ResolveUsername(setting.ChatName!);
var userPeer = new InputPeerUser(resolvedUser.User.ID, resolvedUser.User.access_hash);

var webViewRes = await client.Messages_RequestWebView(
    peer: userPeer,
    bot: userPeer,
    platform: "android",
    reply_to: null,
    url: "url from button / or url you need to sign in",
    theme_params: new DataJSON { data = themeParams },
    start_param: null,
    send_as: null,
    from_bot_menu: true,
    silent: false
);

结果将是

url
,并且需要所有
auth data

© www.soinside.com 2019 - 2024. All rights reserved.