#javascript #node.js #json #fetch #discord.js
#javascript #node.js #json #извлечение #discord.js
Вопрос:
Я работаю над командой, которая будет автоматически извлекать файл по ссылке один раз в день, извлекать из него два элемента и отправлять это в виде сообщения по каналу.
Моя проблема здесь в том, что у меня возникают проблемы с фактической загрузкой файла. Я пробовал несколько разных функций для извлечения файла, но пока ничего не сработало. Я прикрепил одну из функций, которые я пробовал ниже.
async function getQuote () {
const url = "https://quotes.rest/qod?category=inspire";
const path = Path.resolve(__dirname, 'temp', 'qod.json')
const writer = fs.CreateWriteStream(path)
const response = await axios({
url,
method: 'GET',
responseType: 'stream'
})
response.data.pipe(writer)
getQuote();
return new Promise((resolve, reject) => {
writer.on('finish', resolve)
writer.on('error', reject)
})
}
fs.readFile('./temp/qod.json', 'utf8', function (err, data) {
if (err) throw err;
var obj = JSON.parse(data);
msg.channel.send(data);
})
Файл, с которым я пытаюсь работать здесь, выглядит примерно так:
{
"success": {
"total": 1
},
"contents": {
"quotes": [
{
"quote": "What you do speaks so loudly that I cannot hear what you say.",
"length": "61",
"author": "Ralph Waldo Emerson",
"tags": [
"action",
"inspire",
"leadership",
"management",
"tod"
],
"category": "inspire",
"language": "en",
"date": "2020-08-23",
"permalink": "https://theysaidso.com/quote/ralph-waldo-emerson-what-you-do-speaks-so-loudly-that-i-cannot-hear-what-you-say",
"id": "eZ0NtMPtGp8c5eQJOBfJmweF",
"background": "https://theysaidso.com/img/qod/qod-inspire.jpg",
"title": "Inspiring Quote of the day"
}
]
},
"baseurl": "https://theysaidso.com",
"copyright": {
"year": 2022,
"url": "https://theysaidso.com"
}
}
Он хочет загрузить как файл json, но при переходе по ссылке он указан как XML-документ.
Как бы я мог загрузить это и извлечь из него две строки? Если вам интересно, две строки — это строки цитаты и автора.
Спасибо!
Ответ №1:
Я копирую ваш код и запускаю свой локальный компьютер, и все в порядке.
Ограничения подобны миражам, созданным вашим собственным умом. Когда вы поймете, что ограничений не существует, окружающие вас люди также почувствуют это и позволят вам проникнуть в их пространство. — Стивен Ричардс
Ответ №2:
Похоже, вы пытаетесь записать результат в файл, а затем прочитать из файла, что неэффективно. Вот гораздо более простой способ сделать это.
async function getQuote() {
const url = "https://quotes.rest/qod?category=inspire";
const response = await axios(url);
const result = response.data;
/*
result =
{
"success": {
"total": 1
},
"contents": {
"quotes": [
{
"quote": "Limitations are like mirages created by your own mind. When you realise that limitation do not exist, those around you will also feel it and allow you inside their space. ",
"length": "171",
"author": "Stephen Richards",
"tags": [
"inspire",
"motivational",
"positive-thinking",
"self-empowerment",
"self-help",
"self-improvement",
"wealth",
"wealth-creation"
],
"category": "inspire",
"language": "en",
"date": "2020-08-24",
"permalink": "https://theysaidso.com/quote/stephen-richards-limitations-are-like-mirages-created-by-your-own-mind-when-you",
"id": "OLSVpLiSwrWplvCcFgPPiweF",
"background": "https://theysaidso.com/img/qod/qod-inspire.jpg",
"title": "Inspiring Quote of the day"
}
]
},
"baseurl": "https://theysaidso.com",
"copyright": {
"year": 2022,
"url": "https://theysaidso.com"
}
}
*/
//this is an array of quote objects
const quotes = result.contents.quotes;
//extracting first quote object from the array
const quoteObject = quotes[0];
//extracting quote text and author from quote object
const quote = quoteObject.quote;
const author = quoteObject.author;
//the >>> will make it look like a quote in discord.
console.log(`>>> ${quote}n- ${author}`);
//send the formatted quote to the channel
msg.channel.send(`>>> ${quote}n- ${author}`);
//if for some reason you want to save the result to a file
fs.writeFile(filePath, result, function(err) {
if (err) throw err;
console.log('Saved!');
});
}
getQuote();
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
Комментарии:
1. То, что я пытаюсь сделать, это извлечь автора и цитату из файла, который нужно будет загружать при каждом запуске команды. Причина этого в том, что команда используется для извлечения цитаты дня с указанного URL. К сожалению, предоставленный вами код, похоже, постоянно использует только одну цитату, что не совсем то, что я хочу. Я размещаю бота на сервере AWS, и я действительно не хочу заходить туда через удаленный рабочий стол, добавлять новое предложение и перезагружать бота только для того, чтобы иметь возможность отправлять новое ежедневное предложение.
2. Ответ от конечной точки не является жестко запрограммированным; он очень динамичный. Вы можете проверить это, запустив фрагмент кода (нажав на «Выполнить фрагмент кода») и проверив зарегистрированную цитату. Однако, если вы запустите команду несколько раз в один и тот же день, это даст вам тот же результат. На следующий день вы получите другое предложение. Что касается написания этого комментария, это цитата, которую вы получаете при запуске фрагмента кода:
I keep asking myself these three questions ... What do you have? What do you want? What will you give up? - Jack Ma
Ответ №3:
Я бы предложил просто прочитать цитату для объекта, затем создать строку с использованием интерполяции и отправить ее по каналу discord:
async function getQuote () {
const url = "https://quotes.rest/qod?category=inspire";
console.log("getQuote: Reading quote...");
// Get the response as an object
const response = await axios({
url,
method: 'GET'
})
// Use destructuring to get the quote and author
let { quote, author } = response.data.contents.quotes[0];
// Format our quote
let data = `${quote} - ${author}`;
// Add a console.log for debugging purposes..
console.log("getQuote: Sending quote:", data);
// Send the quote on the channel
msg.channel.send(data);
}
Сегодняшняя цитата тогда выглядела бы так:
Ограничения подобны миражам, созданным вашим собственным умом. Когда вы поймете, что ограничений не существует, окружающие вас люди также почувствуют это и позволят вам проникнуть в их пространство. - Стивен Ричардс
Комментарии:
1. Спасибо за совет! Я пробовал это, но это не возвращает никакого результата. Пытался запустить бота на двух разных системах с одинаковым результатом. Он обнаруживает, что команда вызвана, но не вызывает функцию. Я не получаю никаких ошибок, поэтому я не знаю, что может быть причиной этого.
2. О, отлично, спасибо, что попробовали … возможно, стоит добавить консоль. зайдите в журнал или два, чтобы увидеть, что происходит.
3. Хорошая идея, я попробую это!
4. Я попытался добавить какую-нибудь консоль. регистрируйте элементы по всему документу, но он ничего не выдает. Я также проверил все ссылки на файл, и все кажется нормальным. У вас есть какие-либо идеи, в чем здесь может быть проблема?
5. Я понял, что я сделал не так. Я создал функцию, но не вызывал ее. Не понимал этого, пока не создал консоль. элемент log вне функции. Большое спасибо за помощь, это действительно сработало!