Articles

Bygg En Reddit Bot Del 1

Bygg En Reddit Bot Serie

Del 1: Les innlegg fra reddit

Del 2: Svar på innlegg

del 3: Automatiser Vår Bot

Del 4: marvin den deprimerte bot

introduksjon

så vi skal bygge En Enkel Reddit Bot som vil gjøre to ting:

  1. det vil overvåke en bestemt subreddit for nye innlegg, Og Når Noen Poster «jeg elsker python», vil det svare «meg også!».
  2. Det vil også overvåke alle kommentarer til siste innlegg, og hvis den finner en som sier «jeg hater Python», vil den legge inn en lenke til / r / learnpython og be kommentaren om å stille et spørsmål der.

Forutsetning kunnskap

Bare en grunnleggende kunnskap Om Python er nødvendig, som bygge roboter er ganske enkelt.

Del 1

i del en vil vi se hvordan vi kan lese data Fra Reddit ved Hjelp Av Reddit API. Kildekoden er tilgjengelig På Github:

Edit: Basert på kommentar av leser Farid:

Reddit har oppdatert sin nettside til et nytt utseende. Hvis du kommer over en lenke over som ikke virker, må du endre nettadressen.

Her er et eksempel:
Ovenfor har vi linken http://www.reddit.com/dev/api
Ennå står det ikke funnet. Hvis vi endrer lenken til http://old.reddit.com/dev/api så skal lenken fungere.

kort sagt, hvis en reddit-lenke ikke virker, endrer » www » til «gammel», slik at lenken ser ut som «old.reddit.com»

Programvare bot

en programvare bot er et program som kan samhandle med nettsteder autonomt. De kan være så enkle eller så komplekse som du vil at de skal være.

boten kjører i bakgrunnen og overvåker et nettsted. Når det ser en endring (som et innlegg På Reddit), kan det svare på Det, upvote, eller gjøre noen annen oppgave det var programmert til.

Overvåking nettsteder

det er mange måter å overvåke nettsteder. Du kan bruke web skraping verktøy som urllib eller Beautifulsoup noe lignende. Det er imidlertid et lite problem med dette. Bots kan gjøre tusenvis av forespørsler et sekund, og dette kan overbelaste servere. Så de fleste store nettsteder forbyr bots. Ignorer dette på egen risiko. Jeg har blitt utestengt Fra Google i flere timer, Hadde Gmail låst til jeg kom inn i et dusin captachas, mobilen min og navnet på min første katt.

hvis du vil gjøre dette riktig, hold deg til noen regler nettstedet har.Reddit GIR EN API, og i motsetning til enkelte nettsteder, er det faktisk ganske enkelt å bruke. DEN er basert PÅ REST og json, så i teorien krever ikke noe fancy oppsett.

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

det viktigste er å følge reglene de setter. To av de viktigste er:

  • du kan ikke gjøre mer enn 1 forespørsel hvert 2. sekund (eller 30 i minuttet)
  • Du må ikke lyve om din brukeragent

Les resten her.

brukeragenten er det som identifiserer nettleseren din. Biblioteker som Pythons urllib er sterkt begrenset Av Reddit for å forhindre misbruk. Reddit anbefaler at du bruker din egen spesielle brukeragent, og det er det vi skal gjøre.

Ved HJELP AV API

API ER ganske enkelt å bruke, som jeg sa. DU gjør EN REST-forespørsel, og dette kan gjøres via urllib2(så lenge du setter brukeragenten riktig). Dette er hvordan du ville gjøre det. Jeg har lagt inn to linker nedenfor. Åpne 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. Den andre er hvordan koden din ser den. Som du kan se, er det ganske enkelt å få json.

problemet med denne tilnærmingen er at du fortsatt må sørge for at du rangere begrense dine forespørsler. Du må også analysere json selv. Json er lett å analysere I Python, da det egentlig er En Python-ordbok, men hvis du faktisk ser på json, er det mye data.

