Python Discord Bot - VPS 重启行为?
Python Discord Bot - VPS Reboot Behaviors?
我们和我的一个朋友一起在 python 中创建了一个简单的 discord 机器人,首先让我解释一下它是如何工作的:
我们创建了 366 个不同的用户名,一个代表一年中的每一天。每天在 0:01AM 时,机器人应该自动 post 一条消息:
- 当前日期(日、月、年)和我们与之关联的用户名
- 机器人也应该用当天的用户名重命名自己的用户名
这是我们编写的代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
from datetime import datetime
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')
client = discord.Client()
channel = client.get_channel(CHANNELID)
bissextileSpec = datetime.today().strftime('%m-%d') # To handle bissextile years
nickFile = open("nicknames.txt", "r")
nickList = nickFile.readlines()
dayNumber = datetime.now().timetuple().tm_yday
# We also made special dates
if bissextileSpec == '06-01' :
nickOfTheDay = 'SpecialNick1'
elif bissextileSpec == '07-14' :
nickOfTheDay = 'SpecialNick2'
elif bissextileSpec == '30-12' :
nickOfTheDay = 'SpecialNick3'
elif bissextileSpec == '17-06' :
nickOfTheDay = 'SpecialNick4'
elif bissextileSpec == '05-04' :
nickOfTheDay = 'SpecialNick5'
else :
nickOfTheDay = nickList[dayNumber - 1]
await channel.send('MSG CONTENT', nickOfTheDay, 'MSG CONTENT')
await client.user.edit(username=nickOfTheDay)
我们对 python 有点了解,但我们并不真正了解 discord 机器人的工作原理:
我们不太确定如何指示它在每天午夜自动post:我们想到了一个 While 循环,其末端有一个 sleep(50) 但是:
它将如何处理危险的 VPS 重启? 如果 vps 在睡眠中重启,它会重置它并转移下一个 post时间比 0:00 ?
另外一端,如果我们不使用While循环,而是使用Linux中的CRON系统,每天半夜检查并启动脚本,是不是意味着该机器人将在 Discord 上 23 点 59 分/24 离线显示并保持在线状态只是 post 消息 ? => 我们想稍后添加更多功能,因此我们需要机器人 运行 24/24
另外,如果我们在代码中做错了,请不要犹豫指出它( ͡° ͜ʖ ͡°)
您可以制作一个每 24 小时迭代一次的循环并更改机器人的昵称,您可以通过一些简单的数学运算得到直到午夜的秒数,然后在这些秒内休眠
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
"""Loops every 24 hours and changes the bots nick"""
nick = "" # Get the nick of the corresponding day
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname(guild):
"""Delays the `change_nickname` loop to start at 00:00"""
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, now.month, now.day, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)
要启动它,您需要传递一个 discord.Guild
实例(昵称应该更改的主公会)
change_nickname.start(guild) # You can start it in the `on_ready` event or some command or in the global scope, don't forget to pass the guild instance
无论机器人什么时候开始循环都会在每天 00:00
更改机器人昵称
参考:
Łukasz 的代码有一个小缺陷,future 变量初始化错误,但其他一切正常!这应该可以解决问题:
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
nick = ""
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname():
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)
我们和我的一个朋友一起在 python 中创建了一个简单的 discord 机器人,首先让我解释一下它是如何工作的:
我们创建了 366 个不同的用户名,一个代表一年中的每一天。每天在 0:01AM 时,机器人应该自动 post 一条消息:
- 当前日期(日、月、年)和我们与之关联的用户名
- 机器人也应该用当天的用户名重命名自己的用户名
这是我们编写的代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
from datetime import datetime
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')
client = discord.Client()
channel = client.get_channel(CHANNELID)
bissextileSpec = datetime.today().strftime('%m-%d') # To handle bissextile years
nickFile = open("nicknames.txt", "r")
nickList = nickFile.readlines()
dayNumber = datetime.now().timetuple().tm_yday
# We also made special dates
if bissextileSpec == '06-01' :
nickOfTheDay = 'SpecialNick1'
elif bissextileSpec == '07-14' :
nickOfTheDay = 'SpecialNick2'
elif bissextileSpec == '30-12' :
nickOfTheDay = 'SpecialNick3'
elif bissextileSpec == '17-06' :
nickOfTheDay = 'SpecialNick4'
elif bissextileSpec == '05-04' :
nickOfTheDay = 'SpecialNick5'
else :
nickOfTheDay = nickList[dayNumber - 1]
await channel.send('MSG CONTENT', nickOfTheDay, 'MSG CONTENT')
await client.user.edit(username=nickOfTheDay)
我们对 python 有点了解,但我们并不真正了解 discord 机器人的工作原理:
我们不太确定如何指示它在每天午夜自动post:我们想到了一个 While 循环,其末端有一个 sleep(50) 但是: 它将如何处理危险的 VPS 重启? 如果 vps 在睡眠中重启,它会重置它并转移下一个 post时间比 0:00 ?
另外一端,如果我们不使用While循环,而是使用Linux中的CRON系统,每天半夜检查并启动脚本,是不是意味着该机器人将在 Discord 上 23 点 59 分/24 离线显示并保持在线状态只是 post 消息 ? => 我们想稍后添加更多功能,因此我们需要机器人 运行 24/24
另外,如果我们在代码中做错了,请不要犹豫指出它( ͡° ͜ʖ ͡°)
您可以制作一个每 24 小时迭代一次的循环并更改机器人的昵称,您可以通过一些简单的数学运算得到直到午夜的秒数,然后在这些秒内休眠
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
"""Loops every 24 hours and changes the bots nick"""
nick = "" # Get the nick of the corresponding day
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname(guild):
"""Delays the `change_nickname` loop to start at 00:00"""
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, now.month, now.day, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)
要启动它,您需要传递一个 discord.Guild
实例(昵称应该更改的主公会)
change_nickname.start(guild) # You can start it in the `on_ready` event or some command or in the global scope, don't forget to pass the guild instance
无论机器人什么时候开始循环都会在每天 00:00
更改机器人昵称参考:
Łukasz 的代码有一个小缺陷,future 变量初始化错误,但其他一切正常!这应该可以解决问题:
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
nick = ""
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname():
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)