优化:Telegram 发送通道支持 MarkdownV2解析模式 #570

This commit is contained in:
pppscn 2025-03-02 21:52:41 +08:00
parent 44728b858a
commit 0391868790
8 changed files with 111 additions and 13 deletions

View File

@ -14,6 +14,7 @@ data class TelegramSetting(
val proxyAuthenticator: Boolean = false,
val proxyUsername: String = "",
val proxyPassword: String = "",
val parseMode: String = "HTML",
) : Serializable {
fun getMethodCheckId(): Int {
@ -27,4 +28,12 @@ data class TelegramSetting(
else -> R.id.rb_proxyNone
}
}
fun getParseModeCheckId(): Int {
return when (parseMode) {
"TEXT" -> R.id.rb_parse_mode_text
"MarkdownV2" -> R.id.rb_parse_mode_markdown
else -> R.id.rb_parse_mode_html
}
}
}

View File

@ -133,6 +133,7 @@ class TelegramFragment : BaseFragment<FragmentSendersTelegramBinding?>(), View.O
binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true
binding!!.etProxyUsername.setText(settingVo.proxyUsername)
binding!!.etProxyPassword.setText(settingVo.proxyPassword)
binding!!.rgParseMode.check(settingVo.getParseModeCheckId())
}
}
})
@ -251,8 +252,13 @@ class TelegramFragment : BaseFragment<FragmentSendersTelegramBinding?>(), View.O
}
val method = if (binding!!.rgMethod.checkedRadioButtonId == R.id.rb_method_get) "GET" else "POST"
val parseMode = when (binding!!.rgParseMode.checkedRadioButtonId) {
R.id.rb_parse_mode_text -> "TEXT"
R.id.rb_parse_mode_markdown -> "MarkdownV2"
else -> "HTML"
}
return TelegramSetting(method, apiToken, chatId, proxyType, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword)
return TelegramSetting(method, apiToken, chatId, proxyType, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword, parseMode)
}
override fun onDestroyView() {

View File

@ -58,13 +58,29 @@ class TelegramUtils private constructor() {
val request = if (setting.method == "GET") {
requestUrl += "?chat_id=" + setting.chatId + "&text=" + URLEncoder.encode(content, "UTF-8")
if (setting.parseMode.isNotEmpty() && setting.parseMode != "TEXT") {
requestUrl += "&parse_mode=" + setting.parseMode
}
Log.i(TAG, "requestUrl:$requestUrl")
XHttp.get(requestUrl)
} else {
val bodyMap: MutableMap<String, Any> = mutableMapOf()
bodyMap["chat_id"] = setting.chatId
bodyMap["text"] = content
bodyMap["parse_mode"] = "HTML"
when (setting.parseMode) {
"MarkdownV2" -> {
bodyMap["parse_mode"] = "MarkdownV2"
bodyMap["text"] = escapeMarkdownV2(content)
}
"HTML" -> {
bodyMap["parse_mode"] = "HTML"
bodyMap["text"] = content
}
else -> {
bodyMap["text"] = content
}
}
bodyMap["disable_web_page_preview"] = "true"
val requestMsg: String = Gson().toJson(bodyMap)
Log.i(TAG, "requestMsg:$requestMsg")
@ -155,5 +171,18 @@ class TelegramUtils private constructor() {
}
return buffer.toString()
}
// 用于转义 MarkdownV2 特殊字符的方法
private fun escapeMarkdownV2(text: String): String {
// TODO: MarkdownV2 要求转义以下字符,实测不能全部转义(丢失格式)
//val specialChars = listOf('_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!')
val specialChars = listOf('-')
var escapedText = text
for (char in specialChars) {
// 将每个字符替换为带反斜杠的形式
escapedText = escapedText.replace(char.toString(), "\\$char")
}
return escapedText
}
}
}

View File

