-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
147 lines (123 loc) · 6.47 KB
/
main.py
File metadata and controls
147 lines (123 loc) · 6.47 KB
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
import asyncio
import requests
import re
import os
from aiogram import Bot
from telegram.error import TelegramError
# Инициализация бота
TOKEN = os.getenv("TOKEN")
bot = Bot(token=TOKEN)
# Настройки бота
API_KEY = os.getenv("API_KEY") # API ключ для Redmine из окружения
CHAT_ID = os.getenv("CHAT_ID") # ID чата для отправки уведомлений из окружения
REDMINE_URL = os.getenv("REDMINE_URL") # URL Redmine из окружения
CHECK_INTERVAL = 100 # Интервал проверки (в секундах)
QUERY_ID = 2010 # ID вашей очереди в Redmine
def escape_markdown_v2(text):
"""Экранируем специальные символы для MarkdownV2."""
return re.sub(r'([_*.\[\]()~`>#+\-=|{}.!])', r'\\\1', text)
def priority_to_text(priority_id):
"""ID приоритета > текст."""
if priority_id == 3:
return "⚠️Высокий"
elif priority_id == 4:
return "🚨КРИТИЧЕСКИЙ🚨"
return "Cущественный"
# Функция для получения задач с фильтром по query_id
def get_issues(query_id):
url = f'{REDMINE_URL}/issues.json?query_id={query_id}'
headers = {
'X-Redmine-API-Key': API_KEY,
'Content-Type': 'application/json'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
print(f"Получены задачи: {response.json()}") # Логируем полученные данные
return response.json()
except requests.exceptions.RequestException as e:
print(f"Ошибка при получении задач: {e}")
return None
# Функция для получения последнего пользователя, который изменил параметр assigned_to
def get_last_assigned_user(issue_id):
url = f'{REDMINE_URL}/issues/{issue_id}.json?include=journals'
headers = {
'X-Redmine-API-Key': API_KEY,
'Content-Type': 'application/json'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
journals = response.json().get('issue', {}).get('journals', [])
for journal in reversed(journals): # Идем desc
for detail in journal.get('details', []):
if detail.get('property') == 'attr' and detail.get('name') == 'assigned_to_id':
return journal.get('user', {}).get('name', 'Неизвестный пользователь')
return "Автор"
except requests.exceptions.RequestException as e:
print(f"Ошибка при получении журнала для задачи {issue_id}: {e}")
return "Ошибка при получении данных"
# Функция для извлечения задач if priority_id in [1, 2, 3, 4]
def parse_issues(data):
issues = []
total_count = data['total_count'] # Получаем общее количество задач
for issue in data['issues']:
priority_id = issue['priority']['id']
subject = issue['subject']
status = issue['status']['name']
project = issue['project']['name']
issue_id = issue['id']
issue_url = f'{REDMINE_URL}/issues/{issue_id}'
author = issue.get('author', {}).get('name', 'Неизвестный автор') # Получаем имя автора
if priority_id in [1, 2, 3, 4]: #можно выбирать только высокий или крит
issues.append({
'id': issue_id,
'subject': subject,
'priority_id': priority_id,
'status': status,
'project': project,
'url': issue_url,
'author': author
})
print(f"Отфильтрованные задачи: {issues}")
return issues, total_count
# Функция для отправки
async def send_telegram_message(message):
try:
message = escape_markdown_v2(message) # Экранируем текст перед отправкой
print(f"Отправка сообщения: {message}") # Логирование отправляемого сообщения
await bot.send_message(chat_id=CHAT_ID, text=message, parse_mode='MarkdownV2')
print("Сообщение успешно отправлено.")
except TelegramError as e:
print(f"Ошибка при отправке сообщения в Telegram: {e}")
# функция для отслеживания изменений
async def track_page():
last_issues = [] # Храним предыдущее состояние задач
while True:
data = get_issues(QUERY_ID)
if data:
current_issues, total_count = parse_issues(data)
new_issues = [issue for issue in current_issues if issue not in last_issues]
if new_issues:
message = "Новая задача:\n"
for issue in new_issues:
# Получаем имя последнего пользователя, изменившего assigned_to
last_assigned_user = get_last_assigned_user(issue['id'])
message += (
f"Проект: {issue['project']}\n"
f"Тема: {issue['subject']}\n"
f"Приоритет: {priority_to_text(issue['priority_id'])}\n"
f"Статус: {issue['status']}\n"
f"Автор: {issue['author']}\n" # Добавляем автора задачи
f"Назначил(а): {last_assigned_user}\n"
f"🍏 {issue['url']}\n\n"
)
# тотал
message += f"Всего задач 👉🏻{total_count}"
await send_telegram_message(message)
last_issues.extend(new_issues) # Обновляем список последних задач
else:
print("Изменений не обнаружено.")
await asyncio.sleep(CHECK_INTERVAL) # Задержка перед следующей проверкой
if __name__ == '__main__':
asyncio.run(track_page())