带有meme subreddit的Discord.js meme命令将图像返回403禁止

时间:2020-04-21 17:59:28

标签: javascript node.js https discord.js

我正在执行一个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)
            })
        })
    },


}

3 个答案:

答案 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('&amp;', '&')
                                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)
                })
            })
    }
}