Bygg en Reddit Bot Del 1
Bygg en Reddit Bot Series
Del 1: Läs inlägg från reddit
del 2: svara på inlägg
del 3: automatisera vår bot
Del 4: Marvin den deprimerade bot
Inledning
så vi kommer att bygga en enkel Reddit bot som kommer att göra två saker:
- Det kommer att övervaka en viss subreddit för nya inlägg, och när någon inlägg ”Jag älskar python”, det kommer att svara ”mig också!”.
-
det kommer också att övervaka alla kommentarer till senaste inlägg, och om den hittar en som säger ”jag hatar Python”, kommer den att lägga upp en länk till /r/learnpython och be kommentaren att ställa en fråga där.
förkunskapskunskap
endast en grundläggande kunskap om Python krävs, eftersom det är ganska enkelt att bygga bots.
Del 1
i del ett kommer vi att se hur vi kan läsa data från Reddit med hjälp av Reddit API. Källkoden finns på Github:
redigera: baserat på Kommentar från läsaren Farid:
Reddit har uppdaterat sin webbplats till ett nytt utseende. Om du stöter på en länk ovan som inte fungerar måste du ändra webbadressen.
Här är ett exempel:
ovan har vi länken http://www.reddit.com/dev/api
än, det står inte hittat. Om vi ändrar länken till http://old.reddit.com/dev/api ska länken fungera.
kort sagt, om en reddit-länk inte fungerar, ändra ”www” till ”gammal”, så länken ser ut som ”old.reddit.com”
Software bot
en programvara bot är ett program som kan interagera med webbplatser autonomt. De kan vara så enkla eller så komplexa som du vill att de ska vara.
boten körs i bakgrunden och övervakar en webbplats. När det ser en förändring (som ett inlägg på Reddit) kan det svara på det, upvote eller göra någon annan uppgift som den var programmerad till.
övervaka webbplatser
det finns många sätt att övervaka webbplatser. Du kan använda webbskrapningsverktyg som urllib eller Beautifulsoup något liknande. Det finns dock ett litet problem med detta. Bots kan göra tusentals förfrågningar en sekund, och detta kan överbelasta servrar. Så de flesta stora webbplatser förbjuder bots. Ignorera detta på egen risk. Jag har blivit bannad från Google i timmar, hade min Gmail låst tills jag kom in i ett dussin captachas, min mobil och namnet på min första katt.
om du vill göra det ordentligt, håll dig till alla regler som webbplatsen har.
Reddit API
Reddit tillhandahåller ett API, och till skillnad från vissa webbplatser är det faktiskt ganska enkelt att använda. Den är baserad på REST och json, så i teorin kräver ingen snygg inställning.
http://www.reddit.com/dev/api
det viktiga är att följa de regler de ställer in. Två av de viktigaste är:
- Du kan inte göra mer än 1 begäran var 2: e sekund (eller 30 en minut)
- du får inte ljuga om din användaragent
Läs resten här.
användaragenten är det som identifierar din webbläsare. Bibliotek som Pythons urllib är starkt begränsade av Reddit för att förhindra missbruk. Reddit rekommenderar att du använder din egen speciella användaragent, och det är vad vi ska göra.
använda API
API är ganska lätt att använda, som jag sa. Du gör en VILOFÖRFRÅGAN, och detta kan göras via urllib2 (så länge du ställer in användaragenten korrekt). Så här skulle du göra det. Jag har lagt två länkar nedan. Öppna båda i en ny flik:
http://www.reddit.com/r/learnPython/
http://www.reddit.com/r/learnPython/hot/.json
det första är hur en människa skulle se det. Det andra är hur din kod ser det. Som du kan se är det ganska enkelt att få json.
problemet med detta tillvägagångssätt är att du fortfarande måste se till att du betygsätter begränsa dina önskemål. Du måste också analysera json själv. Json är lätt att tolka i Python, eftersom det i huvudsak är en Python-ordbok, men om du faktiskt tittar på json finns det mycket data.
introduktion Praw
Praw är ett bibliotek som åtgärdar många av dessa problem för dig. Det begränsar hur många förfrågningar du kan göra, och gör det enkelt att extrahera json. Installera det genom att:
1
|
pip installera praw
|
Du måste göra några inställningar först.
skapa Reddit App
gå till: https://www.reddit.com/prefs/apps/
och välj Skapa App:
ge det ett namn. Du måste välja en omdirigerings-uri (av någon dum anledning, dum eftersom jag bygger en bot, inte en webapp, men vad som helst). Jag valde http://127.0.0.1
du får nu en client_id (röd ruta nedan) och hemlig (blå ruta nedan). Notera det, men håll det hemligt.
nu måste du uppdatera din praw ini-fil för att komma ihåg dessa inställningar. Annars måste du lägga dem i ditt manus och det är farligt (som andra kan se dem).
den här sidan beskriver hur du ändrar räkor.ini-filer: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html
Du hittar filen i din Python-installationsmapp under Lib\Site-Packages\praw\praw.ini
uppdatering: som Bryce påpekar i kommentarerna:
Jag rekommenderar inte att ändra paketnivån praw.ini
eftersom dessa ändringar kommer att skrivas över varje gång paketet uppdateras. Istället ska praw.ini
placeras i katalogen som programmet körs från (ofta samma katalog som filen).
andra alternativ anges här: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files
Jag rekommenderar att du följer Bryces råd.
Lägg till värdena vi noterade:
client_id och client_secret är vad du skrev ner. Användarnamn och lösenord är dina kontouppgifter (och valfritt om du bara vill ha skrivskyddad åtkomst).
det finns ett nytt fält: user_agent.
Kom ihåg att jag sa att Reddit-reglerna säger att du måste ha en specifik användaragent? Jag väljer namnet PyEng Bot. Numret i slutet är versionen. Detta rekommenderas, eftersom när din kod är ute, människor kan missbruka den. Om någon spammar Reddit med din kod kommer Reddit att förbjuda den användaragenten.
i så fall flyttar du bara upp versionen. Inte perfekt, men du måste acceptera att din kod kan missbrukas av spammare.
Låt oss gå över koden nu. Ladda ner den på Github.
1
|
importera räkor
|
vi importerar räkor.
1
2
3
|
reddit = räkor.Reddit (’bot1’)
subreddit = r.subreddit(”learnpython”)
|
Vi skapar en Reddit-instans med de värden vi sparade under bot1.
då får vi subreddit learnpython.
Nu, om du tittar på subreddit, du kan se att det finns en het flik. Detta indikerar inte temperaturen där är hög eller att det finns racy baddräktsmodeller. Det betyder de mest populära inläggen. Det är vad vi ska läsa nu. Funktionen för att göra det är get_hot ().
1
|
för inlämning i subreddit.hot (limit = 5):
|
vi får de 5 bästa heta inlämningarna. I detta skede kan du göra detta för att se vilka funktioner som är tillgängliga (du kan göra det när som helst eller titta på Praws dokumentation).
ser en snippad lista:
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(inlämning)
|
jag påpekar några viktiga. Titel är titeln, som den visas på Reddits huvudsida. Selftext är den valfria texten du kan lägga på inlägg – de flesta inlägg har inte dessa. learnpython är unik eftersom de flesta inlägg har text (vanligtvis affischen som ställer sin fråga), varför jag har valt den. score är den totala poängen, lägga upvotes och downvotes (som båda är också tillgängliga).
dessa är de tre vi kommer att skriva ut:
1
2
3
4
5
|
för inlämning i subreddit.hot (gräns = 5):
Skriv ut(”Titel:”, inlämning.title)
Skriv ut (”Text:”, inlämning.självtext)
Skriv ut (”poäng:”, inlämning.score)
Skriv ut(”———————————\n”)
|
det är det. Kör skriptet och öppna Reddit i en webbläsare samtidigt. Kontrollera att du får rätt resultat.
nästa gång
nästa gång kommer vi att titta på hur man skickar ett svar på ett inlägg på Reddit. Nästa del