Articles

Construir un Bot Reddit Parte 1

Construir una serie de Bot Reddit

Parte 1: Leer publicaciones de reddit

Parte 2: Responder a publicaciones

Parte 3: Automatiza nuestro Bot

Parte 4: Marvin el Bot Deprimido

Introducción

Así que vamos a construir un Bot Reddit simple que hará dos cosas:

  1. Supervisará un subreddit en particular para buscar nuevas publicaciones, y cuando alguien publique «I love Python», responderá «¡Yo también!».
  2. También monitoreará todos los comentarios de publicaciones recientes, y si encuentra uno que diga «Odio Python», publicará un enlace a /r/learnpython y le pedirá al comentarista que haga una pregunta allí.

Conocimiento previo

Solo se requiere un conocimiento básico de Python, ya que construir bots es bastante fácil.

Parte 1

En la primera parte, veremos cómo podemos leer datos de Reddit utilizando la API de Reddit. El código fuente está disponible en Github:

Editar: Basado en el comentario del lector Farid:

Reddit ha actualizado su sitio web a un nuevo aspecto. Si te encuentras con un enlace de arriba que no funciona, entonces tendrás que cambiar la url.

Aquí hay un ejemplo:
Arriba tenemos el enlace http://www.reddit.com/dev/api
Sin embargo, dice no encontrado. Si cambiamos el enlace a http://old.reddit.com/dev/api, entonces el enlace debería funcionar.

En resumen, si un enlace de reddit no funciona, cambie el » www » a «antiguo», para que el enlace se vea como «old.reddit.com»

Bot de software

Un bot de software es un programa que puede interactuar con sitios web de forma autónoma. Pueden ser tan simples o complejas como quieras que sean.

El bot se ejecuta en segundo plano y supervisa un sitio web. Cuando ve un cambio (como una publicación en Reddit), puede responder a él, votar a favor o hacer cualquier otra tarea para la que esté programado.

Monitoreo de sitios web

Hay muchas maneras de controlar sus sitios web. Puede usar herramientas de extracción de datos web como urllib o Beautifulsoup cualquier cosa similar. Sin embargo, hay un pequeño problema con esto. Los bots pueden hacer miles de solicitudes por segundo, y esto puede sobrecargar los servidores. Así que la mayoría de los grandes sitios web prohíben los bots. Ignore esto bajo su propio riesgo. He sido prohibido de Google durante horas, tenía mi Gmail bloqueado hasta que ingresé una docena de captachas, mi móvil y el nombre de mi primer gato.

Si quieres hacer esto correctamente, sigue las reglas que tenga el sitio web.

Reddit API

Reddit proporciona una API y, a diferencia de algunos sitios web, en realidad es bastante fácil de usar. Se basa en REST y json, por lo que en teoría no requiere ninguna configuración sofisticada.

http://www.reddit.com/dev/api

lo importante es seguir las reglas que establezca. Dos de los más importantes son:

  • No puede hacer más de 1 solicitud cada 2 segundos (o 30 por minuto)
  • No debe mentir sobre su agente de usuario

Lea el resto aquí.

El agente de usuario es lo que identifica su navegador. Bibliotecas como urllib de Python están severamente restringidas por Reddit para evitar el abuso. Reddit recomienda que uses tu propio agente de usuario especial, y eso es lo que haremos.

Usando la API

La API es bastante fácil de usar, como dije. Usted hace una solicitud REST, y esto se puede hacer a través de urllib2 (siempre y cuando configure el agente de usuario correctamente). Así es como lo harías. He puesto dos enlaces a continuación. Abrir en una nueva pestaña:

http://www.reddit.com/r/learnPython/

http://www.reddit.com/r/learnPython//caliente.json

El primero es cómo lo vería un humano. La segunda es cómo lo ve su código. Como puede ver, obtener el json es bastante fácil.

El problema con este enfoque es que aún tiene que asegurarse de limitar la tarifa de sus solicitudes. También tienes que analizar el json tú mismo. Json es fácil de analizar en Python, ya que es esencialmente un diccionario de Python, pero si nos fijamos en el json, hay muchos datos.

