#javascript #node.js #twitter #discord #discord.js
#javascript #node.js #Twitter #Discord #discord.js
Вопрос:
Я пытаюсь добавить функцию ретвита в мой discord bot, чтобы он мог показывать сообщение, которое пользователь ретвитнул. Я пытался сделать что-то подобное, но когда я запускаю свой код, он по-прежнему публикует только новые твиты. Кто-нибудь может помочь в устранении неполадок?
Позвольте мне попытаться упростить сценарий, потому что я думаю, что может быть сложно сказать, чего я на самом деле хочу достичь.
- Представьте, что я пользователь Twitter с именем @hojitea (просто пример). Я следую за пользователем в Twitter по имени @readDonaldTrump.
- Я бы хотел, чтобы мой discord-бот делал не только новый твит, который опубликовал @realDonaldTrump, но и ретвиты, которые он сделал.
- Итак, нравится это изображение (я хочу получить этот ретвит в моем боте discord):
- Обратите внимание, что на изображении указано «Дональд Трамп ретвитнул», и я хочу, чтобы мой discord-бот также отображал, а не какой-либо другой пользователь. Это недостижимо на основе моего текущего кода.
Прямо сейчас это выглядит так (фрагмент всего исходного кода):
// 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:
Согласно документации Twitter (эта ссылка предназначена для GET statuses/show/:id
, но все объекты Tweet в любом случае имеют одинаковый формат), current_user_retweet
предоставляется только в том случае, если аутентифицирующий пользователь ( @hojitea
) ретвитнул твит. Поскольку объект Tweet предоставляется непосредственно после публикации твита, практически невозможно, чтобы пользователь, проверяющий подлинность, уже ретвитнул твит.
Вы должны удалить tweet.retweeted_status
из большого if
заявления, если хотите анализировать ретвиты. Также будут показаны все ретвиты твитов этого человека, поэтому, чтобы отфильтровать твиты других пользователей, просто проверьте, равен ли идентификатор пользователя, на которого вы подписаны, идентификатору пользователя в объекте tweet ( tweet.user.id
) . Вы бы хотели поместить это перед обработкой любых твитов, поэтому вы бы поместили это прямо перед вышеупомянутым if
заявлением.
Чтобы проверить, является ли твит ретвитом, используйте tweet.retweeted_status
вместо него оператор if . Это значение всегда указывается для ретвитов, но всегда равно нулю для не ретвитов.
// ...
if (tweet.retweeted_status) { // true if the tweet was a retweet.
const twitterRetweetMessage = `**${tweet.user.name} ...`
// ...
PS: Если бы я был немного придирчивым, сообщение должно быть `A new Tweet has been retweeted by @${tweet.user.screen_name}!`
вместо этого, поскольку ретвитирующий пользователь технически не публиковал твит.
Комментарии:
1. Так это будет выглядеть примерно так ? Не возражаете, если вы поможете мне проверить?