Articles

Zbuduj bota Reddit Część 1

Zbuduj serię botów Reddit

Część 1: Czytaj posty z reddit

część 2: odpowiadaj na posty

Część 3: zautomatyzuj naszego bota

część 4: Marvin depresyjny Bot

wprowadzenie

więc zbudujemy prostego bota Reddit, który zrobi dwie rzeczy:

  1. będzie monitorował konkretny subreddit pod kątem nowych postów, a kiedy ktoś opublikuje „kocham Pythona”, odpowie „ja też!”.
  2. będzie również monitorować wszystkie komentarze do ostatnich postów, a jeśli znajdzie taki, który mówi „nienawidzę Pythona”, opublikuje link do/R / learnpython i poprosi komentującego, aby zadał tam pytanie.

wymagana wiedza

wymagana jest tylko podstawowa znajomość Pythona, ponieważ budowanie botów jest dość łatwe.

Część 1

w części pierwszej zobaczymy, jak możemy odczytać dane z Reddit za pomocą Reddit API. Kod źródłowy jest dostępny na Githubie:

Edit: na podstawie komentarza czytelnika Farida:

Reddit zaktualizował swoją stronę do nowego wyglądu. Jeśli natkniesz się na link powyżej, który nie działa, będziesz musiał zmienić adres url.

oto przykład:
powyżej mamy linkhttp://www.reddit.com/dev/api
jeszcze nie znaleziono. Jeżeli zmienimy link na http://old.reddit.com/dev/api to link powinien działać.

krótko mówiąc, jeśli link nie działa Zmień „www ” na” Stare”, więc link wygląda jak „old.reddit.com”

Bot programowy

Bot programowy to program, który może samodzielnie współpracować ze stronami internetowymi. Mogą być tak proste lub tak złożone, jak chcesz.

bot działa w tle i monitoruje stronę. Kiedy widzi zmianę (jak post na Reddicie), może na nią odpowiedzieć, upvote lub wykonać inne zadanie, do którego został zaprogramowany.

monitorowanie stron internetowych

istnieje wiele sposobów monitorowania stron internetowych. Możesz użyć narzędzi do skrobania stron internetowych, takich jak urllib lub Beautifulsoup. Jest z tym jednak mały problem. Boty mogą wysyłać tysiące żądań na sekundę, co może przeciążać serwery. Więc większość dużych stron internetowych zakazuje botów. Zignoruj to na własne ryzyko. Zostałem zbanowany z Google przez wiele godzin, mój Gmail został zablokowany, dopóki nie wprowadziłem kilkunastu captachów, mojej komórki i imienia mojego pierwszego kota.

Jeśli chcesz to zrobić poprawnie, trzymaj się wszelkich zasad obowiązujących na stronie.

Reddit API

Reddit zapewnia API, a w przeciwieństwie do niektórych stron internetowych, jest dość łatwy w użyciu. Jest oparty na REST i json, więc teoretycznie nie wymaga żadnych fantazyjnych konfiguracji.

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

ważne jest przestrzeganie ustalonych reguł. Do najważniejszych należą:

  • nie możesz wysłać więcej niż 1 żądania co 2 sekundy (lub 30 na minutę)
  • nie możesz kłamać o swoim agencie użytkownika

przeczytaj resztę tutaj.

agent użytkownika jest tym, co identyfikuje Twoją przeglądarkę. Biblioteki takie jak Urllib Pythona są poważnie ograniczone przez Reddit, aby zapobiec nadużyciom. Reddit zaleca użycie własnego specjalnego agenta użytkownika i to właśnie zrobimy.

Korzystanie z API

API jest dość łatwe w użyciu, jak powiedziałem. Składasz prośbę o odpoczynek i można to zrobić poprzez urllib2 (o ile poprawnie ustawisz user agent). Tak byś to zrobił. Umieściłem dwa linki poniżej. Otwórz oba w nowej karcie:

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

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

pierwszy to jak człowiek by to zobaczył. Drugi to sposób, w jaki widzi go twój kod. Jak widać, uzyskanie json jest dość łatwe.

problem z tym podejściem polega na tym, że nadal musisz upewnić się, że oceniasz limit swoich żądań. Musisz również sam przeanalizować json. Json jest łatwy do przeanalizowania w Pythonie, ponieważ jest to zasadniczo Słownik Pythona, ale jeśli spojrzysz na json, jest wiele danych.

Introducing Praw

