-
Notifications
You must be signed in to change notification settings - Fork 0
/
tweet.py
179 lines (140 loc) · 5.44 KB
/
tweet.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
import tweepy
import environment
def get_keys(keys):
"""
Le em um arquivo cada uma das chaves/tokens de autenticacao fornecidos
pelo Twitter para publicar na conta do bot e armazana esses dados em
um dicionario
"""
with open("secret_user_keys.txt", "r") as user_keys:
for key in environment.keys:
environment.keys[key] = str(user_keys.readline().rstrip())
user_keys.close()
def set_API(keys):
"""
Utiliza as chaves de autenticacao nas funcoes da biblioteca tweepy,
configurando assim todo o codigo necessario para publicar os tweets
no perfil @bot_RU_UFMG
Para uma introducao facil e amigavel a essa biblioteca, veja:
https://tweepy.readthedocs.io/en/latest/getting_started.html#hello-tweepy
"""
auth = tweepy.OAuthHandler(
environment.keys["CONSUMER_KEY"], environment.keys["CONSUMER_SECRET"]
)
auth.set_access_token(
environment.keys["ACCESS_KEY"], environment.keys["ACCESS_SECRET"]
)
api = tweepy.API(auth)
return api
def setup_for_tweet(keys):
"""
Funcao que chamam todas as funcoes necessarias para deixar tudo pronto
para a postagem dos tweets
"""
get_keys(keys)
return set_API(keys)
def tweeta(api, texto_tweet, mais_280_caracteres):
"""
Publica o tweet no perfil do bot (@bot_RU_UFMG), caso tenha mais do que 280
caracteres - i.e. a quantidade maxima de caracteres permitidas por tweet -
divide a postagem em duas e posta como uma curta thread
"""
if not mais_280_caracteres:
api.update_status(texto_tweet)
elif mais_280_caracteres:
# tweet_1 = texto_tweet
print("erro, mais de 280 carac")
print("Tweet publicado com sucesso!")
def elabora_tweet(restaurante, cardapio, almoco, jantar):
"""
Elabora o texto que sera tweetado de acordo com o restaurante em questao,
tipo de refeicao e o cardapio em si. Para melhor visualizacao dos elementos
do cardapio, agrupa eles de acordo com seus tipos - faz deixando uma linha
em branco para separar essas categorias
"""
if restaurante == environment.restaurantes["RU_SETORIAL_I"]:
texto_restaurante = "Cardápio RU Setorial I"
elif restaurante == environment.restaurantes["RU_SETORIAL_II"]:
texto_restaurante = "Cardápio RU Setorial II"
elif restaurante == environment.restaurantes["RU_SAUDE_E_DIREITO"]:
texto_restaurante = "Cardápio Saúde e Direito"
elif restaurante == environment.restaurantes["RU_ICA"]:
texto_restaurante = "Cardápio RU ICA"
# variavel para armazenar somente a parte do cardapio que eh usada no tweet
cardapio_tweet = ""
# lista que determina quais partes do cardapio fazem parte do tweet
partes_tweetaveis = []
if almoco:
partes_tweetaveis = [
"proteina_1",
"proteina_2",
"proteina_3",
"guarnicao",
"sobremesa_1",
"sobremesa_2",
]
almoco_ou_jantar = "Almoço"
elif jantar:
partes_tweetaveis = ["proteina_1", "proteina_3", "guarnicao", "sobremesa_1"]
almoco_ou_jantar = "Jantar"
for elemento in partes_tweetaveis:
cardapio_tweet += cardapio[elemento]
cardapio_tweet += "\n" # pula para a proxima linha
if elemento == "guarnicao":
cardapio_tweet += "\n" # pula mais uma linha para separar as partes
# do cardapio
tweet = texto_restaurante + " - " + almoco_ou_jantar + "\n\n" + cardapio_tweet
return tweet
def confere_tweet(tweet):
"""
Busca pelo texto das tags que indicam os tipos de prato do cardapio, que
sempre deveriam estar presentes. Caso algum desses tipos nao seja
encontrado, adiciona um emoji (⚠️) no tweet para indicar que possivelmente
aquele cardapio pode ter algum dos itens em falta. Depois disso, confere
se o texto original tem mais de 280 caracteres (limite maximo que um tweet
pode ter). Retorna um booleano que indica isso
"""
if environment.almoco:
termos_obrigatorios = [
"Prato protéico 1",
"Prato protéico 2",
"Prato protéico 3",
"Guarnição",
"Sobremesa (uma porção)",
"Sobremesa 2",
]
elif environment.jantar:
termos_obrigatorios = [
"Prato protéico 1",
"Prato protéico 3",
"Guarnição",
"Sobremesa (uma porção)",
]
cardapio_completo = True
for termo_obrigatorio in termos_obrigatorios:
if termo_obrigatorio in tweet:
cardapio_completo = cardapio_completo and True
else:
# se um dos elementos nao esta no cardapio, ele ja esta errado
cardapio_completo = cardapio_completo and False
if not cardapio_completo:
print("cardapio incompleto!")
if environment.almoco:
novo_tweet = (
tweet[: tweet.find("Almoço") + len("Almoço")]
+ " ⚠️"
+ tweet[tweet.find("Almoço") + len("Almoço") :]
)
elif environment.jantar:
novo_tweet = (
tweet[: tweet.find("Jantar") + len("Jantar")]
+ " ⚠️"
+ tweet[tweet.find("Jantar") + len("Jantar") :]
)
else:
novo_tweet = None
if len(tweet) > 282:
mais_280_caracteres = True
else:
mais_280_caracteres = False
return novo_tweet, mais_280_caracteres