Articles

Byg en Reddit Bot Del 1

Byg en Reddit Bot serie

Del 1: Læs indlæg fra reddit

Del 2: Svar på indlæg

del 3: Automatiser vores bot

Del 4: Marvin den deprimerede bot

introduktion

så vi skal bygge en simpel Reddit bot, der vil gøre to ting:

  1. det vil overvåge en bestemt subreddit for nye indlæg, og når nogen poster “jeg elsker Python”, vil den svare “mig også!”.
  2. det vil også overvåge alle kommentarer til de seneste indlæg, og hvis den finder en, der siger “jeg hader Python”, vil den sende et link til /r/learnpython og bede kommentatoren om at stille et spørgsmål der.

Forudsætningskendskab

kun en grundlæggende viden om Python er påkrævet, da det er ret nemt at bygge bots.

Del 1

i første del vil vi se, hvordan vi kan læse data fra Reddit ved hjælp af Reddit API. Kildekoden er tilgængelig på Github:

Rediger: baseret på kommentar fra læseren Farid:

Reddit har opdateret sin hjemmeside til et nyt look. Hvis du støder på et link ovenfor, der ikke fungerer, bliver du nødt til at ændre url ‘ en.

Her er et eksempel:
ovenfor har vi linket http://www.reddit.com/dev/api
endnu står det ikke fundet. Hvis vi ændrer linket til http://old.reddit.com/dev/api så skal linket fungere.

kort sagt, hvis et reddit-link ikke fungerer, skal du ændre “Første gang” til “gammel”, så linket ser ud som “old.reddit.com”

et program bot er et program, der kan interagere med hjemmesider autonomt. De kan være så enkle eller så komplekse, som du vil have dem til at være.

bot kører i baggrunden og overvåger en hjemmeside. Når det ser en ændring (som et indlæg på Reddit), kan det svare på det, opstemme eller udføre enhver anden opgave, det var programmeret til.

overvågning hjemmesider

der er mange måder at overvåge hjemmesider. Du kan bruge skrabeværktøjer som urllib eller Beautifulsoup noget lignende. Der er dog et lille problem med dette. Bots kan gøre tusindvis af anmodninger et sekund, og dette kan overbelaste servere. Så de fleste store hjemmesider forbyder bots. Ignorer dette på egen risiko. Jeg er blevet forbudt fra Google i timevis, havde min Gmail låst, indtil jeg kom ind i et dusin captachas, min mobil og navnet på min første kat.

Hvis du vil gøre dette ordentligt, skal du holde dig til de regler, hjemmesiden har.Reddit giver en API, og i modsætning til nogle hjemmesider er det faktisk ret nemt at bruge. Det er baseret på REST og json, så i teorien kræver det ikke nogen fancy opsætning.

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

det vigtige er at følge de regler, de sætter. To af de vigtigste er:

  • du kan ikke foretage mere end 1 anmodning hvert 2.sekund (eller 30 i minuttet)
  • Du må ikke lyve om din brugeragent

Læs resten her.

brugeragenten er det, der identificerer din bro.ser. Biblioteker som Pythons urllib er stærkt begrænset af Reddit for at forhindre misbrug. Reddit anbefaler, at du bruger din egen specielle brugeragent, og det er hvad vi vil gøre.

brug af API

API ‘ en er ret nem at bruge, som jeg sagde. Du laver en HVILEANMODNING, og dette kan gøres via urllib2 (så længe du indstiller brugeragenten korrekt). Sådan ville du gøre det. Jeg har lagt to links nedenfor. Åbn begge i en ny fane:

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

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

den første er, hvordan et menneske ville se det. Det andet er, hvordan din kode ser det. Som du kan se, er det ret nemt at få json.

problemet med denne tilgang er, at du stadig skal sørge for, at du begrænser dine anmodninger. Du skal også selv analysere json. Json er let at analysere i Python, da det i det væsentlige er en Python-ordbog, men hvis du rent faktisk ser på json, er der mange data.

Introduktion til rejer

