【问题标题】:Telegram MTProto Java: how to get user tokenTelegram MTProto Java:如何获取用户令牌
【发布时间】:2019-12-30 20:01:45
【问题描述】:

This 表示要获取用户的令牌,我需要发送请求

auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;

某处?我读过它是一个 MTProto 请求,但我不知道如何发送它。可以用postman寄吗? teletgrambots library rubenlagus?

【问题讨论】:

    标签: java telegram telegram-bot mtproto


    【解决方案1】:

    电报协议

    MTProto 嵌入到传输协议(TCP、HTTP、...)中,所以使用 Postman 并非不可能,但我真的很难做到(所以它不是最佳选择)。 认为您的 http 调用必须实现 MTProto 2.0,因此您的 http 消息必须具有以下结构/格式:structure

    • 64 位密钥指纹
    • 128 位消息密钥
    • 加密数据

    schematic presentation of messages

    只有非常有限数量的特殊类型的消息可以作为纯文本传输。

    电报机器人

    关于 TelegramBots 是一个帮助使用 Telegram Bots Api 构建 Bot 的库。

    它支持两种技术:长轮询Webhook

    项目有很好的教程可以试试:quickstart

    另外,如果您是 Spring Boot 用户,它也有一个 Spring Boot starter (spring boot starter.

    如何实现自己的认证客户端?

    如果你想学习如何与电报api交互进行身份验证,你需要阅读这个:auth section

    之后,您可以了解如何与 Telegram 交互以进行身份​​验证...我建议您阅读真正的应用程序如何使用 Telegram API。 查看此示例实现中 Telegram Api 的所有用法(对包类的引用:org.telegram.api.requests.TLRequestAuth*):

    ActivationController impl

    如上例所示,通常电报客户端使用 TDLib。

    Telegram 基本上提供了两个 API:

    Telegram API 和 TDLib

    此 API 允许您构建自己的自定义 Telegram 客户端。它 对所有希望创建 Telegram 的开发人员 100% 开放 我们平台上的应用程序。随意学习开源代码 现有电报应用程序的示例,以了解事物的工作原理 这里。不要忘记在我们的系统中注册您的应用程序。

    机器人 API

    此 API 允许您将机器人连接到我们的系统。电报机器人是 不需要额外电话号码来设置的特殊帐户 向上。这些帐户用作在某处运行的代码的接口 你的服务器。

    如果您想创建或使用 Telegram 作为服务来发送和接收消息并与服务器交互(不需要电话号码)... Bot API 应该是您的选择。

    如果您想创建自己的定制 Telegram 应用(您的用户将需要一个电话号码来注册,就像在手机中使用 Telegram 一样)... Telegram API/TDLib 应该是您的选择。

    TDLib 是:

    一种用于第三方开发者的工具,可以轻松快速地构建, 安全且功能丰富的 Telegram 应用程序。 TDLib 负责所有网络 实现细节、加密和本地数据存储,让您 可以花更多时间设计,响应式界面美观 动画。

    TDLib 支持所有 Telegram 功能并使开发 Telegram 应用程序在任何平台上都轻而易举。它可以在安卓、iOS、 Windows、macOS、Linux 和几乎任何其他系统。图书馆是 开源,几乎与任何编程语言兼容。

    所以你不需要关心像 MTProtocol 协议、网络、加密等底层细节。你只需要在这种情况下使用 TDLib。

    我发送给您的示例类是适用于 Android 的 Telegram 应用程序 (telegram app)。它使用 TDLib。

    如果您想学习如何创建自己的 TDLib... 源代码在这里: tdlib source

    它是用 C 语言开发的,可以与 Java、.NET 等一起使用。

    基本上,它通过传输协议(http、tcp 或 udp)发送消息。例如。对于 http 使用 post 请求来提交具有上述 MTProto 格式的消息。消息用于编码。

    关于 MTProto 支持的传输如何工作的文本:supported transports

    其他参考资料:

    电报 API:Telegram APIs TDLib:TDLib


    TDLib 在 Java 中的使用示例

    Java 示例代码库:TDLib example client

    1. 第一次结帐 TDLib repo TDLib repo 正如我所说,TDLib 是用 C 语言开发的,因此您需要使用 JNI(Java Native Interface)与之交互。因此,您需要编译 TDLib(使用 cmake)。

    2. 按照示例说明 (readme.md) 在您的平台 (readme) 中构建/预构建 TDLib。

    TDLib 应预先构建以与 Java 一起使用并安装到本地 子目录td/如下:

    cd <path to TDLib sources>
    mkdir jnibuild
    cd jnibuild
    cmake -DCMAKE_BUILD_TYPE=Release -DTD_ENABLE_JNI=ON -DCMAKE_INSTALL_PREFIX:PATH=../example/java/td ..
    cmake --build . --target install
    

    如果您想在 Windows 上使用 MSVC 为 64 位 Java 编译 TDLib, 您还需要在 CMake 中添加 -A x64 选项。

    在 Windows 中,通过添加参数来使用 Vcpkg 工具链文件 -DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/vcpkg.cmake

    然后你可以构建这个例子:

    cd <path to TDLib sources>/example/java
    mkdir build
    cd build
    cmake -DCMAKE_BUILD_TYPE=Release -DTd_DIR=<full path to TDLib sources>/example/java/td/lib/cmake/Td -DCMAKE_INSTALL_PREFIX:PATH=.. ..
    cmake --build . --target install
    

    编译后的 TDLib 共享库和 Java 示例将是 放置在 bin/ 和 docs/ 中的 Javadoc 文档中。

    1. 然后就可以运行 Java 示例了
    cd <path to TDLib sources>/example/java/bin
    java '-Djava.library.path=.' org/drinkless/tdlib/example/Example
    

    如果您从 CMake 收到“Could NOT find JNI ...”错误,您需要 指定已安装 JDK 的 CMake 路径,例如, “-DJAVA_HOME=/usr/lib/jvm/java-8-oracle/”。

    如果您收到 java.lang.UnsatisfiedLinkError 并显示“找不到依赖项 库”,您可能还需要复制一些依赖共享的 OpenSSL 和 zlib 库到bin/

    如果您将示例编译为 32 位版本,您可能需要 给 Java 提供 -d32 参数。

    如果您想使用 IntelliJ 之类的 IDE 打开或在您的项目中导入此示例,请查看此票证:how to use IntelliJ with TDLib

    尝试运行示例!非常简单,它只有三个 Java 类(Example、Client 和 Log)。

    客户端:使用“本地”方法与 TDLib 交互。
    示例:使用客户端的应用程序。

    例如查看如何发送授权请求: auth request

    【讨论】:

    • 感谢您的回答。问题是,我已经读了很多。我制作了自己的投票机器人,效果很好。我已经看过那个认证页面。该页面仅列出了一些我需要用来获取用户(不是机器人!)令牌的命令,但没有提供任何示例。由于它与通过 HTTP 协议发送 GET/POST 请求不同(就像获取 bot 的 令牌时所做的那样,我很困惑如何在没有任何示例的情况下做到这一点。不幸的是,似乎没有关于Activationcontroller.java 的任何示例。
    • 您好@parsecer,ActionController.java 类不是您应该使用的 util/lib,它只是一个示例,是 TDLib 的实际用法。您需要使用 TDLib,不要尝试实现自己的低级实现。这并非不可能,但你真的需要吗?我将更新我的答案以澄清一些观点。
    • 如果您能提供一个使用 TDLib 的最简单请求的示例,我将不胜感激。我只需要一个例子,比如说,获取一个令牌(向给定的电话号码发送短信?)。
    • 嗨@parsecer 我更新了答案,其中包含指向 TDLib Java 示例的链接(查看底部)以及在 Java 项目中编译/包含 TDLib 需要做的一些事情。
    猜你喜欢
    • 2015-07-30
    • 2022-10-25
    • 2012-11-13
    • 2011-12-12
    • 2020-07-12
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多