public async Task <string> GetReceipt(AndroidCheckinResponse credentials)
        {
            _logger?.LogDebug($"{nameof(GetReceipt)}");

            var requestParams = GetRequestParams(credentials.AndroidId.ToString());
            var content       = new FormUrlEncodedContent(requestParams);

            var response = await "https://android.clients.google.com/c2dm/register3"
                           .WithHeader("Authorization", $"AidLogin {credentials.AndroidId}:{credentials.SecurityToken}")
                           .WithHeader("User-Agent", GcmUserAgent)
                           .PostAsync(content)
                           .ConfigureAwait(false);

            response.EnsureSuccessStatusCode();

            var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = responseString.Split(new[] { "|ID|2|:" }, StringSplitOptions.None)[1];

            if (result == "PHONE_REGISTRATION_ERROR")
            {
                throw new InvalidOperationException($"{nameof(GetReceipt)} bad response: {result}\n{content}");
            }

            return(result);
        }
Exemple #2
0
        private async Task <CheckinData> CheckIn(ulong androidId, ulong securityToken)
        {
            AndroidCheckinRequest request = new AndroidCheckinRequest()
            {
                UserSerialNumber = 0,
                Checkin          = new AndroidCheckinProto()
                {
                    Type        = DeviceType.DeviceChromeBrowser,
                    ChromeBuild = new ChromeBuildProto()
                    {
                        Platform      = ChromeBuildProto.Types.Platform.Mac,
                        ChromeVersion = "63.0.3234.0",
                        Channel       = ChromeBuildProto.Types.Channel.Stable
                    },
                },
                Version       = 3,
                Id            = Convert.ToInt64(androidId),
                SecurityToken = securityToken
            };

            using (var httpClient = new HttpClient())
                using (var memoryStream = new MemoryStream())
                {
                    httpClient.DefaultRequestHeaders.Clear();
                    httpClient.DefaultRequestHeaders.ConnectionClose = true;

                    request.WriteTo(memoryStream);
                    memoryStream.Position = 0;

                    StreamContent content = new StreamContent(memoryStream);
                    content.Headers.ContentType = protobufContentType;

                    HttpResponseMessage response = await httpClient.PostAsync(checkinUrl, content).ConfigureAwait(false);

                    using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                    {
                        AndroidCheckinResponse result = AndroidCheckinResponse.Parser.ParseFrom(responseStream);
                        return(new CheckinData(result.AndroidId, result.SecurityToken));
                    }
                }
        }
Exemple #3
0
        public async Task <string> Register(AndroidCheckinResponse credentials)
        {
            var requestParams = GetRegisterRequestParams(RandomString.Generate(22), credentials.AndroidId.ToString());

            var content = new FormUrlEncodedContent(requestParams);

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://android.clients.google.com/c2dm/register3")
            {
                Content = content
            };

            httpRequestMessage.Headers.TryAddWithoutValidation("Authorization", $"AidLogin {credentials.AndroidId}:{credentials.SecurityToken}");

            var response = await _httpClient.SendAsync(httpRequestMessage).ConfigureAwait(false);

            response.EnsureSuccessStatusCode();

            var registerResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            return(registerResponse);
        }