我正在执行一个meme命令,该命令从meme subreddit发送一个随机的meme,发现所有内容(嵌入中的实际图像除外)后,我将图像记录到控制台,并返回了403
错误。如果有人能够提供帮助,将不胜感激。
代码:
const https = require('https');
const Discord = require('discord.js');
const url = 'https://www.reddit.com/r/meme/hot/.json?limit=100'
module.exports = {
name: 'meme',
description: 'sends meme',
execute(message, args) {
https.get(url, (result) => {
var body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
var response = JSON.parse(body)
var index = response.data.children[Math.floor(Math.random() * 99) + 1].data
if (index.post_hint !== 'image') {
var text = index.selftext
const textembed = new Discord.MessageEmbed()
.setTitle(subRedditName)
.setColor(9384170)
.setDescription(`[${title}](${link})\n\n${text}`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(textembed)
}
var image = index.preview.images[0].source.url
var title = index.title
var link = 'https://reddit.com' + index.permalink
var subRedditName = index.subreddit_name_prefixed
if (index.post_hint !== 'image') {
const textembed = new Discord.RichEmbed()
.setTitle(subRedditName)
.setColor(9384170)
.setDescription(`[${title}](${link})\n\n${text}`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(textembed)
}
console.log(image);
const imageembed = new Discord.MessageEmbed()
.setTitle(subRedditName)
.setImage(image)
.setColor(9384170)
.setDescription(`[${title}](${link})`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(imageembed)
}).on('error', function (e) {
console.log('Got an error: ', e)
})
})
},
}
答案 0 :(得分:1)
我尝试了您的代码,发现图像URL中的&
编码为Redd。&
(例如:https://preview.redd.it/z8jsjzvkhq051.jpg?auto=webp&s=bb492d4861f48b62da806584f26bcc15f4d6663a
),它无法理解并返回403错误。
只需将图像网址中的&
替换为&
,它对我有用。
const https = require('https');
const Discord = require('discord.js');
const url = 'https://www.reddit.com/r/meme/hot/.json?limit=100'
module.exports = {
name: 'meme',
description: 'sends meme',
execute(message, args) {
https.get(url, (result) => {
var body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
var response = JSON.parse(body)
var index = response.data.children[Math.floor(Math.random() * 99) + 1].data
if (index.post_hint !== 'image') {
var text = index.selftext
const textembed = new Discord.MessageEmbed()
.setTitle(subRedditName)
.setColor(9384170)
.setDescription(`[${title}](${link})\n\n${text}`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(textembed)
}
var image = index.preview.images[0].source.url.replace('&', '&')
var title = index.title
var link = 'https://reddit.com' + index.permalink
var subRedditName = index.subreddit_name_prefixed
if (index.post_hint !== 'image') {
const textembed = new Discord.RichEmbed()
.setTitle(subRedditName)
.setColor(9384170)
.setDescription(`[${title}](${link})\n\n${text}`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(textembed)
}
console.log(image);
const imageembed = new Discord.MessageEmbed()
.setTitle(subRedditName)
.setImage(image)
.setColor(9384170)
.setDescription(`[${title}](${link})`)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(imageembed)
}).on('error', function (e) {
console.log('Got an error: ', e)
})
})
},
}
答案 1 :(得分:0)
这有点难以读,因为您重复了两次代码块(两个文本嵌入和img嵌入)
第一个[Math.floor(Math.random() * 99) + 1]
=> [Math.floor(Math.random() * 100)]
第二个使得它可以选择任何值,第一个永远不能为0。
尝试一下(在索引变量后插入代码)
const isImage = index.post_hint === "image";
const subRedditName = index.subreddit_name_prefixed;
const title = index.title;
const link = 'https://reddit.com' + index.permalink;
const text = !isImage && index.selfText;
const desc = `[${title}](${link})`;
const embed = new Discord.MessageEmbed()
.setTitle(subRedditName)
.setColor(9384170)
.setDescription(desc + (text ? `\n\n${text}` : ""))
.setURL(`https://reddit.com/${subRedditName}`);
if (isImage) {
const img = index.preview.images[0].source.url;
embed.setImage(img);
}
messsage.channel.send(embed);
答案 2 :(得分:0)
我调整了代码以使其适用于任何 subreddit。所以你只会做(前缀)模因有趣,它会搜索前 100 个或更少的帖子以查找 subreddit“有趣”。我还添加了 nsfw 检查。如果您不在 discord 上的 nsfw 频道中,那么它将浏览前 100 个帖子中的每一个,并检查它是否是 nsfw。如果是,那么它将从我将每个帖子推入的数组中删除它。如果它找不到非 nsfw 帖子,那么它会在聊天中告诉您。但是,如果您在 nsfw 聊天中,它只会从它找到的前 100 个帖子中随机选择一个帖子。
旁注:我找不到检查 subreddit 是否存在的方法,所以我只是检查结果是否超过 1000 个字符。任何存在的 subreddit 应该超过 1000 个字符。任何不存在的字符都应少于 1000 个。
const prefix = '.'
const args = message.content.substring(1).split(" ")
if (message.content.startsWith(prefix){
if (args[0] == 'meme'){
if (args[1] != null){
var url = `https://www.reddit.com/r/${args[1]}/hot/.json?limit=100`
} else {
var url = `https://www.reddit.com/r/meme/hot/.json?limit=100`
}
https.get(url, (result) => {
var body = ''
var chunked = false
result.on('data', (chunk) => {
body += chunk
if (chunked == false){
chunked = true
}
})
result.on('end', () => {
if (body.length > 1000){
var response = JSON.parse(body)
var postChildren = []
if (message.channel.nsfw == false){
var postsNumber = 0
for (var number = 0; number < response.data.children.length; number++){
postChildren.push(number)
}
for (var found = false; found == false; postsNumber ++){
if (postChildren.length > 0){
var index1 = Math.floor(Math.random() * (postChildren.length))
var index2 = postChildren[index1]
if (response.data.children[index2].data.over_18 == true){
postChildren.splice(index1, 1)
} else {
var index = response.data.children[index2].data
var found = true
}
} else {
var found = true
}
}
} else {
var index = response.data.children[Math.floor(Math.random() * (response.data.children.length-1)) + 1].data
}
if (postChildren.length > 0 || message.channel.nsfw){
var title = index.title
var link = 'https://reddit.com' + index.permalink
var subRedditName = index.subreddit_name_prefixed
if (index.post_hint !== 'image') {
var text = index.selftext
if (title.length > 256) {
title = (title.substring(0, 253) + "...")
}
if (text.length > 2048) {
text = (text.substring(0, 2045) + "...")
}
const textembed = new Discord.MessageEmbed()
.setTitle(title)
.setColor('#ff0000')
.setDescription(text)
.setURL(`https://reddit.com/${subRedditName}`)
message.channel.send(textembed)
}
if (index.post_hint == 'image'){
var image = index.preview.images[0].source.url.replace('&', '&')
if (title.length > 256) {
title = (title.substring(0, 253) + "...")
}
const imageembed = new Discord.MessageEmbed()
.setTitle(title)
.setImage(image)
.setColor('#ff0000')
.setURL(link)
message.channel.send(imageembed)
}
} else {
message.channel.send('Could not find a meme that was not nsfw')
}
} else {
message.channel.send('Could not find subreddit!')
}
}).on('error', function (e) {
console.log('Got an error: ', e)
})
})
}
}