Articles

Costruire un Reddit Bot Parte 1

Costruire un Reddit Bot Serie

Parte 1: Leggere i post di reddit

Parte 2: per Rispondere al post

Parte 3: Automatizzare il nostro Bot

Parte 4: Marvin il Depresso Bot

Introduzione

Quindi, stiamo andando a costruire un semplice Reddit Bot che fare due cose:

  1. È in grado di monitorare un particolare subreddit per nuovi posti di lavoro, e quando qualcuno invia “mi piace Python”, risponderà “anche Me!!!”.
  2. Monitorerà anche tutti i commenti ai post recenti, e se ne trova uno che dice “Odio Python”, pubblicherà un link a/r / learnpython e chiederà al commentatore di fare una domanda lì.

Conoscenza dei prerequisiti

È richiesta solo una conoscenza di base di Python, poiché la creazione di bot è abbastanza semplice.

Parte 1

Nella prima parte, vedremo come possiamo leggere i dati da Reddit utilizzando l’API Reddit. Il codice sorgente è disponibile su Github:

Edit: Basato sul commento del lettore Farid:

Reddit ha aggiornato il suo sito Web a un nuovo look. Se ti imbatti in un link sopra che non funziona, dovrai cambiare l’URL.

Ecco un esempio:
Sopra abbiamo il linkhttp://www.reddit.com/dev/api
Ancora, dice non trovato. Se cambiamo il link a http://old.reddit.com/dev/api allora il link dovrebbe funzionare.

In breve, se un link reddit non funziona cambia ” www “in ” vecchio”, quindi il link assomiglia a “old.reddit.com”

Bot software

Un bot software è un programma che può interagire con i siti web in modo autonomo. Possono essere semplici o complessi come vuoi che siano.

Il bot viene eseguito in background e monitora un sito web. Quando vede un cambiamento (come un post su Reddit), può rispondere ad esso, upvote, o fare qualsiasi altro compito è stato programmato per.

Monitoraggio dei siti web

Esistono molti modi per monitorare i siti web. È possibile utilizzare strumenti di raschiamento web come urllib o Chelsoup qualsiasi cosa simile. C’è un piccolo problema con questo, però. I bot possono fare migliaia di richieste al secondo, e questo può sovraccaricare i server. Quindi la maggior parte dei grandi siti web vietano i bot. Ignorare questo a proprio rischio. Sono stato bannato da Google per ore, ho bloccato Gmail fino a quando non ho inserito una dozzina di captachas, il mio cellulare e il nome del mio primo gatto.

Se vuoi farlo correttamente, segui le regole del sito web.

Reddit API

Reddit fornisce un’API e, a differenza di alcuni siti web, è in realtà abbastanza facile da usare. Si basa su REST e json, quindi in teoria non richiede alcuna configurazione di fantasia.

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

L’importante è seguire le regole impostate. Due dei più importanti sono:

  • Non puoi fare più di 1 richiesta ogni 2 secondi (o 30 al minuto)
  • Non devi mentire sul tuo user agent

Leggi il resto qui.

L’agente utente è ciò che identifica il tuo browser. Librerie come urllib di Python sono severamente limitate da Reddit per prevenire abusi. Reddit consiglia di utilizzare il proprio agente utente speciale, ed è quello che faremo.

Utilizzando l’API

L’API è abbastanza facile da usare, come ho detto. Si effettua una richiesta REST e questo può essere fatto tramite urllib2 (purché si imposti correttamente l’agente utente). E ‘cosi’ che lo faresti. Ho messo due link qui sotto. Aprire entrambi in una nuova scheda:

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

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

Il primo è come un umano lo vedrebbe. Il secondo è come il tuo codice lo vede. Come puoi vedere, ottenere il json è abbastanza facile.

Il problema con questo approccio è che devi ancora assicurarti di limitare le tue richieste. Devi anche analizzare il json da solo. Json è facile da analizzare in Python, in quanto è essenzialmente un dizionario Python, ma se si guarda effettivamente il json, ci sono molti dati.

Introducendo Praw

