· 6 years ago · Apr 02, 2020, 11:02 AM
1#! /usr/bin/env python
2# -*- coding: utf-8 -*-
3import vk_api
4from vk_api.bot_longpoll import VkBotLongPoll
5from vk_api.utils import get_random_id
6from datetime import datetime, timezone
7import datetime
8import time
9import random
10import pyowm
11import requests, json # Модуль для обработки URL
12from bs4 import BeautifulSoup # Модуль для работы с HTML
13
14vk = vk_api.VkApi(token='3709764b230f73dbf6a6fca9c41e726af8c0e28eff5ea171f2e25d6b5d3761711e9cf46b77cbf3d7c47ba') #токен паблика
15
16class MyVkLongPoll(VkBotLongPoll): # создаю класс чтобы он не терял соединение с сервером вк когда тот перезагружается (перезагружается раз в день где-то глубоко ночью)
17 def listen(self):
18 while True:
19 try:
20 for event in self.check():
21 yield event
22 except Exception as e:
23 print(e) #будет писать в консоль что таймаут произошел, при желании просто впишите сюда pass
24
25bot_id = '193179464' # сюда id паблика
26longpoll = MyVkLongPoll(vk, bot_id)
27log = [
28 '''
29 недавние команды:
30
31 '''
32def send_message(msg):
33 vk.method('messages.send',{'random_id':get_random_id(),'peer_id':event.obj.peer_id,'message':msg})
34
35def game(name, date1,date2,date3):
36 # Значение: datetime.datetime(2017, 4, 5, 0, 18, 51, 980187)
37 now = datetime.datetime.now()
38 then = datetime.datetime(date1,date2,date3)
39 time = then - now
40 days = time.days
41 send_message(str(name) + str(days) + ' days' )
42
43
44def get_id(text): #функция для удобного получения id из всего сообщения
45 split_msg = text.split(' ')
46 for i in split_msg:
47 if 'id' in i:
48 if '-' in i:
49 id = i.split('|')[0].replace('@id-','')
50 return -(int(id))
51 id = i.split('|')[0].replace('[id','')
52 return int(id)
53 elif 'club' in i:
54 id = i.split('|')[0].replace('[club','')
55 return -(int(id))
56 id_from_message = get_id(event.obj.text)
57
58def cryptofunc(URL, clas, btc):
59 BTC = URL
60
61 ist = requests.get(BTC)
62
63 textbtc = ist.text
64
65 soupbtc = BeautifulSoup(textbtc)
66
67 tablebtc3 = soupbtc.findAll("span", {"class": clas})
68
69 send_message(name + str(tablebtc3[0].text))
70
71
72citymoscow = ['moscow','время мск' ,'мск', 'время москва'] #Время Москва UTC + 3
73sityekb = ['ект', 'екб', 'время екатеринбург', 'ekaterinburg', 'время екб'] #Время екб UTC +5
74
75course = ['курсы','курс', 'курсы валют', 'валюта', 'валюты', 'курс доллара', 'доллар', 'usd', 'евро', 'euro', 'курс евро', 'курсы валют', 'Валюта', 'нефть', 'курс нефти', 'oil'] #курсы валют
76kripta = ['крипта','криптовалюта','биткоин','kripta','крипто валюта']
77
78
79tlou2 = ['tlou', 'tlou2', 'тлоу', 'тлоу2']
80gost = ['gost', 'гост', 'тсушима']
81marvel = ['марвел', 'marvel\'s avengers', 'marvels avengers','мстители']
82cyberpunk = ['киперпанк','cyberpunk','cyberpunk 2077']
83
84koronavirus = ['коронавирус', 'covid', 'корона', 'вирус', 'coronavirus', 'мониторинг коронавируса']
85
86
87
88
89
90for event in longpoll.listen(): #начинаем слушать лонгпулл
91 if event.obj:
92 if event.obj.text.lower() in ('комманды', '/комманды', 'commands', '/commands','команды'):
93 send_message('Вот что я умею: \n1. /rand "число1-число2" \n2. Время "город" \n3. Погода "Город" \n4. Курсы валют \n5. Мониторинг коронавируса \
94 \n6. Дата выхода Gost/tlou2/Marvel Avenger\'s/Cyberpunk 2077 \n7.Орёл/Решка')
95 log = log + 'команды, '
96 print(event.obj.text)
97 elif event.obj.text.lower() == 'привет':
98 send_message('привет')
99 print(event.obj.text)
100 elif event.obj.text.lower() == 'пока':
101 send_message('пока')
102 print(event.obj.text)
103 id_from_message = event.obj.from_id
104 ids = get_id(event.obj.text)
105 print(id_from_message)
106 print(ids)
107
108 #elif event.obj.text.lower() == 'kick':
109 #chat_id = int(str(event.obj.peer_id)[-1:])
110 #vk.method('messages.removeChatUser',{'chat_id':chat_id,'member_id':504708567})
111
112 elif event.obj.text.lower() in kripta:
113 log = log + 'курс криптовалюты, '
114 BTC = 'https://www.coingecko.com/ru'
115
116 ist = requests.get(BTC)
117
118 textbtc = ist.text
119
120 soupbtc = BeautifulSoup(textbtc)
121
122 tablebtc = soupbtc.findAll("span", {"class": 'no-wrap'})
123 tablebtc1 = soupbtc.findAll("span", {"data-coin-id": '1'})
124
125 tableeth1 = soupbtc.findAll("span", {"data-coin-id": '279'})
126
127 send_message('BTC = ' + str(tablebtc[0].text) + ' $ ' + '▲' + str(tablebtc1[2].text) + ' за день'\
128 '\n ETH = ' + str(tableeth1[0].text) + ' $ ' + '▲' + str(tableeth1[2].text) + ' за день' )
129
130 elif event.obj.text.lower() in course:
131 log = log + 'курс валют'
132
133 oil = 'https://yandex.ru/news/quotes/1006/'
134 dollar_rub = 'https://yandex.ru/news/quotes/1.html'
135 euro_rub = 'https://yandex.ru/news/quotes/23.html'
136 CNY = 'https://yandex.ru/news/quotes/10018.html'
137 # Парсим всю страницу
138 source1 = requests.get(dollar_rub)
139 source2 = requests.get(euro_rub)
140 source3 = requests.get(oil)
141 source4 = requests.get(CNY)
142
143 main_text1 = source1.text
144 main_text2 = source2.text
145 main_text3 = source3.text
146 main_text4 = source4.text
147 # Разбираем через BeautifulSoup
148 soup1 = BeautifulSoup(main_text1)
149 soup2 = BeautifulSoup(main_text2)
150 soup3 = BeautifulSoup(main_text3)
151 soup4 = BeautifulSoup(main_text4)
152
153 # Получаем нужное для нас значение и возвращаем его
154 table1 = soup1.findAll("td", {"class": "quote__value"})
155 table2 = soup2.findAll("td", {"class": "quote__value"})
156 table3 = soup3.findAll("td", {"class": "quote__value"})
157 table4 = soup4.findAll( "td", { "class": "quote__value" } )
158 #tr = table.find( "span", { "class": "quote__sgn" } )
159
160
161 send_message('Доллар = ' + str(table1[0].text[:5]) + ' рублей' + '\nЕвро = ' + str(table2[0].text[:5]) + ' рублей' +\
162 '\nЮань = ' + str(table4[0].text[:5]) + ' Рублей' + '\n ' + '\nНефть = ' + str(table3[0].text) + ' USD' )
163
164
165 elif event.obj.text.lower() in koronavirus:
166 oil = 'https://dev.by/news/poyavilsya-onlain-servis-dlya-monitoringa-rasprostraneniya-koronavirusa'
167 log = log + 'статистика коронавируса, '
168
169 source = requests.get(oil)
170 main_text = source.text
171 soup = BeautifulSoup(main_text)
172
173 USA = soup.findAll( "", { "class": "data row1 col1"} )
174 ITALIA = soup.findAll( "", { "class": "data row2 col1"} )
175 SPANISH = soup.findAll( "", { "class": "data row3 col1"} )
176 CHINA = soup.findAll( "", { "class": "data row4 col1"} )
177 GERMANY = soup.findAll( "", { "class": "data row5 col1"} )
178 RUSSIA = soup.findAll( "", { "class": "data row32 col1"} )
179 send_message('Заражённых в сша: ' + str(USA[0].text) + '\nЗаражённых в Италии ' + str(ITALIA[0].text)) + '\nЗаражённых в России ' + str(RUSSIA[0].text))
180
181
182
183 elif 'погода' in event.obj.text.lower():
184
185 # Enter your API key here
186 #api_key = "c012abf83e8afdf40810863f64ae8618"
187
188 # base_url variable to store url
189 #base_url = "http://api.openweathermap.org/data/2.5/weather?"
190 # Give city name
191 owm = pyowm.OWM('c012abf83e8afdf40810863f64ae8618', language = 'ru')
192
193 try:
194 city_name = event.obj.text.split(' ')[1:][0] #Получаем всё, что идёт после "погода"
195 log = log + city_name, ', '
196 #pyowm
197 observation = owm.weather_at_place(city_name)
198 w = observation.get_weather()
199 temp = w.get_temperature('celsius')['temp']
200 status = w.get_detailed_status()
201
202 # print following values
203 send_message(" Температура (в цельсиях): " +
204 str(temp) + '°' +
205 #"\n atmospheric pressure (in hPa unit) = " +
206 #str(current_pressure) +
207 #"\n humidity (in percentage) = " +
208 #str(current_humidiy) +
209 "\n Состояние: " +
210 str(status))
211 except:
212 send_message('Город не найден')
213
214
215 elif '/rand' in event.obj.text.lower():
216 spis = event.obj.text.split(' ')[1:] #Получаем всё, что идёт после "рандом"
217 pered = event.obj.text.split(' ')[:1] #Получаем всё, что идёт перед "рандом"
218 log = log + 'рандом', spis, ', '
219 pred = ' '.join(pered)
220
221 if len(spis)>1:
222 send_message('Неправильно набрана команда!')
223 elif pred != '/rand':
224 send_message('ты нахуй пишешь чото перед /rand')
225 continue
226 else:
227 try:
228 first_number = int(spis[0].split('-')[0]) #Получаем первое число деля строку с числами на две
229 second_number = int(spis[0].split('-')[1]) #Получаем второе число
230 random_num = random.randint(first_number, second_number)
231 send_message(str('Рандомное число: ' + str(random_num)))
232 except:
233 send_message('неправильные числа представлены!')
234
235
236
237 elif 'орёл/решка' in event.obj.text.lower():
238 Headstails = random.randint(1,2)
239 log = log + 'орёл/решка, '
240
241 if Headstails == 1:
242 d = 'Орёл'
243 elif Headstails == 2:
244 d = 'Решка'
245 send_message(str(d))
246
247
248
249 elif event.obj.text.lower() in tlou2:
250 game('Until the release of "The Last of Us Part 2" left to wait ' , 2020,5,29)
251 log = log + 'time to release The Last of Us Part 2, '
252
253
254 elif event.obj.text.lower() in gost:
255 game('Until the release of "Ghost of Tsushima" left to wait ', 2020, 6, 26)
256 log = log + 'time to release Ghost of Tsushima, '
257
258 elif event.obj.text.lower() in cyberpunk:
259 game('Until the release of "Cyberpunk 2077" left to wait ', 2020, 9, 17)
260 log = log + 'time to release Cyberpunk 2077, '
261
262 elif event.obj.text.lower() in marvel:
263 game('Until the release of "Marvel\'s Avengers" left to wait ', 2020, 9, 4)
264 log = log + 'time to release marvel, '
265
266
267
268
269
270
271
272
273
274
275 elif 'время' in event.obj.text.lower():
276 utcp3 = ['москва','киров','адлер','азов','анапа','арзамас','балашиха','балахна','белгород','бор','владимир','воронеж',\
277 'вязьма','казань','липецк','пенза','тверь','тамбов','сочи','смоленск','псков','подольск','питер','санкт-петербург','киев','минск','нижний-новгород']
278 time = datetime.datetime.now(timezone.utc)
279 utc3 = time.hour + 3
280 if utc3 > 24:
281 a = utc3 - 24
282 else:
283 a = time.hour + 3
284 st = (str(a) + ':' + str(time.minute) + ':' + str(time.second) )
285
286 spis = event.obj.text.split(' ')[1:] #Получаем всё, что идёт после "время"
287 city_name = ' '.join(spis)
288 city = city_name.lower()
289
290 pered = event.obj.text.split(' ')[:1] #Получаем всё, что идёт перед "время"
291 pered = ' '.join(pered)
292 pered = pered.lower()
293
294 if city in utcp3:
295 send_message('В городе ' + str(city.title()) + ' сейчас: ' + str(st))
296 log = log + str(city , ', ')
297 continue
298 #elif len(spis)
299 elif len(spis) < 3:
300 if pered != 'время':
301 send_message('ты нахуй пишешь чото перед время')
302 continue
303 elif city not in utcp3:
304 send_message('Город не найден!')
305 continue
306
307 print(pered)
308
309
310 #elif event.obj.text.lower() in sityekb:
311
312
313
314
315 elif event.obj.text.lower() == 'кик':
316 log = log + 'кик, '
317 try:
318 chat_id = int(str(event.obj.peer_id)[-1:])
319 user_id = event.obj['reply_message']['from_id']
320 vk.method("messages.removeChatUser", {"chat_id": chat_id ,"user_id": user_id })
321 except Exception as e:
322 print(e)
323
324
325# vk.method('сам метод',{параметры метода})