我按照 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) 我有一个问题困扰了我很长时间。我将非常感谢您的帮助!
让我们想象这样一个情况:
您通过命令输入了一个函数。在这个特定的函数中,有一个循环需要很长时间才能完成,或者更糟糕的是,它实际上是一个无限循环。问题是,如何中止此循环或函数以便机器人可以处理其他请求?
一个例子是这样的:
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 def或CallbackQueryHandler(query_handle, run_async = True)类的尝试,我仍然未能产生这种效果。
我注意到有一个装饰器叫from telegram.ext.dispatcher import run_async,这有帮助吗?或者说,还有其他方法可以实现这个结果吗?
谢谢!
当我执行此操作时发生了这种情况:
updater = Updater('xyaz:testtsttttt-HI', use_context=True)
Run Code Online (Sandbox Code Playgroud)
非常感谢!
我想创建一个 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) 我希望我的 FastAPI 应用程序能够访问始终实际bot_data的python-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
我使用Telegram API使用我的机器人将消息发送给用户。当用户向我发送消息时,该操作有效,但是当我想向以前从未向我发送任何消息的用户发送消息时,就会发生错误(我有他的用户ID):
{"ok":false,"error_code":400,"description":"Error: Bad Request: user not found"}
Run Code Online (Sandbox Code Playgroud)
有解决方案吗?
我正在制作一个基本的控制面板,用于使用PHP管理Bot。
基本上,我想显示向机器人发送消息的用户的个人资料图片/头像。
但是,用户对象没有photo_id,那么有没有办法获取用户的头像?
php telegram python-telegram-bot telegram-bot php-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-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-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)
我怎样才能实现这个类,以便从数据库中获取和保存我的对话状态?