示例#1
0
    def get_daoju_number(self, screen=None, must_int=True):
        """想尽一切办法获得右上角道具数量。
        利用x号定位,获取精确范围。
        若开启must_int:则会再搞不出整数时返回(None, 原始str),搞出时返回(整数,原始str)
        否则,返回整数或原始str
        """
        MIDS = {1: 49, 2: 39, 3: 31, 4: 21, 5: 11}  # 中位数

        sc = self.getscreen() if screen is None else screen
        at = (647, 199, 714, 217)
        sc = UIMatcher.img_cut(sc, at=at)
        plus = cv2.imread(filename="img/plus.bmp")
        choose = self.img_where_all_prob(plus, screen=sc, threshold=0.6)
        if len(choose) == 0:
            if must_int:
                return None, -1
            else:
                return -1
        choose = choose[0]
        prob, x, y, (x1, y1, x2, y2) = choose
        num_at = (x2 + 647, 199, 720, 214)
        out = self.ocr_center(*num_at)
        if out == -1:
            if must_int:
                return None, out
            else:
                return out
        new_out = make_it_as_number_as_possible(out)
        if len(new_out) == 0:
            if must_int:
                return None, out
            else:
                return out
        the_int = int(new_out)
        int_len = len(str(the_int))
        if int_len > 5:
            if must_int:
                return None, out
            else:
                return the_int
        # The median X should be +- 3
        M_X = MIDS[int_len]
        if -3 <= x - M_X <= 3:
            # Good int, maybe.
            if must_int:
                return the_int, out
            else:
                return the_int
        else:
            # Maybe Bad INT.
            if must_int:
                return None, out
            else:
                return must_int
 def get_number_by_sale():
     sc = self.getscreen()
     if self.is_exists(ZHUCAIDAN_BTN["sale_short"], screen=sc):
         self.click_btn(ZHUCAIDAN_BTN["sale_short"], until_appear=ZHUCAIDAN_BTN["chushouqueren"])
     elif self.is_exists(ZHUCAIDAN_BTN["sale_long"], screen=sc):
         self.click(ZHUCAIDAN_BTN["sale_long"], until_appear=ZHUCAIDAN_BTN["chushouqueren"])
     else:
         return None
     sc = self.last_screen
     for _ in range(6):
         self.click(1, 1)
     at = (492, 266, 566, 286)
     out = self.ocr_center(*at, screen_shot=sc)
     new_out = make_it_as_number_as_possible(out)
     try:
         the_int = int(new_out)
         return the_int
     except:
         return None
示例#3
0
 def get_zhanli(screen=None):
     at = (830, 261, 894, 275)
     return make_it_as_number_as_possible(self.ocr_center(*at, screen))
示例#4
0
 def get_haogan(screen=None):
     at = (271, 390, 291, 405)
     return make_it_as_number_as_possible(self.ocr_center(*at, screen))
示例#5
0
 def get_level(screen=None):
     at = (259, 416, 291, 433)
     return make_it_as_number_as_possible(self.ocr_center(*at, screen))
