ToB企服应用市场:ToB评测及商务社交产业平台

标题: 翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自 [打印本页]

作者: 守听    时间: 2024-11-4 19:56
标题: 翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自
自动翻转卡包和拼写均已实现,剩下的点听力,阅读,语法,较为简单(如需要请自行增补代码)
ps: 使用雷电模拟器
这里提供的代码重要是思绪,直接粘贴复制是用不了的(因为缺少相关情况和python的模块包)





实现自动拼写:

  1. import pyautogui,time,logging,re
  2. from paddleocr import PaddleOCR
  3. pyautogui.PAUSE = 0.1
  4. time.sleep(1)
  5. img_path="pinxie.png"
  6. ##定位键盘,这个x,y很重要,定位全局。(尽量别修改)
  7. x,y=pyautogui.locateCenterOnScreen(img_path,region=(0,0,500,900),confidence=0.8)##左半屏
  8. ##可以不带region参数 x,y=pyautogui.locateCenterOnScreen(img_path,confidence=0.8)##全屏寻找
  9. print(x,y)                                             
  10. keyboard_layout = {
  11.     'q': (x-365, y-196), 'w': (x-320, y-196), 'e': (x-275, y-196), 'r': (x-230, y-196), 't': (x-185, y-196),
  12.     'y': (x-140, y-196), 'u': (x-95, y-196), 'i': (x-50, y-196), 'o': (x-5, y-196), 'p': (x+40, y-196),
  13.     'a': (x-340, y-136), 's': (x-295, y-136), 'd': (x-250, y-136), 'f': (x-205, y-136), 'g': (x-160, y-136),
  14.     'h': (x-115, y-136), 'j': (x-70, y-136), 'k': (x-25, y-136), 'l': (x+20, y-136),
  15.     'z': (x-300, y-76), 'x': (x-255, y-76), 'c': (x-210, y-76), 'v': (x-165, y-76), 'b': (x-120, y-76),
  16.     'n': (x-75, y-76), 'm': (x-30, y-76)
  17. }
  18. #这里的坐标不要修改,我调好的参数。
  19. ##这里是主体部分
  20. while True:##一般这里就是二十五个循环(25个单词拼写)
  21.     def type_text(text):
  22.         for char in text:
  23.             if char in keyboard_layout:
  24.                 x, y = keyboard_layout[char]
  25.                 pyautogui.click(x, y)
  26.     # 模拟第一次输入
  27.     type_text("qwertyuipoiuy")
  28.     pyautogui.click(x, y)
  29.     time.sleep(0.5)
  30.     ##截取单词
  31.     pyautogui.screenshot("danci.png", (int(x - 360), int(y - 536), 380, 250))
  32.     danci = []
  33.     ##识别单词
  34.     logging.disable(logging.DEBUG)
  35.     ocr = PaddleOCR(use_angle_cls=True, lang="ch")
  36.     result = ocr.ocr(f"danci.png", cls=True)
  37.     for idx in range(len(result)):
  38.         res = result[idx]
  39.         for line in res:
  40.             danci.append(line[1][0])
  41.             # 将列表转换为一个字符串
  42.     string = ''.join(danci)
  43.     # 定义正则表达式模式,匹配 "提示" 后面的单词
  44.     pattern = re.compile(r'提示(\w+)')
  45.     # 使用正则表达式进行匹配
  46.     match = pattern.search(string)
  47.     result = match.group(1)     #           <---这个就是识别出来的正确答案
  48.     print(result)               #打印出来方便观察的(可以删)
  49.     ##以上为识别单词(识别结束)
  50.     # 现在可以点击删除键清空单词
  51.     pyautogui.click(x + 20, y - 76)
  52.     # 现在开始输入单词
  53.     type_text(result)
  54.     pyautogui.click(x, y)
  55.     time.sleep(1)               #延迟函数(很重要)可以根据你的电脑调整时间,但是不要删除(给截屏反应时间的),因为那个页面跳转会有0.3秒的时间响应
