Dmtlant commited on
Commit
f1bfa1a
·
verified ·
1 Parent(s): 828b01a

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -0
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()