Simple Python library for retrieving statistics of Battlefield: Bad Company 2 players
Project description
pybfbc2stats
Simple Python 🐍 library for retrieving statistics of Battlefield: Bad Company 2 players. Possible thanks to previous work by Luigi Auriemma and nemo.
Features
- lookup players/personas by id or name on any platform
- search for players/personas by name on any platform (with wildcard support)
- retrieve all available statistics for players on PC/PS3
- retrieve player leaderboards on PC/PS3
- full support for async Python
Installation
Simply install the package via pip.
$ pip install pybfbc2stats
Usage
TLS 1.0
The FESL backend only supports TSL 1.0. So, you can only use this library in an environment that allows Python to use TLS 1.0. The easiest and least intrusive way to enable TLS 1.0 support is to set an OPENSSL_CONF
environment variable that contains the absolute path to the included openssl.cnf
. On Linux, you can set it by running this in the project directory:
`export OPENSSL_CONF=$(realpath openssl.cnf)`
Basic example
The following examples show how to find a player/persona by name and retrieve their stats using the default as well as the async client.
Retrieve stats using the default client
from urllib.parse import quote
from pybfbc2stats import Client, Platform, Namespace
async def main():
with Client('ea_account_name', 'ea_account_password', Platform.pc) as client:
quoted_name = quote('Krut0r')
persona = client.lookup_username(quoted_name, Namespace.pc)
stats = client.get_stats(int(persona['userId']))
print(stats)
if __name__ == '__main__':
main()
Retrieve stats using the async client
import asyncio
from urllib.parse import quote
from pybfbc2stats import AsyncClient, Platform, Namespace
async def main():
async with AsyncClient('ea_account_name', 'ea_account_password', Platform.pc) as client:
quoted_name = quote('Krut0r')
persona = await client.lookup_username(quoted_name, Namespace.pc)
stats = await client.get_stats(int(persona['userId']))
print(stats)
if __name__ == '__main__':
asyncio.run(main())
Client methods
Both the default and the async clients offer the same methods with the same signatures.
[Async]Client(username, password, platform, timeout)
Create a new [Async]Client instance.
Note: The account has to be valid for Bad Company 2. If your account does not work, you can create a new one using ealist: .\ealist.exe -A -a [username] [password] bfbc2-pc
(the created account will work for all platforms).
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
username |
str | Required | |
password |
str | Required | |
platform |
Platform | Required | One of: Platform.pc , Platform.ps3 (Xbox 360 is not yet supported) |
timeout |
float | Optional | How long to wait for data before raising a timeout exception |
[Async]Client.hello()
Send the initial "hello" packet to the FESL server.
[Async]Client.memcheck()
Send the response to the FESL server's "memcheck" challenge.
[Async]Client.login()
Send the login details to the FESL server.
[Async]Client.lookup_usernames(usernames, namespace)
Lookup a list of url encoded/quoted usernames and return any matching personas (only exact name matches are returned).
Note: Since this method accepts a namespace
argument, it can lookup usernames in any namespace (on any platform), regardless of which Platform
was used to create the client instance.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
usernames |
List[str] | Required | List of url encoded/quoted usernames |
namespace |
Namespace | Required | One of: Namespace.pc , Namespace.ps3 , Namespace.xbox360 |
Example
from urllib.parse import quote
from pybfbc2stats import Client, Platform, Namespace
client = Client('ea_account_name', 'ea_account_password', Platform.pc)
names = ['SickLittleMonkey', '[SuX] DeLuXe']
quoted = [quote(name) for name in names]
persona = client.lookup_usernames(quoted, Namespace.pc)
[Async]Client.lookup_username(username, namespace)
Lookup a single url encoded/quoted username and return any matching persona (only exact name matches are returned).
Note: Since this method accepts a namespace
argument, it can lookup usernames in any namespace (on any platform), regardless of which Platform
was used to create the client instance.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
username |
str | Required | Url encoded/quoted username |
namespace |
Namespace | Required | One of: Namespace.pc , Namespace.ps3 , Namespace.xbox360 |
Example
from urllib.parse import quote
from pybfbc2stats import Client, Platform, Namespace
client = Client('ea_account_name', 'ea_account_password', Platform.ps3)
persona = client.lookup_username(quote('Major Brainhurt'), Namespace.pc)
[Async]Client.lookup_user_ids(user_ids, namespace)
Lookup a list of user ids and return any matching personas.
Note: Since this method accepts a namespace
argument, it can lookup user ids in any namespace (on any platform), regardless of which Platform
was used to create the client instance.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
user_ids |
List[int] | Required | |
namespace |
Namespace | Required | One of: Namespace.pc , Namespace.ps3 , Namespace.xbox360 |
Example
from pybfbc2stats import Client, Platform, Namespace
client = Client('ea_account_name', 'ea_account_password', Platform.pc)
persona = client.lookup_user_ids([232302860, 233866102], Namespace.xbox360)
[Async]Client.lookup_user_id(user_id, namespace)
Lookup a single user id and return any matching persona.
Note: Since this method accepts a namespace
argument, it can lookup user ids in any namespace (on any platform), regardless of which Platform
was used to create the client instance.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
user_id |
int | Required | |
namespace |
Namespace | Required | One of: Namespace.pc , Namespace.ps3 , Namespace.xbox360 |
Example
from pybfbc2stats import Client, Platform, Namespace
client = Client('ea_account_name', 'ea_account_password', Platform.pc)
persona = client.lookup_user_id(232302860, Namespace.xbox360)
[Async]Client.search_name(screen_name)
Find personas given a url encoded/quoted (partial) name on the client instance's platform. You can use *
as a trailing wildcard.
Note: The FESL backend returns an error both if a) no matching results were found and b) too many matching results were found. So, be careful with wildcard characters in combination with short partial names.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
screen_name |
str | Required | Url encoded/quoted (partial) name |
Example
from urllib.parse import quote
from pybfbc2stats import Client, Platform
client = Client('ea_account_name', 'ea_account_password', Platform.pc)
results = client.search_name(quote('[=BL=] larryp11'))
[Async]Client.get_stats(userid, keys)
Retrieve a given list of stats attributes for a given player id on the client instance's platform.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
userid |
int | Required | |
keys |
List[bytes] | Optional | By default, all available attributes are retrieved (see STATS_KEYS constant for details) |
Example
from pybfbc2stats import Client, Platform
client = Client('ea_account_name', 'ea_account_password', Platform.ps3)
stats = client.get_stats(223789857, [b'accuracy', b'kills', b'deaths', b'score', b'time'])
[Async]Client.get_leaderboard(min_rank, max_rank, sort_by, keys)
Retrieve a given range of players on the leaderboard with the given list of stats, sorted by a given key, on the client instance's platform.
Note: There does not seem to be a hard limit to either the rank rage size nor the number of stats keys that can be retrieved for each player. You will, however, need to increase your client-wide timeout if you are planning to retrieve large chunks of the leaderboard or lots of stats attributes.
Arguments
Argument | Type | Opt/Required | Note |
---|---|---|---|
min_rank |
int | Optional | Minimum placement/rank on the leaderboard (1-250000) |
max_rank |
int | Optional | Maximum placement/rank on the leaderboard (1-250001) |
sort_by |
bytes | Optional | Key to sort leaderboard by, must be one of deaths , elo , kills , rank , score , time , veteran |
keys |
List[bytes] | Optional | By default, only deaths , kills , score and time are retrieved (see STATS_KEYS constant for additional available keys) |
Example
from pybfbc2stats import Client, Platform
client = Client('ea_account_name', 'ea_account_password', Platform.pc)
leaderboard = client.get_leaderboard(1, 50, b'time')
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pybfbc2stats-0.2.6-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5df30af3039efaa1be2d743efbf45b5a7816b062f47929f7335cbda82ddf7376 |
|
MD5 | e2cc9ae820f3279aa0914b2a2e64a023 |
|
BLAKE2b-256 | 49ba662c0caa326ffd5da19f0b19d64cc9ba74e4282866fea3324ae68ea9a6c1 |