示例#6
0
    def get_base_info(self,
                      base_info=False,
                      introduction_info=False,
                      props_info=False,
                      out_xls=False,
                      s_sent=False,
                      acc_nature=0):
        """
        账号基本信息获取
        By:CyiceK
        有bug请反馈
        :param acc_nature: 小/大号
        :param s_sent: 是否发送到Server酱
        :param out_xls: 是否输出为Excel表格
        :param base_info: 是否读取主页面的基本信息
        :param introduction_info: 是否读取介绍的基本信息
        :param props_info: 是否读取道具的基本信息-扫荡券
        :return: acc_info_dict
        """
        # 笨方法转化时间戳"%Y-%m-%d-%H-%M-%S"
        date_start = datetime.datetime(1899, 12, 30)
        date_now = datetime.datetime.now()
        delta = date_now - date_start
        # 时间戳
        date_1900 = float(delta.days) + (float(delta.seconds) / 86400)
        # 日期
        date = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

        acc_info_dict = {
            "dengji": 'None',
            "jianjie_name": 'None',
            "tili": 'None',
            "mana": 'None',
            "baoshi": 'None',
            "jianjie_zhanli": 'None',
            "jianjie_hanghui": 'None',
            "jianjie_id": 'None',
            "zhanghao": self.account,
            "group": ','.join(get_all_group(self.account)),
            "saodangquan": 'None',
            "date": date,
        }
        acc_info_list = []
        self.lock_home()
        if base_info:
            time.sleep(2)
            self.lock_home()
            screen_shot = self.getscreen()
            # 体力 包括/
            acc_info_dict["tili"] = self.ocr_center(243, 6, 305, 22, screen_shot=screen_shot, size=2.0) \
                .replace('=', '').replace('-', '').replace('一', '').replace('_', '')
            # 等级
            acc_info_dict["dengji"] = make_it_as_number_as_possible(
                self.ocr_center(29,
                                43,
                                60,
                                67,
                                screen_shot=screen_shot,
                                size=2.0))
            # mana
            acc_info_dict["mana"] = make_it_as_number_as_possible(
                self.ocr_center(107, 54, 177, 76, screen_shot=screen_shot, size=2.0) \
                    .replace(',', '').replace('.', ''))
            # 宝石
            acc_info_dict["baoshi"] = make_it_as_number_as_possible(
                self.ocr_center(258, 52, 306, 72, screen_shot=screen_shot, size=2.0) \
                    .replace(',', '').replace('.', ''))
        if introduction_info:
            self.lock_img(ZHUCAIDAN_BTN["bangzhu"],
                          elseclick=[(871, 513)])  # 锁定帮助
            # 去简介
            self.lock_no_img(ZHUCAIDAN_BTN["jianjie"], elseclick=[(382, 230)])
            self.lock_img(ZHUCAIDAN_BTN["jianjie_L"],
                          elseclick=[(382, 230)])  # 锁定简介
            screen_shot = self.getscreen()
            acc_info_dict["jianjie_name"] = self.ocr_center(
                608, 151, 879, 178, screen_shot=screen_shot, size=2.0)
            acc_info_dict["dengji"] = make_it_as_number_as_possible(
                self.ocr_center(702,
                                184,
                                785,
                                205,
                                screen_shot=screen_shot,
                                size=2.0))
            acc_info_dict["jianjie_zhanli"] = make_it_as_number_as_possible(
                self.ocr_center(702,
                                214,
                                786,
                                235,
                                screen_shot=screen_shot,
                                size=2.0))
            acc_info_dict["jianjie_hanghui"] = self.ocr_center(
                703, 243, 918, 266, screen_shot=screen_shot, size=2.0)
            acc_info_dict["jianjie_id"] = make_it_as_number_as_possible(
                self.ocr_center(598,
                                415,
                                768,
                                435,
                                screen_shot=screen_shot,
                                size=1.2))
        if props_info:
            self.lock_img(ZHUCAIDAN_BTN["bangzhu"],
                          elseclick=[(871, 513)])  # 锁定帮助
            # 去道具
            self.lock_no_img(ZHUCAIDAN_BTN["daoju"], elseclick=[(536, 159)])
            self.lock_img(ZHUCAIDAN_BTN["daojuyilan"],
                          elseclick=[(536, 159)])  # 锁定道具一览
            screen_shot = self.getscreen()
            self.click_img(screen=screen_shot,
                           img="img/zhucaidan/saodangquan.bmp")
            time.sleep(2)
            screen_shot = self.getscreen()
            acc_info_dict["saodangquan"] = self.get_daoju_number(
                screen_shot, must_int=False)
        acc_info_list.append(acc_info_dict)
        self.lock_home()
        # 表格数据整理和转换
        if out_xls:
            # 将字典列表转换为DataFrame
            pf = pd.DataFrame(list(acc_info_list))
            # 指定字段顺序
            order = [
                'dengji', 'jianjie_name', 'tili', 'mana', 'baoshi',
                'jianjie_zhanli', 'jianjie_hanghui', 'jianjie_id', 'zhanghao',
                'group', 'saodangquan', 'date'
            ]
            pf = pf[order]
            # 将列名替换为中文
            columns_map = {
                'dengji': '等级',
                'jianjie_name': '名字',
                'tili': '体力',
                'mana': '玛娜数量',
                'baoshi': '宝石数量',
                'jianjie_zhanli': '全角色战力',
                'jianjie_hanghui': '所属行会',
                'jianjie_id': '玩家ID',
                'zhanghao': '账号',
                'group': '所在组',
                'saodangquan': '所拥有的扫荡券',
                'date': '录入日期',
            }
            pf.rename(columns=columns_map, inplace=True)

            if acc_nature == 0:
                # 小号/农场号输出格式
                xls_path = 'xls/%s-pcr_farm_info.xlsx' % self.today_date
            elif acc_nature == 1:
                # 大号统一文件格式
                xls_path = 'xls/pcr_farm_info.xlsx'
            else:
                # 乱输入就这样的格式
                xls_path = 'xls/%s-pcr_farm_info.xlsx' % self.today_date

            # 将空的单元格替换为空字符
            pf.fillna('', inplace=True)
            # 判断文件是否存在
            if not os.path.exists(xls_path):
                # 输出
                # 指定生成的Excel表格名称
                file_path = pd.ExcelWriter(xls_path, engine='openpyxl')
                pf.to_excel(file_path,
                            engine='openpyxl',
                            encoding='utf-8',
                            index=False)
                # 保存表格
                file_path.save()
                return acc_info_dict
            # 多进程怎么加锁QAQ

            # 保存表格
            index = len(list(acc_info_list))  # 获取需要写入数据的行数
            workbook = openpyxl.load_workbook(xls_path)  # 打开表格
            sheets = workbook.sheetnames  # 获取表格中的所有表格
            worksheet = workbook[sheets[0]]  # 获取表格中所有表格中的的第一个表格
            rows_old = worksheet.max_row  # 获取表格中已存在的数据的行数
            for i in range(0, index):
                for j in range(0, len(list(acc_info_list)[i])):
                    # 追加写入数据,注意是从i+rows_old行开始写入
                    worksheet.cell(row=i + 1 + rows_old, column=1 +
                                   j).value = list(acc_info_dict.values())[j]
            workbook.save(xls_path)  # 保存表格

        return acc_info_dict
