Articles

construiți un bot Reddit Partea 1

construiți o serie de Bot Reddit

Partea 1: Citiți postări de la reddit

Partea 2: răspundeți la postări

partea 3: Automatizați botul nostru

Partea 4: Marvin botul deprimat

introducere

deci, vom construi un bot Reddit simplu care va face două lucruri:

  1. va monitoriza un anumit subreddit pentru postări noi, iar când cineva postează „îmi place Python”, va răspunde „și eu!”.
  2. de asemenea, va monitoriza toate comentariile la postările recente și, dacă găsește unul care spune „Urăsc Python”, va posta un link către /r/learnpython și va cere comentatorului să pună o întrebare acolo.

cunoștințe prealabile

este necesară doar o cunoaștere de bază a Python, deoarece construirea roboților este destul de ușoară.

Partea 1

în prima parte, vom vedea cum putem citi datele de la Reddit folosind API-ul Reddit. Codul sursă este disponibil la Github:

Edit: pe baza comentariului cititorului Farid:

Reddit și-a actualizat site-ul la un aspect nou. Dacă întâlniți un link de mai sus care nu funcționează, atunci va trebui să schimbați adresa url.

aici este un exemplu:
mai sus avem link-ulhttp://www.reddit.com/dev/api
Cu toate acestea, se spune nu a fost găsit. Dacă schimbăm linkul la http://old.reddit.com/dev/api atunci linkul ar trebui să funcționeze.

pe scurt, în cazul în care un link reddit nu funcționează schimba ” www ” la „vechi”, astfel încât link-ul arata ca „old.reddit.com”

Software bot

un software bot este un program care poate interacționa cu site-urile în mod autonom. Ele pot fi la fel de simple sau complexe pe cât doriți să fie.

botul rulează în fundal și monitorizează un site web. Când vede o schimbare (cum ar fi o postare pe Reddit), poate răspunde la ea, poate vota sau poate face orice altă sarcină pentru care a fost programată.

monitorizarea site-urilor web

există multe modalități de monitorizare a site-urilor web. Puteți utiliza instrumente de razuire web precum urllib sau Beautifulsoup orice ceva similar. Există o mică problemă cu acest lucru, totuși. Roboții pot face mii de solicitări pe secundă, iar acest lucru poate supraîncărca serverele. Deci, majoritatea site-urilor mari interzic roboții. Ignorați acest lucru pe propriul risc. Am fost interzis de la Google de ore, a avut Gmail mea blocat până când am intrat o duzină captachas, telefonul meu mobil și numele de prima mea pisica.

dacă doriți să faceți acest lucru în mod corespunzător, respectați orice reguli pe care le are site-ul web.

Reddit API

Reddit oferă un API și, spre deosebire de unele site-uri web, este de fapt destul de ușor de utilizat. Se bazează pe REST și json, deci teoretic nu necesită nicio configurație fantezistă.

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

important este să respectați regulile pe care le stabilesc. Două dintre cele mai importante sunt:

  • nu puteți face mai mult de 1 solicitare la fiecare 2 secunde (sau 30 pe minut)
  • nu trebuie să mințiți despre agentul dvs. utilizator

Citiți restul aici.

agentul utilizator este ceea ce identifică browserul dvs. Biblioteci precum Python ‘ s urllib sunt sever restricționate de Reddit pentru a preveni abuzul. Reddit vă recomandă să utilizați propriul agent de utilizator special și asta vom face.

utilizarea API-ului

API-ul este destul de ușor de utilizat, așa cum am spus. Faceți o solicitare REST, iar acest lucru se poate face prin urllib2 (atâta timp cât setați corect agentul utilizator). Așa ai face-o. Am pus două link-uri mai jos. Deschideți ambele într-o filă nouă:

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

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

primul este modul în care un om ar vedea-o. Al doilea este modul în care codul dvs. îl vede. După cum puteți vedea, obținerea json este destul de ușoară.

problema cu această abordare este că tot trebuie să vă asigurați că evaluați limita solicitărilor. De asemenea, trebuie să analizați singur json. Json este ușor de analizat în Python, deoarece este în esență un dicționar Python, dar dacă te uiți de fapt la json, există o mulțime de date.

introducerea Praw