Vi Presenterer Praw

Praw Er et bibliotek som løser mange av disse problemene for deg. Det begrenser hvor mange forespørsler du kan gjøre, og gjør det enkelt å trekke ut json. Installer den av:

1
pip installer praw

du må gjøre noe oppsett først.

Opprett Reddit App

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

Og velg Opprett App:

Gi den et navn. Du må velge en omdirigere uri (for noen dum grunn, dum Fordi Im bygge en bot, ikke en webapp, men uansett). Jeg valgte http://127.0.0.1

Du vil nå få en client_id (rød boks under) og hemmelig(blå boks under). Legg merke til det, men hold det hemmelig.

nå må du oppdatere praw ini-filen for å huske disse innstillingene. Ellers må du sette dem i skriptet ditt og det er farlig (som andre kan se dem).

denne siden beskriver hvordan du endrer reker.ini files: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

du finner filen i Python – installasjonsmappen din, under Lib \ Site-Packages\praw \ praw.Ini

Update: Som Bryce påpeker i kommentarfeltet:

jeg anbefaler ikke å endre pakken-nivå praw.ini som disse endringene vil bli overskrevet hver gang pakken er oppdatert. I stedet praw.ini skal plasseres i katalogen som programmet kjøres fra (ofte samme katalog som filen).

Andre alternativer er spesifisert her: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

jeg anbefaler Å følge Bryce råd.

Legg til verdiene vi noterte ned:

client_id og client_secret er det du skrev ned. Brukernavn og passord er kontodetaljene dine(og valgfritt hvis du bare vil ha lesetilgang).

det er et nytt felt: user_agent.

Husk At Jeg sa Reddit-reglene sier at du må ha en bestemt brukeragent? Jeg velger Navnet PyEng Bot. Tallet på slutten er versjonen. Dette anbefales, fordi når koden din er der ute, kan folk misbruke den. Hvis Noen spammer Reddit med koden din, Vil Reddit forby den brukeragenten.

i så fall flytter du bare versjonen opp. Ikke ideelt, men du må akseptere at koden din kan bli misbrukt av spammere.

La oss gå over koden nå. Last den ned på Github.

1
importer reker

vi importerer reker.

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

1
2
3

vi lager En Reddit-forekomst ved hjelp av verdiene vi lagret under bot1.

Så får vi subreddit learnpython.

Nå, hvis du ser på subreddit, kan du se at det er en varm fane. Dette indikerer ikke temperaturen der er høy eller at det er racy badedraktmodeller. Det betyr de mest populære innleggene. Det er det vi skal lese nå. Funksjonen for å gjøre det er get_hot ().

1
for innsending i subreddit.hot (limit=5):

vi får topp 5 varme innleveringer. På dette stadiet kan du gjøre dette for å se hvilke funksjoner som er tilgjengelige (du kan gjøre det når som helst, eller se På Praws dokumentasjon).

Ser en klippet liste:

dir(innsending)

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

jeg vil påpeke noen viktige. Tittel er tittelen, som det vises på Reddits hovedside. Selvtekst er den valgfrie teksten du kan legge på innlegg-de fleste innlegg har ikke disse. learnpython er unikt fordi de fleste innlegg har tekst (vanligvis plakaten stiller spørsmålet sitt), og derfor har jeg valgt det. score er den totale poengsummen, legge upvotes og downvotes (begge er også tilgjengelig).

Dette er de tre vi vil skrive ut:

for innsending i subreddit.hot (limit=5):
skriv ut («Tittel:», innsending.tittel)
skriv ut («Tekst:», innsending.selvtekst)
skriv ut («Score:», innsending.resultat)
skriv ut(«———————————\n»)

1
2
3

4
5

Det er det. Kjør skriptet, og åpne Reddit i en nettleser samtidig. Sjekk at du får de riktige resultatene.

Neste gang

Neste gang vil vi se På hvordan du sender et svar til et innlegg På Reddit. Neste Del