import json
import requests
import telebot
from telebot import types
from requests import request
import re
bot = telebot.TeleBot("TOKEN") #вместо TOKEN вставляем токен от BotFather
@bot.message_handler(commands=["start"]) #здесь, как и раньше, создаем приветствие и две кнопки
def start(message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(types.KeyboardButton("Актуальные параметры"))
keyboard.add(types.KeyboardButton("Прогноз на три дня"))
bot.send_message(message.chat.id, "Какие показатели изволите?", reply_markup=keyboard)
@bot.message_handler(content_types=["text"])
def second(message):
wind_speed = 0 #теперь зададим переменные для расчета времени прибытия солнечного выброса
const_distance = 25000
if message.text == "Актуальные параметры":
try: #завернем все в обработчик ошибок и начнем последовательно ходить в файлы json за данными
a = requests.get("https://services.swpc.noaa.gov/products/summary/solar-wind-speed.json")
speed = json.loads(a.text)
b = requests.get("https://services.swpc.noaa.gov/products/summary/10cm-flux.json")
flux = json.loads(b.text)
c = requests.get("https://services.swpc.noaa.gov/products/summary/solar-wind-mag-field.json")
field = json.loads(c.text)
d = requests.get("https://services.swpc.noaa.gov/products/noaa-scales.json")
storm = json.loads(d.text)
e = requests.get("https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json")
Kp = json.loads(e.text)
with open("params.txt", "w") as f: #запишем данные из json в текстовый файл
f.write(str(speed) + "\n")
f.write(str(flux) + "\n")
f.write(str(field) + "\n")
f.write(str(storm) + "\n")
f.write(str(Kp))
with open("params.txt", "r") as g: #откроем файл для чтения и найдем в нем нужные числа с помощью регулярных выражений
text = g.read()
pattern = r"\d+" #целые положительные числа - это скорость потока, Flux, Bt и G
pattern2 = r"-\d+|\d+" #целое число, которое может быть и отрицательным, и положительным - Bz
pattern3 = r"\d+\.\d+" #дробное положительное число - Kp-индекс
numbers = re.findall(pattern, text)
numbers2 = re.findall(pattern2, text)
numbers3 = re.findall(pattern3, text)
if numbers:
#далее нужно лишь знать, какая цифра на каком месте в файле. Это место указано в квадратных скобках. По порядку: скорость потока, Flux, Bt, Bz, G, Kp-индекс
first_number = numbers[0]
eighth_number = numbers[8]
fifteenth_number = numbers[15]
sixteenth_number = numbers2[16]
thirtythird_number = numbers[33]
last_number = numbers3[-1]
#находим цифры и копируем их в новый текстовый файл, не забыв добавить пояснения для лучшей читаемости
with open("parameters.txt", "w") as h:
h.write(f"Solar Wind Speed: {first_number}" + " km/s" + "\n")
wind_speed = float(first_number)
h.write(f"Flux: {eighth_number}" + " sfu" + "\n")
h.write(f"Bt: {fifteenth_number}" + " nT" + "\n")
h.write(f"Bz: {sixteenth_number}" + " nT" + "\n")
h.write(f"G-Storm: {thirtythird_number}" + "\n")
h.write(f"Kp: {last_number}" + "\n")
h.write("\n" + "Time to Earth: " + str(round(const_distance / wind_speed, 1)) + " minutes" + "\n") #здесь задаем формулу, как описано выше, для расчета времени
with open("parameters.txt", "r") as i: #эта процедура также уже описана выше: добавляем пояснение о том, к северу от какой широты видно сияние при имеющейся магнитной буре
for line in i:
location_vars = {"G-Storm: 0": 65, "G-Storm: 1": 60, "G-storm: 2": 55, "G-Storm: 3": 50, "G-Storm: 4": 45, "G-Storm: 5": 40}
for loc_var in location_vars.keys():
if loc_var in line:
with open("parameters.txt", "a", encoding="utf-8") as i:
i.write(f"Location: north to {location_vars[loc_var]}" + "° when Bz < 0" + "\n")
with open("parameters.txt", "r", encoding="utf-8") as j: #наконец, даем оценку вероятности увидеть полярное сияние в зависимости от Bz:
content = j.read()
with open("parameters.txt", "a", encoding="utf-8") as k:
if re.search(r"Bz: -[1-9] nT", content):
k.write("Low chance to see aurora 😾")
if re.search(r"Bz: -1[0-9] nT", content):
k.write("Good chance to see aurora 😺")
if re.search(r"Bz: -[2-9][0-9]|-100 nT", content):
k.write("WOW! High chance to see aurora! 🙀")
if not re.search(r"-\d+", content):
k.write("No chance to see aurora 😿 (Bz ≥ 0)")
with open("parameters.txt", "r", encoding="utf-8") as l:
m = l.read()
bot.send_message(message.chat.id, text=m)
except:
bot.send_message(message.chat.id, "Ooops, NOAA feels bad. Try again later") #а если на сайте NOAA что-то пойдет не так, выполнение кода не завершится. Просто бот пришлет вот такое сообщение
if message.text == "Прогноз на три дня": #здесь ничего нового. Все описано выше. Разве что тоже добавил обработчик ошибок
try:
n = request("get", "https://services.swpc.noaa.gov/text/3-day-geomag-forecast.txt").text
with open("days.txt", "w") as o:
o.write(n)
with open("days.txt", "r", encoding="utf-8") as p:
lines = p.readlines()
selected_lines = lines[15:25]
bot.send_message(message.chat.id, text="\n".join(selected_lines))
except:
bot.send_message(message.chat.id, "Ooops, NOAA feels bad. Try again later")
bot.polling(none_stop=True)
Статья интересна, но жаль, что не повторю инструкцию. Просто не смогу увидеть полярное сияние(
Рады, что вам понравилось! Уверены, когда-нибудь вы его увидите ❤️🦖
А цена сервера на скрине - это в день?
Александр, здравствуйте! Цена указана за месяц)
Также в панели управления можно посмотреть стоимость за час и день: my.selectel.ru
для жителей лен области полезно будет!