Skip to content

Commit 293d187

Browse files
authored
Prevent Telegram market symbol auto-links
1 parent b821e8c commit 293d187

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/quant_platform_kit/notifications/telegram.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,24 @@
33
from __future__ import annotations
44

55
import json
6+
import re
67
import urllib.parse
78
import urllib.request
89
from collections.abc import Sequence
910
from typing import Any
1011

1112

1213
DEFAULT_TELEGRAM_BOT_API_BASE_URL = "https://api.telegram.org"
14+
_TELEGRAM_MARKET_SYMBOL_LINK_RE = re.compile(r"(?<![A-Za-z0-9_])([A-Z0-9]{1,12})\.([A-Z]{2,4})(?![A-Za-z0-9_])")
15+
_TELEGRAM_MARKET_SYMBOL_LINK_JOINER = "\u2060"
16+
17+
18+
def _break_telegram_market_symbol_auto_links(value: object) -> str:
19+
text = str(value or "")
20+
return _TELEGRAM_MARKET_SYMBOL_LINK_RE.sub(
21+
lambda match: f"{match.group(1)}.{_TELEGRAM_MARKET_SYMBOL_LINK_JOINER}{match.group(2)}",
22+
text,
23+
)
1324

1425

1526
def parse_telegram_chat_ids(raw_value: str | Sequence[str] | None) -> tuple[str, ...]:
@@ -85,7 +96,7 @@ def send_telegram_message(
8596
for chat_id in resolved_chat_ids:
8697
payload: dict[str, object] = {
8798
"chat_id": chat_id,
88-
"text": message,
99+
"text": _break_telegram_market_symbol_auto_links(message),
89100
"disable_web_page_preview": bool(disable_web_page_preview),
90101
}
91102
text_parse_mode = str(parse_mode or "").strip()

tests/test_strategy_plugin_telegram_notifications.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,28 @@ def opener(request, timeout):
7272
self.assertEqual(payload["text"], "危机通知")
7373
self.assertTrue(payload["disable_web_page_preview"])
7474

75+
def test_send_telegram_message_breaks_market_symbol_auto_links(self):
76+
requests = []
77+
78+
def opener(request, timeout):
79+
requests.append((request, timeout))
80+
return _FakeResponse()
81+
82+
sent = send_telegram_message(
83+
text="SOXL.US 预计;00700.HK 持仓;https://example.com 保持原样",
84+
chat_ids=("123",),
85+
bot_token="123456:ABC",
86+
api_base_url="https://telegram.example.test",
87+
opener=opener,
88+
)
89+
90+
self.assertTrue(sent)
91+
payload = json.loads(requests[0][0].data.decode("utf-8"))
92+
self.assertEqual(
93+
payload["text"],
94+
"SOXL.\u2060US 预计;00700.\u2060HK 持仓;https://example.com 保持原样",
95+
)
96+
7597
def test_send_strategy_plugin_telegram_combines_title_and_body(self):
7698
requests = []
7799

0 commit comments

Comments
 (0)