Metadata-Version: 2.2
Name: FireBased
Version: 0.0.1
Summary: Firebase token generation
Home-page: https://github.com/isaackogan/FireBased
Author: Tricorder
Author-email: tricorder@isaackogan.com
License: MIT
Keywords: Firebase,Reverse Engineering,python3,api,unofficial
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Build Tools
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3.12
Classifier: Framework :: Pydantic :: 2
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx
Requires-Dist: betterproto==2.0.0b7
Requires-Dist: pydantic>=2.0.0
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: requires-dist
Dynamic: summary

# FireBased

A based implementation of the Firebase API. This project is a partial wrapper around the Firebase API.

With just the teeniest bit of extra work, you can hook this up like
someone did in [Push-Server](https://github.com/lastrise/Push-Server) to a
REST API and have a full-fledged push notification server.

## Note From The Creator

If you are using this, you are a developer. You know what you are doing.
I am not responsible for any misuse of this software.
I am not responsible for any bans or other actions taken against your account.

If you are hiring, e-mail `isaacikogan@gmail.com`. Let's chat :)!

## Helpful Tips

There are only a few identifiers you need to make requests.
All of them can be found in the APK of the app you want to register firebase for:

- `google_api_key` e.g. "AIzaSyA1b2C3dE4f5G6H7I8J9K0LmNOpQrStUvWx"
- `google_app_id` e.g. "1:123456789012:android:abcdefghijklm1234567"
- `google_app_package` e.g. "com.example.app"
- `google_app_name` e.g. "api-project-123456789012"
- `google_android_cert` e.g. "12345678A1B2C3D4E5F6G7H8I9J0KLMNOPQRSTU"

For your convenience, here is a basic example script that can generate a GCM token:

```python
import asyncio

from FireBased.client.client import FireBasedClient
from FireBased.client.proto import CheckInRequestMessage, CheckInResponseMessage
from FireBased.client.schemas import RegisterInstallRequestBody, RegisterInstallRequestBodyJsonBody, RegisterGcmRequestBody, FirebaseInstallationRequestResponse, RegisterGcmRequestResponse
from FireBased.ext.synthetic_data import create_synthetic_check_in, create_mobile_user_agent

client = FireBasedClient()

google_api_key = "AIzaSyA1b2C3dE4f5G6H7I8J9K0LmNOpQrStUvWx"  # Firebase API key
google_app_id = "1:123456789012:android:abcdefghijklm1234567"  # Firebase app ID
google_app_package = "com.example.app"  # Package name of the Android app
google_app_name = "api-project-123456789012"  # Firebase app name
google_android_cert = "12345678A1B2C3D4E5F6G7H8I9J0KLMNOPQRSTU"  # Sha-1 APK signing cert


async def generate_gcm_token() -> str:
    # Create a synthetic check-in payload.
    # Note that according to ChatGPT, developers can't access the data you send here.
    # All they can really check is the Firebase ID, GCM token, and the Android ID.
    check_in_payload: CheckInRequestMessage = create_synthetic_check_in()
    check_in_response: CheckInResponseMessage = await client.check_in(body=check_in_payload)

    # Create the installation registration payload
    register_install_payload: RegisterInstallRequestBody = RegisterInstallRequestBody(
        app_public_key=google_api_key,
        app_package=google_app_package,
        app_name=google_app_name,
        json_body=RegisterInstallRequestBodyJsonBody(appId=google_app_id),
        user_agent=create_mobile_user_agent(),
        app_cert=google_android_cert
    )

    # Register the installation
    install_data: FirebaseInstallationRequestResponse = await client.register_install(
        body=register_install_payload
    )

    # Finally, register the GCM token using the data from the previous requests
    gcm_response: RegisterGcmRequestResponse = await client.register_gcm(
        body=RegisterGcmRequestBody.from_models(
            install_request_body=register_install_payload,
            install_request_response=install_data,
            check_in_request_response=check_in_response
        )
    )

    return gcm_response.token


if __name__ == '__main__':
    gcm_token: str = asyncio.run(generate_gcm_token())
    print(f"Generated GCM token: {gcm_token}")
```

## Contributors

* **Isaac Kogan** - *Creator, Primary Maintainer, and Reverse-Engineering* - [isaackogan](https://github.com/isaackogan)
* **Lastrise** - *Reverse-Engineering* - [lastrise](https://github.com/lastrise)

See also the full list of [contributors](https://github.com/isaackogan/Grindr/contributors) who have participated in
this project.

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
