예제 #1
0
 def post(self, mmsi, **kwargs):
     if self.connet_count <= 5:
         try:
             return self.request.post(**kwargs)
         except Exception as E:
             ship_logger.error('当前第{}次请求MMSI:{}时,发生错误:{}'.format(
                 self.connet_count, mmsi, E))
             self.connet_count += 1
             return self.post(mmsi, **kwargs)
     else:
         ship_logger.error('MMSI:{}已达到最大连接次数,准备放进二号队列'.format(mmsi))
         return
예제 #2
0
    def get_ais_info(self, mmsi):
        """获取船舶AIS信息
        :param mmsi:
        :return: 返回船舶AIS信息(字典格式)
        """
        time.sleep(random.randint(3, 5))

        data = {'mmsi': mmsi}
        # r= self.request.post(url=SHIP_INFO_API,data=data)
        req = Request(request=self.request)  # 创建Request对象
        r = req.post(mmsi=mmsi, url=SHIP_INFO_API, data=data, timeout=60)
        if r:
            if r.status_code == 200:
                try:
                    ship_msg = json.loads(r.content.decode())
                    res_status = ship_msg.get('status')
                    ship_data = ship_msg.get('data')  # 列表套一个字典
                    if res_status == 0:  # todo 表示账号未封停
                        if ship_data:  # 表示能查询到该船舶
                            if isinstance(ship_data, list):
                                ship_info = ship_data[0]  # 取字典
                                return ship_info
                            elif isinstance(ship_data, dict):
                                return ship_data
                        else:
                            ship_logger.info('无效的MMSI:{}'.format(mmsi))
                    else:
                        ship_logger.critical(
                            '目前账号:{},获取MMSI:{}时,可能被封停或者Cookies已失效'.format(
                                self.username, mmsi))
                        return '账号异常'
                except:
                    ship_logger.critical(
                        '当前账号:{},请求MMSI:{}对应的AIS数据失败,请求url:{},返回内容:{}'.format(
                            self.username, mmsi, r.url, r.content.decode()))
                    self.db.push_mmsi(mmsi)
                    return '账号异常'
            else:
                ship_logger.error('请求MMSI:{}的AIS数据失败,返回状态码为:{}'.format(
                    mmsi, r.status_code))
                self.db.push_mmsi(mmsi=mmsi)
        else:
            self.db.push_spare_mmsi(mmsi=mmsi)  # 放进二号队列
예제 #3
0
    def get_history_track(self, mmsi, start_time, end_time):
        """
        3.获取轨迹
        :param mmsi:
        :param start_time:
        :param end_time:
        :return: 返回船舶轨迹信息(列表套字典,每个字典都是一个航点)
        """
        time.sleep(random.randint(3, 5))

        track_url = Track_API.format(mmsi, start_time, end_time)
        # r = self.request.get(url=track_url)
        req = Request(request=self.request)  # 创建Request对象
        r = req.get(mmsi=mmsi, url=track_url, timeout=60)
        if r:
            if r.status_code == 200:
                try:
                    content = json.loads(r.content.decode())
                    ship_track = content.get('data')  # 加密格式的字符串
                    if ship_track:  # 表示有轨迹
                        ship_track_list = parse_ship_track(ship_track)  # 列表套字典
                        return ship_track_list
                    else:
                        ship_logger.warning('MMSI:{}在时间段{}-{}没有对应的轨迹信息'.format(
                            mmsi, start_time, end_time))
                except:
                    ship_logger.critical(
                        '当前账号:{},请求MMSI:{}对应的轨迹失败,请求url:{},返回内容:{}'.format(
                            self.username, mmsi, r.url, r.content.decode()))
                    self.db.push_mmsi(mmsi)
                    return '账号异常'
            else:
                ship_logger.error(
                    '请求MMSI:{}在时间段{}-{}对应的轨迹信息失败,返回状态码为,{}'.format(
                        mmsi, start_time, end_time, r.status_code))
                self.db.push_mmsi(mmsi=mmsi)
        else:
            self.db.push_spare_mmsi(mmsi=mmsi)  # 放进二号队列
예제 #4
0
    def get_history_voyage(self, mmsi, start_time, end_time):
        """查询船舶历史航次信息
        :param mmsi:
        :param start_time:
        :param end_time:
        :return: 返回船舶历史航班信息(列表套字典,每个字典就是一个航次)
        """
        time.sleep(random.randint(3, 5))

        data = {'mmsi': mmsi, 'btime': start_time, 'etime': end_time}
        # r = self.request.post(url=HISTORY_VOYAGE_API, data=data)
        req = Request(request=self.request)  # 创建Request对象
        r = req.post(mmsi=mmsi, url=HISTORY_VOYAGE_API, data=data, timeout=60)
        if r:
            if r.status_code == 200:
                try:
                    content = json.loads(r.content.decode())
                    history_voyage = content.get('data')
                    if history_voyage:  # 表示有航次
                        return history_voyage
                    else:
                        ship_logger.warning(
                            'MMSI:{}暂无航次信息,放进2号队列'.format(mmsi))
                        self.db.push_spare_mmsi(mmsi=mmsi)
                except:
                    ship_logger.critical(
                        '当前账号:{},请求MMSI:{}对应的航次失败,请求url:{},返回内容:{}'.format(
                            self.username, mmsi, r.url, r.content.decode()))
                    self.db.push_mmsi(mmsi)
                    return '账号异常'
            else:
                ship_logger.error('请求MMSI:{}的航次信息失败,返回状态码为'.format(
                    mmsi, r.status_code))
                self.db.push_mmsi(mmsi=mmsi)  # 再次放回去
        else:
            self.db.push_spare_mmsi(mmsi=mmsi)  # 放进二号队列