Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mxrch
GitHub Repository: mxrch/GHunt
Path: blob/master/ghunt/apis/playgateway.py
252 views
1
from ghunt.objects.apis import GAPI, EndpointConfig
2
from ghunt.objects.base import GHuntCreds
3
from ghunt import globals as gb
4
from ghunt.protos.playgatewaypa.search_player_pb2 import PlayerSearchProto
5
from ghunt.protos.playgatewaypa.search_player_results_pb2 import PlayerSearchResultsProto
6
from ghunt.protos.playgatewaypa.get_player_pb2 import GetPlayerProto
7
from ghunt.protos.playgatewaypa.get_player_response_pb2 import GetPlayerResponseProto
8
from ghunt.parsers.playgateway import PlayerSearchResults
9
from ghunt.parsers.playgateway import PlayerProfile
10
11
import httpx
12
13
from typing import *
14
from struct import pack
15
import inspect
16
17
18
class PlayGatewayPaGrpc(GAPI):
19
def __init__(self, creds: GHuntCreds, headers: Dict[str, str] = {}):
20
super().__init__()
21
22
# Android OAuth fields
23
self.api_name = "playgames"
24
self.package_name = "com.google.android.play.games"
25
self.scopes = [
26
"https://www.googleapis.com/auth/games.firstparty",
27
"https://www.googleapis.com/auth/googleplay"
28
]
29
30
if not headers:
31
headers = gb.config.android_headers
32
33
headers = {**headers, **{
34
"Content-Type": "application/grpc",
35
"Te": "trailers"
36
}}
37
38
# Normal fields
39
40
self.hostname = "playgateway-pa.googleapis.com"
41
self.scheme = "https"
42
43
self._load_api(creds, headers)
44
45
async def search_player(self, as_client: httpx.AsyncClient, query: str) -> PlayerSearchResults:
46
endpoint = EndpointConfig(
47
name = inspect.currentframe().f_code.co_name,
48
verb = "POST",
49
data_type = "data", # json, data or None
50
authentication_mode = "oauth", # sapisidhash, cookies_only, oauth or None
51
require_key = None, # key name, or None
52
ext_metadata = {
53
"bin": {
54
"158709649": "CggaBgj22K2aARo4EgoI+aKnlZf996E/GhcQHhoPUkQyQS4yMTEwMDEuMDAyIgIxMToICgZJZ0pHVWdCB1BpeGVsIDU",
55
"173715354": "CgEx"
56
}
57
}
58
)
59
self._load_endpoint(endpoint)
60
61
base_url = "/play.gateway.adapter.interplay.v1.PlayGatewayInterplayService/GetPage"
62
63
player_search = PlayerSearchProto()
64
player_search.search_form.query.text = query
65
payload = player_search.SerializeToString()
66
67
prefix = bytes(1) + pack(">i", len(payload))
68
data = prefix + payload
69
70
req = await self._query(endpoint.name, as_client, base_url, data=data)
71
72
# Parsing
73
player_search_results = PlayerSearchResultsProto()
74
player_search_results.ParseFromString(req.content[5:])
75
76
parser = PlayerSearchResults()
77
parser._scrape(player_search_results)
78
79
return parser
80
81
async def get_player_stats(self, as_client: httpx.AsyncClient, player_id: str) -> PlayerProfile:
82
"""
83
This endpoint client isn't finished, it is only used to get total played applications & achievements count.
84
To get all the details about a player, please use get_player method of PlayGames (HTTP API).
85
"""
86
87
endpoint = EndpointConfig(
88
name = inspect.currentframe().f_code.co_name,
89
verb = "POST",
90
data_type = "data", # json, data or None
91
authentication_mode = "oauth", # sapisidhash, cookies_only, oauth or None
92
require_key = None, # key name, or None
93
ext_metadata = {
94
"bin": {
95
"158709649": "CggaBgj22K2aARo4EgoI+aKnlZf996E/GhcQHhoPUkQyQS4yMTEwMDEuMDAyIgIxMToICgZJZ0pHVWdCB1BpeGVsIDU",
96
"173715354": "CgEx"
97
}
98
}
99
)
100
self._load_endpoint(endpoint)
101
102
base_url = "/play.gateway.adapter.interplay.v1.PlayGatewayInterplayService/GetPage"
103
104
player_profile = GetPlayerProto()
105
player_profile.form.query.id = player_id
106
payload = player_profile.SerializeToString()
107
108
prefix = bytes(1) + pack(">i", len(payload))
109
data = prefix + payload
110
111
req = await self._query(endpoint.name, as_client, base_url, data=data)
112
113
# Parsing
114
player_profile = GetPlayerResponseProto()
115
player_profile.ParseFromString(req.content[5:])
116
117
parser = PlayerProfile()
118
parser._scrape(player_profile)
119
120
return parser
121