标签: python-telegram-bot

如何使用 Telegram 机器人发送文档?

我按照 youtube 上的教程学习了如何创建 Telegram Bot,目前它只能发送消息,但我什至想发送文档或音频、视频、照片等文件...现在我只是想发送一个文件,但我很困惑,我不知道该怎么做。

该机器人的源代码分为 2 个主要文件。一个responser.py:

def responses(input_text):
    user_message = str(input_text).lower()

    if user_message in ("test", "testing"):
        return "123 working..."
    

    return "The command doesn't exists. Type /help to see the command options."
Run Code Online (Sandbox Code Playgroud)

和main.py:

import constants as key
from telegram.ext import *
import responser as r

print("Hello. Cleint has just started.")

def start_command(update):
    update.message.reply_text("The Bot Has Started send you command sir.")



def help_command(update):
    update.message.reply_text("""
    Welcome to the Cleint Bot. For this purchase the following commands are available:
    send - send …
Run Code Online (Sandbox Code Playgroud)

python python-telegram-bot

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

关于 python-telegram-bot 中的异步处理的问题

我有一个问题困扰了我很长时间。我将非常感谢您的帮助!

让我们想象这样一个情况:

您通过命令输入了一个函数。在这个特定的函数中,有一个循环需要很长时间才能完成,或者更糟糕的是,它实际上是一个无限循环。问题是,如何中止此循环或函数以便机器人可以处理其他请求?

一个例子是这样的:

def function(update, context):
  counter = 0
  message = update.message.reply_text(str(counter))

  while True:
    counter += 1
    message = message.edit_text(text = str(counter))
    time.sleep(1)

dispatcher.add_handler(CommandHandler("main", function))
Run Code Online (Sandbox Code Playgroud)

用户通过“/main”进入此功能后,他或她会收到一条包含数字的消息,该数字每秒都在增加,并且将永远需要完成。

我尝试过的事情:

  • 设计另一个MessageHandler,如果用户发送一些像“stop”这样的关键字,它会改变全局变量的值。在循环中,True每次添加数字之前都会检查该变量是否为False,则中断。

    但是,在循环实际结束之前,MessageHandler 不会检测到此消息,因此这是没有意义的。

  • InlineKeyboard在消息中包含一个名为“停止”的按钮。设计另一个CallbackQueryHandler来处理这个按钮。

    同样,CallbackQueryHandler 仅在循环完成后才会收到回调。break如果我在计数器达到 5 之类的数字时设置手动,则可以验证这一点。

我在想是否可以设计某种异步运行的中止函数,但我个人对Python中的异步不是很熟悉。经过一些尝试,例如设置async defCallbackQueryHandler(query_handle, run_async = True)类的尝试,我仍然未能产生这种效果。

我注意到有一个装饰器叫from telegram.ext.dispatcher import run_async,这有帮助吗?或者说,还有其他方法可以实现这个结果吗?

谢谢!

python python-telegram-bot

5
推荐指数
1
解决办法
8221
查看次数

类型错误:Updater.__init__() 得到意外的关键字参数“use_context”

当我执行此操作时发生了这种情况:

updater = Updater('xyaz:testtsttttt-HI', use_context=True)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

python python-telegram-bot

5
推荐指数
2
解决办法
4万
查看次数

如何解决 TypeError: __init__() 缺少 1 个必需的位置参数:'update_queue'?

我想创建一个 Telegram 机器人来检查网站上是否有新帖子(目前出于测试目的每 15 秒检查一次)。如果是这样,它应该将包含帖子内容的消息发送到 Telegram 频道。

为此,我已经有了以下“代码骨架”:(格式化和添加方面的精细工作稍后进行)

import requests
import asyncio
from bs4 import BeautifulSoup
from telegram import InputMediaPhoto
from telegram.ext import Updater

# Telegram Bot API Token
API_TOKEN = 'XXXXXXXXXXXXXXXXX'

# URL of the website
URL = 'https://chemiehalle.de'

# List for storing seen posts
seen_posts = []

# Function for fetching posts
def get_posts():
    # Send request to the website
    res = requests.get(URL)
    # Parse HTML content
    soup = BeautifulSoup(res.content, 'html.parser')
    # Find all posts on the website …
Run Code Online (Sandbox Code Playgroud)

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

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

如何在同一运行事件循环中运行另一个应用程序?

我希望我的 FastAPI 应用程序能够访问始终实际bot_datapython-telegram-bot。我需要这个,所以当我调用 FastAPI 中的某个端点时,可以将消息发送到所有聊天,存储在bot_data.

据我了解这个问题:bot.run_polling()uvicorn.run(...)启动两个独立的异步循环。我需要将它们整合在一起运行。

UPD-1:
感谢@MatsLindh,我创建了下一个函数,我将其传递给块,但它的工作不一致。有时bot.run_polling()(获得正确的循环并且一切正常,但其他时候并因存在不同循环的错误而中断):

import asyncio
from uvicorn import Config, Server
# --snip--
def run(app: FastAPI, bot:Application):
    # using get_event_loop leads to:
    # RuntimeError: Cannot close a running event loop
    # I guess it is because bot.run_polling()
    # calls loop.run_until_complete() different tasks
    # loop = asyncio.get_event_loop()
    loop = asyncio.new_event_loop()
    server = Server(Config(app=app, port=9001))
    loop.create_task(server.serve())

    t = Thread(target=loop.run_forever)
    t.start()

    bot.run_polling()

    t.join() …
Run Code Online (Sandbox Code Playgroud)

python-3.x python-asyncio telegram python-telegram-bot fastapi

5
推荐指数
1
解决办法
4644
查看次数

电报API:在从该用户收到第一条消息之前,不向该用户发送消息

我使用Telegram API使用我的机器人将消息发送给用户。当用户向我发送消息时,该操作有效,但是当我想向以前从未向我发送任何消息的用户发送消息时,就会发生错误(我有他的用户ID):

{"ok":false,"error_code":400,"description":"Error: Bad Request: user not found"}
Run Code Online (Sandbox Code Playgroud)

有解决方案吗?

python-telegram-bot

4
推荐指数
1
解决办法
6273
查看次数

如何使用Telegram机器人聊天API获取某人的用户个人资料图片?

我正在制作一个基本的控制面板,用于使用PHP管理Bot。

基本上,我想显示向机器人发送消息的用户的个人资料图片/头像。

但是,用户对象没有photo_id,那么有没有办法获取用户的头像?

php telegram python-telegram-bot telegram-bot php-telegram-bot

4
推荐指数
1
解决办法
3844
查看次数

Telegram bot发起与用户的对话

我正在写一个Telegram机器人,为了简化问题,假设您可以在渠道中询问机器人问题并且它会私下回复您.当僵尸程序收到命令时,它将chat_id从用户处获取:update.message.from_user.id

但是当我这样做时,我收到一个错误:

Unauthorized: Forbidden: bot can't initiate conversation with a user
Run Code Online (Sandbox Code Playgroud)

这听起来很合乎逻辑,因为我认为这可以防止编写垃圾邮件机器人.问题是我该如何克服它?如何让用户从机器人启用私人消息?

注意:僵尸程序确实成功向我发送消息但不向其他用户发送消息.

python telegram python-telegram-bot telegram-bot

4
推荐指数
1
解决办法
3051
查看次数

如何格式化 bot 'send_message' 输出,使其像表格一样对齐?

我正在尝试使用美妙的python-telegram-bot模块创建一个简单的 Telegram Bot ,但我无法将字典与默认"{0:<20} {1}".format(key, value)想法对齐。

让我给你举个例子:

MAP = {
    "one": "1",
    "two": "2",
    "three": "3",
    "four": "4",
    "five": "5",
    "six": "6",
    "seven": "7",
    "eight": "8"
}

tmpstring = ""

for key, value in MAP.items():
    tmpstring = tmpstring + "{0:<20} {1}".format(key, value) + "\n"

print(tmpstring)
context.bot.send_message(chat_id=update.message.chat_id, text=tmpstring)
Run Code Online (Sandbox Code Playgroud)

印刷完成看起来像这样:

one                  1
two                  2
three                3
four                 4
five                 5
six                  6
seven                7
eight                8
Run Code Online (Sandbox Code Playgroud)

正如预期的那样完美对齐,但 Telegram 中的消息如下所示:

在此处输入图片说明

所以我的问题是:如何对齐聊天消息,使其看起来像打印输出?

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

4
推荐指数
1
解决办法
7052
查看次数

python-telegram-bot 的自定义持久化类

我正在使用python-telegram-bot库开发一个简单的 Telegram 聊天机器人。我的机器人目前正在使用ConversationHandler来跟踪对话状态。

我想通过将对话状态存储在 MongoDB 数据库中来使对话持久化

我正在使用mongoenginepython 库与我的数据库进行通信。

通过阅读BasePersistence( https://python-telegram-bot.readthedocs.io/en/stable/telegram.ext.basepersistence.html )的文档,我了解到有必要使用自定义类扩展此类,我们称之为MongoPersistence,并覆盖以下方法:

  • get_conversations(name)
  • update_conversation(name, key, new_state)

文档没有指定dict返回的结构get_conversations(name),因此也很难理解如何实现update_conversation(name, key, new_state)

假设我有上面提到的类(store_user_data, store_chat_data,store_bot_data都设置为False因为我不想存储这些数据):

from telegram.ext import BasePersistence


class MongoPersistence(BasePersistence):

    def __init__(self):
        super(MongoPersistence, self).__init__(store_user_data=False,
                                               store_chat_data=False,
                                               store_bot_data=False)

    def get_conversations(self, name):
        pass

    def update_conversation(self, name, key, new_state):
        pass
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个类,以便从数据库中获取和保存我的对话状态?

python mongoengine telegram python-telegram-bot

4
推荐指数
1
解决办法
909
查看次数