Articles

építsen egy Reddit botot 1. rész

építsen egy Reddit Bot sorozatot

1. rész: olvassa el a reddit bejegyzéseit

2. rész: válasz a bejegyzésekre

3. rész: automatizálja a Botunkat

4. rész: Marvin a depressziós bot

bevezetés

tehát egy egyszerű Reddit botot fogunk építeni, amely két dolgot fog tenni:

  1. egy adott subreddit-et figyel az új bejegyzésekért, és amikor valaki “szeretem a Pythont”, akkor azt válaszolja: “én is!”.
  2. ezenkívül figyelemmel kíséri a legutóbbi hozzászólások összes megjegyzését, és ha talál egyet, amely azt mondja: “utálom a Pythont”, akkor közzétesz egy linket a/r / learnpython-ra, és felkéri a kommentelőt, hogy tegyen fel egy kérdést ott.

előfeltétel ismerete

csak a Python alapvető ismerete szükséges, mivel a botok felépítése meglehetősen egyszerű.

1. rész

az első részben meglátjuk, hogyan olvashatjuk el a Reddit adatait a Reddit API segítségével. A forráskód elérhető Github:

Szerkesztés: Farid olvasó megjegyzése alapján:

a Reddit új megjelenésre frissítette weboldalát. Ha találkozik egy fenti linkkel, amely nem működik, akkor meg kell változtatnia az url-t.

itt van egy példa:
fent van a link http://www.reddit.com/dev/api
még, azt mondja, Nem található. Ha a linket http://old.reddit.com/dev/api értékre változtatjuk, akkor a linknek működnie kell.

röviden, ha egy reddit link nem működik, változtassa meg a ” www ” – t “régi” – re, így a link úgy néz ki, mint “old.reddit.com”

Szoftverbot

a szoftverbot egy olyan program, amely önállóan képes kölcsönhatásba lépni a weboldalakkal. Lehetnek olyan egyszerűek vagy összetettek, amennyit csak akarsz.

a bot a háttérben fut, és figyeli a webhelyet. Amikor változást lát (például egy bejegyzést a Reddit-en), válaszolhat rá, szavazhat, vagy bármilyen más feladatot elvégezhet, amelyre beprogramozták.

webhelyek figyelése

a webhelyek figyelésének számos módja van. Használhat olyan webkaparó eszközöket, mint az urllib vagy a Beautifulsoup, bármi hasonló. Van egy kis probléma ezzel, bár. A botok másodpercenként több ezer kérést tehetnek, ami túlterhelheti a szervereket. Tehát a legtöbb nagy weboldal tiltja a botokat. Hagyja figyelmen kívül ezt a saját felelősségére. Órákra kitiltottak a Google-ból, zárolták a Gmailemet, amíg be nem írtam egy tucat captachát, a mobilomat és az első macskám nevét.

ha ezt megfelelően szeretné megtenni, tartsa be a webhely minden szabályát.

Reddit API

a Reddit egy API-t biztosít, és néhány weboldallal ellentétben valójában nagyon könnyen használható. Ez alapján REST és json, így elméletben nem igényel semmilyen díszes beállítás.

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

a legfontosabb az általuk meghatározott szabályok betartása. A két legfontosabb:

  • nem lehet több, mint 1 kérés 2 másodpercenként (vagy 30 percenként)
  • nem szabad hazudni a felhasználói ügynök

olvassa el a többit itt.

a felhasználói ügynök azonosítja a böngészőt. Az olyan könyvtárakat, mint a Python urllib, a Reddit szigorúan korlátozza a visszaélések megelőzése érdekében. A Reddit azt javasolja, hogy használja a saját speciális felhasználói ügynökét, és ezt fogjuk tenni.

az API használata

az API használata nagyon egyszerű, mint mondtam. REST kérelmet ad meg, és ezt az urllib2-en keresztül lehet megtenni (mindaddig, amíg megfelelően beállítja a felhasználói ügynököt). Így csinálnád. Két linket tettem alább. Nyissa meg mindkettőt egy új lapon:

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

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

az első az, hogy egy ember hogyan látja. A második az, hogy a kód hogyan látja. Mint látható, a json megszerzése meglehetősen egyszerű.

ezzel a megközelítéssel az a probléma, hogy továbbra is meg kell győződnie arról, hogy korlátozza-e kéréseit. Magának is elemeznie kell a json-t. A JSON könnyen elemezhető Pythonban, mivel lényegében Python szótár, de ha valóban megnézi a json-t, akkor sok adat van.

Praw bemutatása

Praw egy könyvtár, amely megoldja ezeket a problémákat az Ön számára. Ez korlátozza, hogy hány kérést tehet, és megkönnyíti a JSON kibontását. Telepítse:

