Articles

Vytvořit Reddit Bot, Část 1

Vytvořit Reddit Bot Série

Část 1: Přečtěte si příspěvky od reddit

Část 2: Odpovědi na příspěvky

Část 3: Automatizovat naše Bot

Část 4: Marvin Depresivní Bot

Úvod

Tak jsme se chystáte stavět jednoduché Reddit Bot, který bude dělat dvě věci:

  1. To bude sledovat konkrétní subreddit pro nové příspěvky, a když někdo napíše „mám rád Python“, odpoví „Já taky!“.
  2. To bude také sledovat všechny komentáře k poslední příspěvky, a pokud to najde jeden, který říká, „nenávidím Python“, to bude post odkaz na /r/learnpython a požádat komentátor se zeptat tam.

předpoklad znalosti

je vyžadována pouze základní znalost Pythonu, protože vytváření robotů je poměrně snadné.

Část 1

v první části uvidíme, jak můžeme číst data z Redditu pomocí rozhraní Reddit API. Zdrojový kód je k dispozici na adrese Github:

upravit: na základě komentáře čtenáře Farid:

Reddit aktualizoval svůj web na nový vzhled. Pokud narazíte na výše uvedený odkaz, který nefunguje, budete muset změnit adresu url.

zde je příklad:
Výše máme odkaz http://www.reddit.com/dev/api
přesto se říká, že nebyl nalezen. Pokud změníme odkaz na http://old.reddit.com/dev/api, měl by odkaz fungovat.

stručně řečeno, pokud reddit link nefunguje změnit „www“ na „starý“, takže odkaz vypadá „old.reddit.com“

Software bot

software bot je program, který může komunikovat s webové stránky samostatně. Mohou být tak jednoduché nebo tak složité, jak chcete.

bot běží na pozadí a monitoruje webové stránky. Když vidí změnu (jako příspěvek na Redditu), může na ni odpovědět, upvote nebo provést jakýkoli jiný úkol, na který byl naprogramován.

monitorování webových stránek

existuje mnoho způsobů, jak sledovat webové stránky. Můžete použít nástroje pro stírání webu, jako je urllib nebo Beautifulsoup, cokoli podobného. S tím je však malý problém. Boti mohou provádět tisíce požadavků za sekundu, což může přetížit servery. Takže většina velkých webů zakazuje roboty. Ignorujte to na vlastní nebezpečí. Byl jsem zakázán od Googlu celé hodiny, měl jsem Gmail zamčený, dokud jsem nevstoupil tucet captachas, můj mobil a jméno mé první kočky.

Pokud to chcete udělat správně, dodržujte všechna pravidla, která má web.

Reddit API

Reddit poskytuje API, a na rozdíl od některých webových stránek, je to vlastně docela snadné použití. Je založen na REST a json, takže teoreticky nevyžaduje žádné fantastické nastavení.

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

důležité je dodržovat pravidla stanovují. Dva z nejdůležitějších jsou:

  • nemůžete udělat více než 1 žádost každé 2 sekundy (nebo 30 minut)
  • nesmí lhát o vašem user agent

Přečtěte si zbytek tady.

uživatelský agent identifikuje váš prohlížeč. Knihovny, jako je Urlib Pythonu, jsou redditem přísně omezeny, aby se zabránilo zneužití. Reddit doporučuje používat vlastní speciální User agent, a to je to, co uděláme.

pomocí API

API je poměrně snadné použití, jak jsem řekl. Provedete REST request, a to lze provést pomocí urllib2 (pokud správně nastavíte agenta uživatele). Takhle bys to udělal. Dal jsem dva odkazy níže. Otevřete obě na nové kartě:

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

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

první je, jak by to člověk viděl. Druhým je, jak to vidí váš kód. Jak vidíte, získání json je poměrně snadné.

problém s tímto přístupem spočívá v tom, že se stále musíte ujistit, že ohodnotíte omezení svých požadavků. Musíte také analyzovat json sami. Json se snadno analyzuje v Pythonu, protože je to v podstatě slovník Pythonu, ale pokud se skutečně podíváte na json, existuje spousta dat.

Představujeme Praw

