Articles

het Bouwen van een Reddit Bot Deel 1

het Bouwen van een Reddit Bot-Serie

Deel 1: Lees de berichten van reddit

Deel 2: Antwoorden op berichten

Deel 3: Het automatiseren van onze Bot

Deel 4: Marvin de Depressieve Bot

Inleiding

we gaan Dus naar het bouwen van een eenvoudige Reddit Bot die twee dingen doen:

  1. Het bewaken van een bepaalde subreddit voor nieuwe berichten, en wanneer iemand “ik hou van Python”, zal het antwoord “ik ook!”.
  2. Het zal ook alle commentaren op recente berichten controleren, en als het er een vindt die zegt “Ik haat Python”, zal het een link plaatsen naar /r/learnpython en de commentator vragen om daar een vraag te stellen.

Prerequisite knowledge

alleen een basiskennis van Python is vereist, omdat het bouwen van bots vrij eenvoudig is.

deel 1

in deel 1 zullen we zien hoe we gegevens van Reddit kunnen lezen met behulp van de Reddit API. De broncode is beschikbaar op Github:

bewerken: gebaseerd op commentaar van de lezer Farid:

Reddit heeft zijn website bijgewerkt naar een nieuwe look. Als je boven een link tegenkomt die niet werkt, dan moet je de url wijzigen.

Hier is een voorbeeld:
hierboven hebben we de link http://www.reddit.com/dev/api
nog niet gevonden. Als we de link wijzigen naar http://old.reddit.com/dev/api dan zou de link moeten werken.

In het kort, als een Reddit link niet werkt verander de ” www “naar ” old”, zodat de link eruit ziet als “old.reddit.com”

Software bot

een software bot is een programma dat zelfstandig kan interageren met websites. Ze kunnen zo eenvoudig of zo complex zijn als je wilt dat ze zijn.

De bot draait op de achtergrond en controleert een website. Wanneer het een verandering ziet (zoals een bericht op Reddit), kan het erop reageren, upvote, of een andere taak uitvoeren waarvoor het geprogrammeerd was.

Monitoring websites

Er zijn vele manieren om websites te monitoren. U kunt gebruik maken van web schrapen tools zoals urllib of Beautifulsoup iets dergelijks. Er is echter een klein probleem. Bots kunnen duizenden verzoeken per seconde doen, en dit kan servers overbelasten. Dus de meeste grote websites verbieden bots. Negeer dit op eigen risico. Ik ben verbannen uit Google voor uren, had mijn Gmail vergrendeld tot ik ingevoerd een dozijn captacha’ s, mijn mobiel en de naam van mijn eerste kat.

Als u dit goed wilt doen, houdt u zich dan aan de regels van de website.

Reddit API

Reddit biedt een API, en in tegenstelling tot sommige websites, is het eigenlijk vrij eenvoudig te gebruiken. Het is gebaseerd op rust en json, dus in theorie is er geen dure setup nodig.

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

het belangrijkste is om de regels te volgen die ze instellen. Twee van de belangrijkste zijn:

  • u kunt niet meer dan 1 verzoek doen om de 2 seconden (of 30 per minuut)
  • u mag niet liegen over uw user agent

Lees de rest hier.

de user agent is wat uw browser identificeert. Bibliotheken zoals Python ‘ s urllib zijn streng beperkt door Reddit om misbruik te voorkomen. Reddit raadt u aan uw eigen speciale user agent te gebruiken, en dat is wat we zullen doen.

met behulp van de API

de API is vrij eenvoudig te gebruiken, zoals ik al zei. Je doet een RUSTVERZOEK, en dit kan via urllib2 (zolang je de user agent correct instelt). Dit is hoe je het zou doen. Ik heb twee links hieronder gezet. Open beide in een nieuw tabblad:

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

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

de eerste is hoe een mens het zou zien. De tweede is hoe je code het ziet. Zoals je kunt zien, is het krijgen van de json vrij eenvoudig.

het probleem met deze aanpak is dat u er nog steeds voor moet zorgen dat u uw aanvragen beperkt. Je moet ook de json zelf ontleden. Json is gemakkelijk te ontleden in Python, omdat het in wezen een Python woordenboek is, maar als je echt naar de json kijkt, zijn er veel gegevens.

De introductie van Praw

