Ayuda con APIS y Discord.py

Alberteban

Buenas, estoy intentando crear un bot con Discord.py que coja y muestre datos de la web de logs de WoW llamada WarcraftLogs, la cual cuenta con su propia API. Mi código es el siguiente:

import discord
import requests


TOKEN = // Mi token
api_key = /Mi key de warcraftlogs
client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    if message.author == client.user:
        return

if message.content.startswith('!Holas'):
    msg = 'pa ti mi cola {0.author.mention}'.format(message)
    await client.send_message(message.channel, msg)

@client.event
async  def  on_message(message):
    if message.author == client.user:
        return
    if message.content.startswith('!log'):
        requests.get("https://www.warcraftlogs.com/v1/report/tables/damage-done/p2hdgxLAVnv7yfrb?api_key=" + api_key)

client.run(TOKEN)

¿Le falta algo? En principio el código rula pero al hacer !log en mi server el bot no hace nada. El tema es que tampoco estoy seguro de lo que debería hacer, ya que soy bastante nuevo en esto. Si necesitáis mas info o lo que sea me decís, que estoy bastante perdido.

MisKo

No entiendo de python pero a ver si te ayuda xD :

El comando !Holas te funciona?
Lo que veo en el !log es que hace la request para traer la info, pero nunca la muestra, solo la trae (salvo que el requests.get de python tb la muestre)

De la misma manera, los

if message.author == client.user:
        return

Que funcion tienen exactamente?, pq parece que si quien envia el mensaje es igual al cliente no hace nada (supongo que comprueba que el que envía por ejemplo !log no sea el bot) y no se si eso es justo lo que quieres

1 respuesta
Alberteban

#2 el !Holas funciona si, y puede que tengas razón con lo de que el !log solo pide info y no muestra nada, pero no sabría entonces cómo mostrarla xD.

#2MisKo:

if message.author == client.user:
return
Que funcion tienen exactamente?

Básicamente hace que el bot no se responda así mismo

1 respuesta
MisKo

#3 Pues partiendo del !Holas

if message.content.startswith('!Holas'):
    msg = 'pa ti mi cola {0.author.mention}'.format(message)
    await client.send_message(message.channel, msg)

Prueba con el client.send_message para enviar la info al discord, aunque supongo que primero tendrás que transformarla o algo, ya que por lo que veo, la API que has puesto devuelve la información en JSON, por lo que primero tendrás que darle el formato que necesites y luego enviarla con el comando anterior.

De momento, prueba a enviar el JSON íntegro que recibas y, a partir de ahí, ya lo vas dejando como te guste xD

if message.content.startswith('!log'):
        data = requests.get("https://www.warcraftlogs.com/v1/report/tables/damage-done/p2hdgxLAVnv7yfrb?api_key=" + api_key)
        await client.send_message(message.channel, data.text )
        await client.send_message(message.channel, data.json() )
1 respuesta
Alberteban

#4 He probado con

data = requests.get("https://www.warcraftlogs.com/v1/report/tables/damage-done/p2hdgxLAVnv7yfrb?api_key=" + api_key)
       jsondata = data.json()
       await client.send_message(message.channel, jsondata)

Y el bot me devuelve esto:

{'entries': [], 'totalTime': 0, 'logVersion': 8}

Cuando supongo que me debería devolver algo así

Por cierto el !Holas me ha dejado de funcionar XD.

2 respuestas
Fyn4r

Por qué has implementado on_message 2 veces?
Por qué tienes un if (si no es cosa de como has copiado el código) en medio del script?

2 respuestas
MisKo

#5 Creo que ahí ya te toca pegarte con la API la verdad xD

#6 Pues yo pienso que ha cogido algo que ya estaba hecho y se ha puesto a duplicar codigo y cambiar variables.

Supongo que si lo hace todo en el mismo

@client.event
async  def  on_message(message):

también funcionaria, pero como no entiendo de python, te lo dejo a tí xD

Alberteban

#6 Mi código es así ahora:

import discord
import requests
import json

TOKEN = MI TOKEN
api_key = MI APIKEY
client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return

if message.content.startswith('!Holas'):
    msg = 'pa ti mi cola {0.author.mention}'.format(message)
    await client.send_message(message.channel, msg)

if message.content.startswith('!log'):
   data = requests.get("https://www.warcraftlogs.com/v1/report/tables/damage-done/p2hdgxLAVnv7yfrb?api_key=" + api_key)
   jsondata = data.json()
   await client.send_message(message.channel, jsondata)


client.run(TOKEN)

A qué te refieres con los If?

2 respuestas
MisKo

#8 Los IFs no tienen que estar 'espaciados' para q estén dentro del bloque? , es decir:


@client.event
async def on_message(message):
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return

    if message.content.startswith('!Holas'):
        msg = 'pa ti mi cola {0.author.mention}'.format(message)
        await client.send_message(message.channel, msg)

    if message.content.startswith('!log'):
       data = requests.get("https://www...._key=" + api_key)
       jsondata = data.json()
       await client.send_message(message.channel, jsondata)

Por eso te ha dejado de funcionar el !Holas xD

1 respuesta
B

#5 Si te devuelve eso es porque al usar la api_key del enlace que pusiste con https://www.warcraftlogs.com/v1/report/tables/damage-done/p2hdgxLAVnv7yfrb?api_key= devuelve una lista vacía, por lo que funciona correctamente.

Lo que tendrías que verificar es si la api_key que utilizas es la correcta o si la llamada que haces es incorrecta.

Fyn4r

#8 Como dice #9 en Python los bloques se definen utilizando el indentado (creo que la palabra no existe pero bue xD). Es decir,

def f(x):
  print('f')
print('x')

La línea que imprime 'f' es parte de la función, la que imprime 'x' no. En cualquier caso entiendo que de ser así en tu código debería dar error porque entiendo que message no está definido fuera de on_message.

1 respuesta
MisKo

#11 Yo creo que indentado está bien dicho xD aunque la rae recomienda 'Sangrado' xDDDDDDDDDD

https://es.wikipedia.org/wiki/Indentaci%C3%B3n

Usuarios habituales