Praw je knihovna, která řeší mnoho z těchto problémů pro vás. Omezuje, kolik požadavků můžete provést, a usnadňuje extrahování json. Nainstalujte jej tím, že:

1
pip nainstalovat praw

Budete muset udělat nějaké nastavení jako první.

vytvořit aplikaci Reddit

přejděte na: https://www.reddit.com/prefs/apps/

a vyberte Vytvořit aplikaci:

dejte mu jméno. Musíte si vybrat přesměrování uri (z nějakého hloupého důvodu, hloupý, protože im budování bot, ne webapp, ale cokoliv). Vybral jsem http://127.0.0.1

nyní získáte client_id (červený rámeček níže) a secret (modrý rámeček níže). Poznamenejte si to, ale udržujte to v tajnosti.

nyní musíte aktualizovat soubor praw ini, abyste si tato nastavení zapamatovali. Jinak je budete muset vložit do skriptu a to je nebezpečné (jak je mohou vidět ostatní).

Tato stránka popisuje, jak změnit praw.INI soubory: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

soubor najdete ve složce instalace Pythonu pod položkou Lib \ Site-Packages\praw\praw.ini

Update: Jako Bryce upozorňuje na to v komentářích:

nedoporučuji úpravy obalu-level praw.ini jak tyto změny budou přepsány pokaždé, když balíček je aktualizován. Místo toho praw.ini by měl být umístěn v adresáři, ze kterého je program spuštěn (často stejný adresář jako soubor).

Další možnosti jsou uvedeny zde: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

doporučuji následující Bryce radu.

přidejte hodnoty, které jsme zaznamenali:

client_id a client_secret jsou to, co jste si zapsali. Uživatelské jméno a heslo jsou údaje o vašem účtu (a volitelné, pokud chcete přístup pouze pro čtení).

je zde nové pole: user_agent.

pamatujte, že jsem řekl, že pravidla Reddit říkají, že musíte mít konkrétního agenta uživatele? Volím jméno PyEng Bot. Číslo na konci je verze. To se doporučuje, protože jakmile je váš kód venku, lidé by ho mohli zneužít. Pokud někdo spamuje Reddit s vaším kódem, Reddit tento uživatelský agent zakáže.

v takovém případě stačí posunout verzi nahoru. Není to ideální, ale musíte přijmout, že váš kód může být zneužit spammery.

pojďme nyní přes kód. Stáhněte si ji na Githubu.

1
import praw

zabýváme se dovozem praw.

1
2
3

reddit = praw.Reddit(‚bot1‘)
subreddit = r.subreddit(„learnpython“)

vytvoříme Reddit instance pomocí hodnoty jsme uložili pod bot1.

pak dostaneme subreddit learnpython.

Nyní, když se podíváte na subreddit, můžete vidět, že existuje horká karta. To neznamená, že je vysoká teplota nebo že existují pikantní modely plavek. To znamená nejoblíbenější příspěvky. To je to, co teď budeme číst. Funkce k tomu je get_hot().

1
pro podání v subreddit.horké(limit=5):

top 5 sexy podání. V této fázi to můžete udělat, abyste zjistili, které funkce jsou k dispozici (můžete to udělat v kterékoli fázi nebo se podívat na dokumentaci Praw).

zobrazení vyříznutého seznamu:

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(předložení)

upozorním na několik důležitých. Název je název, jak se objevuje na hlavní stránce Redditu. Selftext je volitelný text, který můžete umístit na příspěvky-většina příspěvků je nemá. learnpython je jedinečný v tom, že většina příspěvků má text (obvykle plakát, který se ptá na jejich otázku), a proto jsem si to vybral. skóre je celkové skóre, přidání upvotes a downvotes (oba jsou také k dispozici).

toto jsou tři, které vytiskneme:

1
2
3
4
5

pro podání v subreddit.hot (limit=5):
print („Title:“, podání.název)
tisk („Text:“, podání.selftext)
print („Score:“, submission.skóre)
tisk(„———————————\n“)

to je to. Spusťte skript a současně otevřete Reddit v prohlížeči. Zkontrolujte, zda máte správné výsledky.

příště

příště se podíváme na to, jak poslat odpověď na příspěvek na Redditu. Další část