标签: telegram-bot

用户在Telegram Bot API中单击后如何隐藏ReplyKeyboardMarkup

我正在使用Node.js telegram-bot-api.

理念:

  1. 使用一个按钮显示自定义键盘 - "分享我的电话号码".
  2. 当用户单击此按钮时,应发送联系人并从屏幕上删除按钮.

这是我正在使用的代码:

bot.sendMessage({
    text: 'Please give us your phone number',
    reply_markup: JSON.stringify({
        keyboard: [
            [{
                text: 'Share my phone number',
                request_contact: true
            }]
        ],
        resize_keyboard: true,
        one_time_keyboard: true
    })
});
Run Code Online (Sandbox Code Playgroud)

问题:

  • 当用户点击"分享我的电话号码"按钮时,它会共享他的联系人,但即使在此之后按钮也可见.
  • 当我没有使用request_contact旗帜时,one_time_keyboard工作正常(使用后隐藏按钮),但即使在这种情况下它只是隐藏按钮,因此用户可以点击图标将其带回屏幕,这根本不是好事.

如果我在这里做错了,请告诉我.谢谢

javascript node.js telegram telegram-bot

8
推荐指数
2
解决办法
1万
查看次数

电报不会逃脱某些降价字符

电报不会逃避某些降价字符,例如:

  • 这很好用

    _测试一下_

  • 但是这个返回解析错误

    *测试一下*

我做错了什么?

markdown telegram-bot

8
推荐指数
4
解决办法
6136
查看次数

如何在没有用户名的情况下提及Telegram用户?

我想提及那些没有用户名的用户.

如果用户已设置用户名,则返回

Hi @username 
Run Code Online (Sandbox Code Playgroud)

作为答案,但如果用户没有答案,我不能这样做.

我尝试使用唯一的用户ID,例如

@5642166
Run Code Online (Sandbox Code Playgroud)

但那没用.

我怎样才能做到这一点?

php telegram telegram-bot php-telegram-bot

8
推荐指数
1
解决办法
2382
查看次数

'stream.ReadTimeout'抛出了'System.InvalidOperationException'类型的异常,将照片发送到电报机器人

我写了下面的代码,用于向我的机器人发送照片,但在我的信息流中,我有两个例外的读写,我的照片没有发送.

我想也许原因是这个错误,但我无法解决它:

stream.ReadTimeout 抛出了'System.InvalidOperationException'类型的异常

using (var stream = System.IO.File.Open("a.jpg", FileMode.Open))
{
    var fileToSend = new FileToSend("a.jpg", stream);
    Task.Run(() => bot.SendPhotoAsync(u.Message.Chat.Id, fileToSend).ConfigureAwait(false));
}
Run Code Online (Sandbox Code Playgroud)

c# bots telegram telegram-bot

8
推荐指数
1
解决办法
2万
查看次数

没有默认按钮的电报授权

使用Telegram第三方授权的唯一记录方法是使用https://core.telegram.org/widgets/login提供的脚本

这个脚本(正如我所挖掘的)以非常奇怪的方式工作

  1. 它将在其中呈现“使用电报登录”按钮,并iframe带有另一个附加功能script,该按钮可加载要使用的某些电报实体(例如TWidgetLoginTSticker (?)TVideo (??)TAudio (???)和其他一些)。
  2. 通过单击按钮,这iframe将打开正在执行授权的新窗口。
  3. 授权完成后,此窗口将关闭,既然完成了,请iframe再次检查授权。如果操作正确,则iframe检索所有共享的用户信息,并取决于授权结束调用的类型,data-onauth或将请求发送到data-auth-url

对于我来说,这种行为确实无法使用,因为我们也在附近使用Google,Github和Facebook OAuths,它们都提供了正常可用的API来手动打开授权窗口并重定向到指定的url。

