如何在Discord bot中显示用户自己对其他人的推文的转发?

时间:2020-10-18 07:31:45

标签: javascript node.js twitter discord discord.js

我正在尝试向我的不和谐机器人添加转推功能,以便它可以显示用户转推的帖子。我试图做这样的事情,但是当我运行代码时,它仍然只发布新的推文。谁能帮助解决问题?

让我尝试简化场景提示,我想说我实际上想要实现的目标可能有点困难。

  • 想象一下,如果我是一个名为@hojitea的Twitter用户(仅举一个例子)。我在Twitter中关注着一个名为@readDonaldTrump的用户。
  • 我希望我的不和谐机器人要做的是,不仅要获取@realDonaldTrump已发布的新推文,还应该获取他所做的转发。
  • 像这样的图片(我想在我的不和谐机器人中得到这个转推):
  • 请注意,在图像中,它注明了“ Donald J. Trump转推了”,这是我希望我的不和谐机器人也可以显示的,而不是其他用户。根据我当前的代码,这是无法实现的。

现在,它是这样的(完整的源代码片段):

// setting up necessary libraries
require('dotenv').config();
const Discord = require('discord.js');
const bot = new Discord.Client();
bot.commands = new Discord.Collection();
const botCommands = require('./commands');
const Twitter = require('twit')

//Set up discord and twitter token blah blah blah...

const twitterClient = new Twitter(twitterConf);

// create a stream to follow tweets
const stream = twitterClient.stream('statuses/filter', {
    follow: '25073877', //donaldtrump twt id
});

const dest = '765217504305872896' //streaming twts to #twitter channel

// TWITTER MAIN PROCESS
// stream directly to that channel
stream.on('tweet', tweet => {
    if (tweet.retweeted_status  //to prevent other user tweets and only get specifically from the user
        || tweet.in_reply_to_status_id_str 
        || tweet.in_reply_to_user_id
        || tweet.in_reply_to_user_id_str
        || tweet.in_reply_to_screen_name) return true;
      
    if (tweet.current_user_retweet) { //to show the retweeted message by the user
        const twitterRetweetMessage = `**${tweet.user.name} (@${tweet.user.screen_name}) new retweet!**\n https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`
        bot.channels.cache.get(dest).send(twitterRetweetMessage);
        console.log(`A new retweet has been posted by @${tweet.user.screen_name}!`)
        return false;
    }
    const twitterMessage = `**${tweet.user.name} (@${tweet.user.screen_name}) new tweet!**\n https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`
    bot.channels.cache.get(dest).send(twitterMessage);
    console.log(`A new tweet has been posted by @${tweet.user.screen_name}!`)
    return false;
});

// acknowledge bot has connected
bot.on('ready', () => {
    console.log(`Logged in as ${bot.user.tag}!`);
});

免责声明:无论如何,我不是美国公民。所使用的用户名仅是示例,而不是美国的选举宣传。

1 个答案:

答案 0 :(得分:0)

根据Twitter documentation(此链接用于GET statuses/show/:id,但所有Tweet对象仍然遵循相同的格式),只有在进行身份验证的用户({{1} })转推了该推文。由于Tweet对象是在发布Tweet之后直接提供的,因此验证用户几乎已经转发了Tweet几乎是不可能的。

如果要解析转发,则必须从大current_user_retweet语句中删除@hojitea。这还会显示该人的推文的所有转发,因此要过滤其他用户的推文,只需检查您订阅的用户的ID是否等于该推文对象中的用户ID({{1} })。您希望将其放在处理任何推文之前,因此将其放在上述tweet.retweeted_status语句之前。

要检查Tweet是否为Retweet,请使用if作为if语句。始终为转推提供此值,但对于非转推始终提供空值。

tweet.user.id

P.S .:如果我有点挑剔,那么该消息应该改为if,因为转发用户在技术上没有发布该推文。