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.12.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.12-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.12.tar.gz.

File metadata

  • Download URL: bfportal_grpc_bf6-0.1.12.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.12.tar.gz
Algorithm Hash digest
SHA256 637b6628efad4d41859a0e3b7fd4906658195b04dfa9ddf60f72b3abb31273a4
MD5 58a149a9deac4ab2355927456d9aabac
BLAKE2b-256 3f7159e184186e1df871785bdd41df358e116c06c2828fc891f8bdb031270fe0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bfportal_grpc_bf6-0.1.12-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 c0f8010d94b1f3faa88809df1d4359388ea9ed4d370e5c4fc5f6d445c08a4f73
MD5 b4c6768d0e45902c886a3b9b58a60a59
BLAKE2b-256 41617cc380c8bb354dc91537ca1527e81f8ed915f613fbdc89306d9cc4463df4

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