rejer er et bibliotek, der løser mange af disse problemer for dig. Det begrænser, hvor mange anmodninger du kan gøre, og gør det nemt at udtrække json. Installer det af:

1
PIP installer rejer

du skal først lave nogle opsætninger.

Opret Reddit App

gå til: https://www.reddit.com/prefs/apps/

og vælg Opret App:

giv det et navn. Du skal vælge en omdirigering uri (af en eller anden dum grund, dum fordi jeg bygger en bot, ikke en hjemmeside, men hvad som helst). Jeg valgte http://127.0.0.1

Du får nu en client_id (rød boks nedenfor) og hemmelig (blå boks nedenfor). Læg mærke til det, men hold det hemmeligt.

nu skal du opdatere din reje ini-fil for at huske disse indstillinger. Ellers bliver du nødt til at sætte dem i dit script, og det er farligt (som andre måske ser dem).

denne side beskriver, hvordan du ændrer rejer.INI-filer: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

du finder filen i din Python-installationsmappe under Lib\Site-pakker\rejer\rejer.ini

opdatering: som Bryce påpeger i kommentarerne:

Jeg anbefaler ikke at ændre pakkeniveauet praw.ini da disse ændringer overskrives hver gang pakken opdateres. I stedet praw.ini skal placeres i den mappe, som programmet køres fra (ofte den samme mappe som filen).

andre muligheder er angivet her:https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Jeg anbefaler at følge Bryces råd.

Tilføj de værdier, vi noterede ned:

client_id og client_secret er hvad du skrev ned. Brugernavn og adgangskode er dine kontooplysninger (og valgfri, hvis du kun vil have skrivebeskyttet adgang).

der er et nyt felt: user_agent.

Husk jeg sagde Reddit-reglerne siger, at du skal have en bestemt brugeragent? Jeg vælger navnet PyEng Bot. Nummeret i slutningen er versionen. Dette anbefales, fordi når din kode er derude, kan folk misbruge den. Hvis nogen spammer Reddit med din kode, Reddit vil forbyde denne brugeragent.

i så fald flytter du bare versionen op. Ikke ideel, men du skal acceptere, at din kode kan blive misbrugt af spammere.

lad os gå over koden nu. Hent det på Github.

1
import rejer

Vi importerer rejer.

1
2
3

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

Vi opretter en Reddit-forekomst ved hjælp af de værdier, vi gemte under bot1.

så får vi subreddit learnpython.

nu, hvis du ser på subreddit, kan du se, at der er en varm fane. Dette indikerer ikke, at temperaturen er høj, eller at der er racy badedragtsmodeller. Det betyder de mest populære indlæg. Det er det, vi skal læse nu. Funktionen til at gøre det er get_hot().

1
til indsendelse i subreddit.hot (grænse=5):

Vi får top 5 hot indlæg. På dette tidspunkt kan du gøre dette for at se, hvilke funktioner der er tilgængelige (Du kan gøre det på ethvert tidspunkt eller se på Rejs dokumentation).

at se en snippet liste:

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

dir(indsendelse)

Jeg vil påpege et par vigtige. Titel er titlen, som den vises på Reddits hovedside. Selvtekst er den valgfri tekst, du kan lægge på indlæg – de fleste indlæg har ikke disse. learnpython er unik, fordi de fleste indlæg har tekst (normalt plakaten spørger deres spørgsmål), hvorfor jeg har valgt det. score er den samlede score, tilføje opstemninger og nedstemninger (som begge er også tilgængelige).

Dette er de tre, vi vil udskrive:

1
2
3
4
5

til indsendelse i subreddit.hot (grænse=5):
print(“Titel:”, indsendelse.Titel)
print (“tekst:”, indsendelse.selvtekst)
print (“Score:”, indsendelse.score)
print(“———————————\n”)

det er det. Kør scriptet, og åbn Reddit i en bro.ser på samme tid. Kontroller, at du får de rigtige resultater.

næste gang

næste gang vil vi se på, hvordan du sender et svar til et indlæg på Reddit. Næste del