pip install praw

1

először el kell végeznie néhány beállítást.

Reddit alkalmazás létrehozása

ugrás:https://www.reddit.com/prefs/apps/

és válassza az alkalmazás létrehozása lehetőséget:

adj neki egy nevet. Ki kell választania egy átirányítási uri-t (valamilyen hülye okból, hülye, mert botot építek, nem webappot, de bármi mást). Kiválasztottam http://127.0.0.1

most kap egy client_id (piros doboz alatt) és secret (kék doboz alatt). Jegyezze fel, de tartsa titokban.

most frissítenie kell a praw ini fájlt, hogy emlékezzen ezekre a beállításokra. Ellenkező esetben be kell helyeznie őket a szkriptbe, és ez veszélyes (ahogy mások láthatják őket).

Ez az oldal leírja, hogyan kell változtatni garnélarák.ini fájlok: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

a fájlt a Python telepítési mappájában találja, a Lib\Site-Packages\praw\praw alatt.ini

frissítés: amint Bryce rámutat a megjegyzésekben:

nem javaslom a csomagszint módosítását praw.ini mivel ezek a változások felülíródnak minden alkalommal, amikor a csomag frissül. Ehelyett a praw.ini könyvtárba kell helyezni, ahonnan a program fut (gyakran ugyanabba a könyvtárba, mint a fájl).

további opciók itt vannak megadva:https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

azt javaslom, hogy kövesd Bryce tanácsát.

adja hozzá az általunk feljegyzett értékeket:

client_id és client_secret azok, amiket leírtál. A felhasználónév és a jelszó a fiók adatai(és opcionális, ha csak olvasható hozzáférést szeretne).

van egy új mező: user_agent.

emlékszel, hogy azt mondtam, hogy a Reddit szabályai szerint rendelkeznie kell egy adott felhasználói ügynökkel? A PyEng Bot nevet választom. A végén lévő szám a verzió. Ez azért ajánlott, mert ha a kódod ott van, az emberek visszaélhetnek vele. Ha valaki a Reddit-et spameli a kódjával, a Reddit betiltja azt a felhasználói ügynököt.

ebben az esetben csak mozgassa a verziót felfelé. Nem ideális, de el kell fogadnia, hogy a spammerek visszaélhetnek a kóddal.

nézzük át most a kódot. Töltse le a Github-on.

garnélarák importálása
1

garnélarák importálása.

1
2
3

Reddit = garnélarák.Reddit (‘bot1’)
subreddit = r.subreddit(“learnpython”)

létrehozunk egy Reddit példányt a bot1 alatt mentett értékek felhasználásával.

ezután megkapjuk a subreddit learnpythont.

most, ha megnézed a subredditet, láthatod, hogy van egy forró lap. Ez nem jelzi a magas hőmérsékletet, vagy azt, hogy vannak pikáns fürdőruhamodellek. Ez a legnépszerűbb bejegyzéseket jelenti. Ezt fogjuk most olvasni. A funkció erre a get_hot().

a subreddit-ben történő benyújtáshoz.hot (limit=5):
1

megkapjuk az első 5 forró beadványt. Ebben a szakaszban megteheti ezt, hogy megnézze, mely funkciók állnak rendelkezésre (ezt bármelyik szakaszban megteheti, vagy megnézheti a Praw dokumentációját).

egy kivágott lista megtekintése:

1
2
3
4
5
6
7
8
9
10
11

2

3 45

16
17
18
19
20
21
22
23

4

25
26
27
28
dir(submission)

rámutatok néhány fontosra. A cím a cím, amint az a Reddit főoldalán megjelenik. A Selftext az opcionális szöveg, amelyet fel lehet tenni a bejegyzésekbe – a legtöbb bejegyzésben nincs ilyen. a learnpython egyedülálló abban, hogy a legtöbb bejegyzésben van szöveg (általában a poszter kérdezi a kérdésüket), ezért választottam. a pontszám a teljes pontszám, összeadva az upvotes és a downvotes (mindkettő szintén elérhető).

Ezek a három fogunk nyomtatni:

1
2
3
4
5

a subreddit-ben történő benyújtáshoz.hot (limit=5):
nyomtatás(“cím:”, benyújtás.cím)
nyomtatás (“szöveg:”, benyújtás.selftext)
nyomtatás (“pontszám:”, benyújtás.score)
nyomtatás(“———————————\n”)

ennyi. Futtassa a szkriptet, és nyissa meg a Reddit-et egy böngészőben egyszerre. Ellenőrizze, hogy a megfelelő eredményeket kapja-e.

legközelebb

legközelebb megnézzük, hogyan küldhetünk választ egy bejegyzésre a Reddit-en. Következő rész