Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import requests
|
3 |
+
import zeep
|
4 |
+
from datetime import datetime, timedelta
|
5 |
+
import telegram
|
6 |
+
import time
|
7 |
+
|
8 |
+
# Получение токенов
|
9 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
10 |
+
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
|
11 |
+
CHAT_ID = "-4620812399" # Ваш чат Telegram
|
12 |
+
|
13 |
+
# Клиент SOAP для получения RUONIA
|
14 |
+
wsdl_url = 'https://cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'
|
15 |
+
client = zeep.Client(wsdl=wsdl_url)
|
16 |
+
|
17 |
+
def get_ruonia(start_date, end_date):
|
18 |
+
start_str = start_date.strftime('%Y-%m-%d')
|
19 |
+
end_str = end_date.strftime('%Y-%m-%d')
|
20 |
+
try:
|
21 |
+
data = client.service.Ruonia(fromDate=start_str, ToDate=end_str)
|
22 |
+
return data
|
23 |
+
except Exception as e:
|
24 |
+
return []
|
25 |
+
|
26 |
+
def summarize_ruonia(data):
|
27 |
+
summary = []
|
28 |
+
total_rate = 0
|
29 |
+
total_volume = 0
|
30 |
+
for entry in data:
|
31 |
+
date = entry['D0'].strftime('%d.%m.%Y')
|
32 |
+
rate = float(entry['RUONIA'])
|
33 |
+
volume = float(entry['Volume'])
|
34 |
+
total_rate += rate
|
35 |
+
total_volume += volume
|
36 |
+
summary.append(f"📅 {date}: Ставка RUONIA: {rate:.4f}%, Объём: {volume:.2f} млн руб.")
|
37 |
+
avg_rate = total_rate / len(data) if data else 0
|
38 |
+
return "\n".join(summary), avg_rate, total_volume
|
39 |
+
|
40 |
+
def get_weather():
|
41 |
+
url = "https://wttr.in/Moscow?format=3"
|
42 |
+
try:
|
43 |
+
res = requests.get(url)
|
44 |
+
if res.status_code == 200:
|
45 |
+
return res.text
|
46 |
+
else:
|
47 |
+
return "Погода в Москве: не удалось получить данные"
|
48 |
+
except Exception:
|
49 |
+
return "Погода в Москве: ошибка подключения"
|
50 |
+
|
51 |
+
def ask_hf(prompt):
|
52 |
+
headers = {
|
53 |
+
"Authorization": f"Bearer {HF_TOKEN}",
|
54 |
+
"Content-Type": "application/json"
|
55 |
+
}
|
56 |
+
payload = {"inputs": prompt}
|
57 |
+
url = "https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta"
|
58 |
+
try:
|
59 |
+
res = requests.post(url, headers=headers, json=payload, timeout=60)
|
60 |
+
output = res.json()
|
61 |
+
if isinstance(output, list) and "generated_text" in output[0]:
|
62 |
+
return output[0]["generated_text"]
|
63 |
+
else:
|
64 |
+
return "⚠️ Не удалось получить ответ нейросети"
|
65 |
+
except Exception:
|
66 |
+
return "⚠️ Ошибка запроса к HF API"
|
67 |
+
|
68 |
+
def send_telegram_message(text):
|
69 |
+
bot = telegram.Bot(token=TELEGRAM_TOKEN)
|
70 |
+
bot.send_message(chat_id=CHAT_ID, text=text, parse_mode=telegram.ParseMode.HTML)
|
71 |
+
|
72 |
+
def generate_daily_report():
|
73 |
+
today = datetime.today()
|
74 |
+
start = today.replace(day=1)
|
75 |
+
end = today
|
76 |
+
|
77 |
+
ruonia_data = get_ruonia(start, end)
|
78 |
+
ruonia_summary, avg_rate, total_vol = summarize_ruonia(ruonia_data)
|
79 |
+
|
80 |
+
weather = get_weather()
|
81 |
+
|
82 |
+
prompt = (
|
83 |
+
f"Ты — эксперт по экономике и геополитике. Вот данные:\n\n"
|
84 |
+
f"{ruonia_summary}\n\n"
|
85 |
+
f"Погода в Москве: {weather}\n\n"
|
86 |
+
f"Сделай краткий вывод на русском: как это связано с ситуацией в стране и мире, кратко, в 3-4 предложениях."
|
87 |
+
)
|
88 |
+
|
89 |
+
ai_comment = ask_hf(prompt)
|
90 |
+
|
91 |
+
message = (
|
92 |
+
"<b>📰 Экономическая сводка за {}</b>\n\n"
|
93 |
+
"{}\n\n"
|
94 |
+
"📊 Средняя ставка RUONIA: {:.2f}%\n"
|
95 |
+
"💰 Общий объём: {:.2f} млн руб.\n"
|
96 |
+
"🌦️ {}\n\n"
|
97 |
+
"🤖 Мнение нейросети:\n{}\n"
|
98 |
+
).format(end.strftime('%d.%m.%Y'), ruonia_summary, avg_rate, total_vol, weather, ai_comment)
|
99 |
+
|
100 |
+
send_telegram_message(message)
|
101 |
+
|
102 |
+
# Запускаем отправку отчёта
|
103 |
+
if __name__ == "__main__":
|
104 |
+
generate_daily_report()
|