コード例 #1
0
ファイル: rpc_api.py プロジェクト: jordyroosen/fastpokemap
    def __init__(self):
        self._session = requests.session()
        self._session.headers.update({'User-Agent': 'Niantic App'})
        self._session.verify = True

        self.auth_provider = None

        self._curl = ParallelCurl({pycurl.FOLLOWLOCATION: 1, pycurl.MAXREDIRS: 5, pycurl.TIMEOUT: 10,
                                   pycurl.NOSIGNAL: 1, pycurl.USERAGENT: 'Niantic App',
                                   pycurl.ENCODING: 'gzip,deflate', pycurl.CAINFO: certifi.where()}, 8)
コード例 #2
0
ファイル: rpc_api.py プロジェクト: 1623tennyson/newfastone
    def __init__(self):
        self._session = requests.session()
        self._session.headers.update({'User-Agent': 'Niantic App'})
        self._session.verify = True

        self.auth_provider = None

        pycurl_options = {pycurl.FOLLOWLOCATION: 1, pycurl.MAXREDIRS: 5,
                          pycurl.NOSIGNAL: 1, pycurl.USERAGENT: 'Niantic App',
                          pycurl.CONNECTTIMEOUT: 10000,
                          pycurl.CAINFO: certifi.where()}

        try:
            pycurl.Curl().setopt(pycurl.DNS_SERVERS, "8.8.8.8")
            # If the above line does not fail, DNS is available
            pycurl_options[pycurl.DNS_SERVERS] = "8.8.8.8"
        except:
            pass  # Just use default DNS Server

        self._curl = ParallelCurl(pycurl_options, 8)
コード例 #3
0
ファイル: rpc_api.py プロジェクト: 1623tennyson/newfastone
class RpcApi:
    def __init__(self):
        self._session = requests.session()
        self._session.headers.update({'User-Agent': 'Niantic App'})
        self._session.verify = True

        self.auth_provider = None

        pycurl_options = {pycurl.FOLLOWLOCATION: 1, pycurl.MAXREDIRS: 5,
                          pycurl.NOSIGNAL: 1, pycurl.USERAGENT: 'Niantic App',
                          pycurl.CONNECTTIMEOUT: 10000,
                          pycurl.CAINFO: certifi.where()}

        try:
            pycurl.Curl().setopt(pycurl.DNS_SERVERS, "8.8.8.8")
            # If the above line does not fail, DNS is available
            pycurl_options[pycurl.DNS_SERVERS] = "8.8.8.8"
        except:
            pass  # Just use default DNS Server

        self._curl = ParallelCurl(pycurl_options, 8)

    def get_rpc_id(self):
        return 8145806132888207460

    def decode_raw(self, raw):
        process = subprocess.Popen(['protoc', '--decode_raw'], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
        output = error = None
        try:
            output, error = process.communicate(raw)
        except:
            pass

        return output

    def _make_rpc(self, endpoint, request_proto_plain):
        log.debug('Execution of RPC')

        request_proto_serialized = request_proto_plain.SerializeToString()
        try:
            http_response = self._session.post(endpoint, data=request_proto_serialized, timeout=10)
        except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
            raise ServerBusyOrOfflineException

        return http_response

    def request(self, endpoint, subrequests, player_position):
        if not self.auth_provider or self.auth_provider.is_login() is False:
            raise NotLoggedInException()

        request_proto = self._build_main_request(subrequests, player_position)
        response = self._make_rpc(endpoint, request_proto)

        response_dict = parse_main_request(response.content, response.status_code, subrequests)

        return response_dict

    def request_async(self, endpoint, subrequests, player_position, callback):
        if not self.auth_provider or self.auth_provider.is_login() is False:
            raise NotLoggedInException()

        request_proto = self._build_main_request(subrequests, player_position)
        request_proto_serialized = request_proto.SerializeToString()

        bundle = {'callback': callback, 'subrequests': subrequests}

        self._curl.add_request({pycurl.URL: endpoint, pycurl.POSTFIELDS: request_proto_serialized},
                               self._success_callback, self._error_callback, bundle=bundle)

    def _success_callback(self, handle, options, bundle, header_buf, data_buf):
        response_data = data_buf.getvalue()
        response_dict = parse_main_request(response_data, 200, bundle['subrequests'])
        bundle['callback'](response_dict)

    def _error_callback(self, handle, options, bundle, header_buf, data_buf):
        log.warning("Error downloading map: {}".format(handle.getinfo(pycurl.RESPONSE_CODE)))
        bundle['callback'](False)

    def _build_main_request(self, subrequests, player_position=None):
        log.debug('Generating main RPC request...')

        request = RpcEnvelope.Request()
        request.direction = RpcEnum.REQUEST
        request.rpc_id = self.get_rpc_id()

        if player_position is not None:
            request.latitude, request.longitude, request.altitude = player_position

            # ticket = self._auth_provider.get_ticket()
            # if ticket:
            # request.auth_ticket.expire_timestamp_ms, request.auth_ticket.start, request.auth_ticket.end = ticket
        # else:
        request.auth.provider = self.auth_provider.get_name()
        request.auth.token.contents = self.auth_provider.get_token()
        request.auth.token.unknown13 = 59

        # unknown stuff
        request.unknown12 = 989

        request = build_sub_requests(request, subrequests)

        log.debug('Generated protobuf request: \n\r%s', request)

        return request

    def finish_async(self, max_time=None):
        self._curl.finish_requests(max_time)