Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import cn.ppps.forwarder.utils.TYPE_URL_SCHEME
import cn.ppps.forwarder.utils.TYPE_WEBHOOK
import cn.ppps.forwarder.utils.TYPE_WEWORK_AGENT
import cn.ppps.forwarder.utils.TYPE_WEWORK_ROBOT
import cn.ppps.forwarder.utils.TYPE_WXPUSHER
import kotlinx.parcelize.Parcelize
import java.util.Date

Expand Down Expand Up @@ -70,6 +71,7 @@ data class LogsDetail(
TYPE_FEISHU_APP -> R.drawable.icon_feishu_app
TYPE_URL_SCHEME -> R.drawable.icon_url_scheme
TYPE_SOCKET -> R.drawable.icon_socket
TYPE_WXPUSHER -> R.drawable.icon_wxpusher
else -> R.drawable.icon_sms
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import cn.ppps.forwarder.utils.TYPE_URL_SCHEME
import cn.ppps.forwarder.utils.TYPE_WEBHOOK
import cn.ppps.forwarder.utils.TYPE_WEWORK_AGENT
import cn.ppps.forwarder.utils.TYPE_WEWORK_ROBOT
import cn.ppps.forwarder.utils.TYPE_WXPUSHER
import kotlinx.parcelize.Parcelize
import java.util.Date

Expand Down Expand Up @@ -55,6 +56,7 @@ data class Sender(
TYPE_FEISHU_APP -> R.drawable.icon_feishu_app
TYPE_URL_SCHEME -> R.drawable.icon_url_scheme
TYPE_SOCKET -> R.drawable.icon_socket
TYPE_WXPUSHER -> R.drawable.icon_wxpusher
else -> R.drawable.icon_sms
}

Expand Down
10 changes: 8 additions & 2 deletions app/src/main/kotlin/cn/ppps/forwarder/entity/MsgInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ data class MsgInfo(
var newContent = this
val lineArray = regexReplace.split("\\n".toRegex()).toTypedArray()
for (line in lineArray) {
val lineSplit = line.split("===".toRegex()).toTypedArray()
val lineSplit = line.split("===").toTypedArray()
if (lineSplit.isNotEmpty()) {
val regex = lineSplit[0]
val replacement =
Expand All @@ -158,6 +158,11 @@ data class MsgInfo(
}
}

//对外提供正则替换能力:供发送通道对已渲染内容执行 正则===替换 规则(每行一条),如提取验证码
fun applyRegexReplace(content: String, regexReplace: String): String {
return content.regexReplace(regexReplace)
}

//替换标签(支持正则替换)
private fun String.replaceTag(tag: String, info: String, encoderName: String = "", ignoreCase: Boolean = true): String {
var result = when (encoderName) {
Expand All @@ -167,7 +172,8 @@ data class MsgInfo(
}

val tagName = tag.removePrefix("{{").removeSuffix("}}")
val tagRegex = "\\{\\{${tagName}###([^=]+)===(.*?)\\}\\}".toRegex()
//使用 (.+?) 而非 ([^=]+):正则部分可能包含 "=" 字符(如 (?=...) 正向前瞻),([^=]+) 会提前截断导致标签解析失败
val tagRegex = "\\{\\{${tagName}###(.+?)===(.*?)\\}\\}".toRegex()
tagRegex.findAll(result).forEach {
try {
Log.d("MsgInfo", "tagRegex: ${it.value}, ${it.groupValues}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package cn.ppps.forwarder.entity.result

data class WxpusherResult(
var code: Long = 0,
var msg: String = "",
var data: Any? = null,
var success: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ data class WebhookSetting(
val proxyAuthenticator: Boolean = false,
val proxyUsername: String = "",
val proxyPassword: String = "",
val regexReplace: String = "",
) : Serializable {
fun getMethodCheckId(): Int {
return when (method) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package cn.ppps.forwarder.entity.setting

import java.io.Serializable

data class WxpusherSetting(
val appToken: String = "",
val uids: String = "",
val topicIds: String = "",
val spt: String = "",
val contentType: Int = 1,
val summaryTemplate: String = "",
val regexReplace: String = "",
) : Serializable {

//SPT极简推送模式:自己发给自己,无需创建应用
val isSimplePush: Boolean
get() = spt.isNotBlank() && appToken.isBlank()

fun getPushTypeCheckId(): Int {
return if (isSimplePush) cn.ppps.forwarder.R.id.rb_simple_push else cn.ppps.forwarder.R.id.rb_standard_push
}

fun getContentTypeCheckId(): Int {
return when (contentType) {
2 -> cn.ppps.forwarder.R.id.rb_content_html
3 -> cn.ppps.forwarder.R.id.rb_content_markdown
else -> cn.ppps.forwarder.R.id.rb_content_text
}
}
}
10 changes: 10 additions & 0 deletions app/src/main/kotlin/cn/ppps/forwarder/fragment/SendersFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import cn.ppps.forwarder.fragment.senders.UrlSchemeFragment
import cn.ppps.forwarder.fragment.senders.WebhookFragment
import cn.ppps.forwarder.fragment.senders.WeworkAgentFragment
import cn.ppps.forwarder.fragment.senders.WeworkRobotFragment
import cn.ppps.forwarder.fragment.senders.WxpusherFragment
import cn.ppps.forwarder.utils.KEY_SENDER_CLONE
import cn.ppps.forwarder.utils.KEY_SENDER_ID
import cn.ppps.forwarder.utils.KEY_SENDER_TYPE
Expand All @@ -55,6 +56,7 @@ import cn.ppps.forwarder.utils.TYPE_URL_SCHEME
import cn.ppps.forwarder.utils.TYPE_WEBHOOK
import cn.ppps.forwarder.utils.TYPE_WEWORK_AGENT
import cn.ppps.forwarder.utils.TYPE_WEWORK_ROBOT
import cn.ppps.forwarder.utils.TYPE_WXPUSHER
import cn.ppps.forwarder.utils.XToastUtils
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xaop.annotation.SingleClick
Expand Down Expand Up @@ -200,6 +202,13 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(),
CoreAnim.slide,
R.drawable.icon_socket
),
PageInfo(
getString(R.string.wxpusher),
"cn.ppps.forwarder.fragment.senders.WxpusherFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_wxpusher
),
)

override fun viewBindingInflate(
Expand Down Expand Up @@ -354,6 +363,7 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(),
TYPE_FEISHU_APP -> FeishuAppFragment::class.java
TYPE_URL_SCHEME -> UrlSchemeFragment::class.java
TYPE_SOCKET -> SocketFragment::class.java
TYPE_WXPUSHER -> WxpusherFragment::class.java
else -> DingtalkGroupRobotFragment::class.java
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ class WebhookFragment : BaseFragment<FragmentSendersWebhookBinding?>(), View.OnC
binding!!.etSecret.setText(settingVo.secret)
binding!!.etResponse.setText(settingVo.response)
binding!!.etWebParams.setText(settingVo.webParams)
binding!!.etRegexReplace.setText(settingVo.regexReplace)
//set header
for ((key, value) in settingVo.headers) {
addHeaderItemLinearLayout(
Expand Down Expand Up @@ -255,6 +256,7 @@ class WebhookFragment : BaseFragment<FragmentSendersWebhookBinding?>(), View.OnC
val secret = binding!!.etSecret.text.toString().trim()
val response = binding!!.etResponse.text.toString().trim()
val webParams = binding!!.etWebParams.text.toString().trim()
val regexReplace = binding!!.etRegexReplace.text.toString().trim()
val headers = getHeadersFromHeaderItemMap(headerItemMap)

val proxyType: Proxy.Type = when (binding!!.rgProxyType.checkedRadioButtonId) {
Expand All @@ -276,7 +278,7 @@ class WebhookFragment : BaseFragment<FragmentSendersWebhookBinding?>(), View.OnC
throw Exception(getString(R.string.invalid_username_or_password))
}

return WebhookSetting(method, webServer, secret, response, webParams, headers, proxyType, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword)
return WebhookSetting(method, webServer, secret, response, webParams, headers, proxyType, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword, regexReplace)
}


Expand Down
Loading