discord.js 机器人在本地工作,但不在 Heroku 上

Posted

技术标签:

【中文标题】discord.js 机器人在本地工作,但不在 Heroku 上【英文标题】:discord.js bot working locally but not on Heroku 【发布时间】:2020-02-02 05:54:58 【问题描述】:

我一直在尝试在 Heroku 上运行我的 discord.js 机器人,但我无法让我的机器人加入语音频道。每当我在本地运行我的机器人时,一切正常,但是当我将它托管在 Heroku 上时,有些事情就不起作用了。

我的 bot.js 看起来像这样:

const Discord = require('discord.js');
const client = new Discord.Client();
const ffmpeg = require('ffmpeg');
const opus = require('opusscript');
const token = 'Hidden for obious reasons'
var isReady = true;

client.on('ready', () => 
    console.log(`Logged in as $client.user.tag!`);
);

client.on('message', message => 
     if (message.content === 'ping') 
       message.reply('Test message');
       client.channels.get('Our general chat').send('Test message 2')
      
);

client.on('message', message => 
    if (message.content === 'join') 
      isReady = false;
      const voiceChannel = client.channels.get('ID of our voiceChannel');
      if (!voiceChannel) 
        client.channels.get('ID of our general chat').send('Can\'t get vc');
      
      else 
        client.channels.get('ID of our general chat').send('Got here 1');
        voiceChannel.join();
        client.channels.get('ID of our general chat').send('Got here 2');
        isReady = true;
      
    
);

client.on('message', message => 
  if (message.content === 'leave') 
    isReady = false;
    const voiceChannel = client.channels.get('ID of our voiceChannel');
    voiceChannel.leave();
    isReady = true;
  
);

client.on('voiceStateUpdate', (oldMember, newMember) => 
  if (isReady && newMember.id === 'My friends ID' && oldMember.voiceChannel === undefined && newMember.voiceChannel !== undefined)
  
  isReady = false;
  var voiceChannel = client.channels.get('ID of our voiceChannel');
  voiceChannel.join().then(connection =>
  
     // Play the file
     const dispatcher = connection.playFile('./clip.mp3');
     dispatcher.on("end", end => 
       voiceChannel.leave();
       );
   ).catch(err => console.log(err));
   isReady = true;
  
);

client.login(token);

而我的 package.json 看起来像:


  "name": "mybot",
  "version": "1.0.0",
  "description": "Make It Say Dumb Thing",
  "main": "bot.js",
  "scripts": 
    "start": "node bot.js"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": 
    "discord.js": "^11.5.1",
    "ffmpeg": "0.0.4",
    "opusscript": "0.0.7"
  

我的 Procfile 只是:

worker: node bot.js

当我在我的机器上本地运行它时,一切正常。但是,当我在 Heroku 上托管它时, .join() 函数不起作用。它打印出 'Got here 1' 和 'Got here 2' 但机器人从不加入语音聊天。

【问题讨论】:

因为您说代码正在运行并且您在控制台中收到消息。那么它没有达到连接功能的唯一方法是不输入条件或它的其他部分。尝试记录条件并检查它。 【参考方案1】:

你正在使用 client.login(token);,不是client.login(process.env.token);

问题是您没有要求代码查看变量。

这也出现了,因为您可能没有正确设置 .env。

在heroku中,ENV位于

(您的应用)> 设置 > 配置变量。

如果没有设置,这也是问题。

我希望这会有所帮助。

【讨论】:

【参考方案2】:

将 ffmpeg 构建添加到 Heroku

    Heroku → [设置] → [添加构建包]

    粘贴链接

    https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git
    

    [保存更改]

有人可以作为指导: https://www.youtube.com/watch?v=f3wsxbMbi5M

【讨论】:

以上是关于discord.js 机器人在本地工作,但不在 Heroku 上的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 无法永远在服务器上使用 process.env 启动机器人,但它可以通过 Visual Studio 在我的本地驱动器上正常工作

Heroku DIScord.js Typescript - 机器人工作但构建卡在待处理

validate_email python库在本地机器上工作,但不在aws弹性bean上

当我们提到(@)机器人时,如何使 Discord.js 机器人响应本地图片?

远程 fs.readFile 的问题? (在本地工作,但不在服务器上)[关闭]

Discord.js 机器人加入然后离开