首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有meme subreddit的Discord.js meme命令返回图像为403禁止

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

Stack Overflow用户
提问于 2020-04-22 01:59:29
回答 3查看 9.6K关注 0票数 1

我做了一个meme命令,从meme子编辑中随机发送一个meme,在发现除了嵌入中的实际图像之外的所有东西都在工作后,我将图像记录到控制台,它返回了一个403错误。如果有人能帮上忙,我们将不胜感激。

代码:

代码语言:javascript
复制
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)
            })
        })
    },


}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-25 14:51:54

我已经尝试过您的代码,并且已经看到图像URL中的&被编码为Redd.it无法理解的& (示例:https://preview.redd.it/z8jsjzvkhq051.jpg?auto=webp&s=bb492d4861f48b62da806584f26bcc15f4d6663a),并返回403错误。

只需将图像URL中的&替换为&,我就可以使用它了。

代码语言:javascript
复制
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)
            })
        })
    },
}
票数 3
EN

Stack Overflow用户

发布于 2021-05-13 07:56:17

我调整了代码,使它可以与任何subreddit一起工作。所以你只需添加(前缀)表情包搞笑,它就会在前100个或更少的帖子中搜索子subreddit“搞笑”。我还添加了nsfw检查。如果你不在nsfw频道的不和谐上,那么它会检查前100个帖子中的每一个,并检查它是否是nsfw。如果是,那么它将从我推送每个帖子的数组中删除它。如果它找不到非nsfw的帖子,那么它会在聊天中告诉你。然而,如果你在nsfw聊天,那么它会从它找到的前100个帖子中随机挑选一个帖子。

附注:我找不到方法来检查subreddit是否存在,所以我只是让它检查结果是否超过1000个字符。任何存在的subreddit都应该超过1000个字符。任何不存在的字符都应该少于1000个字符。

代码语言:javascript
复制
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)
                })
            })
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-26 15:14:01

这有点难读,因为你重复了两次代码块(两个文本嵌入和img嵌入)

first [Math.floor(Math.random() * 99) + 1] => [Math.floor(Math.random() * 100)],第二个值,所以可以选择任何值,第一个值永远不能是0。

尝试此操作(在索引变量后插入代码)

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61350023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档