Skip to main content

bf6 portal web grpc as python package

Project description

Battlefield Portal web-grpc

This npm and python package can be used to directly call the https://portal.battlefield.com/ api. we're making this public since you can read the javascript of the website and figure this out yourself easily anyway, but we want to make sure only 1 github repo has to be kept in sync with the api and the rest that uses it just has to update a package and a few code changes to still have it work.

https://www.npmjs.com/package/bfportal-grpc-bf6

https://pypi.org/project/bfportal_grpc_bf6/

Typescript usage example

import { createChannel, Metadata, createClientFactory } from "nice-grpc-web";
import { play, access_token } from "bfportal-grpc-bf6";

(async () => {
  const accessToken = await getBf6GatewaySession({ sid: "", remid: "" });
  const session = await access_token.getWebAccessToken(accessToken!);

  const channel = createChannel("https://santiago-prod-wgw-envoy.ops.dice.se");
  const client = createClientFactory().use((call, options) =>
    call.next(call.request, {
      ...options,
      metadata: Metadata(options.metadata)
        .set('x-dice-tenancy', 'prod_default-prod_default-santiago-common')
        .set('x-gateway-session-id', session.sessionId)
        .set('x-grpc-web', '1')
    }),
  );

  const webPlayClient = client.create(play.WebPlayDefinition, channel);

  const response = await webPlayClient.getPlayElement({ id: "c7dff320-a543-11f0-8e01-a29ee389d262", includeDenied: true });
  console.log(response.playElement?.name);
})()

Python usage example

from bfportal_grpc_bf6 import play_pb2, converter, access_token
import httpcore

async def main():
    cookie = access_token.Cookie(sid="", remid="")
    token = await access_token.getBf6GatewaySession(cookie)
    res = await access_token.get_web_access_token(token)
    session_id = res.get("sessionId", "")

    serialized_msg = play_pb2.GetPlayElementRequest(
        id=playground_id, includeDenied=True
    ).SerializeToString()

    async with httpcore.AsyncConnectionPool(http2=True, keepalive_expiry=30) as session:
        msg = converter.to_length_prefixed_msg(serialized_msg)
        response = await session.request(
            "POST",
            "https://santiago-prod-wgw-envoy.ops.dice.se/santiago.web.play.WebPlay/getPlayElement",
            headers={
                "content-type": "application/grpc-web+proto",
                "x-dice-tenancy": "prod_default-prod_default-santiago-common",
                "x-gateway-session-id": session_id,
                "x-grpc-web": "1",
                "x-user-agent": "grpc-web-javascript/0.1",
            },
            content=msg,
        )

        serialized_message = converter.from_length_prefixed_msg(response.content)
        message = play_pb2.PlayElementResponse()
        message.ParseFromString(serialized_message)
        print(message.playElement.name)

if __name__ == "__main__":
    asyncio.run(main())

Building the proto translations

Build the typescript variant with with:

./node_modules/.bin/grpc_tools_node_protoc \
  --plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto \
  --ts_proto_out=./src/proto \
  --ts_proto_opt=env=browser,outputServices=nice-grpc,outputServices=generic-definitions,outputJsonMethods=false,useExactTypes=false \
  --proto_path=./proto \
  ./proto/authentication.proto ./proto/localization.proto ./proto/play.proto ./proto/reporting.proto

Building for python requires grpcio-tools, which can be installed with:

pip3 install grpcio-tools

And can be build with:

poetry run compile-proto

Python package used: https://github.com/romnn/proto-compile

Pushing your changes

Package versions can be made with npm run build and npm version patch git push --tags origin main to release. for python poetry build.

Example library used for this project: https://github.com/tomchen/example-typescript-package

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bfportal_grpc_bf6-0.1.11.tar.gz (32.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bfportal_grpc_bf6-0.1.11-cp313-cp313-macosx_26_0_arm64.whl (39.3 kB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

File details

Details for the file bfportal_grpc_bf6-0.1.11.tar.gz.

File metadata

  • Download URL: bfportal_grpc_bf6-0.1.11.tar.gz
  • Upload date:
  • Size: 32.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.13.14 Darwin/25.5.0

File hashes

Hashes for bfportal_grpc_bf6-0.1.11.tar.gz
Algorithm Hash digest
SHA256 7623ddd04aff2027099aaf3afe417d5d96fc22ca74f422e8c4a8e962afa4f733
MD5 e88934adda1911fbcd8a83623661609a
BLAKE2b-256 54e67cee4f5e1f6e3b822df908f4b3a7bcb6b098038fe56129c6c7e17a82b2bb

See more details on using hashes here.

File details

Details for the file bfportal_grpc_bf6-0.1.11-cp313-cp313-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bfportal_grpc_bf6-0.1.11-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 3c036b753e3c6f6561c8939cb2519f5876c2f25384362603941773f70c530082
MD5 6c5777f624222a4307678c15255de1ac
BLAKE2b-256 070cb92e0ed4f1680cb4c1c5729d79487b1bf17778a49eb976fdcf1f7b3f8b30

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page