Praw este o bibliotecă care rezolvă multe dintre aceste probleme pentru tine. Limitează numărul de solicitări pe care le puteți face și facilitează extragerea json. Instalați-l prin:

1
pip install praw

trebuie să faceți mai întâi o configurare.

Creare aplicație Reddit

mergeți la: https://www.reddit.com/prefs/apps/

și selectați Creare aplicație:

dă-i un nume. Trebuie să alegeți un uri de redirecționare (dintr-un motiv prost, prost pentru că construiesc un bot, nu un webapp, ci orice altceva). Am aleshttp://127.0.0.1

veți primi acum un client_id (caseta roșie de mai jos) și secret (caseta albastră de mai jos). Notați-l, dar păstrați-l secret.

acum, trebuie să actualizați fișierul praw ini pentru a vă aminti aceste setări. În caz contrar, va trebui să le puneți în scenariul dvs. și asta este periculos (așa cum le-ar putea vedea alții).

această pagină descrie modul de schimbare a creveților.fișiere ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

veți găsi fișierul în folderul de instalare Python, sub Lib\Site-Packages\praw\praw.ini

actualizare: după cum subliniază Bryce în comentarii:

nu recomand modificarea nivelului pachetuluipraw.ini deoarece aceste modificări vor fi suprascrise de fiecare dată când pachetul este actualizat. În schimb praw.ini ar trebui plasat în directorul din care este rulat programul (adesea același director ca fișierul).

alte opțiuni sunt specificate aici:https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

vă recomand să urmați sfaturile lui Bryce.

adăugați valorile pe care le-am notat:

client_id și client_secret sunt ceea ce ați scris. Numele de utilizator și parola sunt detaliile contului dvs. (și opțional dacă doriți doar acces numai în citire).

există un câmp nou: user_agent.

amintiți-vă că am spus Regulile Reddit spun că trebuie să aveți un anumit agent de utilizator? Aleg numele PyEng Bot. Numărul de la sfârșit este versiunea. Acest lucru este recomandat, deoarece odată ce codul dvs. este acolo, oamenii ar putea abuza de el. Dacă cineva trimite spam Reddit cu codul dvs., Reddit va interzice acel agent utilizator.

în acest caz, trebuie doar să mutați versiunea în sus. Nu este ideal, dar trebuie să acceptați că codul dvs. poate fi utilizat în mod abuziv de spammeri.

să trecem peste cod acum. Descărcați – l la Github.

1
importă creveți

importăm creveți.

1
2
3

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

creăm o instanță Reddit folosind valorile pe care le-am salvat sub bot1.

apoi vom obține subreddit learnpython.

acum, dacă te uiți pe subreddit, puteți vedea că există o filă fierbinte. Acest lucru nu indică temperatura ridicată sau că există modele de costume de baie pline de spirit. Înseamnă cele mai populare postări. Asta vom citi acum. Funcția de a face acest lucru este get_hot().

1
pentru trimiterea în subreddit.hot (limit=5):

obținem primele 5 trimiteri la cald. În această etapă, puteți face acest lucru pentru a vedea ce funcții sunt disponibile (puteți face acest lucru în orice etapă sau puteți consulta documentația Praw).

vizualizarea unei liste decupate:

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

voi sublinia câteva importante. Titlul este titlul, așa cum apare pe pagina principală a Reddit. Selftext este textul opțional pe care îl puteți pune pe postări – majoritatea postărilor nu au acestea. learnpython este unic prin faptul că majoritatea postărilor au text (de obicei afișul care le pune întrebarea), motiv pentru care l-am ales. scorul este Scorul total, adăugând upvotes și downvotes (ambele din care sunt de asemenea disponibile).

acestea sunt cele trei pe care le vom tipări:

1
2
3
4
5

pentru depunerea în subredit.hot (limită = 5):
imprimare(„Titlu:”, depunere.titlu)
print („Text:”, depunere.selftext)
print(„scor: „, depunere.scor)
imprimare(„———————————\n”)

asta e. Rulați scriptul și deschideți Reddit într-un browser în același timp. Verificați dacă obțineți rezultatele corecte.

data viitoare

data viitoare vom analiza cum să trimitem un răspuns la o postare pe Reddit. Partea următoare