---
# System prepended metadata

title: Bots de Discord
tags: [' discord', jedai, ' bot']

---

---
title: Bots de Discord
tags: jedai, bot, discord
---
<div style="text-align: center;">
    
![](https://i.imgur.com/TP4roqZ.png)
    
</div>

# Introducció a la creació de bots a Discord [¹]

## &#x2705; Què és un bot de Discord?
Un bot és bàsicament un programa que és capaç de detectar determinats esdeveniment que es produeixen a un servidor de Discord i provocar canvis al nostre servidor.
Un exemple d'esdeveniment pot ser rebre un nou missatge i un exemple de canvi provocat pel nostre bot podria ser crear un nou missatge escrit pel nostre bot. Però podem reaccionar a molts altres tipus d'esdeveniments, per exemple:
- [X]  Un usuari s'afegeix a un servidor.
- [X]  Un usuari abandona un servidor.
- [X]  Algú del servidor actualitza el seu perfil.

En aquest [enllaç](https://discordpy.readthedocs.io/en/stable/api.html#event-reference) podeu trobar una llista dels events suportats per la llibreria ['discord.py'](https://discordpy.readthedocs.io/en/stable/), una de les més populars pel nostre llenguatge de programació favorit.

## &#x2705; Realment necessito un bot?
<div style="color: red;">
    
### :bomb: No si només vols enviar missatges automàtics que no responguin a esdeveniments del canal.

</div>

Com hem vist a dalt, els bots són capaços de reaccionar a esdeveniments que es produeixen a canals de Discord, però en moltes aplicacions, no necessitem detectar esdeveniments, només enviar missatges de forma automàtica quan succeeix un esdeveniment. És impossible d'imaginar totes les utilitats pràctiques on podem utilitzar l'enviament de missatges automàtics a una plataforma de missatgeria instantània, però se m'acudeixen per exemple les següents:

- [ ] Monitoritzar el percentatge de disk usat a un servidor i que ens avisi quan arriva a nivells crítics.
- [ ] Fer ping a diferents servidors dins d'una empresa i saber de forma inmediata quan ha caigut un servidor.
- [ ] De la mateixa forma que monitoritzem serveis, també podriem monitoritzar servidors. I podem rebre un missatge automàtic si el nostre servidor web ha caigut.
- [ ] Portar el tracking de preus d'un article a internet i assabentar-nos quan baixa un percentatge establert. És relativament fàcil mitjançant tècniques de _web scrapping_ monitoritzar un preu d'un article a una pàgina web i rebre un avís quan canviï o quan baixi d'un llindar establert.
- [ ] i 1000 coses més.

## &#x2705; Enviar missatges a un servidor des d'un programa
Per a enviar missatges a un servidor des d'un programa no cal crear-se un bot. El bot només és necessari si volem reaccionar a events, però no el necessitem si només volem enviar missatges.
L'avantatge de no utilitzar un bot és que no necessitem tenir un servidor o com a mínim un _servei_ correns totes les hores del dia.

### Requisits necessaris per a enviar un missatge a un canal
- [X] El primer requisit és crear un __web hook__ a un canal del nostre servidor (o a un servidor on tinguem permisos).
- [X] Poder enviar missatges per HTTP utilitzant el mètode POST.
- [X] Codificar el nostre missatge dins d'un JSON amb l'estructura que Discord espera trobar.

No calen ni llibreries especialitzades, ni altres components. És tan fàcil que podem utilitzar una ordre curl per a enviar missatges al nostre canal preferit.

#### :Pencil: Estructura del JSON de misstage:
```json=
{
  "username": "",
  "avatar_url": "",
  "content": "",
  "embeds": [],
  "components": []
}
```
Però en realitat només caldria omplir el camp _"content"_ per rebre un missatge al nostre canal.

### &#x1FA9D; Fem ja el nostre webhook!!!
El primer pas és entrar a la configuració del canal:
![](https://i.imgur.com/8tsvR1u.png)
A continuació anem a _'Integraciones'_:
![](https://i.imgur.com/O3zJzo9.png)
I fem click al botó _'Crear webhook'_
![](https://i.imgur.com/HjqJ3YM.png)
Un cop aquí dins editem el webhook al nostre gust i fem click a _'Copiar URL de webhook'_
I et voilà, ja podem enviar missatges al nostre canal:
```
$ curl -X POST https://discord.com/api/webhooks/aqui_el_vostre_webhook -d '{"content": "Hola Jedais"}' -H "Content-Type: application/json"
```
<div style="text-align: center; color: red;">
<b>&#x26A0; No oblideu canviar l'adreça del webhook per la vostra!!!</b>
</div>
    
![](https://i.imgur.com/gRzRI5U.png)

### &#x1F9BF; Molt bé, i això com s'automatitza amb Python
```python=
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys        # Permet capturar els paràmetres de la línia de comandes
import requests   # Enviar peticions HTTP de forma sencilla
import json       # Codificar en format JSON

"""
discord_envia_missatge.py 
Permet enviar missatges de text de Discord.
El contingut el rep per la línia de comandes com a paràmetre.
"""
ganxo = 'https://discord.com/api/webhooks/aqui_el_teu_webhook'


def main(missatge, hook):
    resultat = "[X] Alguna cosa ha anat malament! :(  "
    capcaleres = {'Content-Type': 'application/json'}
    carrega = {"content": missatge}
    resposta = requests.post(
        hook, 
        data=json.dumps(carrega), 
        headers=capcaleres
        )
    if resposta.ok:
        resultat = "Missatge enviat"
    else:
        resultat = resultat + str(resposta.status_code ) + ": " + resposta.reason
    return resultat

if __name__ == "__main__":
    print(main(sys.argv[1], ganxo))
```

    $ python3 envia_missatge_discord.py "Hola a tothom! :)"
    Missatge enviat

## &#x2705; Reaccionar a esdeveniments del servidor programant un BOT
Si no tenim prou amb l'automatització de l'enviament de missatges, llavors, hem de programar el nostre __bot__ i fer que atengui els esdeveniments que nosaltres dessitjem.

### Requisits necessaris per a usar un bot
1. El primer requisit és obtenir un __token__ que identifiqui el nostre bot.

Els tokens els haurem d'aconsseguir entrant a la [web de desenvolupadors de Discord](https://discord.com/developers/applications): 
![](https://i.imgur.com/NDCTiWw.png)
Fent click a __'New Application'__:
![](https://i.imgur.com/WJMr4ep.png)
I un cop a la finestra de crear aplicacions anem a __'Bot'__:
![](https://i.imgur.com/rbYlgho.png)
Pement el botó __'Add Bot'__, crearem el nostre bot i haurem de seleccionar els permisos que li donem.
En aquesta finestra també podem regenerar i copiar el nostre __token de bot__.
Ara només ens queda generar una URL que permeti autoritzar el nostre bot via OAuth2.
![](https://i.imgur.com/BLZRRJT.png)
I és a la [URL que apareix abaix](https://discord.com/api/oauth2/authorize?client_id=953599451895844874&permissions=274878019584&scope=bot) on podem convidar al nou bot al nostre canal.
Ara ja estem llestos per programar el nostre bot i respondre a segons quins missatges:

![](https://i.imgur.com/vErVX0X.png)

### Per fi el codi de Python que permet llegir missatges i reaccionar enviant text al canal.

```python=
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import discord
import os
import json


#client = discord.Client()
intents = discord.Intents.all()
intents.typing = False
intents.presences = False
#add other intents according to your needs
client = discord.Client(intents=intents)
 
@client.event
async def on_ready():
    print(f"Sessió iniciada amb nom d'usuari: {client.user}")
 
@client.event
async def on_message(message):
    if message.author == client.user:
        return
 
    missatge = message.content
    print (f"Missatge rebut! {missatge}")
    if missatge.startswith("jdi"):
        await message.channel.send('Que interessant!. Vull saber-ne més.')
    if 'jedai' in  missatge.lower():
        contingut = """Veig que parles de les jornades tècniques per alumne i empreses de l'institut Joan D'Austria, altrament conegudes com a JEDAIs.
        Els tallers es duran a terme durant el dimecres dia 29 de març de 2023.
        Considero que són força interessants i una forma molt didàctica de passar molt millor aquest llarg 2on trimestre, que la Setmana Santa encara queda lluny.        """
        encastats = discord.Embed(title="Si cliques aquest link aniràs a la pàgina de les JEDAI d'enguany!",
                                url="http://jedai.fpinformatica.cat/")
        await message.channel.send(contingut, embed=encastats)


client.run(os.environ['bot_token'])

```

## &#x2705; Publicar el nostre bot de manera gratuïta
A internet existeixen formes d'executar codi de forma limitada però gratuïta, per exemple:
* funcions lambda d'AWS (requereixen targeta de crèdit)
* [Heroku](https://www.heroku.com/)
* [Replit](https://replit.com/)

Nosaltres pujarem el nostre codi a Replit i tot i que el nostre repositori serà públic si no paguem, encara podem desar el nostre token a estalvi de mirades indiscretes. A la següent imatge podeu veure com he pogut desar el meu token en un compte gratuït de Replit.
![](https://i.imgur.com/KrceJZr.png)


[¹]: Realitzat per Xavi Quesada per a les jornades JEDAI de l'Institut Joan D'Austria del districte de Sant Martí de Barcelona.
