вместо изображения креветка возвращает r / memes / hot - PullRequest
0 голосов
/ 16 июня 2020

Я хочу, чтобы мой бот discord.py отправлял мем из горячих постов r / memes через PRAW. После этой проблемы я попытался выполнить поиск в Интернете и в документации, но не нашел способа просмотреть изображение. Вот мой код:

import praw
import discord
from discord.ext import commands
from discord import client



reddit = praw.Reddit(client_id="d",
                     client_secret="d",
                     user_agent="automoderatoredj by /u/taskuratik")

#boot

print("il bot si sta avviando... ")
token = "token"
client = commands.Bot(command_prefix=("/"))

#bot online

@client.event

async def on_ready():
    print("il bot e' ora online")



@client.command()
async def meme(submission):
        if reddit:
            channel = client.get_channel(722491234991472742)
            submission = reddit.subreddit("memes").hot(limit=1)
            await channel.send(submission.url)

client.run(token)

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

В вашем коде указано:

submission = reddit.subreddit("memes").hot(limit=1)
await channel.send(submission.url)

Здесь вы назначаете список из одного сообщения для submission. Поскольку листинг является повторяющимся (что-то вроде списка), который содержит одно представление, а не само представление. В отличие от списка, вы не можете использовать индекс для доступа к определенному элементу c, но есть другие способы получить его. Один из способов подать заявку -

for submission in reddit.subreddit("memes").hot(limit=1):
    await channel.send(submission.url)

. Это позволяет вам изменить лимит и при желании отправить больше сообщений. Или вы можете использовать next(), чтобы получить следующий (и единственный) элемент из списка сообщений:

submission = next(reddit.subreddit("memes").hot(limit=1))
await channel.send(submission.url)

Это всегда будет отправлять только одно сообщение, даже если вы измените параметр limit.

0 голосов
/ 17 июня 2020

PRAW блокирует, aiohttp нет и, честно говоря, discord.py идет с aiohttp. Reddit предлагает конечную точку для возврата данных json, которые вы можете стереть с помощью метода json .loads (), чтобы получить необработанные json. Это то, что я написал для получения изображений из субреддитов

from aiohttp import ClientSession
from random import choice as c
from json import loads

async def get(session: object, url: object) -> object:
    async with session.get(url) as response:
        return await response.text()


async def reddit(sub: str):
    type = ['new', 'top', 'hot', 'rising']
    url = f"https://www.reddit.com/r/{sub}/{c(type)}.json?sort={c(type)}&limit=10"
    async with ClientSession() as session:
        data = await get(session, url)
        data = loads(data)
        data = data['data']['children']
        url = [d['data']['url'] for d in data]
        return c(url)

Все, что вам нужно сделать, это await reddit(sub= 'memes'), чтобы получить требуемый URL.

...