Praw è una libreria che risolve molti di questi problemi per voi. Limita il numero di richieste che puoi effettuare e semplifica l’estrazione di json. Installazione:

1
pip install praw

È necessario fare alcune impostazioni prima.

Crea app Reddit

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

E seleziona Crea app:

Dagli un nome. Devi scegliere un uri di reindirizzamento (per qualche stupida ragione, stupida perché sto costruendo un bot, non una webapp, ma qualunque cosa). Ho scelto http://127.0.0.1

Ora otterrai un client_id (casella rossa sotto) e un segreto (casella blu sotto). Annotalo, ma mantienilo segreto.

Ora, è necessario aggiornare il file praw ini per ricordare queste impostazioni. Altrimenti, dovrai metterli nel tuo script e questo è pericoloso (come altri potrebbero vederli).

Questa pagina descrive come cambiare il gambero.file ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

Troverai il file nella cartella di installazione di Python, sotto Lib\Site-Packages\praw\praw.ini

Update: Come Bryce sottolinea nei commenti:

Non consiglio di modificare il praw.ini a livello di pacchetto poiché tali modifiche verranno sovrascritte ogni volta che il pacchetto viene aggiornato. Invece praw.ini dovrebbe essere collocato nella directory da cui viene eseguito il programma (spesso la stessa directory del file).

Altre opzioni sono specificate qui: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Consiglio di seguire il consiglio di Bryce.

Aggiungi i valori che abbiamo annotato:

client_id e client_secret sono ciò che hai scritto. Nome utente e password sono i dettagli dell’account (e facoltativi se si desidera solo l’accesso in sola lettura).

C’è un nuovo campo: user_agent.

Ricorda che ho detto che le regole di Reddit dicono che devi avere un agente utente specifico? Sto scegliendo il nome PyEng Bot. Il numero alla fine è la versione. Questo è raccomandato, perché una volta che il tuo codice è là fuori, le persone potrebbero abusarne. Se qualcuno spams Reddit con il tuo codice, Reddit vieterà quell’agente utente.

In tal caso, basta spostare la versione in alto. Non è l’ideale, ma devi accettare che il tuo codice possa essere abusato dagli spammer.

Andiamo oltre il codice ora. Scaricalo su Github.

1
importa praw

importare praw.

1
2
3

reddit = praw.Reddit (‘bot1’)
subreddit = r.subreddit(“learnpython”)

Creiamo un’istanza Reddit usando i valori che abbiamo salvato sotto bot1.

Quindi otteniamo il subreddit learnpython.

Ora, se si guarda sul subreddit, si può vedere che c’è una scheda calda. Questo non indica la temperatura è alta o che ci sono modelli di costume da bagno filanti. Significa i post più popolari. Questo è quello che stiamo andando a leggere ora. La funzione per farlo è get_hot ().

1
per la presentazione in subreddit.hot (limit = 5):

Otteniamo le prime 5 osservazioni calde. In questa fase, puoi farlo per vedere quali funzioni sono disponibili (puoi farlo in qualsiasi momento o guardare la documentazione di Praw).

Visualizzazione di un elenco snipped:

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(presentazione)

Ne indicherò alcuni importanti. Title è il titolo, come appare sulla pagina principale di Reddit. Selftext è il testo opzionale che puoi inserire nei post: la maggior parte dei post non li ha. learnpython è unico in quanto la maggior parte dei post ha testo (di solito il poster che fa la loro domanda), motivo per cui l’ho scelto. score è il punteggio totale, aggiungendo upvotes e downvotes (entrambi disponibili anche).

Questi sono i tre che stamperemo:

1
2
3
4
5

per la presentazione in subreddit.hot (limit=5):
stampa (“Title:”, submission.titolo)
stampa (“Testo:”, invio.selftext)
stampa (“Punteggio:”, sottomissione.score)
stampa(“———————————\n”)

Questo è tutto. Esegui lo script e apri Reddit in un browser allo stesso tempo. Verificare che si stanno ottenendo i risultati giusti.

La prossima volta

La prossima volta vedremo come inviare una risposta a un post su Reddit. Parte successiva