Praw is een bibliotheek die veel van deze problemen voor u oplost. Het beperkt hoeveel verzoeken je kunt maken, en maakt het gemakkelijk om de JSON extraheren. Het installeren met:

1
pip installeren praw

U hoeft te doen sommige setup eerste.

Create Reddit App

Ga naar: https://www.reddit.com/prefs/apps/

en selecteer App Maken:

geef het een naam. Je moet een redirect uri kiezen (om een of andere stomme reden, dom omdat Im het bouwen van een bot, geen webapp, maar wat dan ook). Ik koos http://127.0.0.1

u krijgt nu een client_id (rood kader hieronder) en geheim (blauw kader hieronder). Noteer het, maar hou het geheim.

nu moet u uw praw INI-bestand bijwerken om deze instellingen te onthouden. Anders moet je ze in je script zetten en dat is gevaarlijk (zoals anderen ze zouden kunnen zien).

deze pagina beschrijft hoe praw te veranderen.ini-bestanden: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

u vindt het bestand in uw Python installatiemap, onder Lib\Site-Packages\praw\praw.ini

Update: zoals Bryce aangeeft in de commentaren:

adviseer ik niet om het pakketniveau te wijzigen praw.ini omdat deze wijzigingen worden overschreven elke keer dat het pakket wordt bijgewerkt. In plaats daarvan moet praw.ini in de map worden geplaatst waaruit het programma wordt uitgevoerd (vaak dezelfde map als het bestand).

andere opties zijn hier gespecificeerd: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

Ik adviseer Bryce ‘ s advies te volgen.

voeg de waarden toe die we hebben genoteerd:

client_id en client_secret zijn wat je hebt opgeschreven. Gebruikersnaam en wachtwoord zijn uw accountgegevens (en optioneel als u alleen leestoegang wilt).

Er is een nieuw veld: user_agent.

Weet je nog dat ik zei dat de Reddit regels zeggen dat je een specifieke user agent moet hebben? Ik kies de naam PyEng Bot. Het nummer aan het einde is de versie. Dit wordt aanbevolen, want als je code eenmaal beschikbaar is, kunnen mensen er misbruik van maken. Als iemand Reddit spamt met jouw code, zal Reddit die user agent verbieden.

in dat geval verplaats je gewoon de versie naar boven. Niet ideaal, maar je moet accepteren dat je code misbruikt kan worden door spammers.

laten we nu de code doornemen. Download het bij Github.

1
importeren praw

Wij importeren praw.

1
2
3

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

We maken een Reddit instantie met behulp van de waarden die we opgeslagen hebben onder bot1.

dan krijgen we de subreddit learnpython.

nu, als je op de subreddit kijkt, kun je zien dat er een hot tab is. Dit geeft niet aan dat de temperatuur daar hoog is of dat er pikante badpak modellen zijn. Het betekent de meest populaire berichten. Dat gaan we nu lezen. De functie om dit te doen is get_hot().

1
voor indiening in subreddit.hot (limit = 5):

we krijgen de top 5 hot inzendingen. In dit stadium kunt u dit doen om te zien welke functies beschikbaar zijn (u kunt dat doen in elk stadium, of kijk naar Praw ‘ s documentatie).

het zien van een gesnipte lijst:

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

Ik zal een paar belangrijke aanwijzen. Titel is de titel, zoals het verschijnt op Reddit ‘ s hoofdpagina. Selftext is de optionele tekst die je op berichten kunt zetten – de meeste berichten hebben deze niet. learnpython is uniek in dat de meeste berichten hebben tekst (meestal de poster stellen hun vraag), dat is waarom ik heb gekozen. score is de totale score, optellen van upvotes en downvotes (die beide ook beschikbaar zijn).

Dit zijn de drie die we zullen afdrukken:

1
2
3
4
5

voor de indiening in subreddit.hot (limit = 5):
print(“Title:”, submission.titel)
print (“Text:”, submission.selftext)
print (“Score:”, submission.score)
afdrukken(“———————————\n”)

dat is het. Voer het script uit en open Reddit tegelijkertijd in een browser. Controleer of u de juiste resultaten krijgt.

De volgende keer

de volgende keer zullen we kijken hoe we een antwoord kunnen sturen naar een post op Reddit. Volgend deel