Articles

Construire un Bot Reddit Partie 1

Construire une série de Bots Reddit

Partie 1: Lire les messages de reddit

Partie 2: Répondre aux messages

Partie 3: Automatiser notre Bot

Partie 4: Marvin le Bot déprimé

Introduction

Nous allons donc construire un Bot Reddit simple qui fera deux choses:

  1. Il surveillera un subreddit particulier pour de nouveaux messages, et quand quelqu’un publiera « J’aime Python », il répondra « Moi aussi! ».
  2. Il surveillera également tous les commentaires des messages récents, et s’il en trouve un qui dit « Je déteste Python », il publiera un lien vers /r/learnpython et demandera au commentateur de poser une question là-bas.

Connaissances préalables

Seule une connaissance de base de Python est requise, car la construction de bots est assez facile.

Partie 1

Dans la première partie, nous verrons comment lire les données de Reddit à l’aide de l’API Reddit. Le code source est disponible sur Github:

Edit: Basé sur le commentaire du lecteur Farid:

Reddit a mis à jour son site Web pour un nouveau look. Si vous rencontrez un lien ci-dessus qui ne fonctionne pas, vous devrez modifier l’URL.

Voici un exemple:
Ci-dessus, nous avons le lien http://www.reddit.com/dev/api
Pourtant, il est dit non trouvé. Si nous changeons le lien en http://old.reddit.com/dev/api alors le lien devrait fonctionner.

En bref, si un lien reddit ne fonctionne pas, remplacez le « www » par « ancien », de sorte que le lien ressemble à « old.reddit.com « 

Bot logiciel

Un bot logiciel est un programme qui peut interagir avec des sites Web de manière autonome. Ils peuvent être aussi simples ou aussi complexes que vous le souhaitez.

Le bot s’exécute en arrière-plan et surveille un site Web. Lorsqu’il voit un changement (comme un post sur Reddit), il peut y répondre, voter ou effectuer toute autre tâche pour laquelle il a été programmé.

Surveillance des sites Web

Il existe de nombreuses façons de surveiller les sites Web. Vous pouvez utiliser des outils de grattage Web comme urllib ou Beautifulsoup tout ce qui est similaire. Il y a cependant un léger problème avec cela. Les robots peuvent effectuer des milliers de requêtes par seconde, ce qui peut surcharger les serveurs. Ainsi, la plupart des grands sites Web interdisent les robots. Ignorez cela à vos risques et périls. J’ai été banni de Google pendant des heures, j’avais mon Gmail verrouillé jusqu’à ce que j’entre une douzaine de captachas, mon mobile et le nom de mon premier chat.

Si vous voulez le faire correctement, respectez les règles du site Web.

Reddit API

Reddit fournit une API, et contrairement à certains sites Web, elle est en fait assez facile à utiliser. Il est basé sur REST et json, donc en théorie ne nécessite aucune configuration sophistiquée.

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

L’important est de suivre les règles qu’ils fixent. Deux des plus importantes sont:

  • Vous ne pouvez pas faire plus d’une demande toutes les 2 secondes (ou 30 par minute)
  • Vous ne devez pas mentir sur votre agent utilisateur

Lisez la suite ici.

L’agent utilisateur est ce qui identifie votre navigateur. Les bibliothèques comme urllib de Python sont sévèrement restreintes par Reddit pour éviter les abus. Reddit vous recommande d’utiliser votre propre agent utilisateur spécial, et c’est ce que nous ferons.

Utilisation de l’API

L’API est assez facile à utiliser, comme je l’ai dit. Vous faites une demande REST, et cela peut être fait via urllib2 (tant que vous définissez correctement l’agent utilisateur). C’est comme ça que tu ferais ça. J’ai mis deux liens ci-dessous. Ouvrez les deux dans un nouvel onglet :

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

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

Le premier est comment un humain le verrait. La seconde est la façon dont votre code le voit. Comme vous pouvez le voir, obtenir le json est assez facile.

Le problème avec cette approche est que vous devez toujours vous assurer de limiter vos demandes. Vous devez également analyser le json vous-même. Json est facile à analyser en Python, car il s’agit essentiellement d’un dictionnaire Python, mais si vous regardez réellement le json, il y a beaucoup de données.

Présentation de Praw