Presentamos Praw

Praw es una biblioteca que soluciona muchos de estos problemas. Limita el número de solicitudes que puede realizar y facilita la extracción del json. Instalarlo:

1
pip install praw

lo que Usted necesita hacer algunos ajustes en primer lugar.

Crear Reddit App

Ir a: https://www.reddit.com/prefs/apps/

Y seleccione Crear App:

Darle un nombre. Tienes que elegir un uri de redirección (por alguna razón estúpida, estúpida porque estoy construyendo un bot, no una aplicación web, sino lo que sea). Elegí http://127.0.0.1

Ahora obtendrá un client_id (cuadro rojo a continuación) y un secret (cuadro azul a continuación). Anótalo, pero mantenlo en secreto.

Ahora, necesita actualizar su archivo praw ini para recordar estas configuraciones. De lo contrario, tendrás que ponerlos en tu guión y eso es peligroso (como otros podrían verlos).

Esta página describe cómo cambiar las gambas.archivos ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

Encontrará el archivo en su carpeta de instalación de Python, en Lib\Site-Packages\praw\praw.ini

Update: Como Bryce señala en los comentarios:

No recomiendo modificar el nivel de paquete praw.ini ya que esos cambios se sobrescribirán cada vez que se actualice el paquete. En su lugar, praw.ini debe colocarse en el directorio desde el que se ejecuta el programa (a menudo el mismo directorio que el archivo).

Aquí se especifican otras opciones: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Recomiendo seguir los consejos de Bryce.

Agregue los valores que anotamos:

client_id y client_secret son lo que escribió. El nombre de usuario y la contraseña son los detalles de su cuenta (y opcionales si solo desea acceso de solo lectura).

Hay un nuevo campo: user_agent.

¿Recuerdas que dije que las reglas de Reddit dicen que tienes que tener un agente de usuario específico? Elijo el nombre de PyEng Bot. El número al final es la versión. Esto es recomendable, porque una vez que tu código esté disponible, la gente podría abusar de él. Si alguien envía spam a Reddit con tu código, Reddit prohibirá ese agente de usuario.

En ese caso, simplemente mueva la versión hacia arriba. No es ideal, pero tienes que aceptar que tu código puede ser mal utilizado por los spammers.

Repasemos el código ahora. Descárgalo en Github.

1
importar praw

importar praw.

1
2
3

reddit = praw.Reddit(‘bot1’)
subreddit = r.subreddit(«learnpython»)

vamos a crear una Reddit instancia a través de los valores que se guardan bajo bot1.

Entonces obtenemos el subreddit learnpython.

Ahora, si miras el subreddit, puedes ver que hay una pestaña caliente. Esto no indica que la temperatura sea alta o que haya modelos de trajes de baño picantes. Significa las publicaciones más populares. Eso es lo que vamos a leer ahora. La función para hacerlo es get_hot().

1
para la presentación en el subreddit.caliente(límite=5):

Tenemos el top 5 de caliente presentaciones. En esta etapa, puede hacer esto para ver qué funciones están disponibles (puede hacerlo en cualquier etapa, o consulte la documentación de Praw).

Ver una lista recortada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

dir(presentación)

voy a señalar algunos de los más importantes. Título es el título, tal y como aparece en la página principal de Reddit. El texto propio es el texto opcional que puedes poner en las publicaciones, la mayoría de las publicaciones no las tienen. learnpython es único en que la mayoría de las publicaciones tienen texto (generalmente el póster que hace su pregunta), por lo que lo he elegido. la puntuación es la puntuación total, sumando votos positivos y votos negativos (los cuales también están disponibles).

Estos son los tres que imprimiremos:

1
2
3
4
5

para la presentación en el subreddit.hot (limit=5):
print («Título:», envío.título)
print(«Texto:», envío.texto propio)
print («Partitura:», envío.score)
imprimir(«———————————\n»)

Eso es todo. Ejecute el script y abra Reddit en un navegador al mismo tiempo. Compruebe que está obteniendo los resultados correctos.

La próxima vez

veremos cómo enviar una respuesta a una publicación en Reddit. Siguiente Parte