Library written in Python that wraps Halo Infinite API.

Overview

haloinfinite

Library written in Python that wraps Halo Infinite API.

Before start

It's unofficial, reverse-engineered, neither stable nor production ready Halo Infinite web API.

You need to register an Azure Active Directory application and set a Client Secret for your application.

Credits

Credits to Den Delimarsky for the reverse-engineering. If you want to learn more then check his Halo Infinite Web API blog series. Also you can use his API wrapper written in C#.

Installing

From Pip (recommended)

pip install haloinfinite

From Github

pip install git+https://github.com/ingmferrer/haloinfinite.git

From tar.gz file

Download haloinfinite-X.Y.Z.tar.gz from the Releases page.

pip install haloinfinite-X.Y.Z.tar.gz

Usage

Client instantiation

from haloinfinite.client import HaloInfiniteAPIClient as Client
client = Client(client_id, client_secret, user_token=None, xbox_user_token=None, xsts_xbox_token=None, xsts_halo_token=None, spartan_token=None, clearance_token=None)

OAuth 2.0

Get authorization url

url = client.get_authorization_url(redirect_uri, scope=["Xboxlive.signin", "Xboxlive.offline_access"], state=None)

Exchange the code for an user token

user_token = client.exchange_code(redirect_uri, code)

# print(user_token.data)
{
    "token_type": "bearer",
    "expires_in": 3600,
    "scope": "XboxLive.signin XboxLive.offline_access",
    "access_token": "...",
    "refresh_token": "...",
    "user_id": "...",
}

Refresh user token

user_token = client.refresh_token(redirect_uri, user_token["refresh_token"])

# print(user_token.data)
{
    "token_type": "bearer",
    "expires_in": 3600,
    "scope": "XboxLive.signin XboxLive.offline_access",
    "access_token": "...",
    "refresh_token": "...",
    "user_id": "...",
}

Set user token

client.set_user_token(user_token)

Get xbox user token

xbox_user_token = client.get_xbox_user_token()

# print(xbox_user_token.data)
{
    "IssueInstant": "2022-02-06T01:00:03.6132203Z",
    "NotAfter": "2022-02-20T01:00:03.6132203Z",
    "Token": "...",
    "DisplayClaims": {"xui": [{"uhs": "..."}]},
}

Set xbox user token

client.set_xbox_user_token(token=xbox_user_token)

Get xsts xbox token

xsts_xbox_token = client.get_xsts_xbox_token()

# print(xsts_xbox_token.data)
{
    "IssueInstant": "2022-02-06T01:35:40.7628209Z",
    "NotAfter": "2022-02-06T17:35:40.7628209Z",
    "Token": "...",
    "DisplayClaims": {
        "xui": [
            {
                "gtg": "...",
                "xid": "...",
                "uhs": "...",
                "agg": "Adult",
                "usr": "...",
                "utr": "...",
                "prv": "...",
            }
        ]
    },
}

Set xsts xbox token

client.set_xsts_xbox_token(token=xsts_xbox_token)

Get xsts halo token

xsts_halo_token = client.get_xsts_xbox_token()

# print(xsts_halo_token.data)
{
    "IssueInstant": "2022-02-06T01:12:27.9108457Z",
    "NotAfter": "2022-02-06T05:12:27.9108457Z",
    "Token": "...",
    "DisplayClaims": {"xui": [{"uhs": "..."}]},
}

Set xsts halo token

client.set_xsts_halo_token(token=xsts_halo_token)

Get spartan token

spartan_token = client.get_xsts_xbox_token()

# print(spartan_token.data)
{
    "SpartanToken": "...",
    "ExpiresUtc": {"ISO8601Date": "2022-02-06T05:12:27Z"},
    "TokenDuration": "PT3H34M12.4226916S",
}

Set spartan token

client.set_spartan_token(token=spartan_token)

Get clearance token

clearance_token = client.get_clearance_token()

# print(clearance_token.data)
{
    "FlightConfigurationId": "...",
}

Set clearance token

