Articles

Erstellen Sie einen Reddit-Bot Teil 1

Erstellen Sie eine Reddit-Bot-Serie

Teil 1: Lesen Sie Beiträge von reddit

Teil 2: Antworten Sie auf Beiträge

Teil 3: Automatisieren

Teil 4: Marvin der Python-Bot

Einführung

Wir werden also einen einfachen Reddit-Bot erstellen, der zwei Dinge tut:

  1. Er überwacht einen bestimmten Subreddit auf neue Beiträge, und wenn jemand „Ich liebe Python“ postet, antwortet er „Ich auch!“.
  2. Es wird auch alle Kommentare zu den letzten Posts überwachen, und wenn es einen findet, der sagt „Ich hasse Python“, wird es einen Link zu / r /learnpython posten und den Kommentator bitten, dort eine Frage zu stellen.

Vorkenntnisse

Es sind nur Grundkenntnisse in Python erforderlich, da das Erstellen von Bots relativ einfach ist.

Teil 1

In Teil eins werden wir sehen, wie wir Daten von Reddit mit der Reddit-API lesen können. Der Quellcode ist auf Github verfügbar:

Edit: Basierend auf einem Kommentar von Leser Farid:

Reddit hat seine Website auf ein neues Aussehen aktualisiert. Wenn Sie oben auf einen Link stoßen, der nicht funktioniert, müssen Sie die URL ändern.

Hier ist ein Beispiel:
Oben haben wir den Link http://www.reddit.com/dev/api
Noch heißt es nicht gefunden. Wenn wir den Link in http://old.reddit.com/dev/api ändern, sollte der Link funktionieren.

Kurz gesagt, wenn ein Reddit-Link nicht funktioniert, ändern Sie das „www“ in „alt“, sodass der Link wie folgt aussiehtold.reddit.com „

Software-Bot

Ein Software-Bot ist ein Programm, das autonom mit Websites interagieren kann. Sie können so einfach oder so komplex sein, wie Sie möchten.

Der Bot läuft im Hintergrund und überwacht eine Website. Wenn es eine Änderung sieht (wie ein Beitrag auf Reddit), kann es darauf antworten, Upvote oder eine andere Aufgabe ausführen, für die es programmiert wurde.

Überwachung von Websites

Es gibt viele Möglichkeiten, Websites zu überwachen. Sie können Web-Scraping-Tools wie urllib oder Beautifulsoup oder ähnliches verwenden. Es gibt jedoch ein kleines Problem damit. Bots können Tausende von Anfragen pro Sekunde stellen, und dies kann Server überlasten. Daher verbieten die meisten großen Websites Bots. Ignorieren Sie dies auf eigene Gefahr. Ich wurde stundenlang von Google gesperrt, hatte mein Google Mail gesperrt, bis ich ein Dutzend Captachas, mein Handy und den Namen meiner ersten Katze eingegeben hatte.

Wenn Sie dies richtig machen möchten, halten Sie sich an alle Regeln der Website.

Reddit API

Reddit bietet eine API, und im Gegensatz zu einigen Websites, es ist eigentlich ganz einfach zu bedienen. Es basiert auf REST und JSON und erfordert theoretisch kein ausgefallenes Setup.

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

Das Wichtigste ist, die von ihnen festgelegten Regeln zu befolgen. Zwei der wichtigsten sind:

  • Sie können nicht mehr als 1 Anfrage alle 2 Sekunden (oder 30 pro Minute) stellen
  • Sie dürfen nicht über Ihren Benutzeragenten lügen

Lesen Sie den Rest hier.

Der User Agent identifiziert Ihren Browser. Bibliotheken wie Pythons urllib werden von Reddit stark eingeschränkt, um Missbrauch zu verhindern. Reddit empfiehlt Ihnen, Ihren eigenen speziellen Benutzeragenten zu verwenden, und das werden wir tun.

Verwenden der API

Die API ist, wie gesagt, recht einfach zu bedienen. Sie stellen eine REST-Anfrage, und dies kann über urllib2 erfolgen (solange Sie den Benutzeragenten richtig einstellen). So würdest du es machen. Ich habe unten zwei Links eingefügt. Öffnen Sie beide in einem neuen Tab:

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

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

Das erste ist, wie ein Mensch es sehen würde. Die zweite ist, wie Ihr Code es sieht. Wie Sie sehen, ist es ziemlich einfach, den JSON zu erhalten.

Das Problem bei diesem Ansatz ist, dass Sie immer noch sicherstellen müssen, dass Sie Ihre Anfragen begrenzen können. Sie müssen den JSON auch selbst analysieren. Json ist in Python einfach zu analysieren, da es sich im Wesentlichen um ein Python-Wörterbuch handelt, aber wenn Sie sich den JSON tatsächlich ansehen, gibt es viele Daten.

Einführung in Praw

Praw ist eine Bibliothek, die viele dieser Probleme für Sie behebt. Es begrenzt, wie viele Anfragen Sie stellen können, und erleichtert das Extrahieren des JSON. Installieren Sie es durch:

