Exemple #1
0
 def step(self, action):
     """
     {"card": (action_card, card_prob),
     "pos_x": (action_pos_x, pos_x_prob),
     "pos_y": (action_pos_y, pos_y_prob)}, actor_hidden
     :param action:
     :return:
     """
     choice_index = None
     if action["card"][0] == 0:
         logger.info("do nothing or skip step.")
     else:
         card = action["card"][0]
         loc_x = (int(action["pos_x"][0] * self.width // 6 + self.width // 6 // 2) + self.offset_w) * 2
         loc_y = (int(action["pos_y"][0] * self.height // 8 + self.height // 8 // 2) + self.offset_h) * 2
         # loc_x = (int(self.x * self.width // 6 + self.width // 6 // 2) + self.offset_w) * 2
         # loc_y = (int(self.y * self.height // 8 + self.height // 8 // 2) + self.offset_h) * 2
         # self.x = (self.x + 1) % 6
         # self.y = (self.y + 1) % 8
         start_x = self.card_location[card][0]
         start_y = self.card_location[card][1]
         logger.info(
             "locate card {} {} {} {} {} {}.".format(card, action["card_prob"][0], action["pos_x"][0],
                                                     action["pos_y"][0], loc_x, loc_y))
         if self.real_time:
             self.device.swipe([start_x, start_y, loc_x, loc_y])
         choice_index = [0]
     self.actions.append(action)
     return choice_index
Exemple #2
0
    def __init__(self, proxy_set=None):
        self.enable = True
        self.init_valid_proxies = 1
        self.test_thread_nums = 20
        self.proxy_least = 3
        self.invalid_limit = 200
        self.ban_re = r''
        self.ban_code = [
            503,
        ]
        self.download_timeout = 60
        self.test_urls = [
            ('http://www.w3school.com.cn', '06004630'),
        ]
        self.test_proxy_timeout = 5

        self.proxy_set = proxy_set or {}
        # for k, v in self._settings:
        #     setattr(self, k, self.proxy_set.get(k, v))

        # 代理列表和当前的代理指针,couter_proxy用作该代理下载的网页数量
        self.proxy = []
        self.proxy_index = 0
        self.proxies = {}
        self.counter_proxy = {}

        self.fetch_new_proxy()
        if self.proxies:
            self.test_proxies(self.proxies, wait=True)
        logger.info('Use proxy : %s', self.proxy)
Exemple #3
0
def get(url):
    if scrapy_configs.configs('debug'):
        logger.info(url)
    req_list = [
        grequests.request("GET",
                          url=url,
                          headers=scrapy_configs.configs('api_headers'),
                          timeout=10)
    ]
    return grequests.imap(req_list, exception_handler=err_handler)
Exemple #4
0
def post(url, item):
    if scrapy_configs.configs('debug'):
        # logger.info(api_url)
        logger.info(json.dumps(item, ensure_ascii=False))
    req_list = [
        grequests.request("POST",
                          url=url,
                          data=json.dumps(item),
                          headers=scrapy_configs.configs('api_headers'),
                          timeout=10)
    ]
    return grequests.imap(req_list, exception_handler=err_handler)
Exemple #5
0
 def fetch_new_proxy(self):
     """
     获取新的代理,目前从三个网站抓取代理,每个网站开一个线程抓取代理。
     """
     logger.info('Starting fetch new proxy.')
     # urls = ['xici', 'ip3336', 'kxdaili']
     urls = ['kxdaili']
     threads = []
     for url in urls:
         t = ProxyFetch(self.proxies, url)
         threads.append(t)
         t.start()
     for t in threads:
         t.join()
Exemple #6
0
 def test_proxies(self, proxies):
     from func_timeout import func_timeout, FunctionTimedOut
     for proxy, valid in proxies.items():
         check_proxy_res = False
         try:
             check_proxy_res = func_timeout(6,
                                            self.check_proxy,
                                            args=(proxy, ))
         except FunctionTimedOut:
             logger.info(
                 "func:check_proxy can't finished within 6 second,try next check"
             )
         except Exception as e:
             logger.info(e)
         # if self.check_proxy(proxy):
         if check_proxy_res:
             self.auto_proxy.proxies[proxy] = True
             self.auto_proxy.append_proxy(proxy)
Exemple #7
0
def get_soup(url):
    req = urllib.request.Request(url)
    req.add_header(
        "User-Agent",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 "
        "Safari/537.36")
    while True:
        try:
            resp = urllib.request.urlopen(req, timeout=10)
            html_doc = resp.read()
            break
        except HTTPError:
            return None
        except ValueError:
            logger.info(
                "Fetch proxy from {} fail, will try later.".format(url))
            time.sleep(120)

    soup = BeautifulSoup(html_doc, features='lxml')

    return soup
Exemple #8
0
    def fetch_proxy_from_xici(self):
        logger.info('get proxies from: %s' % self.url)
        proxies = {}
        url = "http://www.xicidaili.com/nn/"
        try:
            for i in range(1, 4):
                soup = get_soup(url + str(i))
                trs = soup.find("table", attrs={
                    "id": "ip_list"
                }).find_all("tr")
                for j, tr in enumerate(trs):
                    if 0 == j:
                        continue
                    tds = tr.find_all('td')
                    ip = tds[1].text
                    port = tds[2].text
                    proxy = ''.join(['http://', ip, ':', port]).encode('utf-8')
                    proxies[proxy] = False
        except Exception as e:
            logger.error('Failed to fetch_proxy_from_xici. Exception[%s]', e)

        return proxies
Exemple #9
0
    def test_proxies(self, proxies, wait=False):
        """
        测试代理可通性。测试网址、特征码以及测试线程数均可设置。
        """
        list_proxy = proxies.items()
        threads = []
        n = int(math.ceil(len(list_proxy) / self.test_thread_nums))
        for i in range(self.test_thread_nums):
            # 将待测试的代理平均分给测试线程
            list_part = list(list_proxy)[i * n:(i + 1) * n]
            part = {k: v for k, v in list_part}
            t = ProxyValidate(self, part)
            threads.append(t)
            t.start()

        try:
            soup = func_timeout(60,
                                self.ensure_has_valid_proxy,
                                args=(wait, threads))
        except FunctionTimedOut:
            logger.info("func:there is no valid proxy,go next step")
        except Exception as e:
            logger.info(e)
Exemple #10
0
 def fetch_proxy_from_ip3336(self):
     logger.info('get proxies from: %s' % self.url)
     proxies = {}
     url = 'http://www.ip3366.net/free/?stype=1&page='
     try:
         for i in range(1, 6):
             soup = get_soup(url + str(i))
             trs = soup.find("div", attrs={
                 "id": "list"
             }).table.find_all("tr")
             for j, tr in enumerate(trs):
                 if 0 == j:
                     continue
                 tds = tr.find_all("td")
                 ip = tds[0].string.strip().encode('utf-8')
                 port = tds[1].string.strip().encode('utf-8')
                 proxy = ''.join(
                     ['http://', ip.decode(), ':',
                      port.decode()])
                 proxies[proxy] = False
     except Exception as e:
         logger.error('Failed to fetch_proxy_from_ip3336. Exception[%s]', e)
     return proxies
Exemple #11
0
 def get_frame(self):
     time_mill = time.time() * 1000
     if time_mill - self.pre_time < 800:
         return [None, 1]
     else:
         self.pre_time = time_mill
     app = QApplication(sys.argv)
     screens = app.screens()
     if len(screens) == 0:
         logger.info("screen :0")
         return [None, -1]
     window = screens[0].grabWindow(self.hwnd)
     if win32gui.IsWindow(self.hwnd) == 1:
         window_rect = win32gui.GetWindowRect(self.hwnd)
         img = window.toImage()
         img_np = self.convertQImageToMat(img)
         self.update_locate(window_rect, img_np.shape)
         img_np = img_np[-2 - 960:-2, 2:-2, 0:3].copy()
         if img_np.shape[0] != 960:
             raise Exception("错误的分辨率")
         return [img_np, 1]
     else:
         return [None, -1]
Exemple #12
0
    def _action_on_hall(self, result):
        if self.log:
            logger.info(
                "game in hall:" + str(result.index) + " grey:" + str(result.is_grey) + "  spent:" + str(result.milli))
        if self.game_start and self.game_finish:
            self.game_start = False
            self.game_finish = False
        if not self.game_start:
            self._init_game(int(str(int(time.time() * 100))[-9:]))

        if self.mode == self.MODE["battle"] and result.index == 2:
            if self.retry > 25 and self.retry % 10 == 0:
                self.retry = 0
                self.device.tap_button([344, 1246])

        elif self.mode == self.MODE["friend_battle_host"] and result.index == 3:
            if result.is_grey:
                if self.retry > 0 and self.retry % 5 == 0:
                    self.retry = 0
                    # normal 548 544     548 944
                    self.device.tap_button([548, 544])

            else:
                if result.purple_loc[0] != 0:
                    if self.retry > 0 and self.retry % 5 == 0:
                        self.retry = 0
                        self.device.tap_button([result.purple_loc[0], result.purple_loc[1]])

        elif self.mode == self.MODE["friend_battle_guest"] and result.index == 3:
            if not result.is_grey:
                if result.yellow_loc[0] != 0:
                    if self.retry > 0 and self.retry % 5 == 0:
                        self.retry = 0
                        self.device.tap_button([result.yellow_loc[0], result.yellow_loc[1]])

        self.retry += 1
Exemple #13
0
    def _init_game(self, gameId):
        logger.info("agent {} init: {}".format(self.agent_id, gameId))
        self.game_start = True
        self.game_finish = False
        self.frame_count = 0
        self.skip_step = 0
        self.game_id = gameId
        self.record.init_record(gameId)
        self.game_env.init_game(gameId, self.agent_id)
        self.pattern = None

        self.imgs = []

        self.rewards = []
        self.actions = []
        # 剩余圣水量 双倍圣水 即死
        self.env_states = []
        # 0 ~ 93 可用的card 92种card消耗圣水量
        self.card_types = []
        self.card_properties = []

        self.pre_mine_crown = 0
        self.pre_opp_crown = 0
        self.memory_record.append(gameId)
Exemple #14
0
    def change_proxy(self):
        """
        切换代理。
        """
        while True:
            self.proxy_index = (self.proxy_index + 1) % len(self.proxy)
            proxy_valid = self.proxies[self.proxy[self.proxy_index]]
            if proxy_valid:
                break
            if self.len_valid_proxy() == 0:
                logger.info(
                    'Available proxies is none.Waiting for fetch new proxy.')
                break
        logger.info('Change proxy to %s', self.proxy[self.proxy_index])
        logger.info('Available proxies[%s]: %s', self.len_valid_proxy(),
                    self.valid_proxies())

        # 可用代理数量小于预设值则扩展代理
        if self.len_valid_proxy() < self.proxy_least:
            self.extend_proxy()
Exemple #15
0
    def fetch_proxy_from_kxdaili(self):
        logger.info('get proxies from: %s' % self.url)
        proxies = {}
        url = 'http://www.kxdaili.com/dailiip/1/%d.html'
        try:
            from func_timeout import func_timeout, FunctionTimedOut
            for i in range(1, 11):
                soup = None
                try:
                    # soup = get_soup(url % i)
                    soup = func_timeout(5, get_soup, args=(url % i, ))
                except FunctionTimedOut:
                    logger.info(
                        "func:get_soup can't get proxy within 5 second,try next"
                    )
                except Exception as e:
                    logger.info(e)
                if soup is None:
                    continue
                trs = soup.find("table", attrs={
                    "class": "active"
                }).find_all("tr")
                for j, tr in enumerate(trs):
                    if 0 == j:
                        continue
                    tds = tr.find_all("td")
                    ip = tds[0].string.strip().encode('utf-8')
                    port = tds[1].string.strip().encode('utf-8')
                    proxy = ''.join(
                        ['http://', ip.decode(), ':',
                         port.decode()])
                    proxies[proxy] = False
        except Exception as e:
            logger.error('Failed to fetch_proxy_from_kxdaili. Exception[%s]',
                         e)

        return proxies
Exemple #16
0
    def _action_on_running(self, result, img):
        self.retry = 0
        if not self.game_start:
            return
        if self.log:
            logger.info(str(self.device_id) + "  running:" + str(result.frame_index) + "  " +
                        str(len(self.env_states)) + "  elixir:" + str(result.remain_elixir)
                        + "  spent:" + str(result.milli))

            logger.info("{:s}:{:f}:{}-{:s}:{:f}:{}-{:s}:{:f}:{}-{:s}:{:f}:{}".format(CARD_DICT[result.card_type[0]],
                                                                                     result.prob[0],
                                                                                     result.available[0],
                                                                                     CARD_DICT[result.card_type[1]],
                                                                                     result.prob[1],
                                                                                     result.available[1],
                                                                                     CARD_DICT[result.card_type[2]],
                                                                                     result.prob[2],
                                                                                     result.available[2],
                                                                                     CARD_DICT[result.card_type[3]],
                                                                                     result.prob[3],
                                                                                     result.available[3], ))

            logger.info("hp:{:f}-{:f}-{:f}-{:f}-{:f}-{:f}".format(result.opp_hp[0],
                                                                  result.opp_hp[1],
                                                                  result.opp_hp[2],
                                                                  result.mine_hp[0],
                                                                  result.mine_hp[1],
                                                                  result.mine_hp[2], ))
        if result.frame_index == -1:
            self.pattern = self._crop_battle_filed(img)
            self.record.record_pattern(self.pattern)
        if result.frame_index < 0:
            return
        self.skip_step = self.skip_step - 1 if self.skip_step > 0 else 0

        reward = 0
        reward += result.opp_hp[0] * 0.2
        reward += result.opp_hp[1] * 0.1
        reward += result.opp_hp[2] * 0.1
        reward -= result.mine_hp[0] * 0.2
        reward -= result.mine_hp[1] * 0.1
        reward -= result.mine_hp[2] * 0.1

        if result.opp_crown > self.pre_opp_crown:
            reward -= 0.6
            self.pre_opp_crown = result.opp_crown
        if result.mine_crown > self.pre_mine_crown:
            reward += 0.6
            self.pre_mine_crown = result.mine_crown

        self._append_reward(reward, result.frame_index)

        env_state, card_type, card_property = parse_frame_state(result)

        self.card_location = {card_type[0]: self.card_choices[0], card_type[1]: self.card_choices[1],
                              card_type[2]: self.card_choices[2], card_type[3]: self.card_choices[3]}

        self.env_states.append(env_state)
        self.card_types.append(card_type)
        self.card_properties.append(card_property)

        img_state = self._crop_battle_filed(img)
        img_state = cv2.resize(img_state, (192, 256))
        self.imgs.append(img_state)

        img_diff = extract_attention(img_state, self.pattern)

        return [img_diff, env_state, card_type, card_property]
Exemple #17
0
 def _update_reward(self, reward_value, index):
     if self.log and reward_value != 0:
         logger.info("update  step {}  reward {:f} ".format(index, reward_value) +
                     ("++++++++++" if reward_value > 0 else "----------"))
     self.rewards[index] += reward_value
Exemple #18
0
 def _append_reward(self, reward_value, index):
     if self.log and reward_value != 0:
         logger.info("append  step {}  reward {:f} ".format(index, reward_value) +
                     ("++++++++++" if reward_value > 0 else "----------"))
     self.rewards.append(reward_value)
Exemple #19
0
def execute_cmd(cmd):
    logger.info("execute cmd:{:s}".format(cmd))
    os.system(cmd)
Exemple #20
0
def tap(x, y):
    logger.info("tap :{:d} {:d}".format(x, y))