client.set_clearance_token(token=clearance_id)

Match API

Match privacy

response = client.match.get_match_privacy()

# print(response.data)
{'MatchmadeGames': 1, 'OtherGames': 2}

Match count

response = client.match.get_match_count()

# print(response.data)
{'CustomMatchesPlayedCount': 6, 'MatchesPlayedCount': 885, 'MatchmadeMatchesPlayedCount': 879, 'LocalMatchesPlayedCount': 0}

Match history

response = client.match.get_match_history()

# print(response.data)
{'Count': 25,
 'Links': {},
 'ResultCount': 25,
 'Results': [{'LastTeamId': 0,
              'MatchId': '...',
              'MatchInfo': {'ClearanceId': '...',
                            'Duration': 'PT9M22.8961519S',
                            'EndTime': '2022-02-05T23:30:32.564Z',
                            'GameVariantCategory': 9,
                            'LevelId': '...',
                            'LifecycleMode': 3,
                            'MapVariant': {'AssetId': '...',
                                           'AssetKind': 2,
                                           'VersionId': '...'},
                            'PlayableDuration': 'PT9M22.875S',
                            'Playlist': {'AssetId': '...',
                                         'AssetKind': 3,
                                         'VersionId': '...'},
                            'PlaylistExperience': 5,
                            'PlaylistMapModePair': {'AssetId': '...',
                                                    'AssetKind': 7,
                                                    'VersionId': '...'},
                            'SeasonId': 'Seasons/Season6.json',
                            'StartTime': '2022-02-05T23:20:39.923Z',
                            'TeamScoringEnabled': True,
                            'TeamsEnabled': True,
                            'UgcGameVariant': {'AssetId': '...',
                                               'AssetKind': 6,
                                               'VersionId': '...'}},
              'Outcome': 3,
              'PresentAtEndOfMatch': True,
              'Rank': 6},
              ...
 'Start': 0}

Match stats

response = client.match.get_match_stats(match_id)

# print(response.data)
{'MatchId': '...',
 'MatchInfo': {'ClearanceId': '...',
               'Duration': 'PT9M22.8961519S',
               'EndTime': '2022-02-05T23:30:32.564Z',
               'GameVariantCategory': 9,
               'LevelId': '...',
               'LifecycleMode': 3,
               'MapVariant': {'AssetId': '...',
                              'AssetKind': 2,
                              'VersionId': '...'},
               'PlayableDuration': 'PT9M22.875S',
               'Playlist': {'AssetId': '...',
                            'AssetKind': 3,
                            'VersionId': '...'},
               'PlaylistExperience': 5,
               'PlaylistMapModePair': {'AssetId': '...',
                                       'AssetKind': 7,
                                       'VersionId': '...'},
               'SeasonId': 'Seasons/Season6.json',
               'StartTime': '2022-02-05T23:20:39.923Z',
               'TeamScoringEnabled': True,
               'TeamsEnabled': True,
               'UgcGameVariant': {'AssetId': '...',
                                  'AssetKind': 6,
                                  'VersionId': '...'}},
 'Players': [...],
 'Teams': [...],

Match skill

response = client.match.get_match_skill(match_id, player_id)

# print(response.data)
{'Value': [{'Id': 'xuid(...)',
            'Result': {'Counterfactuals': {'SelfCounterfactuals': {'Deaths': 12.38441050555862,
                                                                   'Kills': 11.805217023995946},
                                           'TierCounterfactuals': {}},
                       'RankRecap': {'PostMatchCsr': {'InitialMeasurementMatches': 0,
                                                      'MeasurementMatchesRemaining': 0,
                                                      'NextSubTier': 0,
                                                      'NextTier': '',
                                                      'NextTierStart': 0,
                                                      'SubTier': 0,
                                                      'Tier': '',
                                                      'TierStart': 0,
                                                      'Value': 0},
                                     'PreMatchCsr': {'InitialMeasurementMatches': 0,
                                                     'MeasurementMatchesRemaining': 0,
                                                     'NextSubTier': 0,
                                                     'NextTier': '',
                                                     'NextTierStart': 0,
                                                     'SubTier': 0,
                                                     'Tier': '',
                                                     'TierStart': 0,
                                                     'Value': 0}},
                       'RankedRewards': None,
                       'StatPerformances': {'Deaths': {'Count': 9,
                                                       'Expected': 12.38441050555862,
                                                       'StdDev': 4.498181792537211},
                                            'Kills': {'Count': 13,
                                                      'Expected': 11.805217023995946,
                                                      'StdDev': 4.750282423640629}},
                       'TeamId': 0,
                       'TeamMmr': 1149.370133486992,
                       'TeamMmrs': {'0': 1149.370133486992,
                                    '1': 1151.942592441846}},
            'ResultCode': 0}]}

Match progression

response = client.match.get_match_progression(match_id)

# print(response.data)
{'ChallengeProgressState': [{'Id': '...',
                             'Path': 'ChallengeContent/ClientChallengeDefinitions/S1CapstoneChallenges/CSamuraiMedalKilljoy.json',
                             'PreviousProgress': 1,
                             'Progress': 3},
                            {'Id': '...',
                             'Path': 'ChallengeContent/ClientChallengeDefinitions/DailyChallenges/PlayNew/d0NPlayB1.json',
                             'PreviousProgress': 0,
                             'Progress': 1}],
 'ClearanceId': '...',
 'RewardId': '...'}

Requirements

  • requests
  • python-dateutil

Tests

  • Not yet

Contributing

We are always grateful for any kind of contribution including but not limited to bug reports, code enhancements, bug fixes, and even functionality suggestions.

You can report any bug you find or suggest new functionality with a new issue.

If you want to add yourself some functionality to the wrapper:

  1. Fork it ( https://github.com/ingmferrer/haloinfinite )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Adds my new feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request
You might also like...
Clubhouse API written in Python. Standalone client included. For reference and education purposes only.
Clubhouse API written in Python. Standalone client included. For reference and education purposes only.

clubhouse-py is originally developed for the sake of interoperability. Standalone client is also created with very basic features, including but not limited to the audio-chat

A GETTR API client written in Python.

GUTTR A GETTR client library written in Python. I rushed to get this out so it's a bit janky. Open an issue if something is broken or missing. Getting

The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

Python wrapper for Spyse API The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

An API wrapper for convertio.co written in Python.

An API wrapper for convertio.co written in Python.

A simple API wrapper for Discord written in Python.

AIOCord This project is work in progress not for production use A simple asynchronous API wrapper around Discord API written in Python. Inspiration Th

A tool written in Python used to instalock agents in VALORANT using the local API.

Valorant Instalock Tool v2.1.0 by Mr. SOSA A tool written in Python used to instalock agents in VALORANT using the local API. This is NOT a hotkey pro

Python written Rule34 API

Python written Rule34 API

A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python.
A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python.

A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. Key Features Modern Pythonic API using async and await

A modern,feature-rich, and async ready API wrapper for Discord written in Python

discord.io A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. Key Features Modern Pythonic API using asyn

Owner
Miguel Ferrer
Creador de teemu.app y discordea.net
Miguel Ferrer
A Happy and lightweight Python Package that Provides an API to search for articles on Google News and returns a JSON response.

A Happy and lightweight Python Package that Provides an API to search for articles on Google News and returns a JSON response.

Muhammad Abdullah 273 Dec 31, 2022
Send song lyrics to iMessage users using the Genius lyrics API

pyMessage Send song lyrics to iMessage users using the Genius lyrics API. Setup 1.) Open the main.py file, and add your API key on line 7. 2.) Install

therealkingnull 1 Jan 23, 2022
Pogodasbot - Telegram bot sending channel weather info

Pogodasbot - Telegram bot sending channel weather info

Qayrat Sultan 1 Dec 15, 2022
Discord-Bot - Bot using nextcord for beginners

Discord-Bot Bot using nextcord for beginners! Requirements: 1 :- Install nextcord by typing "pip install nextcord" Thats it! You can use this code any

INFINITE_. 3 Jan 10, 2022
A updated and improved version from the original Discord-Netflix from Nirewen.

Discord-Netflix A updated version from the original Discord-Netflix from nirewen A Netflix wrapper that uses Discord RPC to show what you're watching

Void 42 Jan 02, 2023
Telegram üzerinden paylaşılan kısa linkleri geçmenin daha hızlı bir yolu

Telegram Url skipper Telegramda paylaşılan kısa linkleri geçmenin daha hızlı bir yolu · Hata Raporla · Öneri Yap İçerik Tablosu Kurulum Kullanım Lisan

WarForPeace 6 Oct 07, 2022
This tool is created by Shahzain and is one of the best self bots out there!

Shahzain SelfBot This tool is created by Shahzain and is one of the best self bots out there! Features Token Destroyer! Server Nuker(50-100 Bans Per S

Shahzain 6 Apr 02, 2022
The Most advanced and User-Friendly Google Collab NoteBook to download Torrent directly to Google Drive with File or Magnet Link support and with added protection of Timeout Preventer.

Torrent To Google Drive (UI Added! 😊 ) A Simple and User-Friendly Google Collab Notebook with UI to download Torrent to Google Drive using (.Torrent)

Dr.Caduceus 33 Aug 16, 2022
Automatically changes your discord status

Automatically changes your discord status, Be careful as this may get you rate limited and banned

octo 5 Sep 20, 2022
StringSessionGenerator - A Telegram bot to generate pyrogram and telethon string session

⭐️ String Session Generator ⭐️ Genrate String Session Using this bot. Made by TeamUltronX 🔥 String Session Demo Bot: Environment Variables Mandatory

TheUltronX 1 Dec 31, 2021
A Telegram Userbot to play Audio and Video songs / files in Telegram Voice Chats.

VC UserBot A Telegram Userbot to play Audio and Video songs / files in Telegram Voice Chats. It's made with PyTgCalls and Pyrogram Requirements Python

조던 1 Nov 29, 2021
An API Client package to access the APIs for NBA.com

nba_api An API Client package to access the APIs for NBA.com Development Version: v1.1.9 nba_api is an API Client for www.nba.com. This package is mea

Swar Patel 1.4k Jan 01, 2023
Mikasa is a 100% Spanish bot, a multifunctional bot, Mikasa is in beta.

Mikasa Miaksa, It is a multi-functional discord bot that is currently in development, this is not complete, there are still many things to fix and imp

Made in 2 Oct 05, 2021
DISCORD script to automate sending messages to a particular server

discord discord script This script sends random quotes to an discord server and tags random users on the server in the process MADE WITH LOVE BY SACS

Solomon ogu 1 Nov 06, 2021
Yes, it's true :orange_heart: This repository has 346 stars.

Yes, it's true! Inspired by a similar repository from @RealPeha, but implemented using a webhook on AWS Lambda and API Gateway, so it's serverless! If

512 Jan 01, 2023
Construindo API's robustas utilizando Python

🐂 Construindo API's robustas utilizando Python Neste tutorial vamos aprender a construir API's utilizando Python e FastAPI, integrá-las a serviços ex

luizalabs 296 Dec 13, 2022
Telegram Voice Chat Music Player UserBot Written with Pyrogram Smart Plugin and tgcalls

Telegram Voice Chat UserBot A Telegram UserBot to Play Audio in Voice Chats. This is also the source code of the userbot which is being used for playi

Dash Eclipse 7 May 21, 2022
Jika ada pertanyaan lebih lanjut, hubungi kontak dibawah ini. Terimakasih...

⚡ Lynx Userbot ⚡ Userbot Used for Fun on Telegram, and for Maintianing Your Group. This is a Repo Lynx-Userbot. This is Repo was Created by Axel From

29 Aug 30, 2021
Telegram tools

Telegram-Tools Telegram tools. Explanation English | 中文 Features Export group memebrs Add users to the group Send message to users Setup API Open http

4 Apr 02, 2022