é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:
- egy adott subreddit-et figyel az új bejegyzésekért, és amikor valaki “szeretem a Pythont”, akkor azt válaszolja: “én is!”.
-
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:
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.
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().
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