Praw jest biblioteką, która rozwiązuje wiele z tych problemów dla Ciebie. Ogranicza liczbę żądań i ułatwia wyodrębnienie json. Zainstaluj go przez:

1
pip install praw

najpierw musisz zrobić konfigurację.

Utwórz aplikację Reddit

przejdź do:https://www.reddit.com/prefs/apps/

i wybierz Utwórz aplikację:

nadaj mu nazwę. Musisz wybrać URI przekierowania (z jakiegoś głupiego powodu, głupi, bo im budowania bota, nie webapp, ale cokolwiek). Wybrałem http://127.0.0.1

otrzymasz teraz client_id (czerwone pole poniżej) i secret (niebieskie pole poniżej). Zanotuj to, ale zachowaj to w tajemnicy.

teraz musisz zaktualizować plik INI praw, aby zapamiętać te ustawienia. W przeciwnym razie będziesz musiał umieścić je w swoim skrypcie i to niebezpieczne (jak inni mogą je zobaczyć).

ta strona opisuje jak zmienić prawo.pliki ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html

plik znajduje się w folderze instalacyjnym Pythona, pod Lib\site-Packages\praw\praw.ini

Update: jak zaznacza Bryce w komentarzach:

nie polecam modyfikowania pakietu praw.ini, ponieważ zmiany te będą nadpisywane za każdym razem, gdy pakiet zostanie zaktualizowany. Zamiast tegopraw.ini powinien być umieszczony w katalogu, z którego program jest uruchamiany (często w tym samym katalogu co plik).

inne opcje są podane tutaj: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files

polecam skorzystanie z porady Bryce ’ a.

Dodaj wartości, które zanotowaliśmy:

client_id i client_secret są tym, co zapisałeś. Nazwa użytkownika i hasło to dane Twojego konta (i opcjonalne, jeśli chcesz mieć dostęp tylko do odczytu).

jest nowe pole: user_agent.

pamiętasz, jak mówiłem, że zasady Reddita mówią, że musisz mieć konkretnego agenta użytkownika? Wybieram nazwę PyEng Bot. Numer na końcu to wersja. Jest to zalecane, ponieważ gdy kod jest już dostępny, ludzie mogą go nadużywać. Jeśli ktoś spamuje Reddita Twoim kodem, Reddit zbanuje tego agenta użytkownika.

w takim razie wystarczy przesunąć wersję w górę. Nie idealny, ale musisz zaakceptować, że Twój kod może być nadużywany przez spamerów.

przejdźmy teraz do kodu. Pobierz go na Github.

1
import praw

importujemy prawa.

Reddit (’bot1′)
subreddit = r.subreddit („learnpython”)

1
2
3

tworzymy instancję Reddit używając wartości zapisanych w bot1.

następnie otrzymujemy subreddit learnpython.

teraz, jeśli spojrzysz na subreddit, zobaczysz, że istnieje gorąca karta. Nie oznacza to, że temperatura jest wysoka lub że istnieją pikantne modele kostiumów kąpielowych. Oznacza to najpopularniejsze posty. To właśnie teraz przeczytamy. Funkcją do tego celu jest get_hot ().

1
do zgłoszenia w subreddicie.hot(limit=5):

otrzymujemy 5 najlepszych gorących zgłoszeń. Na tym etapie możesz to zrobić, aby zobaczyć, które funkcje są dostępne (możesz to zrobić na dowolnym etapie lub przejrzeć dokumentację Praw).

Zobacz listę:

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

reżyser(widok)

wskażę kilka ważnych. Tytuł to tytuł, który pojawia się na stronie głównej Reddita. Selftext jest opcjonalnym tekstem, który możesz umieścić na postach-większość postów ich nie ma. learnpython jest wyjątkowy, ponieważ większość postów ma tekst (Zwykle plakat z pytaniem), dlatego go wybrałem. wynik to całkowity wynik, sumujący upvotes i downvotes (oba są również dostępne).

to są trzy, które wydrukujemy:

1
2
3
4
5

do wysłania do subreddita.hot (ograniczenie = 5):
Drukuj („nagłówek:”, widok.tytuł)
Drukuj („tekst:”, widok.Autotekst)
Drukuj („wynik:”, reprezentacja.ocena)
Drukuj(„———————————\ n”)

To wszystko. Uruchom skrypt i otwórz Reddit w przeglądarce w tym samym czasie. Sprawdź, czy otrzymujesz właściwe wyniki.

następnym razem

następnym razem przyjrzymy się, jak wysłać odpowiedź na post na Reddicie. Następna część