Praw est une bibliothèque qui résout bon nombre de ces problèmes pour vous. Cela limite le nombre de requêtes que vous pouvez effectuer et facilite l’extraction du json. L’installation se fait par :

1
pip install praw

Vous devez d’abord effectuer une configuration.

Créer une application Reddit

Allez dans:https://www.reddit.com/prefs/apps/

Et sélectionnez Créer une application:

Donnez-lui un nom. Vous devez choisir un uri de redirection (pour une raison stupide, stupide parce que je construis un bot, pas une application Web, mais peu importe). J’ai choisi http://127.0.0.1

Vous obtiendrez maintenant un client_id (boîte rouge ci-dessous) et un secret (boîte bleue ci-dessous). Notez-le, mais gardez-le secret.

Maintenant, vous devez mettre à jour votre fichier ini praw pour mémoriser ces paramètres. Sinon, vous devrez les mettre dans votre script et c’est dangereux (comme d’autres pourraient les voir).

Cette page décrit comment changer la crevette.fichiers ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

Vous trouverez le fichier dans votre dossier d’installation Python, sous Lib\Site-Packages\praw\praw.ini

Mise à jour: Comme le souligne Bryce dans les commentaires:

Je ne recommande pas de modifier le praw.iniau niveau du package, car ces modifications seront écrasées à chaque mise à jour du package. Au lieu de cela, praw.ini doit être placé dans le répertoire à partir duquel le programme est exécuté (souvent le même répertoire que le fichier).

D’autres options sont spécifiées ici: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Je recommande de suivre les conseils de Bryce.

Ajoutez les valeurs que nous avons notées:

client_id et client_secret sont ce que vous avez noté. Le nom d’utilisateur et le mot de passe sont les détails de votre compte (et facultatifs si vous souhaitez uniquement un accès en lecture seule).

Il y a un nouveau champ : user_agent.

Rappelez-vous que j’ai dit que les règles de Reddit disent que vous devez avoir un agent utilisateur spécifique? Je choisis le nom PyEng Bot. Le numéro à la fin est la version. Ceci est recommandé, car une fois que votre code est disponible, les gens pourraient en abuser. Si quelqu’un spams Reddit avec votre code, Reddit bannira cet agent utilisateur.

Dans ce cas, vous déplacez simplement la version vers le haut. Pas idéal, mais vous devez accepter que votre code puisse être mal utilisé par des spammeurs.

Passons en revue le code maintenant. Téléchargez-le sur Github.

1
import praw

Nous importons praw.

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

Nous créons une instance Reddit en utilisant les valeurs que nous avons enregistrées sous bot1.

Ensuite, nous obtenons le subreddit learnpython.

Maintenant, si vous regardez sur le subreddit, vous pouvez voir qu’il y a un onglet chaud. Cela n’indique pas que la température y est élevée ou qu’il existe des modèles de maillots de bain racés. Cela signifie les messages les plus populaires. C’est ce que nous allons lire maintenant. La fonction pour le faire est get_hot().

1
pour soumission dans subreddit.hot(limit= 5):

Nous obtenons les 5 meilleures soumissions chaudes. À ce stade, vous pouvez le faire pour voir quelles fonctions sont disponibles (vous pouvez le faire à tout moment ou consulter la documentation de Praw).

Voir une liste tronquée:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

div>

16
17
18
19
20
21
22
23
24
25
26
27
28
dir(soumission)

Je vais en signaler quelques-uns importants. Titre est le titre, tel qu’il apparaît sur la page principale de Reddit. Selftext est le texte facultatif que vous pouvez mettre sur les messages – la plupart des messages ne les ont pas. learnpython est unique en ce sens que la plupart des messages contiennent du texte (généralement l’affiche posant leur question), c’est pourquoi je l’ai choisi. le score est le score total, en additionnant les votes positifs et les votes négatifs (qui sont également disponibles).

Ce sont les trois que nous allons imprimer:

1
2
3
4
5
pour la soumission dans subreddit.hot(limit=5):
print(« Title: », soumission.title)
print(« Texte: », soumission.selftext)
print(« Score: », soumission.score)
imprimer(« ———————————\ n »)

C’est tout. Exécutez le script et ouvrez Reddit dans un navigateur en même temps. Vérifiez que vous obtenez les bons résultats.

La prochaine fois

La prochaine fois, nous verrons comment envoyer une réponse à un message sur Reddit. Partie suivante