- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用库 python-telegram-bot 和 discord.py(版本 1.0.0)制作一个在 discord 和 telegram 之间进行通信的机器人。但是问题是 discord.py 使用异步函数和 python-telegram-bot 线程。使用下面的代码,对于在 discord 中发布的消息一切正常(机器人将它们正确发送到电报),但是反之则不起作用(机器人从电报中获取消息并将其发送到 discord)。我以前遇到语法/运行时错误问题,因为我试图在同步函数中运行 discords channel.send
函数(因此要么只返回一个生成器对象,要么提示我不能使用 await
在同步函数中)。然而,同时 python-telegram-bot 的 MessageHandler
需要一个同步函数,所以当给他一个异步函数时,Python 提示从未为异步函数调用“await”。我现在尝试使用 asgiref 库中的 async_to_sync 方法从 MessageHandler
运行我的异步 broadcastMsg
,但是代码仍然没有将消息发送到 discord!它似乎正确地调用了该函数,但仅在 print('I get to here')
行之前。不显示任何错误,也不会在不和谐中弹出任何消息。我想这与我必须将该函数注册为 discord.py 事件循环中的任务这一事实有关,但是注册仅在 botDiscord.run(TOKENDISCORD)
之前发生时才有效已经被执行,这当然必须在之前发生。所以把我的问题归结为一个问题:我如何能够与另一个线程(来自电报 MessageHandler
)的 discord.py 事件循环交互。或者,如果这不可能:如何在不在 discord.py 事件循环内的情况下使用 discord.py 发送消息?
谢谢你的帮助
import asyncio
from asgiref.sync import async_to_sync
from telegram import Message as TMessage
from telegram.ext import (Updater,Filters,MessageHandler)
from discord.ext import commands
import discord
TChannelID = 'someTelegramChannelID'
DChannel = 'someDiscordChannelObject'
#%% define functions / commands
prefix = "?"
botDiscord = commands.Bot(command_prefix=prefix)
discordChannels = {}
async def broadcastMsg(medium,channel,message):
'''
Function to broadcast a message to all linked channels.
'''
if isinstance(message,TMessage):
fromMedium = 'Telegram'
author = message.from_user.username
channel = message.chat.title
content = message.text
elif isinstance(message,discord.Message):
fromMedium = 'Discord'
author = message.author
channel = message.channel.name
content = message.content
# check where message comes from
textToSend = '%s wrote on %s %s:\n%s'%(author,fromMedium,channel,content)
# go through channels and send the message
if 'telegram' in medium:
# transform channel to telegram chatID and send
updaterTelegram.bot.send_message(channel,textToSend)
elif 'discord' in medium:
print('I get to here')
await channel.send(textToSend)
print("I do not get there")
@botDiscord.event
async def on_message(message):
await broadcastMsg('telegram',TChannelID,message)
def on_TMessage(bot,update):
# check if this chat is already known, else save it
# get channels to send to and send message
async_to_sync(broadcastMsg)('discord',DChannel,update.message)
#%% initialize telegram and discord bot and run them
messageHandler = MessageHandler(Filters.text, on_TMessage)
updaterTelegram = Updater(token = TOKENTELEGRAM, request_kwargs={'read_timeout': 10, 'connect_timeout': 10})
updaterTelegram.dispatcher.add_handler(messageHandler)
updaterTelegram.start_polling()
botDiscord.run(TOKENDISCORD)
最佳答案
How can I send a message with discord.py without being within the discord.py event loop?
要从事件循环线程外部安全地安排协程,请使用 asyncio.run_coroutine_threadsafe
:
_loop = asyncio.get_event_loop()
def on_TMessage(bot, update):
asyncio.run_coroutine_threadsafe(
broadcastMsg('discord', DChannel, update.message), _loop)
关于python-3.x - 如何从事件循环外部(即来自 python-telegram-bot 线程)使用 discord.py 发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722398/
我在网上看到有一些程序可以使用 Telegram CLI。 我想在他们之间做出选择 对于 Telegram bot API,有更多文档解释其功能,但对于 CLI,解释其特性的文档不多 似乎唯一了解的方
当我从按钮获得触发器时,我正在尝试使用 Telethon 发送 Telegram 消息。 当由 NewMessage 事件等事件触发时,我的 Telethon 方法工作正常,但是如何使用其他触发器(即
API 对象 User有房产language_code - Telegram 如何确定用户的语言,以及如何更改它? 我希望根据 language_code 为用户创建响应语言,但我不确定我是否可以信任
我有很多 Telegram channel ,他们以 24\7 的格式发送消息 “购买 usdjpy sl 145.2 tp 167.4” “eurusd 卖出 sl 145.2 tp 167.4”
我对Telegram机器人有疑问。 我需要键盘和嵌入式键盘,是否可以同时启用这两个功能? 最佳答案 根据Telegram documentation,当前不可能同时为reply_markup传递两个或
有人知道 Telegram 如何制作丰富的预览吗?了解它对我正在进行的开发非常有用。它是服务器端的特性,所以我认为代码不可用。不是吗? 最佳答案 它使用 Open Graph protocol :ht
Telegram是一种基于云的聊天服务。他们所有的客户端都是开源的。我想知道是否有办法在我自己的服务器上托管“私有(private)” Telegram 服务。 如果没有,是否有任何东西可以提供 te
为了发送常规消息,我使用 - const uri = `https://api.telegram.org/bot${token}/sendMessage?chat_id=${channelId}&
我正在尝试创建一个机器人,它可以读取/接收特定 channel 中的所有消息并将它们发送给我。我的问题是我找不到在我的机器人中访问这些消息的方法 重要的是: 我不是该 channel 的管理员或创建者
任何人都可以告诉我如何从我的 Telegram Bot 获取有关用户的信息。想象一下我的机器人是我 channel 中的管理员用户,我想获取我的 channel 用户列表或在新用户加入时引起注意。我怎
举个例子,我知道这个帐户存在“https://t.me/everexio ”,但当我单击查看时,它失败,并显示“没有包含您提供的用户名的 Telegram 帐户。”我在不同的群体中多次看到过这个问题。
我知道有一些特殊的网站,例如 Youtube、Vimeo 和...,我可以将我的视频上传到其中一个网站,并将其链接放在 Telegram 的消息中,在下面显示其大视频预览消息并通过其 InApp-Pl
我有一个机器人可以创建包含用户提供的一些 URL 的消息。Telegram 为这些 url 创建链接预览。预览已缓存。 有时 url 的内容发生变化,那么 Telegram 提供的预览就过时了。所以我
telegram 提供了一种衡量 channel 消息浏览量的方法。我很好奇是否有一种方法可以衡量特定群体每月的每月活跃用户或总独立浏览量。 最佳答案 简短回答:是。 您可以使用许多在线工具或机器人分
我如何在 Telegram 机器人上创建一个三划线菜单,类似于他们对 Jobs 机器人所做的那样?它应该与此类似: 我们如何称呼这种菜单? 最佳答案 您可以使用机器人父亲命令添加将显示在菜单上的命令。
网站telegram如何给登录用户发送消息? Telegram Login for Websites Telegram bots are a powerful communication tool,
我想连接一个简单的 Telegram Bot 来读取来自群组(我不是管理员)的消息。我已经将机器人添加到组中,但它不起作用。 这是我在 Python 中的代码: import telepot from
我想使用它的 deep linking 通过 Telegram 设置身份验证接口(interface)。 为了进行身份验证,在我的应用中,我要求用户点击如下链接: https://telegram.m
Telegram 中是否有任何事件 API 机器人 或 核心检测谁查看了用户或 channel 或群组或机器人配置文件? 一些机器人和应用程序声称他们可以做到这一点,但我没有在 Telegram AP
我正在尝试通过电报bot中的SendVoice方法发送语音消息,但是它将语音作为文档文件发送(而不是播放)。 ffmpeg将ogg文件转换为opus编码。 https://api.telegram.o
我是一名优秀的程序员,十分优秀!