支持修改已添加的主播以及自定义打招呼信息
This commit is contained in:
47
.idea/workspace.xml
generated
47
.idea/workspace.xml
generated
@@ -5,8 +5,10 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="eceeff5e-51c1-459c-a911-d21ec090a423" name="Changes" comment="ai 开始测试">
|
<list default="true" id="eceeff5e-51c1-459c-a911-d21ec090a423" name="Changes" comment="ai 开始测试">
|
||||||
<change afterPath="$PROJECT_DIR$/tidevice_entry.py" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Entity/AnchorModel.py" beforeDir="false" afterPath="$PROJECT_DIR$/Entity/AnchorModel.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Entity/Variables.py" beforeDir="false" afterPath="$PROJECT_DIR$/Entity/Variables.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Module/FlaskService.py" beforeDir="false" afterPath="$PROJECT_DIR$/Module/FlaskService.py" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -46,27 +48,27 @@
|
|||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">{
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"ASKED_ADD_EXTERNAL_FILES": "true",
|
"ASKED_ADD_EXTERNAL_FILES": "true",
|
||||||
"Python.123.executor": "Run",
|
"Python.123.executor": "Run",
|
||||||
"Python.Main.executor": "Run",
|
"Python.Main.executor": "Run",
|
||||||
"Python.tidevice_entry.executor": "Run",
|
"Python.tidevice_entry.executor": "Run",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
||||||
"git-widget-placeholder": "main",
|
"git-widget-placeholder": "main",
|
||||||
"javascript.nodejs.core.library.configured.version": "20.17.0",
|
"javascript.nodejs.core.library.configured.version": "22.18.0",
|
||||||
"javascript.nodejs.core.library.typings.version": "20.17.58",
|
"javascript.nodejs.core.library.typings.version": "22.18.1",
|
||||||
"last_opened_file_path": "F:/company code/AI item/20250820/iOSAI",
|
"last_opened_file_path": "F:/company code/AI item/20250820/iOSAI",
|
||||||
"node.js.detected.package.eslint": "true",
|
"node.js.detected.package.eslint": "true",
|
||||||
"node.js.detected.package.tslint": "true",
|
"node.js.detected.package.tslint": "true",
|
||||||
"node.js.selected.package.eslint": "(autodetect)",
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
"node.js.selected.package.tslint": "(autodetect)",
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
"nodejs_package_manager_path": "npm",
|
"nodejs_package_manager_path": "npm",
|
||||||
"settings.editor.selected.configurable": "com.gitee.ui.GiteeSettingsConfigurable",
|
"settings.editor.selected.configurable": "com.gitee.ui.GiteeSettingsConfigurable",
|
||||||
"vue.rearranger.settings.migration": "true"
|
"vue.rearranger.settings.migration": "true"
|
||||||
}
|
}
|
||||||
}</component>
|
}]]></component>
|
||||||
<component name="RecentsManager">
|
<component name="RecentsManager">
|
||||||
<key name="MoveFile.RECENT_KEYS">
|
<key name="MoveFile.RECENT_KEYS">
|
||||||
<recent name="E:\Code\python\iOSAI\resources" />
|
<recent name="E:\Code\python\iOSAI\resources" />
|
||||||
@@ -179,6 +181,7 @@
|
|||||||
<workItem from="1756905956255" duration="1709000" />
|
<workItem from="1756905956255" duration="1709000" />
|
||||||
<workItem from="1756962238298" duration="14230000" />
|
<workItem from="1756962238298" duration="14230000" />
|
||||||
<workItem from="1756979981948" duration="4536000" />
|
<workItem from="1756979981948" duration="4536000" />
|
||||||
|
<workItem from="1757053266703" duration="6442000" />
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00001" summary="ai 开始测试">
|
<task id="LOCAL-00001" summary="ai 开始测试">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
@@ -215,7 +218,7 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||||
<SUITE FILE_PATH="coverage/iOSAI$123__1_.coverage" NAME="123 (1) 覆盖结果" MODIFIED="1756897091135" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
<SUITE FILE_PATH="coverage/iOSAI$123__1_.coverage" NAME="123 (1) 覆盖结果" MODIFIED="1756897091135" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||||
<SUITE FILE_PATH="coverage/iOSAI$Main.coverage" NAME="Main Coverage Results" MODIFIED="1756990078261" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="" />
|
<SUITE FILE_PATH="coverage/iOSAI$Main.coverage" NAME="Main Coverage Results" MODIFIED="1757059930709" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="" />
|
||||||
<SUITE FILE_PATH="coverage/iOSAI$mac_wda_agent.coverage" NAME="mac_wda_agent Coverage Results" MODIFIED="1756473148639" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/script" />
|
<SUITE FILE_PATH="coverage/iOSAI$mac_wda_agent.coverage" NAME="mac_wda_agent Coverage Results" MODIFIED="1756473148639" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/script" />
|
||||||
<SUITE FILE_PATH="coverage/iOSAI$tidevice_entry.coverage" NAME="tidevice_entry Coverage Results" MODIFIED="1756886706033" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
<SUITE FILE_PATH="coverage/iOSAI$tidevice_entry.coverage" NAME="tidevice_entry Coverage Results" MODIFIED="1756886706033" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||||
<SUITE FILE_PATH="coverage/iOSAI$ScriptManager.coverage" NAME="ScriptManager 覆盖结果" MODIFIED="1756896057801" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/script" />
|
<SUITE FILE_PATH="coverage/iOSAI$ScriptManager.coverage" NAME="ScriptManager 覆盖结果" MODIFIED="1756896057801" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/script" />
|
||||||
|
|||||||
@@ -14,3 +14,8 @@ class AnchorModel:
|
|||||||
model.anchorId = d.get('anchorId', "")
|
model.anchorId = d.get('anchorId', "")
|
||||||
model.country = d.get('country', "")
|
model.country = d.get('country', "")
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
# 模型转字典
|
||||||
|
@classmethod
|
||||||
|
def modelToDict(cls, model):
|
||||||
|
return {"anchorId": model.anchorId, "country": model.country}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import threading
|
|||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
from Entity.AnchorModel import AnchorModel
|
from Entity.AnchorModel import AnchorModel
|
||||||
|
|
||||||
|
|
||||||
# wda apple bundle id
|
# wda apple bundle id
|
||||||
WdaAppBundleId = "com.yolozsAgent.wda.xctrunner"
|
WdaAppBundleId = "com.yolozsAgent.wda.xctrunner"
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,12 @@ import json
|
|||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
import warnings
|
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
from Entity.AnchorModel import AnchorModel
|
||||||
from Utils.AiUtils import AiUtils
|
from Utils.AiUtils import AiUtils
|
||||||
from Utils.LogManager import LogManager
|
from Utils.LogManager import LogManager
|
||||||
from Utils.Requester import Requester
|
|
||||||
|
|
||||||
import tidevice
|
import tidevice
|
||||||
import wda
|
import wda
|
||||||
from flask import Flask, request
|
from flask import Flask, request
|
||||||
@@ -17,9 +16,8 @@ from Entity.ResultData import ResultData
|
|||||||
from Utils.ControlUtils import ControlUtils
|
from Utils.ControlUtils import ControlUtils
|
||||||
from Utils.ThreadManager import ThreadManager
|
from Utils.ThreadManager import ThreadManager
|
||||||
from script.ScriptManager import ScriptManager
|
from script.ScriptManager import ScriptManager
|
||||||
from Entity.Variables import anchorList, addModelToAnchorList
|
from Entity.Variables import anchorList, addModelToAnchorList, prologueList, removeModelFromAnchorList
|
||||||
import Entity.Variables
|
import Entity.Variables as ev
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
CORS(app)
|
||||||
|
|
||||||
@@ -82,17 +80,17 @@ def start_socket_listener():
|
|||||||
listener_thread = threading.Thread(target=start_socket_listener, daemon=True)
|
listener_thread = threading.Thread(target=start_socket_listener, daemon=True)
|
||||||
listener_thread.start()
|
listener_thread.start()
|
||||||
|
|
||||||
|
# 传递token,暂时用不到了
|
||||||
@app.route('/passToken', methods=['POST'])
|
# @app.route('/passToken', methods=['POST'])
|
||||||
def passToken():
|
# def passToken():
|
||||||
try:
|
# try:
|
||||||
data = request.get_json()
|
# data = request.get_json()
|
||||||
token = data['token']
|
# token = data['token']
|
||||||
Requester.requestPrologue(token)
|
# Requester.requestPrologue(token)
|
||||||
return ResultData(data="").toJson()
|
# return ResultData(data="").toJson()
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print(e)
|
# print(e)
|
||||||
return ResultData(data="").toJson()
|
# return ResultData(data="").toJson()
|
||||||
|
|
||||||
|
|
||||||
# 获取设备列表
|
# 获取设备列表
|
||||||
@@ -246,6 +244,11 @@ def passAnchorData():
|
|||||||
acList = data.get("anchorList", [])
|
acList = data.get("anchorList", [])
|
||||||
# 是否需要回复
|
# 是否需要回复
|
||||||
needReply = data.get("needReply", True)
|
needReply = data.get("needReply", True)
|
||||||
|
|
||||||
|
# 获取打招呼数据
|
||||||
|
ev.prologueList = data.get("prologueList", [])
|
||||||
|
|
||||||
|
|
||||||
# 添加主播数据
|
# 添加主播数据
|
||||||
addModelToAnchorList(acList)
|
addModelToAnchorList(acList)
|
||||||
# 启动线程,执行脚本
|
# 启动线程,执行脚本
|
||||||
@@ -253,13 +256,17 @@ def passAnchorData():
|
|||||||
manager = ScriptManager()
|
manager = ScriptManager()
|
||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
# 启动脚本
|
# 启动脚本
|
||||||
# thread = threading.Thread(target=manager.greetNewFollowers, args=(udid, needReply, event))
|
|
||||||
thread = threading.Thread(target=manager.safe_greetNewFollowers, args=(udid, needReply, event))
|
thread = threading.Thread(target=manager.safe_greetNewFollowers, args=(udid, needReply, event))
|
||||||
thread.start()
|
thread.start()
|
||||||
# 添加到线程管理
|
# 添加到线程管理
|
||||||
ThreadManager.add(udid, thread, event)
|
ThreadManager.add(udid, thread, event)
|
||||||
return ResultData(data="").toJson()
|
return ResultData(data="").toJson()
|
||||||
|
|
||||||
|
# 获取私信数据
|
||||||
|
@app.route("/getPrologueList", methods=['GET'])
|
||||||
|
def getPrologueList():
|
||||||
|
print(ev.prologueList)
|
||||||
|
return ResultData(data=ev.prologueList).toJson()
|
||||||
|
|
||||||
# 添加临时数据
|
# 添加临时数据
|
||||||
@app.route("/addTempAnchorData", methods=['POST'])
|
@app.route("/addTempAnchorData", methods=['POST'])
|
||||||
@@ -323,6 +330,23 @@ def upLoadLogLogs():
|
|||||||
else:
|
else:
|
||||||
return ResultData(data="", msg="日志上传失败").toJson()
|
return ResultData(data="", msg="日志上传失败").toJson()
|
||||||
|
|
||||||
|
# 获取当前的主播列表数据
|
||||||
|
@app.route("/anchorList", methods=['POST'])
|
||||||
|
def queryAnchorList():
|
||||||
|
data = []
|
||||||
|
for model in anchorList:
|
||||||
|
data.append(AnchorModel.modelToDict(model))
|
||||||
|
return ResultData(data=data).toJson()
|
||||||
|
|
||||||
|
# 删除主播
|
||||||
|
@app.route("/deleteAnchorWithIds", methods=['POST'])
|
||||||
|
def deleteAnchorWithIds():
|
||||||
|
ls: list[dict] = request.get_json()
|
||||||
|
for dic in ls:
|
||||||
|
for model in anchorList:
|
||||||
|
if dic.get("anchorId") == model.anchorId:
|
||||||
|
removeModelFromAnchorList(model)
|
||||||
|
return ResultData(data="").toJson()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run("0.0.0.0", port=5000, debug=True, use_reloader=False)
|
app.run("0.0.0.0", port=5000, debug=True, use_reloader=False)
|
||||||
|
|||||||
119
Utils/AiUtils.py
119
Utils/AiUtils.py
@@ -294,110 +294,6 @@ class AiUtils(object):
|
|||||||
print(f"btn:{btn}")
|
print(f"btn:{btn}")
|
||||||
return cls.findNumber(btn.label)
|
return cls.findNumber(btn.label)
|
||||||
|
|
||||||
# 获取聊天页面的聊天信息
|
|
||||||
# @classmethod
|
|
||||||
# def extract_messages_from_xml(cls, xml: str):
|
|
||||||
# """
|
|
||||||
# 仅返回当前屏幕中“可见的”聊天内容(含时间分隔)
|
|
||||||
# """
|
|
||||||
# from lxml import etree
|
|
||||||
# root = etree.fromstring(xml.encode("utf-8"))
|
|
||||||
# items = []
|
|
||||||
#
|
|
||||||
# # 判断是否是聊天页面
|
|
||||||
# is_chat_page = False
|
|
||||||
# if root.xpath('//XCUIElementTypeStaticText[contains(@traits, "Header")]'):
|
|
||||||
# is_chat_page = True
|
|
||||||
# elif root.xpath('//XCUIElementTypeCell//XCUIElementTypeOther[@name or @label]'):
|
|
||||||
# is_chat_page = True
|
|
||||||
#
|
|
||||||
# if not is_chat_page:
|
|
||||||
# raise Exception("请先进入聊天页面")
|
|
||||||
#
|
|
||||||
# # 屏幕宽度
|
|
||||||
# app = root.xpath('/XCUIElementTypeApplication')
|
|
||||||
#
|
|
||||||
# screen_w = cls.parse_float(app[0], 'width', 414.0) if app else 414.0
|
|
||||||
#
|
|
||||||
# # 找 Table 的可见范围
|
|
||||||
# table = root.xpath('//XCUIElementTypeTable')
|
|
||||||
# if table:
|
|
||||||
# table = table[0]
|
|
||||||
# table_top = cls.parse_float(table, 'y', 0.0)
|
|
||||||
# table_h = cls.parse_float(table, 'height', 0.0)
|
|
||||||
# table_bottom = table_top + table_h
|
|
||||||
# else:
|
|
||||||
# table_top, table_bottom = 0.0, cls.parse_float(app[0], 'height', 736.0) if app else 736.0
|
|
||||||
#
|
|
||||||
# def in_view(el) -> bool:
|
|
||||||
# """元素在聊天区内并且可见"""
|
|
||||||
# if el.get('visible') != 'true':
|
|
||||||
# return False
|
|
||||||
# y = cls.parse_float(el, 'y', -1e9)
|
|
||||||
# h = cls.parse_float(el, 'height', 0.0)
|
|
||||||
# by = y + h
|
|
||||||
# return not (by <= table_top or y >= table_bottom)
|
|
||||||
#
|
|
||||||
# # 时间分隔
|
|
||||||
# for t in root.xpath('//XCUIElementTypeStaticText[contains(@traits, "Header")]'):
|
|
||||||
# if not in_view(t):
|
|
||||||
# continue
|
|
||||||
# txt = (t.get('label') or t.get('name') or t.get('value') or '').strip()
|
|
||||||
# if txt:
|
|
||||||
# items.append({'type': 'time', 'text': txt, 'y': cls.parse_float(t, 'y')})
|
|
||||||
#
|
|
||||||
# # 消息气泡
|
|
||||||
# EXCLUDES = {'Heart', 'Lol', 'ThumbsUp', '分享发布内容', '视频贴纸标签页', '双击发送表情'}
|
|
||||||
#
|
|
||||||
# msg_nodes = table.xpath(
|
|
||||||
# './/XCUIElementTypeCell[@visible="true"]'
|
|
||||||
# '//XCUIElementTypeOther[@visible="true" and (@name or @label) and not(ancestor::XCUIElementTypeCollectionView)]'
|
|
||||||
# ) if table is not None else []
|
|
||||||
#
|
|
||||||
# for o in msg_nodes:
|
|
||||||
# text = (o.get('label') or o.get('name') or '').strip()
|
|
||||||
# if not text or text in EXCLUDES:
|
|
||||||
# continue
|
|
||||||
# if not in_view(o):
|
|
||||||
# continue
|
|
||||||
#
|
|
||||||
# # 找所在 Cell
|
|
||||||
# cell = o.getparent()
|
|
||||||
# while cell is not None and cell.get('type') != 'XCUIElementTypeCell':
|
|
||||||
# cell = cell.getparent()
|
|
||||||
#
|
|
||||||
# x = cls.parse_float(o, 'x')
|
|
||||||
# y = cls.parse_float(o, 'y')
|
|
||||||
# w = cls.parse_float(o, 'width')
|
|
||||||
# right_edge = x + w
|
|
||||||
#
|
|
||||||
# direction = None
|
|
||||||
# # 头像位置判定
|
|
||||||
# if cell is not None:
|
|
||||||
# avatar_btns = cell.xpath(
|
|
||||||
# './/XCUIElementTypeButton[@visible="true" and (@name="图片头像" or @label="图片头像")]')
|
|
||||||
# if avatar_btns:
|
|
||||||
# ax = cls.parse_float(avatar_btns[0], 'x')
|
|
||||||
# direction = 'in' if ax < (screen_w / 2) else 'out'
|
|
||||||
# # 右对齐兜底
|
|
||||||
# if direction is None:
|
|
||||||
# direction = 'out' if right_edge > (screen_w - 20) else 'in'
|
|
||||||
#
|
|
||||||
# items.append({'type': 'msg', 'dir': direction, 'text': text, 'y': y})
|
|
||||||
#
|
|
||||||
# # 排序 & 清理
|
|
||||||
# items.sort(key=lambda i: i['y'])
|
|
||||||
# for it in items:
|
|
||||||
# it.pop('y', None)
|
|
||||||
# return items
|
|
||||||
#
|
|
||||||
# @classmethod
|
|
||||||
# def parse_float(cls, el, attr, default=0.0):
|
|
||||||
# try:
|
|
||||||
# return float(el.get(attr, default))
|
|
||||||
# except Exception:
|
|
||||||
# return default
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def extract_messages_from_xml(cls, xml: str):
|
def extract_messages_from_xml(cls, xml: str):
|
||||||
"""
|
"""
|
||||||
@@ -572,4 +468,17 @@ class AiUtils(object):
|
|||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
# AiUtils.getCurrentScreenSource()
|
# 检查字符串中是否包含中文
|
||||||
|
@classmethod
|
||||||
|
def contains_chinese(cls, text):
|
||||||
|
"""
|
||||||
|
判断字符串中是否包含中文字符。
|
||||||
|
参数:
|
||||||
|
text (str): 要检测的字符串。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
bool: 如果字符串中包含中文,返回 True;否则返回 False。
|
||||||
|
"""
|
||||||
|
# 使用正则表达式匹配中文字符
|
||||||
|
pattern = re.compile(r'[\u4e00-\u9fff]')
|
||||||
|
return bool(pattern.search(text))
|
||||||
|
|||||||
Reference in New Issue
Block a user