-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathRobo.py
230 lines (214 loc) · 10.1 KB
/
Robo.py
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
import datetime
import os
import random
import re
import shutil
import time
import pytz
import requests
import tweepy
class Robo:
"""
Este é o robô com suas funções pré-determinadas para efetuar a autenticação e publicação de Tweets com imagens e vídeos.
"""
def __init__(self, nome, versao):
"""
Função chamada ao iniciar o robô, aqui será definido seu nome e sua versão.
"""
super().__init__()
self.nome = nome
self.versao = versao
print("{} ligando na versão {}!".format(self.nome, str(self.versao)))
def __del__(self):
"""
Quando o robô for "deletado" aparecerá uma mensagem.
"""
print("{} desligando...".format(self.nome))
def __repr__(self):
"""
Quando o objeto classe Robo for chamado retornará seu nome e sua versão.
"""
return "{} ({})".format(self.nome, str(self.versao))
def configurar_autenticacao(
self, consumer_key, consumer_secret_key, access_token, access_token_secret
):
"""
Receberá as chaves de autenticação para realizar a autenticação no Twitter.
"""
self.consumer_key = consumer_key
self.consumer_secret_key = consumer_secret_key
self.access_token = access_token
self.access_token_secret = access_token_secret
print("Chaves configuradas com sucesso.")
def iniciar_robo(self):
"""
Irá iniciar o robô com as chaves recebidas, caso ocorra algum erro será mostrado.
"""
autenticacao = tweepy.OAuthHandler(self.consumer_key, self.consumer_secret_key)
autenticacao.set_access_token(self.access_token, self.access_token_secret)
try:
self.api = tweepy.API(autenticacao)
print("Robô iniciado!")
except Exception as e:
print("Ocorreu um erro ao iniciar o robô.")
print("Erro: {}".format(str(e)))
def postar_meme(self):
"""
Ao ser chamada irá selecionar randomicamente algum meme da pasta Memes e irá enviar ao Twitter, em seguida apagará da pasta Memes.
"""
trends = [
trend["name"] for trend in self.api.trends_place(23424768)[0]["trends"][0:5]
]
while True:
memes = os.listdir("Memes")
if len(memes) <= 0:
print("Não há memes para ser postado.")
break
else:
meme_arquivo = random.choice(memes)
try:
twitter_meme_id = self.api.media_upload("Memes/" + meme_arquivo)
self.api.update_status(
status=" ".join(trends),
media_ids=[twitter_meme_id.media_id_string],
)
print("Um meme foi postado.")
os.remove("Memes/" + meme_arquivo)
break
except Exception as e:
print("Não foi possível postar o meme.")
print("Erro: {}".format(str(e)))
os.remove("Memes/" + meme_arquivo)
def mecanismo(self):
"""
Ao ser chamada irá iniciar um evento infinito que irá verificar o horário de acordo com a postagem de memes do iFunny.
Caso o horário bata com a postagem de novos memes no iFunny (08:00, 10:00, 12:00, 14:00, 16:00, 18:00, 20:00, 22:00) irá baixar os 20 novos memes e de 6 em 6 minutos irá postá-los no Twitter.
Por que 6 minutos? Pois no intervalo de 2 horas o iFunny posta 20 memes, ou seja, 2 horas são 120 minutos, 20 memes para serem postados em 2 horas são 120/20 = 6 minutos a cada meme.
"""
self.ifunny = iFunny()
while True:
tempo = datetime.datetime.now()
timezone = pytz.timezone("America/Sao_Paulo")
tempo = tempo.astimezone(timezone)
horarios_ifunny = [8, 10, 12, 14, 16, 18, 20, 22]
minutos_postar = [0, 6, 12, 18, 24, 30, 36, 42, 48, 54]
if (
tempo.hour in horarios_ifunny
and tempo.minute == 0
and tempo.second == 0
):
self.ifunny.pegar_memes()
if tempo.minute in minutos_postar and tempo.second == 0:
self.postar_meme()
class iFunny:
"""
Esta classe está determinada para criar a pasta onde salvar os últimos 20 memes (imagens/vídeos).
"""
def __init__(self):
"""
Ao criar o objeto será verificado a existência da pasta de memes, caso não exista irá cria-la.
Caso a pasta exista, irá deleta-la e apagar todo seu conteúdo.
"""
super().__init__()
if not os.path.exists("Memes"):
os.mkdir("Memes")
else:
shutil.rmtree("Memes")
time.sleep(0.5)
os.mkdir("Memes")
def pegar_memes(self):
"""
Chamando este método irá salvar os últimos 20 memes postados no iFunny BR dentro da pasta Memes.
Caso ocorra algum erro, retornará False, caso contrário, retornará True.
"""
pagina = requests.get(
url="https://br.ifunny.co/",
headers={
"Host": "br.ifunny.co",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-User": "?1",
"Sec-Fetch-Dest": "document",
"Referer": "https://br.ifunny.co/",
},
)
if pagina.status_code == 200:
print("Pegando memes no iFunny.")
memes_id = re.findall(
'<div class="post" data-id="(.*)" data-test', pagina.text
)[0:20]
for meme_id in memes_id:
meme_pagina = requests.get(
url="https://br.ifunny.co/picture/" + meme_id,
headers={
"Host": "br.ifunny.co",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-User": "?1",
"Sec-Fetch-Dest": "document",
"Referer": "https://br.ifunny.co/",
},
)
if meme_pagina.status_code == 200:
meme_imagem_nome = re.search(
'<meta property="og:image" content="https://imageproxy.ifunny.co/crop:x-20,resize:320x,crop:x800,quality:90x75/images/(\w+.jpg)"/>',
meme_pagina.text,
).group(1)
meme_imagem = requests.get(
"https://imageproxy.ifunny.co/crop:x-20/images/"
+ meme_imagem_nome,
stream=True,
)
meme_salvar = open("Memes/" + meme_imagem_nome, "wb")
meme_imagem.raw.decode_content = True
shutil.copyfileobj(meme_imagem.raw, meme_salvar)
meme_salvar.close()
elif meme_pagina.status_code == 404:
try:
meme_pagina = requests.get(
url="https://br.ifunny.co/video/" + meme_id,
headers={
"Host": "br.ifunny.co",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-User": "?1",
"Sec-Fetch-Dest": "document",
"Referer": "https://br.ifunny.co/",
},
)
meme_video_nome = re.search(
'<meta property="og:video:url" content="https://img.ifunny.co/videos/(\w+.mp4)"/>',
meme_pagina.text,
).group(1)
meme_video = requests.get(
"https://img.ifunny.co/videos/" + meme_video_nome,
stream=True,
)
meme_salvar = open("Memes/" + meme_video_nome, "wb")
meme_video.raw.decode_content = True
shutil.copyfileobj(meme_video.raw, meme_salvar)
meme_salvar.close()
except:
pass
else:
print("Ocorreu algum erro ao acessar o iFunny.")
return False
if __name__ == "__main__":
mememaker = Robo(nome="Meme Maker", versao=1.0)
mememaker.configurar_autenticacao(
consumer_key="",
consumer_secret_key="",
access_token="",
access_token_secret="",
)
mememaker.iniciar_robo()
mememaker.mecanismo()