复制代码
思绪都写在注释里了
自动翻转卡包:

  1. import logging,re,Levenshtein
  2. import pyautogui,time
  3. from paddleocr import PaddleOCR, draw_ocr
  4. li=[]##识别表
  5. li1=[]##对比表1
  6. li22=[]##对比表22
  7. def ocrbaocun():                     ##识别保存后正则化   为  对比表1
  8.     li=[]
  9.     li1=[]##初始化列表为空,防止混淆
  10.     pp=0
  11.     while True:
  12.         if (pp==5):
  13.             break
  14.         time.sleep(1.5)
  15.         img_path = "shibie.png"
  16.         x, y = pyautogui.locateCenterOnScreen(img_path, region=(0, 0, 400, 800), confidence=0.7)
  17.         pyautogui.click(x, y + 200)
  18.         time.sleep(1.5)
  19.         pyautogui.screenshot(f"shot{pp+1}.png", (int(x - 235), int(y - 160), 350, 370))
  20.         ##开始识别翻译的截屏
  21.         logging.disable(logging.DEBUG)
  22.         ocr = PaddleOCR(use_angle_cls=True, lang="ch")
  23.         result = ocr.ocr(f"shot{pp+1}.png", cls=True)
  24.         for idx in range(len(result)):
  25.             res = result[idx]
  26.             str1 = ""
  27.             for line in res:
  28.                 str1 += line[1][0]
  29.         pp += 1
  30.         # 按住鼠标左键
  31.         pyautogui.mouseDown(button='left')
  32.         # 向上滑动
  33.         pyautogui.moveRel(0, -100, duration=0.2)  # 这里的100可以调整,表示滑动的距离
  34.         # 释放鼠标左键
  35.         pyautogui.mouseUp(button='left')
  36.         li.append(str1)
  37.         print(li)
  38.     #正则表达式
  39.     pattern = re.compile(r'(?<![A-Z])\b(?!vt|n|adj|adv)[a-zA-Z]+\b|[\u4e00-\u9fa5]+')
  40.     # 遍历列表中的每个元素
  41.     for text in li:
  42.         # 使用findall方法匹配文本中的单词
  43.         matches = pattern.findall(text)
  44.         # 输出匹配到的单词
  45.         li1.append(matches)
  46.     time.sleep(2)
  47.     print(li1)
  48.     for i in range(5):
  49.         ocrchoice(li1)
  50. def ocrchoice(li1):
  51.     time.sleep(1.5)
  52.     li2=[]
  53.     li22=[]
  54.     elect_path = "choice.png"
  55.     x, y = pyautogui.locateCenterOnScreen(elect_path, confidence=0.7, region=(0, 0, 400, 800))
  56.     pyautogui.screenshot("choicejietu.png", (int(x - 200), int(y + 100), 390, 270))
  57.     logging.disable(logging.DEBUG)
  58.     ocr = PaddleOCR(use_angle_cls=True, lang="ch")
  59.     result = ocr.ocr(f"choicejietu.png", cls=True)
  60.     for idx in range(len(result)):
  61.         res = result[idx]
  62.         for line in res:
  63.             li2.append(line[1][0])
  64.     pattern = re.compile(r'[\u4e00-\u9fa5]+')
  65.     for text in li2:
  66.         matches = pattern.findall(text)
  67.         li22.append(matches)
  68.     print(li22)
  69.     ##从这里开始选择
  70.     decide(x,y,li1,li22)
  71. def decide(x,y,li1,li22):
  72.     flat_list1 = [item for sublist in li1 for item in sublist]
  73.     # 设置相似度阈值
  74.     immediate_threshold = 0.7
  75.     def are_similar(str1, str2):
  76.         return Levenshtein.ratio(str1, str2)
  77.     # 找到第二个双层列表中包含相似元素的子列表的相似度最大索引
  78.     max_similarity = 0
  79.     matching_index = -1
  80.     immediate_found=False
  81.     for idx, sublist in enumerate(li22):
  82.         for item in sublist:
  83.             for flat_item in flat_list1:
  84.                 similarity = are_similar(item, flat_item)
  85.                 print(f"Comparing '{item}' with '{flat_item}', similarity: {similarity}")
  86.                 if similarity >= immediate_threshold:
  87.                     print(f"Found immediate match with similarity {similarity} at index {idx}")
  88.                     matching_index=idx
  89.                     max_similarity=similarity
  90.                     immediate_found=True
  91.                     break
  92.                 if similarity > max_similarity:
  93.                     max_similarity = similarity
  94.                     matching_index = idx
  95.             if immediate_found:
  96.                 break
  97.         if immediate_found:
  98.             break
  99.     print(f"Matching index: {matching_index}, max similarity: {max_similarity}")
  100.     #以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接结束比对(一般都是1.0的相似度)。
  101.     #如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。
  102.     if(matching_index==0):
  103.         pyautogui.click(x + 150, y + 130)##A
  104.     if(matching_index==1):
  105.         pyautogui.click(x + 150, y + 200)##B
  106.     if(matching_index==2):
  107.         pyautogui.click(x + 150, y + 270)##C
  108.     if(matching_index==3):
  109.         pyautogui.click(x + 150, y + 340)##D
  110.     time.sleep(0.5)
  111.     # 按住鼠标左键
  112.     pyautogui.mouseDown(button='left')
  113.     # 向上滑动
  114.     pyautogui.moveRel(0, -100, duration=0.2)  # 这里的100可以调整,表示滑动的距离
  115.     # 释放鼠标左键
  116.     pyautogui.mouseUp(button='left')
  117.     time.sleep(1.5)
  118. while True:
  119.     ocrbaocun()
  120.     time.sleep(1)
复制代码
简单解说下卡包的思绪:


列表里的1,2,3,4,5是分别五个单词的翻译及其单词(还没有正则化)五个字符串在一个列表中往后累加的,以是后面也是一样的形式

白色框:是正则化(re)后的每个单词及其翻译
绿色框(每个单词都是这样的):是第一个的单词的选择(A,B,C,D),显而易见也是已经经过 正则化。



选择思绪:


判断相似度:

以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接竣事比对(一般都是1.0的相似度)如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。
Matching index就是选项,0,1,2,3分别对应A,B,C,D.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4