1
pip install praw

Sie müssen zuerst einige Einstellungen vornehmen.

Reddit-App erstellen

Gehen Sie zu: https://www.reddit.com/prefs/apps/

Und wählen Sie App erstellen:

Geben Sie ihm einen Namen. Sie müssen eine Umleitungs-URI auswählen (aus irgendeinem dummen Grund, dumm, weil ich einen Bot baue, keine Webanwendung, aber was auch immer). Ich habe http://127.0.0.1

Sie erhalten jetzt eine client_id (rotes Feld unten) und ein Geheimnis (blaues Feld unten). Notieren Sie es, aber halten Sie es geheim.

Jetzt müssen Sie Ihre praw ini-Datei aktualisieren, um sich diese Einstellungen zu merken. Andernfalls müssen Sie sie in Ihr Skript einfügen und das ist gefährlich (wie andere sie vielleicht sehen).

Diese Seite beschreibt, wie man Garnelen ändert.ini-Dateien: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

Sie finden die Datei in Ihrem Python-Installationsordner unter Lib\Site-Packages\praw\praw .ini

Update: Wie Bryce in den Kommentaren betont:

Ich empfehle nicht, die Paketebene praw.ini da diese Änderungen jedes Mal überschrieben werden, wenn das Paket aktualisiert wird. Stattdessen sollte praw.ini in dem Verzeichnis abgelegt werden, aus dem das Programm ausgeführt wird (oft im selben Verzeichnis wie die Datei).

Andere Optionen sind hier angegeben: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Ich empfehle, Bryces Rat zu befolgen.

Fügen Sie die Werte hinzu, die wir notiert haben:

client_id und client_secret sind das, was Sie notiert haben. Benutzername und Passwort sind Ihre Kontodaten (und optional, wenn Sie nur Lesezugriff wünschen).

Es gibt ein neues Feld: user_agent.

Erinnerst du dich, dass ich gesagt habe, dass die Reddit-Regeln besagen, dass du einen bestimmten User Agent haben musst? Ich wähle den Namen PyEng Bot. Die Nummer am Ende ist die Version. Dies wird empfohlen, da Ihr Code möglicherweise missbraucht wird, sobald er verfügbar ist. Wenn jemand Reddit mit Ihrem Code spammt, Reddit verbietet diesen Benutzeragenten.

In diesem Fall verschieben Sie einfach die Version nach oben. Nicht ideal, aber Sie müssen akzeptieren, dass Ihr Code von Spammern missbraucht werden kann.

Lassen Sie uns nun den Code durchgehen. Laden Sie es bei Github herunter.

1
Garnelen importieren

Wir importieren Garnelen.

1
2
3

reddit = praw.Reddit(‚bot1‘)
subreddit = r.subreddit(„learnpython“)

Wir erstellen eine Reddit-Instanz mit den Werten, die wir unter bot1 gespeichert haben.

Dann bekommen wir den Subreddit learnpython.

Wenn Sie nun auf das Subreddit schauen, können Sie sehen, dass es einen Hot Tab gibt. Dies bedeutet nicht, dass die Temperatur dort hoch ist oder dass es rassige Badeanzugmodelle gibt. Es bedeutet die beliebtesten Beiträge. Das werden wir jetzt lesen. Die Funktion dazu ist get_hot() .

1
für die Einreichung in subreddit.heiß(limit=5):

Wir bekommen die Top 5 heißen Einreichungen. In diesem Stadium können Sie dies tun, um zu sehen, welche Funktionen verfügbar sind (Sie können dies jederzeit tun oder sich die Dokumentation von Praw ansehen).

Anzeigen einer Snipped-Liste:

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

div>

Ich werde auf einige wichtige hinweisen. Titel ist der Titel, wie er auf Reddits Hauptseite erscheint. Selftext ist der optionale Text, den Sie in Posts einfügen können – die meisten Posts haben diesen nicht. learnpython ist insofern einzigartig, als die meisten Beiträge Text haben (normalerweise das Poster, das ihre Frage stellt), weshalb ich es ausgewählt habe. score ist die Gesamtpunktzahl, die Upvotes und Downvotes addiert (beide sind ebenfalls verfügbar).

Das sind die drei, die wir drucken werden:

1
2
3
4
5

zur Einreichung im Subreddit.hot(limit=5):
print(„Titel: „, Vorlage.title)
print(„Text: „, Vorlage.selftext)
print(„Partitur: „, Vorlage.partitur)
drucken(„———————————\ n“)

Das war’s. Führen Sie das Skript aus und öffnen Sie Reddit gleichzeitig in einem Browser. Überprüfen Sie, ob Sie die richtigen Ergebnisse erzielen.

Nächstes Mal

Das nächste Mal werden wir uns ansehen, wie man eine Antwort auf einen Beitrag auf Reddit sendet. Nächster Teil