@ -102,6 +102,44 @@
</LinearLayout>
<LinearLayout
style="@style/BarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/parse_mode"
android:textStyle="bold" />
<RadioGroup
android:id="@+id/rg_parse_mode"
style="@style/rg_style"
android:layout_marginStart="5dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_parse_mode_text"
style="@style/rg_rb_style"
android:text="@string/parse_mode_text" />
<RadioButton
android:id="@+id/rb_parse_mode_html"
style="@style/rg_rb_style"
android:checked="true"
android:text="@string/parse_mode_html" />
<RadioButton
android:id="@+id/rb_parse_mode_markdown"
style="@style/rg_rb_style"
android:text="@string/parse_mode_markdown" />
</RadioGroup>
</LinearLayout>
<LinearLayout
style="@style/BarStyle"
android:layout_width="match_parent"

View File

@ -309,6 +309,10 @@
<string name="TelegramApiToken">ApiToken or Custom Proxy Address (startwith http)</string>
<string name="TelegramChatId">ChatId</string>
<string name="Method" formatted="false">Method</string>
<string name="parse_mode">Parse Mode</string>
<string name="parse_mode_text">Text</string>
<string name="parse_mode_html">Html</string>
<string name="parse_mode_markdown">MarkdownV2</string>
<string name="SmsSimSlot">SIM Slot</string>
<string name="same_source">Same source</string>

View File

@ -310,6 +310,10 @@
<string name="TelegramApiToken">ApiToken 或 自定义代理地址(http开头)</string>
<string name="TelegramChatId">被通知人(或群组)的ChatId</string>
<string name="Method" formatted="false">请求方式</string>
<string name="parse_mode">解析模式</string>
<string name="parse_mode_text">Text</string>
<string name="parse_mode_html">Html</string>
<string name="parse_mode_markdown">MarkdownV2</string>
<string name="SmsSimSlot">发送卡槽</string>
<string name="same_source">原进原出</string>

View File

@ -218,8 +218,14 @@
<string name="switch_rule_status">啟用該條轉發規則</string>
<string name="invalid_match_value">匹配的值不可為空</string>
<string name="invalid_call_type">通話類型不正確只能填寫1到6的任意一個數字</string>
<!--SenderActivity-->
<string name="mon">星期一</string>
<string name="tue">星期二</string>
<string name="wed">星期三</string>
<string name="thu">星期四</string>
<string name="fri">星期五</string>
<string name="sat">星期六</string>
<string name="sun">星期日</string>
<!--SenderActivity-->
<string name="delete_sender_title">發送通道操作確認</string>
<string name="delete_sender_tips">刪除發送通道後會級聯刪除其相關的轉發規則、轉發日誌的所有記錄!\n\n確定刪除該條發送通道</string>
<string name="delete_sender_toast">該條發送通道已經刪除!</string>
@ -304,6 +310,10 @@
<string name="TelegramApiToken">ApiToken 或 自定義代理地址(http開頭)</string>
<string name="TelegramChatId">被通知人(或群組)的ChatId</string>
<string name="Method" formatted="false">請求方式</string>
<string name="parse_mode">解析模式</string>
<string name="parse_mode_text">Text</string>
<string name="parse_mode_html">Html</string>
<string name="parse_mode_markdown">MarkdownV2</string>
<string name="SmsSimSlot">發送卡槽</string>
<string name="same_source">原進原出</string>
@ -1180,10 +1190,4 @@
<string name="start_discovery">搜索裝置</string>
<string name="invalid_bluetooth_mac_address">藍牙裝置MAC地址無效例如AA:BB:CC:DD:EE:FF</string>
<string name="auto_start_redmi"><![CDATA[紅米手機:授權管理 -> 自啟動管理 -> 允許應用自啟動]]></string>
<string name="mon">星期一</string>
<string name="tue">星期二</string>
<string name="wed">星期三</string>
<string name="thu">星期四</string>
<string name="fri">星期五</string>
<string name="sat">星期六</string>
</resources>

View File

@ -339,6 +339,10 @@
<string name="TelegramApiToken">ApiToken 或 自定义代理地址(http开头)</string>
<string name="TelegramChatId">被通知人(或群组)的ChatId</string>
<string name="Method" formatted="false">请求方式</string>
<string name="parse_mode">解析模式</string>
<string name="parse_mode_text">Text</string>
<string name="parse_mode_html">Html</string>
<string name="parse_mode_markdown">MarkdownV2</string>
<string name="SmsSimSlot">发送卡槽</string>
<string name="same_source">原进原出</string>