mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-04 21:06:03 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2933d4843f | ||
|
|
c5de978098 | ||
|
|
8b9cfab072 | ||
|
|
ea5f3c222f | ||
|
|
36bcbca15b | ||
|
|
2b2060e71b | ||
|
|
451688f2df | ||
|
|
d993852de7 | ||
|
|
9d73770a4e | ||
|
|
2541acf9d2 |
@@ -82,12 +82,15 @@ default_prompt = {
|
|||||||
# 群内响应规则
|
# 群内响应规则
|
||||||
# 符合此消息的群内消息即使不包含at机器人也会响应
|
# 符合此消息的群内消息即使不包含at机器人也会响应
|
||||||
# 支持消息前缀匹配及正则表达式匹配
|
# 支持消息前缀匹配及正则表达式匹配
|
||||||
|
# 支持设置是否响应at消息、随机响应概率
|
||||||
# 注意:由消息前缀(prefix)匹配的消息中将会删除此前缀,正则表达式(regexp)匹配的消息不会删除匹配的部分
|
# 注意:由消息前缀(prefix)匹配的消息中将会删除此前缀,正则表达式(regexp)匹配的消息不会删除匹配的部分
|
||||||
# 前缀匹配优先级高于正则表达式匹配
|
# 前缀匹配优先级高于正则表达式匹配
|
||||||
# 正则表达式简明教程:https://www.runoob.com/regexp/regexp-tutorial.html
|
# 正则表达式简明教程:https://www.runoob.com/regexp/regexp-tutorial.html
|
||||||
response_rules = {
|
response_rules = {
|
||||||
|
"at": True, # 是否响应at机器人的消息
|
||||||
"prefix": ["/ai", "!ai", "!ai", "ai"],
|
"prefix": ["/ai", "!ai", "!ai", "ai"],
|
||||||
"regexp": [] # "为什么.*", "怎么?样.*", "怎么.*", "如何.*", "[Hh]ow to.*", "[Ww]hy not.*", "[Ww]hat is.*", ".*怎么办", ".*咋办"
|
"regexp": [], # "为什么.*", "怎么?样.*", "怎么.*", "如何.*", "[Hh]ow to.*", "[Ww]hy not.*", "[Ww]hat is.*", ".*怎么办", ".*咋办"
|
||||||
|
"random_rate": 0.0, # 随机响应概率,0.0-1.0,0.0为不随机响应,1.0为响应所有消息, 仅在前几项判断不通过时生效
|
||||||
}
|
}
|
||||||
|
|
||||||
# 消息忽略规则
|
# 消息忽略规则
|
||||||
|
|||||||
28
main.py
28
main.py
@@ -107,6 +107,8 @@ def reset_logging():
|
|||||||
|
|
||||||
|
|
||||||
def main(first_time_init=False):
|
def main(first_time_init=False):
|
||||||
|
"""启动流程,reload之后会被执行"""
|
||||||
|
|
||||||
global known_exception_caught
|
global known_exception_caught
|
||||||
|
|
||||||
import config
|
import config
|
||||||
@@ -203,7 +205,7 @@ def main(first_time_init=False):
|
|||||||
|
|
||||||
pkg.plugin.host.initialize_plugins()
|
pkg.plugin.host.initialize_plugins()
|
||||||
|
|
||||||
if first_time_init: # 不是热重载之后的启动,则不启动新的bot线程
|
if first_time_init: # 不是热重载之后的启动,则启动新的bot线程
|
||||||
|
|
||||||
import mirai.exceptions
|
import mirai.exceptions
|
||||||
|
|
||||||
@@ -292,17 +294,7 @@ def main(first_time_init=False):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.warning("检查更新失败:{}".format(e))
|
logging.warning("检查更新失败:{}".format(e))
|
||||||
|
|
||||||
while True:
|
return qqbot
|
||||||
try:
|
|
||||||
time.sleep(10)
|
|
||||||
if qqbot != pkg.utils.context.get_qqbot_manager(): # 已经reload了
|
|
||||||
logging.info("以前的main流程由于reload退出")
|
|
||||||
break
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
stop()
|
|
||||||
|
|
||||||
print("程序退出")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
@@ -365,4 +357,14 @@ if __name__ == '__main__':
|
|||||||
# pkg.utils.configmgr.set_config_and_reload("quote_origin", False)
|
# pkg.utils.configmgr.set_config_and_reload("quote_origin", False)
|
||||||
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
||||||
|
|
||||||
main(True)
|
qqbot = main(True)
|
||||||
|
|
||||||
|
import pkg.utils.context
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
time.sleep(10)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
stop()
|
||||||
|
|
||||||
|
print("程序退出")
|
||||||
|
sys.exit(0)
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import logging
|
|||||||
|
|
||||||
class ReplyFilter:
|
class ReplyFilter:
|
||||||
sensitive_words = []
|
sensitive_words = []
|
||||||
|
mask = "*"
|
||||||
|
mask_word = ""
|
||||||
|
|
||||||
# 默认值( 兼容性考虑 )
|
# 默认值( 兼容性考虑 )
|
||||||
baidu_check = False
|
baidu_check = False
|
||||||
@@ -14,8 +16,10 @@ class ReplyFilter:
|
|||||||
baidu_secret_key = ""
|
baidu_secret_key = ""
|
||||||
inappropriate_message_tips = "[百度云]请珍惜机器人,当前返回内容不合规"
|
inappropriate_message_tips = "[百度云]请珍惜机器人,当前返回内容不合规"
|
||||||
|
|
||||||
def __init__(self, sensitive_words: list):
|
def __init__(self, sensitive_words: list, mask: str = "*", mask_word: str = ""):
|
||||||
self.sensitive_words = sensitive_words
|
self.sensitive_words = sensitive_words
|
||||||
|
self.mask = mask
|
||||||
|
self.mask_word = mask_word
|
||||||
import config
|
import config
|
||||||
if hasattr(config, 'baidu_check') and hasattr(config, 'baidu_api_key') and hasattr(config, 'baidu_secret_key'):
|
if hasattr(config, 'baidu_check') and hasattr(config, 'baidu_api_key') and hasattr(config, 'baidu_secret_key'):
|
||||||
self.baidu_check = config.baidu_check
|
self.baidu_check = config.baidu_check
|
||||||
@@ -36,7 +40,10 @@ class ReplyFilter:
|
|||||||
match = re.findall(word, message)
|
match = re.findall(word, message)
|
||||||
if len(match) > 0:
|
if len(match) > 0:
|
||||||
for i in range(len(match)):
|
for i in range(len(match)):
|
||||||
message = message.replace(match[i], "*" * len(match[i]))
|
if self.mask_word == "":
|
||||||
|
message = message.replace(match[i], self.mask * len(match[i]))
|
||||||
|
else:
|
||||||
|
message = message.replace(match[i], self.mask_word)
|
||||||
|
|
||||||
# 百度云审核
|
# 百度云审核
|
||||||
if self.baidu_check:
|
if self.baidu_check:
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import pkg.utils.context
|
|||||||
import pkg.plugin.host as plugin_host
|
import pkg.plugin.host as plugin_host
|
||||||
import pkg.plugin.models as plugin_models
|
import pkg.plugin.models as plugin_models
|
||||||
|
|
||||||
|
|
||||||
# 检查消息是否符合泛响应匹配机制
|
# 检查消息是否符合泛响应匹配机制
|
||||||
def check_response_rule(text: str):
|
def check_response_rule(text: str):
|
||||||
config = pkg.utils.context.get_config()
|
config = pkg.utils.context.get_config()
|
||||||
@@ -45,6 +46,22 @@ def check_response_rule(text: str):
|
|||||||
return False, ""
|
return False, ""
|
||||||
|
|
||||||
|
|
||||||
|
def response_at():
|
||||||
|
config = pkg.utils.context.get_config()
|
||||||
|
if 'at' not in config.response_rules:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return config.response_rules['at']
|
||||||
|
|
||||||
|
|
||||||
|
def random_responding():
|
||||||
|
config = pkg.utils.context.get_config()
|
||||||
|
if 'random_rate' in config.response_rules:
|
||||||
|
import random
|
||||||
|
return random.random() < config.response_rules['random_rate']
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 控制QQ消息输入输出的类
|
# 控制QQ消息输入输出的类
|
||||||
class QQBotManager:
|
class QQBotManager:
|
||||||
retry = 3
|
retry = 3
|
||||||
@@ -82,7 +99,12 @@ class QQBotManager:
|
|||||||
and config.sensitive_word_filter is not None \
|
and config.sensitive_word_filter is not None \
|
||||||
and config.sensitive_word_filter:
|
and config.sensitive_word_filter:
|
||||||
with open("sensitive.json", "r", encoding="utf-8") as f:
|
with open("sensitive.json", "r", encoding="utf-8") as f:
|
||||||
self.reply_filter = pkg.qqbot.filter.ReplyFilter(json.load(f)['words'])
|
sensitive_json = json.load(f)
|
||||||
|
self.reply_filter = pkg.qqbot.filter.ReplyFilter(
|
||||||
|
sensitive_words=sensitive_json['words'],
|
||||||
|
mask=sensitive_json['mask'] if 'mask' in sensitive_json else '*',
|
||||||
|
mask_word=sensitive_json['mask_word'] if 'mask_word' in sensitive_json else ''
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.reply_filter = pkg.qqbot.filter.ReplyFilter([])
|
self.reply_filter = pkg.qqbot.filter.ReplyFilter([])
|
||||||
|
|
||||||
@@ -291,14 +313,19 @@ class QQBotManager:
|
|||||||
|
|
||||||
if Image in event.message_chain:
|
if Image in event.message_chain:
|
||||||
pass
|
pass
|
||||||
elif At(self.bot.qq) not in event.message_chain:
|
|
||||||
check, result = check_response_rule(str(event.message_chain).strip())
|
|
||||||
|
|
||||||
if check:
|
|
||||||
reply = process(result.strip())
|
|
||||||
else:
|
else:
|
||||||
# 直接调用
|
if At(self.bot.qq) in event.message_chain and response_at():
|
||||||
reply = process()
|
# 直接调用
|
||||||
|
reply = process()
|
||||||
|
else:
|
||||||
|
check, result = check_response_rule(str(event.message_chain).strip())
|
||||||
|
|
||||||
|
if check:
|
||||||
|
reply = process(result.strip())
|
||||||
|
# 检查是否随机响应
|
||||||
|
elif random_responding():
|
||||||
|
logging.info("随机响应group_{}消息".format(event.group.id))
|
||||||
|
reply = process()
|
||||||
|
|
||||||
if reply:
|
if reply:
|
||||||
return self.send(event, reply)
|
return self.send(event, reply)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
"说明": "mask将替换敏感词中的每一个字,若mask_word值不为空,则将敏感词整个替换为mask_word的值",
|
||||||
|
"mask": "*",
|
||||||
|
"mask_word": "",
|
||||||
"words": [
|
"words": [
|
||||||
"习近平",
|
"习近平",
|
||||||
"胡锦涛",
|
"胡锦涛",
|
||||||
|
|||||||
Reference in New Issue
Block a user