我有一个非常基本的 discord.py 机器人托管在heroku上。它的唯一功能是每24小时从可能的消息列表中发送一条消息。它始终发送第一条消息,然后停止。我在代码中找不到任何错误,当我降低计时并测试它在我的计算机上运行并在heroku中运行时,它工作正常。
所有这些都在一个python文件中,heroku需要几个文件,messages需要两个文本文档。
下面是主脚本:
import discord
import time
import random as rng
clnt = discord.Client()
ch = 0 #channel id
cnt = 0 #amount of minutes on timer
lp = True #i think this is just a leftover variable from another version, i can't find anywhere i used it
@clnt.event
async def on_ready():
print('ready')
async def ph(): #function to send message
global ch
global lp
qts = open('quotes.txt') #get messages
qtz = qts.read().splitlines() #put messages in a list
qts.close() #close file
#if message file is empty, get the list from a backup file and put them into the first file, reseting the messages
if not qtz:
qts2 = open('quoteslog.txt')
qtz2 = qts2.read().splitlines()
qts2.close()
with open('quotes.txt', 'w') as f:
for i in qtz2:
f.write("%s\n" % i)
f.close()
qts = open('quotes.txt')
qtz = qts.read().splitlines()
qts.close()
#get random message from list
x = rng.randint(1, len(qtz))
x2 = x - 1
y = qtz[x2]
qtz.pop(x2)
open('quotes.txt', 'w').close() #clear the list
#rewrite the same file without the message sent
with open('quotes.txt', 'w') as f:
for i in qtz:
f.write("%s\n" % i)
f.close()
#used for messages with new lines
if y == 'ph1':
await ch.send("this is for one of the messages, it has new lines so it can't be re-inserted into a txt file")
await timer()
elif y == 'ph2':
await ch.send('same here')
await timer()
else:
#send message to channel and restart the timer
await ch.send(y)
await timer()
@clnt.event
async def on_message(m):
if m.author == clnt.user:
return
global ch
if m.content.startswith('send here'):
ch = clnt.get_channel(m.channel.id)
await m.channel.send('ok')
elif m.content.startswith('start'):
await timer()
async def timer(): #loops every 60 seconds, 1440 times, or 24hrs
global lp
while lp:
global cnt
time.sleep(60)
cnt += 1
if cnt == 1440:
cnt = 0 #reset timer and send message
await ph()
clnt.run('the discord bot id')
是的,我知道代码可能是垃圾格式,但据我所知,它应该可以工作,但事实并非如此。我甚至不确定这是否是代码错误,也可能是heroku问题,但我不知道。
如果有人有任何可能有帮助的东西,将不胜感激!
我推荐你使用< code>Bot和< code>Cog类,这样效率会高得多,它们在discord.py中提供,并且有decorators来定义循环函数。它们位于模块的< code > discord . ext . commands 部分。您可以:
from discord.ext import commands, tasks
我刚刚在另一篇文章中回答了一个齿轮和循环函数的例子,你会在这里找到它。以下是适合您情况的相同结构:
# LoopCog.py
from discord.ext import commands, tasks
import random
class LoopCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.test_loop.change_interval(minutes = self.bot.cnt)
@commands.Cog.listener("on_ready")
async def on_ready(self):
self.test_loop.start()
@tasks.loop(hours=24)
async def test_loop(self):
# insert your ph function contents here
# access the channel id via self.bot.ch
def setup(bot):
bot.add_cog(LoopCog(bot))
# main.py
from discord.ext import commands
bot = commands.Bot(command_prefix = "!")
bot.ch = 0
bot.cnt = 0
bot.load_extension("LoopCog")
@bot.event
async def on_ready():
print("ready")
bot.run(token, reconnect = True)
我建议你去看一些教程。为Bot
使用Client
class不是正确的方法,如果继续使用
可在此处找到有关机器人、齿轮和任务的 API 文档
关于heroku,不幸的是,它会每24小时重启一次你的机器人,除非你选择付费的专业服务,包括24/7全天候运行。如果你的程序在30分钟内没有收到任何请求,它也会把你的程序置于睡眠模式。
我正在使用python-telegram-bot处理一个Telegram bot,我希望停止运行Telegram.job对象。 例如,我希望在hello函数处于while循环时停止运行该函数。 问题是,当我在作业开始前使用end命令时(最初10秒),它可以正常工作并停止作业,但当我在运行作业时使用end命令时,它什么也不做,因为正在运行的作业不在作业队列中。 你知道吗?如何停止正在运行的作业?
我试图做一个不和谐机器人,它创建一个类别,并为角色和用户设置权限,将用户id作为参数: 其中args是包含命令、类别名称和用户ID的字符串数组。用法应为: 我对此有一些问题,因为就像机器人看不到服务器的成员,他唯一可以添加的用户是我,如果在第一个参数中指定服务器的所有者(在我的例子中是000000)。如果我把别人的ID,机器人不会在类别中添加该用户的权限。我发现,也许机器人看不到其他用户,事实上,
问题内容: 我在Docker容器上安装了Nginx,并且正在尝试像这样运行它: 问题在于Nginx的工作方式,即初始进程会立即产生一个主要的Nginx进程和一些工作程序,然后退出。由于Docker仅监视原始命令的PID,因此容器将暂停。 如何防止容器停止?我需要能够告诉它绑定到第一个子进程,或者阻止Nginx的初始进程退出。 问题答案: 像所有行为良好的程序一样,可以配置为不自我守护。 使用htt
我有错误,我检查了这个-discord bot-userinfo命令“IndentationError:unexpected indent”,但我不知道如何修复我的代码 此行出错- 这是我所有的功能
我正在学习如何使用python创建一个discord bot,但我在使用这个命令时遇到了问题。我试图做的是踢一个特定的用户,然后使用bot将邀请发送回discord服务器。这是一个愚蠢的想法,但我真的想让它发挥作用。 我特别遇到的问题是如何踢一个特定的用户(带有用户标识),然后将该用户DM。 谢谢! 这里的代码: 这样做的目的是,如果具有适当角色类型的人一个特定的不一致用户id()被踢,机器人会自