Compare commits
3 Commits
fa6f0ce9df
...
caf6ce8deb
| Author | SHA1 | Date | |
|---|---|---|---|
| caf6ce8deb | |||
| b22efdec01 | |||
| 4ff50ecdfc |
7
.idea/IOS__AI.iml
generated
Normal file
7
.idea/IOS__AI.iml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module version="4">
|
||||||
|
<component name="PyDocumentationSettings">
|
||||||
|
<option name="format" value="PLAIN" />
|
||||||
|
<option name="myDocStringFormat" value="Plain" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -3,5 +3,5 @@
|
|||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Python 3.12 (AI-IOS)" />
|
<option name="sdkName" value="Python 3.12 (AI-IOS)" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" project-jdk-type="Python SDK" />
|
<component name="ProjectRootManager" version="2" project-jdk-name="IOSAI" project-jdk-type="Python SDK" />
|
||||||
</project>
|
</project>
|
||||||
@@ -14,7 +14,7 @@ anchorList: list[AnchorModel] = []
|
|||||||
# 线程锁
|
# 线程锁
|
||||||
anchorListLock = threading.Lock()
|
anchorListLock = threading.Lock()
|
||||||
# 打招呼数据
|
# 打招呼数据
|
||||||
prologueList: list[str] = []
|
prologueList = {}
|
||||||
|
|
||||||
# 评论数据
|
# 评论数据
|
||||||
commentList = []
|
commentList = []
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -337,27 +337,16 @@ def passAnchorData():
|
|||||||
try:
|
try:
|
||||||
LogManager.method_info("关注打招呼", "关注打招呼")
|
LogManager.method_info("关注打招呼", "关注打招呼")
|
||||||
data: Dict[str, Any] = request.get_json()
|
data: Dict[str, Any] = request.get_json()
|
||||||
|
|
||||||
# 设备列表
|
# 设备列表
|
||||||
idList = data.get("deviceList", [])
|
idList = data.get("deviceList", [])
|
||||||
|
|
||||||
# 主播列表
|
# 主播列表
|
||||||
acList = data.get("anchorList", [])
|
acList = data.get("anchorList", [])
|
||||||
Variables.commentList = data.get("comment")
|
Variables.commentList = data.get("comment")
|
||||||
|
|
||||||
isComment = data.get("isComment")
|
isComment = data.get("isComment")
|
||||||
|
|
||||||
|
|
||||||
LogManager.info(f"[INFO] 获取数据: {idList} {acList}")
|
LogManager.info(f"[INFO] 获取数据: {idList} {acList}")
|
||||||
|
|
||||||
AiUtils.save_aclist_flat_append(acList)
|
AiUtils.save_aclist_flat_append(acList)
|
||||||
|
|
||||||
# 是否需要回复
|
# 是否需要回复
|
||||||
needReply = data.get("needReply", False)
|
needReply = data.get("needReply", False)
|
||||||
|
|
||||||
# 是否需要进行翻译
|
|
||||||
needTranslate = data.get("needTranslate", True)
|
|
||||||
|
|
||||||
# 获取打招呼数据
|
# 获取打招呼数据
|
||||||
ev.prologueList = data.get("prologueList", [])
|
ev.prologueList = data.get("prologueList", [])
|
||||||
|
|
||||||
@@ -369,7 +358,7 @@ def passAnchorData():
|
|||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
# 启动脚本
|
# 启动脚本
|
||||||
thread = threading.Thread(target=manager.safe_greetNewFollowers,
|
thread = threading.Thread(target=manager.safe_greetNewFollowers,
|
||||||
args=(udid, needReply, needTranslate, isComment,event))
|
args=(udid, needReply, isComment, event,))
|
||||||
# 添加到线程管理
|
# 添加到线程管理
|
||||||
ThreadManager.add(udid, thread, event)
|
ThreadManager.add(udid, thread, event)
|
||||||
return ResultData(data="").toJson()
|
return ResultData(data="").toJson()
|
||||||
@@ -393,8 +382,7 @@ def followAndGreetUnion():
|
|||||||
# 是否需要回复
|
# 是否需要回复
|
||||||
needReply = data.get("needReply", True)
|
needReply = data.get("needReply", True)
|
||||||
|
|
||||||
# 是否需要进行翻译
|
|
||||||
needTranslate = data.get("needTranslate", True)
|
|
||||||
|
|
||||||
# 获取打招呼数据
|
# 获取打招呼数据
|
||||||
ev.prologueList = data.get("prologueList", [])
|
ev.prologueList = data.get("prologueList", [])
|
||||||
@@ -407,7 +395,7 @@ def followAndGreetUnion():
|
|||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
# 启动脚本
|
# 启动脚本
|
||||||
thread = threading.Thread(target=manager.safe_followAndGreetUnion,
|
thread = threading.Thread(target=manager.safe_followAndGreetUnion,
|
||||||
args=(udid, needReply, needTranslate, event))
|
args=(udid, needReply, event))
|
||||||
# 添加到线程管理
|
# 添加到线程管理
|
||||||
ThreadManager.add(udid, thread, event)
|
ThreadManager.add(udid, thread, event)
|
||||||
return ResultData(data="").toJson()
|
return ResultData(data="").toJson()
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
271
Utils/CountryEnum.py
Normal file
271
Utils/CountryEnum.py
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
class CountryLanguageMapper:
|
||||||
|
|
||||||
|
# 初始化一个字典,映射国家到语言代码
|
||||||
|
country_to_language = {
|
||||||
|
"中国大陆": "zh-CN",
|
||||||
|
"台湾": "zh-TW",
|
||||||
|
"香港": "zh-TW",
|
||||||
|
"澳门": "zh-TW",
|
||||||
|
"美国": "en",
|
||||||
|
"英国": "en",
|
||||||
|
"澳大利亚": "en",
|
||||||
|
"日本": "ja",
|
||||||
|
"韩国": "ko",
|
||||||
|
"俄罗斯": "ru",
|
||||||
|
"法国": "fr",
|
||||||
|
"德国": "de",
|
||||||
|
"意大利": "it",
|
||||||
|
"西班牙": "es",
|
||||||
|
"墨西哥": "es",
|
||||||
|
"巴西": "pt",
|
||||||
|
"葡萄牙": "pt",
|
||||||
|
"印度": "hi",
|
||||||
|
"泰国": "th",
|
||||||
|
"越南": "vi",
|
||||||
|
"马来西亚": "ms",
|
||||||
|
"印度尼西亚": "id",
|
||||||
|
"阿联酋": "ar",
|
||||||
|
"沙特阿拉伯": "ar",
|
||||||
|
"埃及": "ar",
|
||||||
|
"以色列": "he",
|
||||||
|
"缅甸": "my",
|
||||||
|
"斯里兰卡": "ta",
|
||||||
|
"巴基斯坦": "ur",
|
||||||
|
"孟加拉国": "bn",
|
||||||
|
"波兰": "pl",
|
||||||
|
"荷兰": "nl",
|
||||||
|
"罗马尼亚": "ro",
|
||||||
|
"土耳其": "tr",
|
||||||
|
"老挝": "lo",
|
||||||
|
"乌克兰": "uk",
|
||||||
|
"芬兰": "fi",
|
||||||
|
"南非": "af",
|
||||||
|
"阿尔巴尼亚": "sq",
|
||||||
|
"安道尔": "ca",
|
||||||
|
"安提瓜和巴布达": "en",
|
||||||
|
"阿根廷": "es",
|
||||||
|
"亚美尼亚": "hy",
|
||||||
|
"奥地利": "de",
|
||||||
|
"阿塞拜疆": "az",
|
||||||
|
"巴哈马": "en",
|
||||||
|
"巴林": "ar",
|
||||||
|
"巴巴多斯": "en",
|
||||||
|
"白俄罗斯": "be",
|
||||||
|
"比利时": "fr",
|
||||||
|
"伯利兹": "en",
|
||||||
|
"贝宁": "fr",
|
||||||
|
"不丹": "dz",
|
||||||
|
"玻利维亚": "es",
|
||||||
|
"波斯尼亚和黑塞哥维那": "bs",
|
||||||
|
"博茨瓦纳": "en",
|
||||||
|
"文莱": "ms",
|
||||||
|
"保加利亚": "bg",
|
||||||
|
"布基纳法索": "fr",
|
||||||
|
"布隆迪": "fr",
|
||||||
|
"柬埔寨": "km",
|
||||||
|
"喀麦隆": "fr",
|
||||||
|
"加拿大": "en",
|
||||||
|
"佛得角": "pt",
|
||||||
|
"开曼群岛": "en",
|
||||||
|
"中非共和国": "fr",
|
||||||
|
"乍得": "fr",
|
||||||
|
"智利": "es",
|
||||||
|
"中国": "zh-CN",
|
||||||
|
"圣诞岛": "en",
|
||||||
|
"科科斯群岛": "en",
|
||||||
|
"哥伦比亚": "es",
|
||||||
|
"科摩罗": "ar",
|
||||||
|
"刚果": "fr",
|
||||||
|
"库克群岛": "en",
|
||||||
|
"哥斯达黎加": "es",
|
||||||
|
"科特迪瓦": "fr",
|
||||||
|
"克罗地亚": "hr",
|
||||||
|
"古巴": "es",
|
||||||
|
"库拉索": "nl",
|
||||||
|
"塞浦路斯": "el",
|
||||||
|
"捷克": "cs",
|
||||||
|
"丹麦": "da",
|
||||||
|
"吉布提": "fr",
|
||||||
|
"多米尼克": "en",
|
||||||
|
"多米尼加共和国": "es",
|
||||||
|
"厄瓜多尔": "es",
|
||||||
|
"萨尔瓦多": "es",
|
||||||
|
"赤道几内亚": "es",
|
||||||
|
"厄立特里亚": "ti",
|
||||||
|
"爱沙尼亚": "et",
|
||||||
|
"埃斯瓦蒂尼": "en",
|
||||||
|
"埃塞俄比亚": "am",
|
||||||
|
"福克兰群岛": "en",
|
||||||
|
"法罗群岛": "fo",
|
||||||
|
"斐济": "en",
|
||||||
|
"法属圭亚那": "fr",
|
||||||
|
"法属波利尼西亚": "fr",
|
||||||
|
"法属南部领地": "fr",
|
||||||
|
"加蓬": "fr",
|
||||||
|
"冈比亚": "en",
|
||||||
|
"格鲁吉亚": "ka",
|
||||||
|
"加纳": "en",
|
||||||
|
"直布罗陀": "en",
|
||||||
|
"希腊": "el",
|
||||||
|
"格陵兰": "kl",
|
||||||
|
"格林纳达": "en",
|
||||||
|
"瓜德罗普": "fr",
|
||||||
|
"关岛": "en",
|
||||||
|
"危地马拉": "es",
|
||||||
|
"根西岛": "en",
|
||||||
|
"几内亚": "fr",
|
||||||
|
"几内亚比绍": "pt",
|
||||||
|
"圭亚那": "en",
|
||||||
|
"海地": "fr",
|
||||||
|
"赫德岛和麦克唐纳群岛": "en",
|
||||||
|
"梵蒂冈": "it",
|
||||||
|
"洪都拉斯": "es",
|
||||||
|
"中国香港特别行政区": "zh-TW",
|
||||||
|
"匈牙利": "hu",
|
||||||
|
"冰岛": "is",
|
||||||
|
"伊朗": "fa",
|
||||||
|
"伊拉克": "ar",
|
||||||
|
"爱尔兰": "en",
|
||||||
|
"曼岛": "en",
|
||||||
|
"牙买加": "en",
|
||||||
|
"泽西岛": "en",
|
||||||
|
"约旦": "ar",
|
||||||
|
"哈萨克斯坦": "kk",
|
||||||
|
"肯尼亚": "en",
|
||||||
|
"基里巴斯": "en",
|
||||||
|
"朝鲜": "ko",
|
||||||
|
"科威特": "ar",
|
||||||
|
"吉尔吉斯斯坦": "ky",
|
||||||
|
"拉脱维亚": "lv",
|
||||||
|
"黎巴嫩": "ar",
|
||||||
|
"莱索托": "en",
|
||||||
|
"利比里亚": "en",
|
||||||
|
"利比亚": "ar",
|
||||||
|
"列支敦士登": "de",
|
||||||
|
"立陶宛": "lt",
|
||||||
|
"卢森堡": "fr",
|
||||||
|
"中国澳门特别行政区": "zh-TW",
|
||||||
|
"马达加斯加": "fr",
|
||||||
|
"马拉维": "en",
|
||||||
|
"马尔代夫": "dv",
|
||||||
|
"马里": "fr",
|
||||||
|
"马耳他": "mt",
|
||||||
|
"马绍尔群岛": "en",
|
||||||
|
"马提尼克": "fr",
|
||||||
|
"毛里塔尼亚": "ar",
|
||||||
|
"毛里求斯": "en",
|
||||||
|
"马约特": "fr",
|
||||||
|
"密克罗尼西亚": "en",
|
||||||
|
"摩尔多瓦": "ro",
|
||||||
|
"摩纳哥": "fr",
|
||||||
|
"蒙古": "mn",
|
||||||
|
"黑山": "sr",
|
||||||
|
"蒙特塞拉特": "en",
|
||||||
|
"摩洛哥": "ar",
|
||||||
|
"莫桑比克": "pt",
|
||||||
|
"纳米比亚": "en",
|
||||||
|
"瑙鲁": "en",
|
||||||
|
"尼泊尔": "ne",
|
||||||
|
"新喀里多尼亚": "fr",
|
||||||
|
"新西兰": "en",
|
||||||
|
"尼加拉瓜": "es",
|
||||||
|
"尼日尔": "fr",
|
||||||
|
"尼日利亚": "en",
|
||||||
|
"纽埃": "en",
|
||||||
|
"诺福克岛": "en",
|
||||||
|
"北马其顿": "mk",
|
||||||
|
"北马里亚纳群岛": "en",
|
||||||
|
"挪威": "no",
|
||||||
|
"阿曼": "ar",
|
||||||
|
"帕劳": "en",
|
||||||
|
"巴勒斯坦": "ar",
|
||||||
|
"巴拿马": "es",
|
||||||
|
"巴布亚新几内亚": "en",
|
||||||
|
"巴拉圭": "es",
|
||||||
|
"秘鲁": "es",
|
||||||
|
"菲律宾": "tl",
|
||||||
|
"皮特凯恩群岛": "en",
|
||||||
|
"波多黎各": "es",
|
||||||
|
"卡塔尔": "ar",
|
||||||
|
"留尼汪": "fr",
|
||||||
|
"卢旺达": "rw",
|
||||||
|
"圣巴泰勒米": "fr",
|
||||||
|
"圣赫勒拿": "en",
|
||||||
|
"圣基茨和尼维斯": "en",
|
||||||
|
"圣卢西亚": "en",
|
||||||
|
"法属圣马丁": "fr",
|
||||||
|
"圣皮埃尔和密克隆": "fr",
|
||||||
|
"圣文森特和格林纳丁斯": "en",
|
||||||
|
"萨摩亚": "sm",
|
||||||
|
"圣马力诺": "it",
|
||||||
|
"圣多美和普林西比": "pt",
|
||||||
|
"塞内加尔": "fr",
|
||||||
|
"塞尔维亚": "sr",
|
||||||
|
"塞舌尔": "fr",
|
||||||
|
"塞拉利昂": "en",
|
||||||
|
"新加坡": "zh-CN",
|
||||||
|
"荷属圣马丁": "nl",
|
||||||
|
"斯洛伐克": "sk",
|
||||||
|
"斯洛文尼亚": "sl",
|
||||||
|
"所罗门群岛": "en",
|
||||||
|
"索马里": "so",
|
||||||
|
"南乔治亚岛和南桑威奇群岛": "en",
|
||||||
|
"南苏丹": "en",
|
||||||
|
"苏丹": "ar",
|
||||||
|
"苏里南": "nl",
|
||||||
|
"斯瓦尔巴群岛和扬马延岛": "no",
|
||||||
|
"瑞典": "sv",
|
||||||
|
"瑞士": "de",
|
||||||
|
"叙利亚": "ar",
|
||||||
|
"台湾省": "zh-TW",
|
||||||
|
"塔吉克斯坦": "tg",
|
||||||
|
"坦桑尼亚": "sw",
|
||||||
|
"东帝汶": "tet",
|
||||||
|
"多哥": "fr",
|
||||||
|
"托克劳": "en",
|
||||||
|
"汤加": "to",
|
||||||
|
"特立尼达和多巴哥": "en",
|
||||||
|
"突尼斯": "ar",
|
||||||
|
"土库曼斯坦": "tk",
|
||||||
|
"特克斯和凯科斯群岛": "en",
|
||||||
|
"图瓦卢": "en",
|
||||||
|
"乌干达": "en",
|
||||||
|
"美国本土外小岛屿": "en",
|
||||||
|
"乌拉圭": "es",
|
||||||
|
"乌兹别克斯坦": "uz",
|
||||||
|
"瓦努阿图": "bi",
|
||||||
|
"委内瑞拉": "es",
|
||||||
|
"英属维尔京群岛": "en",
|
||||||
|
"美属维尔京群岛": "en",
|
||||||
|
"瓦利斯和富图纳": "fr",
|
||||||
|
"西撒哈拉": "ar",
|
||||||
|
"也门": "ar",
|
||||||
|
"赞比亚": "en",
|
||||||
|
"津巴布韦": "en",
|
||||||
|
"阿富汗": "fa",
|
||||||
|
"阿尔及利亚": "ar",
|
||||||
|
"美属萨摩亚": "en",
|
||||||
|
"安哥拉": "pt",
|
||||||
|
"安圭拉": "en",
|
||||||
|
"南极洲": "en",
|
||||||
|
"百慕大": "en",
|
||||||
|
"荷属加勒比区": "nl",
|
||||||
|
"布韦岛": "no",
|
||||||
|
"英属印度洋领地": "en",
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_language_code(cls, country):
|
||||||
|
return cls.country_to_language.get(country)
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
if __name__ == "__main__":
|
||||||
|
mapper = CountryLanguageMapper()
|
||||||
|
countries = ['英国', '美国', '日本', '未知国家']
|
||||||
|
for country in countries:
|
||||||
|
code = mapper.get_language_code(country)
|
||||||
|
if code:
|
||||||
|
print(f"{country} 对应的语言代码是 {code}")
|
||||||
|
else:
|
||||||
|
print(f"没有找到 {country} 对应的语言代码")
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -10,6 +10,7 @@ from datetime import datetime
|
|||||||
from Entity import Variables
|
from Entity import Variables
|
||||||
from Utils.AiUtils import AiUtils
|
from Utils.AiUtils import AiUtils
|
||||||
from Utils.ControlUtils import ControlUtils
|
from Utils.ControlUtils import ControlUtils
|
||||||
|
from Utils.CountryEnum import CountryLanguageMapper
|
||||||
from Utils.IOSAIStorage import IOSAIStorage
|
from Utils.IOSAIStorage import IOSAIStorage
|
||||||
from Utils.JsonUtils import JsonUtils
|
from Utils.JsonUtils import JsonUtils
|
||||||
from Utils.LogManager import LogManager
|
from Utils.LogManager import LogManager
|
||||||
@@ -409,11 +410,11 @@ class ScriptManager():
|
|||||||
关注打招呼以及回复主播消息
|
关注打招呼以及回复主播消息
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def safe_greetNewFollowers(self, udid, needReply, needTranslate, isComment, event):
|
def safe_greetNewFollowers(self, udid, needReply, isComment, event):
|
||||||
retries = 0
|
retries = 0
|
||||||
while not event.is_set():
|
while not event.is_set():
|
||||||
try:
|
try:
|
||||||
self.greetNewFollowers(udid, needReply, needTranslate, isComment,event)
|
self.greetNewFollowers(udid, needReply, isComment, event)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
retries += 1
|
retries += 1
|
||||||
@@ -426,7 +427,7 @@ class ScriptManager():
|
|||||||
LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid)
|
LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid)
|
||||||
|
|
||||||
# 关注打招呼
|
# 关注打招呼
|
||||||
def greetNewFollowers(self, udid, needReply, needTranslate, isComment, event):
|
def greetNewFollowers(self, udid, needReply, isComment, event):
|
||||||
|
|
||||||
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
||||||
session = client.session()
|
session = client.session()
|
||||||
@@ -434,18 +435,14 @@ class ScriptManager():
|
|||||||
print(f"是否要自动回复消息:{needReply}")
|
print(f"是否要自动回复消息:{needReply}")
|
||||||
|
|
||||||
LogManager.method_info(f"是否要自动回复消息:{needReply}", "关注打招呼", udid)
|
LogManager.method_info(f"是否要自动回复消息:{needReply}", "关注打招呼", udid)
|
||||||
LogManager.method_info(f"是否需要进行翻译:{needTranslate}", "关注打招呼", udid)
|
|
||||||
|
|
||||||
# 先关闭Tik Tok
|
# 先关闭Tik Tok
|
||||||
ControlUtils.closeTikTok(session, udid)
|
ControlUtils.closeTikTok(session, udid)
|
||||||
|
event.wait(timeout=1)
|
||||||
if self.interruptible_sleep(event, 1):
|
|
||||||
return
|
|
||||||
|
|
||||||
# 重新打开Tik Tok
|
# 重新打开Tik Tok
|
||||||
ControlUtils.openTikTok(session, udid)
|
ControlUtils.openTikTok(session, udid)
|
||||||
if self.interruptible_sleep(event, 3): # [ADD]
|
event.wait(timeout=3)
|
||||||
return
|
|
||||||
LogManager.method_info(f"重启tiktok", "关注打招呼", udid)
|
LogManager.method_info(f"重启tiktok", "关注打招呼", udid)
|
||||||
|
|
||||||
# 设置查找深度
|
# 设置查找深度
|
||||||
@@ -460,8 +457,7 @@ class ScriptManager():
|
|||||||
LogManager.method_info(f"返回上一步", "关注打招呼", udid)
|
LogManager.method_info(f"返回上一步", "关注打招呼", udid)
|
||||||
session.appium_settings({"snapshotMaxDepth": 15})
|
session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
ControlUtils.clickBack(session)
|
ControlUtils.clickBack(session)
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
|
|
||||||
LogManager.method_info(f"循环条件1:{not event.is_set()}", "关注打招呼", udid)
|
LogManager.method_info(f"循环条件1:{not event.is_set()}", "关注打招呼", udid)
|
||||||
LogManager.method_info(f"循环条件2:{len(anchorList) > 0}", "关注打招呼", udid)
|
LogManager.method_info(f"循环条件2:{len(anchorList) > 0}", "关注打招呼", udid)
|
||||||
@@ -476,6 +472,7 @@ class ScriptManager():
|
|||||||
|
|
||||||
# 获取一个主播,
|
# 获取一个主播,
|
||||||
LogManager.method_info(f"开始获取数据", "关注打招呼", udid)
|
LogManager.method_info(f"开始获取数据", "关注打招呼", udid)
|
||||||
|
# 获取一个主播,
|
||||||
result = AiUtils.peek_aclist_first()
|
result = AiUtils.peek_aclist_first()
|
||||||
LogManager.method_info(f"数据是:{result}", "关注打招呼", udid)
|
LogManager.method_info(f"数据是:{result}", "关注打招呼", udid)
|
||||||
|
|
||||||
@@ -493,21 +490,17 @@ class ScriptManager():
|
|||||||
|
|
||||||
if not anchor:
|
if not anchor:
|
||||||
LogManager.method_info(f"数据库中的数据不足", "关注打招呼", udid)
|
LogManager.method_info(f"数据库中的数据不足", "关注打招呼", udid)
|
||||||
# 你原来的写法:等待完成就 continue;中途被打断就 return
|
|
||||||
if not self.interruptible_sleep(event, 30):
|
if not self.interruptible_sleep(event, 30):
|
||||||
continue
|
continue
|
||||||
return # [ADD] 被打断则退出
|
|
||||||
|
|
||||||
aid = anchor.get("anchorId", "")
|
aid = anchor.get("anchorId", "")
|
||||||
anchorCountry = anchor.get("country", "")
|
anchorCountry = anchor.get("country", "")
|
||||||
|
|
||||||
LogManager.method_info(f"主播的数据,用户名:{aid},国家:{anchorCountry}", "关注打招呼", udid)
|
LogManager.method_info(f"主播的数据,用户名:{aid},国家:{anchorCountry}", "关注打招呼", udid)
|
||||||
|
|
||||||
if self.interruptible_sleep(event, 1):
|
|
||||||
return
|
|
||||||
|
|
||||||
# 点击搜索按钮
|
# 点击搜索按钮
|
||||||
ControlUtils.clickSearch(session)
|
ControlUtils.clickSearch(session)
|
||||||
|
|
||||||
LogManager.method_info(f"点击搜索按钮", "关注打招呼", udid)
|
LogManager.method_info(f"点击搜索按钮", "关注打招呼", udid)
|
||||||
|
|
||||||
# 强制刷新session
|
# 强制刷新session
|
||||||
@@ -519,9 +512,8 @@ class ScriptManager():
|
|||||||
# 如果找到了输入框,就点击并且输入内容
|
# 如果找到了输入框,就点击并且输入内容
|
||||||
if input.exists:
|
if input.exists:
|
||||||
input.click()
|
input.click()
|
||||||
# 稍作停顿(用你的可中断等待)
|
# 稍作停顿
|
||||||
if self.interruptible_sleep(event, 0.5): # [ADD]
|
event.wait(timeout=0.5)
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
print(f"找不到输入框")
|
print(f"找不到输入框")
|
||||||
raise Exception("找不到输入框")
|
raise Exception("找不到输入框")
|
||||||
@@ -529,12 +521,12 @@ class ScriptManager():
|
|||||||
input = session.xpath('//XCUIElementTypeSearchField')
|
input = session.xpath('//XCUIElementTypeSearchField')
|
||||||
if input.exists:
|
if input.exists:
|
||||||
input.clear_text()
|
input.clear_text()
|
||||||
if self.interruptible_sleep(event, 1): # [ADD]
|
event.wait(timeout=1)
|
||||||
return
|
|
||||||
# 输入主播id
|
# 输入主播id
|
||||||
input.set_text(f"{aid or '暂无数据'}\n")
|
input.set_text(f"{aid or '暂无数据'}\n")
|
||||||
|
|
||||||
# 定位 "关注" 按钮 通过关注按钮的位置点击主播首页
|
# 定位 "关注" 按钮 通过关注按钮的位置点击主播首页
|
||||||
|
|
||||||
session.appium_settings({"snapshotMaxDepth": 25})
|
session.appium_settings({"snapshotMaxDepth": 25})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -549,15 +541,12 @@ class ScriptManager():
|
|||||||
session.appium_settings({"snapshotMaxDepth": 15})
|
session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
|
|
||||||
# 找到并点击第一个视频
|
# 找到并点击第一个视频
|
||||||
cellClickResult, workCount = ControlUtils.clickFirstVideoFromDetailPage(session)
|
cellClickResult, workCount = ControlUtils.clickFirstVideoFromDetailPage(session)
|
||||||
LogManager.method_info(f"点击第一个视频", "关注打招呼", udid)
|
|
||||||
|
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
LogManager.method_info(f"点击第一个视频", "关注打招呼", udid)
|
||||||
return
|
event.wait(timeout=2)
|
||||||
|
|
||||||
# 观看主播视频
|
# 观看主播视频
|
||||||
def viewAnchorVideo(workCount):
|
def viewAnchorVideo(workCount):
|
||||||
@@ -575,12 +564,12 @@ class ScriptManager():
|
|||||||
LogManager.method_info("停止脚本中", method="task")
|
LogManager.method_info("停止脚本中", method="task")
|
||||||
if event.is_set():
|
if event.is_set():
|
||||||
break
|
break
|
||||||
if self.interruptible_sleep(event, 1): # [ADD]
|
event.wait(timeout=1)
|
||||||
return
|
|
||||||
LogManager.method_info("停止脚本成功", method="task")
|
LogManager.method_info("停止脚本成功", method="task")
|
||||||
img = client.screenshot()
|
img = client.screenshot()
|
||||||
if self.interruptible_sleep(event, 1): # [ADD]
|
event.wait(timeout=1)
|
||||||
return
|
|
||||||
|
# filePath = f"resources/{udid}/bgv.png"
|
||||||
|
|
||||||
base_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 当前脚本目录的上一级
|
base_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 当前脚本目录的上一级
|
||||||
filePath = os.path.join(base_dir, "resources", udid, "bgv.png")
|
filePath = os.path.join(base_dir, "resources", udid, "bgv.png")
|
||||||
@@ -591,9 +580,7 @@ class ScriptManager():
|
|||||||
img.save(filePath)
|
img.save(filePath)
|
||||||
|
|
||||||
LogManager.method_info("保存屏幕图像成功", "关注打招呼", udid)
|
LogManager.method_info("保存屏幕图像成功", "关注打招呼", udid)
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
|
|
||||||
# 查找add图标
|
# 查找add图标
|
||||||
r = ControlUtils.clickLike(session, udid)
|
r = ControlUtils.clickLike(session, udid)
|
||||||
|
|
||||||
@@ -604,8 +591,7 @@ class ScriptManager():
|
|||||||
LogManager.method_info("停止脚本中", method="task")
|
LogManager.method_info("停止脚本中", method="task")
|
||||||
if event.is_set():
|
if event.is_set():
|
||||||
break
|
break
|
||||||
if self.interruptible_sleep(event, 1): # [ADD]
|
event.wait(timeout=1)
|
||||||
return
|
|
||||||
LogManager.method_info("停止脚本成功", method="task")
|
LogManager.method_info("停止脚本成功", method="task")
|
||||||
|
|
||||||
# 使用OCR进行评论
|
# 使用OCR进行评论
|
||||||
@@ -626,20 +612,16 @@ class ScriptManager():
|
|||||||
# 观看主播视频
|
# 观看主播视频
|
||||||
LogManager.method_info("去查看主播视频", "关注打招呼", udid)
|
LogManager.method_info("去查看主播视频", "关注打招呼", udid)
|
||||||
viewAnchorVideo(workCount)
|
viewAnchorVideo(workCount)
|
||||||
if self.interruptible_sleep(event, 3): # [ADD]
|
event.wait(timeout=3)
|
||||||
return
|
|
||||||
LogManager.method_info("视频看完了,重置试图查询深度", "关注打招呼", udid)
|
LogManager.method_info("视频看完了,重置试图查询深度", "关注打招呼", udid)
|
||||||
session.appium_settings({"snapshotMaxDepth": 25})
|
session.appium_settings({"snapshotMaxDepth": 25})
|
||||||
if self.interruptible_sleep(event, 0.5): # [ADD]
|
event.wait(timeout=0.5)
|
||||||
return
|
|
||||||
# 向上滑动
|
# 向上滑动
|
||||||
ControlUtils.swipe_down(udid)
|
ControlUtils.swipe_down(udid)
|
||||||
|
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
msgButton = AiUtils.getSendMesageButton(session)
|
msgButton = AiUtils.getSendMesageButton(session)
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
|
|
||||||
if msgButton.exists:
|
if msgButton.exists:
|
||||||
# 进入聊天页面
|
# 进入聊天页面
|
||||||
@@ -653,8 +635,7 @@ class ScriptManager():
|
|||||||
session.appium_settings({"snapshotMaxDepth": 15})
|
session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.interruptible_sleep(event, 3): # [ADD]
|
event.wait(timeout=3)
|
||||||
return
|
|
||||||
# 查找聊天界面中的输入框节点
|
# 查找聊天界面中的输入框节点
|
||||||
chatInput = session.xpath("//TextView")
|
chatInput = session.xpath("//TextView")
|
||||||
if chatInput.exists:
|
if chatInput.exists:
|
||||||
@@ -663,12 +644,31 @@ class ScriptManager():
|
|||||||
LogManager.method_info("找到输入框了, 准备发送一条打招呼消息", "关注打招呼", udid)
|
LogManager.method_info("找到输入框了, 准备发送一条打招呼消息", "关注打招呼", udid)
|
||||||
|
|
||||||
print("打招呼的数据", ev.prologueList)
|
print("打招呼的数据", ev.prologueList)
|
||||||
LogManager.method_info(f"传递的打招呼的数据:{ev.prologueList}", "关注打招呼", udid)
|
# LogManager.method_info(f"传递的打招呼的数据:{ev.prologueList}", "关注打招呼", udid)
|
||||||
|
|
||||||
|
|
||||||
|
# 取出国家进行对应国家语言代码
|
||||||
|
anchorCountry_code = CountryLanguageMapper.get_language_code(anchorCountry)
|
||||||
|
print(anchorCountry_code)
|
||||||
|
|
||||||
|
|
||||||
|
print("存储的是:",ev.prologueList)
|
||||||
|
# 判断对应的语言代码是否在传入的字典中
|
||||||
|
if anchorCountry_code in ev.prologueList:
|
||||||
|
# 进行原本的进行传入
|
||||||
|
privateMessageList = ev.prologueList[anchorCountry_code]
|
||||||
|
needTranslate = False
|
||||||
|
|
||||||
|
else:
|
||||||
|
# 需要翻译
|
||||||
|
privateMessageList = ev.prologueList['yolo']
|
||||||
|
needTranslate = True # 使用yolo必须翻译
|
||||||
|
|
||||||
|
|
||||||
# 准备打招呼的文案
|
# 准备打招呼的文案
|
||||||
text = random.choice(ev.prologueList)
|
text = random.choice(privateMessageList)
|
||||||
|
|
||||||
LogManager.method_info(f"取出打招呼的数据,{text}, 判断是否需要翻译:{needTranslate}", "关注打招呼",
|
LogManager.method_info(f"取出打招呼的数据,{text}", "关注打招呼",
|
||||||
udid)
|
udid)
|
||||||
|
|
||||||
if needTranslate:
|
if needTranslate:
|
||||||
@@ -685,10 +685,10 @@ class ScriptManager():
|
|||||||
if chatInput.exists:
|
if chatInput.exists:
|
||||||
chatInput.click()
|
chatInput.click()
|
||||||
chatInput.set_text(f"{msg or '暂无数据'}\n")
|
chatInput.set_text(f"{msg or '暂无数据'}\n")
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
# 发送消息
|
||||||
if self.interruptible_sleep(event, 1): # [ADD]
|
# input.set_text(f"{aid or '暂无数据'}\n")
|
||||||
return
|
event.wait(timeout=1)
|
||||||
else:
|
else:
|
||||||
print("无法发送信息")
|
print("无法发送信息")
|
||||||
LogManager.method_info(f"给主播{aid} 发送消息失败", "关注打招呼", udid)
|
LogManager.method_info(f"给主播{aid} 发送消息失败", "关注打招呼", udid)
|
||||||
@@ -696,6 +696,27 @@ class ScriptManager():
|
|||||||
# 接着下一个主播
|
# 接着下一个主播
|
||||||
goBack(1)
|
goBack(1)
|
||||||
|
|
||||||
|
# 点击关注按钮
|
||||||
|
# followButton = AiUtils.getFollowButton(session).get(timeout=5)
|
||||||
|
# if followButton is not None:
|
||||||
|
# # LogManager.method_info("找到关注按钮了", "关注打招呼", udid)
|
||||||
|
# # followButton.click()
|
||||||
|
# x, y, w, h = followButton.bounds
|
||||||
|
# cx = int(x + w / 2)
|
||||||
|
# cy = int(y + h / 2)
|
||||||
|
# # 随机偏移 ±5 px(可自己改范围)
|
||||||
|
# cx += random.randint(-5, 5)
|
||||||
|
# cy += random.randint(-5, 5)
|
||||||
|
#
|
||||||
|
# session.click(cx, cy)
|
||||||
|
#
|
||||||
|
# else:
|
||||||
|
# LogManager.method_info("没找到关注按钮", "关注打招呼", udid)
|
||||||
|
# time.sleep(1)
|
||||||
|
# goBack(4)
|
||||||
|
# session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
|
# continue
|
||||||
|
|
||||||
session.appium_settings({"snapshotMaxDepth": 15})
|
session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
goBack(3)
|
goBack(3)
|
||||||
|
|
||||||
@@ -708,8 +729,7 @@ class ScriptManager():
|
|||||||
|
|
||||||
# 设置查找深度
|
# 设置查找深度
|
||||||
session.appium_settings({"snapshotMaxDepth": 15})
|
session.appium_settings({"snapshotMaxDepth": 15})
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
print("即将要回复消息")
|
print("即将要回复消息")
|
||||||
LogManager.method_info("即将要回复消息", "关注打招呼", udid)
|
LogManager.method_info("即将要回复消息", "关注打招呼", udid)
|
||||||
|
|
||||||
@@ -726,11 +746,9 @@ class ScriptManager():
|
|||||||
homeButton.click()
|
homeButton.click()
|
||||||
else:
|
else:
|
||||||
ControlUtils.closeTikTok(session, udid)
|
ControlUtils.closeTikTok(session, udid)
|
||||||
if self.interruptible_sleep(event, 2): # [ADD]
|
event.wait(timeout=2)
|
||||||
return
|
|
||||||
ControlUtils.openTikTok(session, udid)
|
ControlUtils.openTikTok(session, udid)
|
||||||
if self.interruptible_sleep(event, 3): # [ADD]
|
event.wait(timeout=3)
|
||||||
return
|
|
||||||
|
|
||||||
print("重新创建wda会话 防止wda会话失效")
|
print("重新创建wda会话 防止wda会话失效")
|
||||||
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
||||||
@@ -742,12 +760,12 @@ class ScriptManager():
|
|||||||
|
|
||||||
print("greetNewFollowers方法执行完毕")
|
print("greetNewFollowers方法执行完毕")
|
||||||
|
|
||||||
def safe_followAndGreetUnion(self, udid, needReply, needTranslate, event):
|
def safe_followAndGreetUnion(self, udid, needReply, event):
|
||||||
|
|
||||||
retries = 0
|
retries = 0
|
||||||
while not event.is_set():
|
while not event.is_set():
|
||||||
try:
|
try:
|
||||||
self.followAndGreetUnion(udid, needReply, needTranslate, event)
|
self.followAndGreetUnion(udid, needReply, event)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
retries += 1
|
retries += 1
|
||||||
@@ -760,7 +778,7 @@ class ScriptManager():
|
|||||||
LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid)
|
LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid)
|
||||||
|
|
||||||
# 关注打招呼以及回复主播消息(联盟号)
|
# 关注打招呼以及回复主播消息(联盟号)
|
||||||
def followAndGreetUnion(self, udid, needReply, needTranslate, event):
|
def followAndGreetUnion(self, udid, needReply, event):
|
||||||
|
|
||||||
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
client = wda.USBClient(udid, ev.wdaFunctionPort)
|
||||||
session = client.session()
|
session = client.session()
|
||||||
@@ -849,6 +867,8 @@ class ScriptManager():
|
|||||||
event.wait(timeout=0.5)
|
event.wait(timeout=0.5)
|
||||||
else:
|
else:
|
||||||
print(f"找不到输入框")
|
print(f"找不到输入框")
|
||||||
|
raise Exception("找不到输入框")
|
||||||
|
|
||||||
|
|
||||||
input = session.xpath('//XCUIElementTypeSearchField')
|
input = session.xpath('//XCUIElementTypeSearchField')
|
||||||
if input.exists:
|
if input.exists:
|
||||||
@@ -904,16 +924,25 @@ class ScriptManager():
|
|||||||
print("找到输入框了, 准备发送一条打招呼消息")
|
print("找到输入框了, 准备发送一条打招呼消息")
|
||||||
LogManager.method_info("找到输入框了, 准备发送一条打招呼消息", "关注打招呼(联盟号)", udid)
|
LogManager.method_info("找到输入框了, 准备发送一条打招呼消息", "关注打招呼(联盟号)", udid)
|
||||||
|
|
||||||
print("打招呼的数据", ev.prologueList)
|
# 取出国家进行对应国家语言代码
|
||||||
LogManager.method_info(f"传递的打招呼的数据:{ev.prologueList}", "关注打招呼(联盟号)", udid)
|
anchorCountry_code = CountryLanguageMapper.get_language_code(anchorCountry)
|
||||||
|
print(anchorCountry_code)
|
||||||
|
|
||||||
|
print("存储的是:", ev.prologueList)
|
||||||
|
# 判断对应的语言代码是否在传入的字典中
|
||||||
|
if anchorCountry_code in ev.prologueList:
|
||||||
|
# 进行原本的进行传入
|
||||||
|
privateMessageList = ev.prologueList[anchorCountry_code]
|
||||||
|
needTranslate = False
|
||||||
|
|
||||||
|
else:
|
||||||
|
# 需要翻译
|
||||||
|
privateMessageList = ev.prologueList['yolo']
|
||||||
|
needTranslate = True # 使用yolo必须翻译
|
||||||
|
|
||||||
# 准备打招呼的文案
|
# 准备打招呼的文案
|
||||||
text = random.choice(ev.prologueList)
|
text = random.choice(privateMessageList)
|
||||||
# text = '你好'
|
|
||||||
|
|
||||||
LogManager.method_info(f"取出打招呼的数据,{text}, 判断是否需要翻译", "关注打招呼(联盟号)", udid)
|
|
||||||
|
|
||||||
isContainChniese = AiUtils.contains_chinese(text)
|
|
||||||
|
|
||||||
if needTranslate:
|
if needTranslate:
|
||||||
# 翻译成主播国家的语言
|
# 翻译成主播国家的语言
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user