我的意思是,例如,这就是我们的Google授权的工作方式:

  1. 用户单击我们自己创建的按钮,该按钮经过定制以匹配我们的应用程序样式。
  2. 点击后,我们的应用程序会创建带有网址的新窗口 https://hostname/some/path/to/auth?and_some_params=here
  3. 我们的服务器将其捕获,并重定向到Google OAuth同意屏幕。
  4. 完成Google授权后,它将用户重定向到另一个 /some/path/to/completed_authorization
  5. 服务器检索所有必要的信息,然后将/some/path/to/success_authorization具有脚本的窗口重定向到window.postMessage具有授权信息的父窗口。
  6. 父窗口(应用程序窗口)捕获此消息,关闭窗口并使用给定的用户数据填充存储。

到此为止。由于打开的窗口是由应用程序打开的,因此可以在不使用该窗口时对其进行控制和关闭(例如,当打开另一个身份验证窗口或关闭应用程序选项卡时)。

电报中的“用电报登录”按钮不合适的是:

  1. 无法风格化按钮以匹配应用程序样式
  2. 不可能更改按钮的内容(在我们的情况下是必须的,因为我们的应用程序是多语言的)。
  3. 无法控制打开的窗口(即使关闭了主窗口也正在打开)

现在,我可以使用Telegram OAuth屏幕打开一个窗口

// some code above
this.popup = window.open("https://oauth.telegram.org/auth?bot_id=<my_bot_id>&origin=http%3A%2F%2F<mydevorigin>&request_access=write, "authWindow", <some window params>)
// some code below
Run Code Online (Sandbox Code Playgroud)

但是由于授权已完成,因此我无法设置任何内容让服务器知道它应该检索用户数据并使用以下命令重定向到我的页面 window.postMessage

没有其“使用电报登录”按钮,是否有任何方法可以实现电报授权?非常感谢您的帮助。

javascript oauth reactjs telegram telegram-bot

8
推荐指数
2
解决办法
166
查看次数

Telegram Bot - 根据最后一个机器人问题处理用户响应

我希望我的 Telegram 机器人根据机器人提出的最后一个问题来处理用户输入。基本上,流程是这样的:

  • 用户调用 /authenticate 命令
  • 机器人要求提供电子邮件
  • 用户发送他的电子邮件
  • 机器人会回复一条有关将代码发送到用户的电子邮件进行确认的消息,并要求用户在聊天中输入代码
  • 用户输入代码
  • 机器人验证用户代码并且用户已通过身份验证并开始接收通知

问题是:我如何知道用户正在回答此流程中的特定机器人问题?

我想了两种方法:

  • 发送带有强制回复选项的消息,以便用户必须回复机器人问题。这将向我发回用户正在响应的消息,以便我可以比较机器人消息字符串以查看答案是什么。

  • 将最后一条机器人消息存储在某处,然后当消息到达时,检查最后一条机器人消息是什么,并假设用户消息是响应。

有没有更好的办法?我正在使用 Java 和telegrambots 库

java telegram telegram-bot

8
推荐指数
1
解决办法
7956
查看次数

Telegram bot api:GIF 上传/下载大小问题

遇到问题,当我尝试将 GIF 发送到我的机器人时,但机器人无法访问图像的原始大小。似乎电报服务器将其转换为 mp4(这是个好主意,看起来不错),当我尝试下载它时 - 它总是看起来像一个最大 320 像素的缩略图

看起来,它是一个api 错误,因为例如这里:

在此处输入图片说明

它描述为 600x473px,但实际下载的 mp4 大小是:

在此处输入图片说明

所以,试图理解 - 我在这里错了,因为我的项目需要原始 gif 大小......也许这里存在任何解决方法?

附:如果手动将 gif 转换为 mp4 并保存质量和大小,然后提交给 bot - 它工作得很棒,没有任何额外的压缩等,但在使用 bot 之前要求使用它是不可接受的。

更新 :

要重现(您需要 bot/bot_token 并且还需要能够使用 json 接收 webhook):

1)通过 Windows 10 电报客户端 (v2.1.10)将此 gif ( https://c2n.me/47Y3H37.gif ) 发送到机器人。使用“无压缩发送”。Gif 大小:600x473,3.35MB

2) Bot 接收和 Telegram 发送 webhook :