示例#7
0
    def get_base_info(self,
                      base_info=False,
                      introduction_info=False,
                      props_info=False,
                      char_info=False,
                      out_xls=False,
                      s_sent=False,
                      acc_nature=0):
        """
        账号基本信息获取
        By:CyiceK
        有bug请反馈
        :param acc_nature: 小/大号
        :param s_sent: 是否发送到Server酱
        :param out_xls: 是否输出为Excel表格
        :param base_info: 是否读取主页面的基本信息
        :param introduction_info: 是否读取介绍的基本信息
        :param props_info: 是否读取道具的基本信息-扫荡券
        :param char_info: 是否记录三星角色
        :return: acc_info_dict
        """
        # 笨方法转化时间戳"%Y-%m-%d-%H-%M-%S"
        date_start = datetime.datetime(1899, 12, 30)
        date_now = datetime.datetime.now()
        delta = date_now - date_start
        # 时间戳
        date_1900 = float(delta.days) + (float(delta.seconds) / 86400)
        # 日期
        date = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

        acc_info_dict = {
            "dengji": 'None',
            "jianjie_name": 'None',
            "tili": 'None',
            "mana": 'None',
            "baoshi": 'None',
            "jianjie_zhanli": 'None',
            "jianjie_hanghui": 'None',
            "jianjie_id": 'None',
            "zhanghao": self.account,
            "group": ','.join(get_all_group(self.account)),
            "charlist": 'None',
            "saodangquan": 'None',
            "date": date,
        }
        acc_info_list = []
        self.lock_home()
        if base_info:
            time.sleep(2)
            self.lock_home()
            screen_shot = self.getscreen()
            # 体力 包括/
            A, B = self.ocr_A_B(243, 6, 305, 22, screen_shot=screen_shot)
            acc_info_dict["tili"] = f"{A}/{B}"
            # 等级 make_it_as_number_as_possible
            acc_info_dict["dengji"] = self.ocr_int(29,
                                                   43,
                                                   60,
                                                   67,
                                                   screen_shot=screen_shot)
            # mana
            if use_pcrocr_to_process_basic_text:
                acc_info_dict["mana"] = make_it_as_number_as_possible(
                    self.ocr_center(107, 54, 177, 76, screen_shot=screen_shot, custom_ocr="pcr", allowstr="0123456789,") \
                        .replace(',', ''))
            else:
                acc_info_dict["mana"] = make_it_as_number_as_possible(
                    self.ocr_center(107, 54, 177, 76, screen_shot=screen_shot, size=2.0) \
                        .replace(',', '').replace('.', ''))
            # 宝石
            if use_pcrocr_to_process_basic_text:
                acc_info_dict["baoshi"] = make_it_as_number_as_possible(
                    self.ocr_center(258, 52, 306, 72, screen_shot=screen_shot, custom_ocr="pcr", allowstr="0123456789,") \
                        .replace(',', ''))
            else:
                acc_info_dict["baoshi"] = make_it_as_number_as_possible(
                    self.ocr_center(258, 52, 306, 72, screen_shot=screen_shot, size=2.0) \
                        .replace(',', '').replace('.', ''))
        if introduction_info:
            self.lock_img(ZHUCAIDAN_BTN["bangzhu"],
                          elseclick=[(871, 513)])  # 锁定帮助
            # 去简介
            self.lock_no_img(ZHUCAIDAN_BTN["jianjie"], elseclick=[(382, 230)])
            self.lock_img(ZHUCAIDAN_BTN["jianjie_L"],
                          elseclick=[(382, 230)])  # 锁定简介
            screen_shot = self.getscreen()
            acc_info_dict["jianjie_name"] = self.ocr_center(
                608, 151, 879, 178, screen_shot=screen_shot, size=2.0)
            acc_info_dict["dengji"] = self.ocr_int(702,
                                                   184,
                                                   785,
                                                   205,
                                                   screen_shot=screen_shot)
            acc_info_dict["jianjie_zhanli"] = self.ocr_int(
                702, 214, 786, 235, screen_shot=screen_shot)
            acc_info_dict["jianjie_hanghui"] = self.ocr_center(
                703, 243, 918, 266, screen_shot=screen_shot, size=2.0)
            acc_info_dict["jianjie_id"] = str(
                self.ocr_int(598, 415, 768, 435, screen_shot=screen_shot))
        if props_info:
            self.lock_img(ZHUCAIDAN_BTN["bangzhu"],
                          elseclick=[(871, 513)])  # 锁定帮助
            # 去道具
            self.lock_no_img(ZHUCAIDAN_BTN["daoju"], elseclick=[(536, 159)])
            self.lock_img(ZHUCAIDAN_BTN["daojuyilan"],
                          elseclick=[(536, 159)])  # 锁定道具一览
            screen_shot = self.getscreen()
            self.click_img(screen=screen_shot,
                           img="img/zhucaidan/saodangquan.bmp")
            time.sleep(2)
            screen_shot = self.getscreen()
            acc_info_dict["saodangquan"] = self.get_daoju_number(
                screen_shot, must_int=False)
        if char_info:
            self.lock_home()
            self.click_btn(MAIN_BTN["juese"], until_appear=JUESE_BTN["duiwu"])
            at1 = (38, 79, 314, 206)
            at2 = (334, 79, 610, 206)
            at3 = (628, 79, 911, 206)
            at4 = (38, 228, 314, 350)
            at5 = (334, 228, 610, 350)
            at6 = (633, 228, 911, 350)
            at_list = [at1, at2, at3, at4, at5, at6]
            charlist = []
            P = pathlib.Path("img/juese/plate/")
            cm = CharMenu(self)
            cm.sort_by(cat="star")
            while True:
                sc = self.getscreen()
                for p in P.iterdir():
                    p = str(p).replace('\\', '/')
                    if p[-4:] == ".bmp":
                        for area in at_list:
                            if self.is_exists(img=p, at=area, screen=sc):
                                name = get_name_from_plate_path(p)
                                charlist.append(name)

                if cm.check_buttom() is True:
                    break
                else:
                    cm.dragdown()
                    if self.is_exists(JUESE_BTN["weijiesuo_w"],
                                      at=(21, 144, 167, 463)):
                        break
                    continue

            out = ','.join(charlist)
            acc_info_dict["charlist"] = out
        acc_info_list.append(acc_info_dict)
        self.lock_home()
        # 表格数据整理和转换
        if out_xls:
            # 将字典列表转换为DataFrame
            pf = pd.DataFrame(list(acc_info_list))
            # 指定字段顺序
            order = [
                'dengji', 'jianjie_name', 'tili', 'mana', 'baoshi',
                'jianjie_zhanli', 'jianjie_hanghui', 'jianjie_id', 'zhanghao',
                'group', 'charlist', 'saodangquan', 'date'
            ]
            pf = pf[order]
            # 将列名替换为中文
            columns_map = {
                'dengji': '等级',
                'jianjie_name': '名字',
                'tili': '体力',
                'mana': '玛娜数量',
                'baoshi': '宝石数量',
                'jianjie_zhanli': '全角色战力',
                'jianjie_hanghui': '所属行会',
                'jianjie_id': '玩家ID',
                'zhanghao': '账号',
                'group': '所在组',
                'charlist': '持有角色',
                'saodangquan': '所拥有的扫荡券',
                'date': '录入日期',
            }
            pf.rename(columns=columns_map, inplace=True)

            if acc_nature == 0:
                # 小号/农场号输出格式
                xls_path = 'xls/%s-pcr_farm_info.xlsx' % self.today_date
            elif acc_nature == 1:
                # 大号统一文件格式
                xls_path = 'xls/pcr_farm_info.xlsx'
            else:
                # 乱输入就这样的格式
                xls_path = 'xls/%s-pcr_farm_info.xlsx' % self.today_date

            # 将空的单元格替换为空字符
            pf.fillna('', inplace=True)
            # 判断文件是否存在
            if not os.path.exists(xls_path):
                # 输出
                # 指定生成的Excel表格名称
                file_path = pd.ExcelWriter(xls_path, engine='openpyxl')
                pf.to_excel(file_path,
                            engine='openpyxl',
                            encoding='utf-8',
                            index=False)
                # 保存表格
                file_path.save()
                return acc_info_dict
            # 多进程怎么加锁QAQ

            # 保存表格
            index = len(list(acc_info_list))  # 获取需要写入数据的行数
            workbook = openpyxl.load_workbook(xls_path)  # 打开表格
            sheets = workbook.sheetnames  # 获取表格中的所有表格
            worksheet = workbook[sheets[0]]  # 获取表格中所有表格中的的第一个表格
            rows_old = worksheet.max_row  # 获取表格中已存在的数据的行数
            for i in range(0, index):
                for j in range(0, len(list(acc_info_list)[i])):
                    # 追加写入数据,注意是从i+rows_old行开始写入
                    worksheet.cell(row=i + 1 + rows_old, column=1 +
                                   j).value = list(acc_info_dict.values())[j]
            workbook.save(xls_path)  # 保存表格

        return acc_info_dict