Construir um Reddit Bot Parte 1
Construir um Reddit Bot Série
Parte 1: Leia as mensagens do reddit
Parte 2: Resposta aos posts
Parte 3: Automatizar o nosso Bot
Parte 4: Marvin, o Deprimido Bot
Introdução
Então, vamos criar um simples tweet Reddit Bot que vai fazer duas coisas:
- Que vai monitorar um determinado subreddit para novos postos de trabalho, e quando alguém postar “eu amo Python”, ele irá responder “eu também!!!”.
-
ele também irá monitorar todos os comentários para posts recentes, e se ele encontrar um que diz “Eu odeio Python”, ele vai postar um link para /R/learnpython e pedir ao comentarista para fazer uma pergunta lá.
conhecimento pré-requisito
apenas um conhecimento básico de Python é necessário, uma vez que construir bots é bastante fácil.
Parte 1
na parte um, veremos como podemos ler os dados do Reddit usando a API Reddit. O código fonte está disponível no Github:
Edit: baseado no comentário do reader Farid:
Reddit actualizou o seu website para uma nova aparência. Se você encontrar um link acima que não funciona, então você terá que mudar a url.
aqui está um exemplo:
acima temos o link http://www.reddit.com/dev/api
No entanto, diz que não foi encontrado. Se mudarmos o link para http://old.reddit.com/dev/api então o link deve funcionar.
em resumo, se um link reddit não funcionar, mude o ” www “para ” velho”, de modo que o link se pareça com “old.reddit.com”
software bot
um software bot é um programa que pode interagir com sites autonomamente. Eles podem ser tão simples ou tão complexos como você quer que eles sejam.
o bot é executado em segundo plano e monitora um site. Quando ele vê uma mudança( como um post no Reddit), ele pode responder a ele, upvote, ou fazer qualquer outra tarefa que foi programado para.
monitorar sites
Existem muitas maneiras de monitorar sites. Você pode usar ferramentas de raspagem web como urllib ou qualquer coisa semelhante. No entanto, há um pequeno problema com isto. Os Bots podem fazer milhares de pedidos por segundo, e isso pode sobrecarregar os servidores. A maioria dos grandes sites banem bots. Ignore isto por sua conta e risco. Fui banido do Google durante horas, bloqueei o meu Gmail até entrar numa dúzia de captachas, o meu telemóvel e o nome do meu primeiro gato.
Se você quiser fazer isso corretamente, siga todas as regras que o site tem.
Reddit API
Reddit fornece uma API, e ao contrário de alguns sites, é realmente muito fácil de usar. Baseia-se no descanso e no json, por isso, em teoria, não requer nenhuma configuração extravagante.
http://www.reddit.com/dev/api
a coisa importante é seguir as regras que eles definem. Dois dos mais importantes são::
- Não pode fazer mais do que 1 pedido a cada 2 segundos (ou 30 por minuto)
- não deve mentir sobre o seu agente de utilizador
Leia o resto aqui.
o agente do utilizador é o que identifica o seu navegador. Bibliotecas como o urlllib do Python são severamente restringidas pelo Reddit para evitar abusos. O Reddit recomenda que use o seu próprio agente especial, e é isso que faremos.
Usando a API
a API é bastante fácil de usar, como eu disse. Você faz um pedido de descanso, e isso pode ser feito através do urllib2 (desde que você configure o agente de usuário corretamente). É assim que o farias. Eu coloquei dois links abaixo. Abrir ambos num novo quadro:
http://www.reddit.com/r/learnPython/
http://www.reddit.com/r/learnPython/hot/.json
O primeiro é como um humano o veria. A segunda é como o seu código vê. Como pode ver, conseguir o json é bastante fácil.
O problema com esta abordagem é que você ainda tem que se certificar de limitar sua taxa de Pedidos. Também tens de analisar o json. Json é fácil de processar em Python, pois é essencialmente um dicionário Python, mas se você realmente olhar para o json, há um monte de dados.
introduzir Praw
Praw é uma biblioteca que corrige muitos desses problemas para você. Limita quantos pedidos você pode fazer, e torna mais fácil extrair o json. Instalá-lo:
1
|
pip install praw
|
o que Você precisa fazer alguma configuração primeiro.
crie uma aplicação Reddit
Go to:https://www.reddit.com/prefs/apps/
e seleccione Criar uma aplicação:
dê-lhe um nome. Você tem que escolher um redirecionamento uri (por alguma razão estúpida, estúpida porque eu estou construindo um bot, não um webapp, mas o que quer que). Eu escolhi http://127.0.0.1
você agora vai ter um client_id (caixa vermelha abaixo) e secret (caixa azul abaixo). Anote, mas mantenha-o em segredo.
agora, você precisa atualizar seu arquivo praw ini para se lembrar dessas configurações. Caso contrário, você terá que colocá-los em seu roteiro e isso é perigoso (como outros podem vê-los).
esta página descreve como mudar praw.ficheiros ini: https://praw.readthedocs.io/en/v4.0.0/getting_started/configuration/prawini.html
irá encontrar o ficheiro na sua pasta de instalação em Python, sob Lib\Site-Packages\praw\praw.ini
Update: como Bryce aponta nos comentários:
I don’t recommend modifying the package-level praw.ini
as those changes will be overwritten every time the package is updated. Em vez disso praw.ini
deve ser colocado no diretório de onde o programa é executado (muitas vezes o mesmo diretório que o arquivo).
outras opções são especificadas aqui: https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html#praw-ini-files
recomendo seguir o Conselho de Bryce.
Add the values we noted down:
client_id and client_secret are what you wrote down. O utilizador e a senha são os detalhes da sua conta (e são opcionais se quiser apenas acesso à leitura).
Existe um novo campo: user_agent.Lembras-te que eu disse que as regras do Reddit dizem que tens de ter um agente de utilizador específico? Estou a escolher o nome PyEng Bot. O número no final é a versão. Isto é recomendado, porque uma vez que o seu código está lá fora, as pessoas podem abusar dele. Se alguém bater no Reddit com o seu código, o Reddit vai banir o agente de utilizador.
nesse caso, basta mover a versão para cima. Não é o ideal, mas tem de aceitar que o seu código pode ser mal utilizado por spammers.vamos rever o código agora. Descarrega – o no Github.
1
|
importar praw
|
fazemos a importação praw.
1
2
3
|
reddit = praw.Reddit(‘bot1’)
subreddit = r.subreddit(“learnpython”)
|
Vamos criar uma Reddit exemplo, usando os valores que são guardados sob bot1.
então nós temos o subreddit learnpython.
agora, se você olhar no subreddit, você pode ver que há uma página quente. Isso não indica a temperatura que há alta ou que existem modelos de macacão. Significa os posts mais populares. É isso que vamos ler agora. A função para fazer isso é get_hot ().
1
|
para apresentação em subreddit.hot (limit=5):
|
recebemos as 5 melhores submissões a quente. Nesta fase, você pode fazer isso para ver quais funções estão disponíveis (você pode fazer isso em qualquer fase, ou olhar para a documentação do Praw).ver uma lista cortada:
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(apresentação)
|
vou apontar alguns importantes. Título é o título, como aparece na página principal do Reddit. Selftext é o texto opcional que você pode colocar em posts-a maioria dos posts não tem estes. learnpython é único em que a maioria dos posts têm texto (geralmente o pôster fazendo sua pergunta), e é por isso que eu escolhi. a pontuação é a pontuação total, somando upvotes e downvotes (ambos também estão disponíveis).estes são os três que vamos imprimir:
1
2
3
4
5
|
para apresentação em subreddit.hot (limit=5):
print (“Title: “, submission.title)
print (“Text:”, submission.selftext)
print(“Score: “, submission.pontuação)
imprimir(“———————————\n”)
|
Que é isso. Execute o script, e abra o Reddit em um navegador ao mesmo tempo. Verifique se você está obtendo os resultados certos.
da próxima vez
da próxima vez veremos como enviar uma resposta para um post no Reddit. Próxima parte