{
  "update_id": 290360893,
  "message": {
    "message_id": 21,
    "from": {
      "id": 101483786,
      "is_bot": false,
      "first_name": "edited",
      "last_name": "edited", …
Run Code Online (Sandbox Code Playgroud)

telegram telegram-bot telegram-webhook telegram-api

8
推荐指数
1
解决办法
1324
查看次数

使用 Python 从 Telegram 频道获取最后一条消息

我正在使用python-telegram-bot库在 Python 中编写一个机器人,该机器人将 URL 发送到该机器人是管理员的通道中。

现在,我想让机器人读取最后 5 条消息(我并不关心数字,因为我只需要阅读聊天中的消息)并将它们存储到代码中的列表中进一步阐述。

我已经让我的机器人使用:

bot = telegram.Bot(token='mytoken')
bot.sendMessage(chat_id='@mychatid', text=entry.link)
Run Code Online (Sandbox Code Playgroud)

但我在 python-telegram-bot 库中找不到一个bot.getLastMessage或某种类。bot.getMessage

如果还没有书面类可以做到这一点,我如何通过 Telegram API 来实现它,因为我在 API 实现方面还是个初学者?

谢谢。

python telegram python-telegram-bot telegram-bot telegram-api

8
推荐指数
1
解决办法
1万
查看次数

ImportError:无法从“telegram”导入名称“ParseMode”

我正在尝试创建一个电报机器人。我试图执行的代码是:

from telegram import ParseMode
Run Code Online (Sandbox Code Playgroud)

但它抛出了这个错误:

ImportError: cannot import name 'ParseMode' from 'telegram'
(C:\ProgramData\Anaconda3\lib\site-packages\telegram\__init__.py)
Run Code Online (Sandbox Code Playgroud)

您能告诉我如何修复这个错误吗?

python python-3.x telegram python-telegram-bot telegram-bot

8
推荐指数
2
解决办法
1万
查看次数

Telegram:如何查找群聊 ID?

我已经尝试解决这个问题三天了,但我在网上找到的解决方案似乎都不起作用,所以我不得不寻求帮助。

我想创建一个 Telegram“群聊”,供我所在俱乐部的成员使用。我创建了以俱乐部首字母缩写命名的聊天,例如:“ABCD”并添加了一些成员。现在我想自动向群组发送偶尔的消息以供所有成员查看。天气预报、我们图库中的随机照片等。

我使用 @BotFather 创建了一个名为“ABCDbot”的机器人,并记下了该机器人的令牌。现在我的浏览器左侧面板上有两个“ABCD”。选择一个给我“ABCD 机器人”,选择另一个给我“ABCD 123 成员”。

使用 perl 脚本和 LWP 我可以使用发送照片

#!/usr/bin/perl -w

use feature 'say';
use LWP;
my $api = LWP::UserAgent->new ();

my $chat_id = '1234567890';
my $photo = '/home/user/gallery/photo999.jpg';

my $response = $api->post(
  "https://api.telegram.org/bot<ABCDbot's token>/sendPhoto",
  [ 'chat_id' => $chat_id,
    'caption' => 'Photo Randomly Selected by the gallery',
    'photo' => $photo,
  ],
  'Content_Type' => 'form-data',
);
if ($response->is_success) {
  say "Response..... Success!";
} else {
  say "Response..... Failure!";
}
Run Code Online (Sandbox Code Playgroud)

如果我给它一个合法的 chat_id 和一个要发送的合法文件,这是可行的。但麻烦的是:我找不到123人的群聊的chat_id!我现在尝试过的每种方法都被证明已过时,或者根本无法返回 ABCD 群聊所需的 …

telegram telegram-bot

8
推荐指数
1
解决办法
2万
查看次数