首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的meme命令不起作用(discord.py)

我的meme命令不起作用(discord.py)
EN

Stack Overflow用户
提问于 2021-05-05 07:45:00
回答 1查看 407关注 0票数 0

我的Reddit meme命令不起作用。当我说&meme时,我希望我的机器人用一个模因来回复,但是它不会回复,而是给出一个运行时错误:

代码语言:javascript
复制
/usr/lib/python3.8/asyncio/events.py:81: RuntimeWarning: coroutine 'SubredditHelper.__call__' was never awaited
  self._context.run(self._callback, *self._args)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

守则是:

代码语言:javascript
复制
@client.command()
async def meme(ctx):
  reddit = asyncpraw.Reddit(client_id = "redditclientid", client_secret = "redditsecret", username = "redditusername", password = "redditpassword", user_agent = "chrome")

  subreddit = reddit.subreddit("memes")
  all_subs = []

  top = subreddit.top(limit = 50)

  for submission in top:
    all_subs.append(submission)

  random_sub = random.choice(all_subs)

  name = random_sub.title
  url = random_sub.url

  em = discord.Embed(title = name)
  em.add_field(url = url)

  await ctx.send(embed = em)

你能帮我找出错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 08:01:11

asyncpraw在某些地方需要asyncawait

文档展示了asyncfor-loop中的示例

代码语言:javascript
复制
async for submission in top:
    all_subs.append(submission)

您还需要在

代码语言:javascript
复制
subreddit = await reddit.subreddit("memes")

另一个问题是url= in add_field。它只能使用name=value=inline=。见dooc:字段

如果您想显示图像,那么您需要set_image

代码语言:javascript
复制
 em.set_image(url=url)

使用add_field,您可以使用[Some text](your url)字符串在文本中添加它作为链接

代码语言:javascript
复制
 em.add_field(name="My Field", value=f"[Click me]({url})")

最终,您可以在Embed中直接在标题中添加链接

代码语言:javascript
复制
 em = discord.Embed(title=name, url=url)

这里有三个版本的屏幕截图:set_imageadd_fieldEmbed

最低工作代码:

我不使用关于我的帐户的信息,所以我不需要usernamepassword

代码语言:javascript
复制
import os
import discord
from discord.ext import commands
import asyncpraw
import random

TOKEN = os.getenv('DISCORD_TOKEN')

REDDIT_CLIENT_ID = os.getenv('REDDIT_CLIENT_ID')
REDDIT_SECRET    = os.getenv('REDDIT_SECRET')

client = commands.Bot(command_prefix="&")

@client.event
async def on_connect():
    print("Connected as", client.user.name)

@client.event
async def on_ready():
    print("Ready as", client.user.name)

@client.command()
async def meme(ctx):

    #searching_msg = await ctx.send("Searching ...")
    
    # https://github.com/reddit-archive/reddit/wiki/API    
    # https://github.com/reddit-archive/reddit/wiki/OAuth2-Quick-Start-Example#first-steps
    # https://asyncpraw.readthedocs.io/en/latest/getting_started/configuration.html#using-an-http-or-https-proxy-with-async-praw
    
    reddit = asyncpraw.Reddit(
        client_id=REDDIT_CLIENT_ID,
        client_secret=REDDIT_SECRET,
        user_agent="linux:pl.furas.blog:v0.1 (by/furas_freeman)",
    )

    subreddit = await reddit.subreddit("memes")  # await

    top = subreddit.top(limit=50)
    
    all_subs = [item async for item in top]

    #all_subs = []
    
    #async for submission in top:   # async
    #    all_subs.append(submission)

    random_sub = random.choice(all_subs)

    name = random_sub.title
    url = random_sub.url

    #await searching_msg.delete()  # remove message `Searching ...`
    #await ctx.message.delete()    # remove user message with `&meme`
    
    # --- display as image ---
    
    em = discord.Embed(title=name)
    em.set_image(url=url)
    await ctx.send(embed=em)        

    # --- display as link in text ---

    em = discord.Embed(title=name)
    em.add_field(name="My Field", value=f"[Click me]({url})")
    await ctx.send(embed=em)        

    # --- display as link in title ---

    em = discord.Embed(title=name, url=url)
    await ctx.send(embed=em)        

    # ---
        
    await reddit.close()
    
client.run(TOKEN)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67397107

复制
相关文章

相似问题

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