From dce12b7e674007c5b88730e4bd447a5de2a86564 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 15 Sep 2020 12:26:28 -0700 Subject: [PATCH 01/10] add protobuf-based v3 sms auth script --- authgateway.proto | 213 ++++++++++++++++++ authgateway.py | 233 ++++++++++++++++++++ google/protobuf/any.proto | 15 ++ google/protobuf/api.proto | 38 ++++ google/protobuf/compiler/plugin.proto | 34 +++ google/protobuf/descriptor.proto | 298 ++++++++++++++++++++++++++ google/protobuf/duration.proto | 16 ++ google/protobuf/empty.proto | 15 ++ google/protobuf/field_mask.proto | 15 ++ google/protobuf/source_context.proto | 14 ++ google/protobuf/struct.proto | 34 +++ google/protobuf/timestamp.proto | 16 ++ google/protobuf/type.proto | 89 ++++++++ google/protobuf/wrappers.proto | 47 ++++ requirements.txt | 18 ++ sms_auth_v3.py | 85 ++++++++ 16 files changed, 1180 insertions(+) create mode 100644 authgateway.proto create mode 100644 authgateway.py create mode 100644 google/protobuf/any.proto create mode 100644 google/protobuf/api.proto create mode 100644 google/protobuf/compiler/plugin.proto create mode 100644 google/protobuf/descriptor.proto create mode 100644 google/protobuf/duration.proto create mode 100644 google/protobuf/empty.proto create mode 100644 google/protobuf/field_mask.proto create mode 100644 google/protobuf/source_context.proto create mode 100644 google/protobuf/struct.proto create mode 100644 google/protobuf/timestamp.proto create mode 100644 google/protobuf/type.proto create mode 100644 google/protobuf/wrappers.proto create mode 100644 requirements.txt create mode 100644 sms_auth_v3.py diff --git a/authgateway.proto b/authgateway.proto new file mode 100644 index 0000000..6fc1a90 --- /dev/null +++ b/authgateway.proto @@ -0,0 +1,213 @@ +syntax = "proto3"; + +package tinder.services.authgateway; + +import "google/protobuf/wrappers.proto"; +import "google/protobuf/timestamp.proto"; + +option java_multiple_files = true; +option java_package = "com.tinder.generated.model.services.shared.authgateway"; + +message FacebookToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message Phone { + string phone = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message PhoneOtpResend { + google.protobuf.StringValue phone = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message PhoneOtp { + google.protobuf.StringValue phone = 1; + string otp = 2; + google.protobuf.StringValue refresh_token = 3; +} + +message Email { + string email = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.BoolValue marketing_opt_in = 3; +} + +message EmailOtpResend { + google.protobuf.StringValue email = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message GoogleToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.BoolValue marketing_opt_in = 3; + google.protobuf.BoolValue user_behavior = 4; +} + +message EmailOtp { + google.protobuf.StringValue email = 1; + string otp = 2; + google.protobuf.StringValue refresh_token = 3; +} + +message AppleToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.StringValue raw_nonce = 3; +} + +message GetInitialState { + google.protobuf.StringValue refresh_token = 1; +} + +message RefreshAuth { + string refresh_token = 1; +} + +message DismissSocialConnectionList { + string refresh_token = 1; +} + +message AuthGatewayRequest { + oneof factor { + Phone phone = 1; + PhoneOtp phone_otp = 2; + Email email = 3; + GoogleToken google_token = 4; + EmailOtp email_otp = 5; + FacebookToken facebook_token = 6; + PhoneOtpResend phone_otp_resend = 7; + EmailOtpResend email_otp_resend = 8; + GetInitialState get_initial_state = 9; + RefreshAuth refresh_auth = 10; + AppleToken apple_token = 11; + DismissSocialConnectionList dismiss_social_connection_list = 12; + } +} + + +message GetPhoneState { + google.protobuf.StringValue refresh_token = 1; +} + +message ValidatePhoneOtpState { + google.protobuf.StringValue refresh_token = 1; + string phone = 2; + google.protobuf.Int32Value otp_length = 3; + google.protobuf.BoolValue sms_sent = 4; +} + +message EmailMarketing { + google.protobuf.BoolValue show_marketing_opt_in = 2; + google.protobuf.BoolValue show_strict_opt_in = 3; + google.protobuf.BoolValue checked_by_default = 4; +} + +message GetEmailState { + google.protobuf.StringValue refresh_token = 1; + EmailMarketing email_marketing = 2; +} + +message ValidateEmailOtpState { + google.protobuf.StringValue refresh_token = 1; + google.protobuf.Int32Value otp_length = 4; + google.protobuf.BoolValue email_sent = 5; + EmailMarketing email_marketing = 6; + + oneof email { + string unmasked_email = 2; + string masked_email = 3; + } +} + +message OnboardingState { + string refresh_token = 1; + string onboarding_token = 2; +} + +message LoginResult { + string refresh_token = 1; + string auth_token = 2; + + Captcha captcha = 3; + enum Captcha { + CAPTCHA_INVALID = 0; + CAPTCHA_V1 = 1; + CAPTCHA_V2 = 2; + } + + string user_id = 4; + google.protobuf.Int64Value auth_token_ttl = 5; +} + +message AppleAccountNotFound { + bool will_link = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message SocialConnection { + Service service = 1; + enum Service { + SERVICE_INVALID = 0; + SERVICE_FACEBOOK = 1; + SERVICE_GOOGLE = 2; + SERVICE_APPLE = 3; + } +} + +message SocialConnectionList { + google.protobuf.StringValue refresh_token = 1; + repeated SocialConnection connections = 2; +} + +message AuthGatewayResponse { + MetaProto meta = 1; + ErrorProto error = 2; + + oneof data { + GetPhoneState get_phone_state = 3; + ValidatePhoneOtpState validate_phone_otp_state = 4; + GetEmailState get_email_state = 5; + ValidateEmailOtpState validate_email_otp_state = 6; + OnboardingState onboarding_state = 7; + LoginResult login_result = 8; + SocialConnectionList social_connection_list = 9; + AppleAccountNotFound apple_account_not_found = 10; + } +} +message Verification { + string type = 1; + string state = 2; +} + +message UnderageBan { + google.protobuf.Int64Value underage_ttl_duration_ms = 1; + google.protobuf.StringValue underage_token = 2; + Verification verification = 3; +} + +message BanAppeal { + string challenge_type = 1; + string challenge_token = 2; + string refresh_token = 3; +} + +message BanReason { + oneof reason { + UnderageBan underage_ban = 1; + BanAppeal ban_appeal = 2; + } +} +message ErrorProto { + int32 code = 1; + string message = 2; + BanReason ban_reason = 3; +} + +message MetaProto { + google.protobuf.Timestamp upstream_time = 1; + google.protobuf.Timestamp start_time = 2; +} diff --git a/authgateway.py b/authgateway.py new file mode 100644 index 0000000..6e6e5e5 --- /dev/null +++ b/authgateway.py @@ -0,0 +1,233 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: authgateway.proto +# plugin: python-betterproto +from dataclasses import dataclass +from datetime import datetime +from typing import List, Optional + +import betterproto + + +class LoginResultCaptcha(betterproto.Enum): + CAPTCHA_INVALID = 0 + CAPTCHA_V1 = 1 + CAPTCHA_V2 = 2 + + +class SocialConnectionService(betterproto.Enum): + SERVICE_INVALID = 0 + SERVICE_FACEBOOK = 1 + SERVICE_GOOGLE = 2 + SERVICE_APPLE = 3 + + +@dataclass +class FacebookToken(betterproto.Message): + external_token: str = betterproto.string_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + + +@dataclass +class Phone(betterproto.Message): + phone: str = betterproto.string_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + + +@dataclass +class PhoneOtpResend(betterproto.Message): + phone: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + + +@dataclass +class PhoneOtp(betterproto.Message): + phone: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + otp: str = betterproto.string_field(2) + refresh_token: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + + +@dataclass +class Email(betterproto.Message): + email: str = betterproto.string_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + marketing_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) + + +@dataclass +class EmailOtpResend(betterproto.Message): + email: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + + +@dataclass +class GoogleToken(betterproto.Message): + external_token: str = betterproto.string_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + marketing_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) + user_behavior: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) + + +@dataclass +class EmailOtp(betterproto.Message): + email: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + otp: str = betterproto.string_field(2) + refresh_token: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + + +@dataclass +class AppleToken(betterproto.Message): + external_token: str = betterproto.string_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + raw_nonce: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + + +@dataclass +class GetInitialState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + + +@dataclass +class RefreshAuth(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + + +@dataclass +class DismissSocialConnectionList(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + + +@dataclass +class AuthGatewayRequest(betterproto.Message): + phone: "Phone" = betterproto.message_field(1, group="factor") + phone_otp: "PhoneOtp" = betterproto.message_field(2, group="factor") + email: "Email" = betterproto.message_field(3, group="factor") + google_token: "GoogleToken" = betterproto.message_field(4, group="factor") + email_otp: "EmailOtp" = betterproto.message_field(5, group="factor") + facebook_token: "FacebookToken" = betterproto.message_field(6, group="factor") + phone_otp_resend: "PhoneOtpResend" = betterproto.message_field(7, group="factor") + email_otp_resend: "EmailOtpResend" = betterproto.message_field(8, group="factor") + get_initial_state: "GetInitialState" = betterproto.message_field(9, group="factor") + refresh_auth: "RefreshAuth" = betterproto.message_field(10, group="factor") + apple_token: "AppleToken" = betterproto.message_field(11, group="factor") + dismiss_social_connection_list: "DismissSocialConnectionList" = (betterproto.message_field(12, group="factor")) + + +@dataclass +class GetPhoneState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + + +@dataclass +class ValidatePhoneOtpState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + phone: str = betterproto.string_field(2) + otp_length: Optional[int] = betterproto.message_field(3, wraps=betterproto.TYPE_INT32) + sms_sent: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) + + +@dataclass +class EmailMarketing(betterproto.Message): + show_marketing_opt_in: Optional[bool] = betterproto.message_field(2, wraps=betterproto.TYPE_BOOL) + show_strict_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) + checked_by_default: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) + + +@dataclass +class GetEmailState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + email_marketing: "EmailMarketing" = betterproto.message_field(2) + + +@dataclass +class ValidateEmailOtpState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + otp_length: Optional[int] = betterproto.message_field(4, wraps=betterproto.TYPE_INT32) + email_sent: Optional[bool] = betterproto.message_field(5, wraps=betterproto.TYPE_BOOL) + email_marketing: "EmailMarketing" = betterproto.message_field(6) + unmasked_email: str = betterproto.string_field(2, group="email") + masked_email: str = betterproto.string_field(3, group="email") + + +@dataclass +class OnboardingState(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + onboarding_token: str = betterproto.string_field(2) + + +@dataclass +class LoginResult(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + auth_token: str = betterproto.string_field(2) + captcha: "LoginResultCaptcha" = betterproto.enum_field(3) + user_id: str = betterproto.string_field(4) + auth_token_ttl: Optional[int] = betterproto.message_field(5, wraps=betterproto.TYPE_INT64) + + +@dataclass +class AppleAccountNotFound(betterproto.Message): + will_link: bool = betterproto.bool_field(1) + refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + + +@dataclass +class SocialConnection(betterproto.Message): + service: "SocialConnectionService" = betterproto.enum_field(1) + + +@dataclass +class SocialConnectionList(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + connections: List["SocialConnection"] = betterproto.message_field(2) + + +@dataclass +class AuthGatewayResponse(betterproto.Message): + meta: "MetaProto" = betterproto.message_field(1) + error: "ErrorProto" = betterproto.message_field(2) + get_phone_state: "GetPhoneState" = betterproto.message_field(3, group="data") + validate_phone_otp_state: "ValidatePhoneOtpState" = betterproto.message_field(4, group="data") + get_email_state: "GetEmailState" = betterproto.message_field(5, group="data") + validate_email_otp_state: "ValidateEmailOtpState" = betterproto.message_field(6, group="data") + onboarding_state: "OnboardingState" = betterproto.message_field(7, group="data") + login_result: "LoginResult" = betterproto.message_field(8, group="data") + social_connection_list: "SocialConnectionList" = betterproto.message_field(9, group="data") + apple_account_not_found: "AppleAccountNotFound" = betterproto.message_field(10, group="data") + + +@dataclass +class Verification(betterproto.Message): + type: str = betterproto.string_field(1) + state: str = betterproto.string_field(2) + + +@dataclass +class UnderageBan(betterproto.Message): + underage_ttl_duration_ms: Optional[int] = betterproto.message_field(1, wraps=betterproto.TYPE_INT64) + underage_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + verification: "Verification" = betterproto.message_field(3) + + +@dataclass +class BanAppeal(betterproto.Message): + challenge_type: str = betterproto.string_field(1) + challenge_token: str = betterproto.string_field(2) + refresh_token: str = betterproto.string_field(3) + + +@dataclass +class BanReason(betterproto.Message): + underage_ban: "UnderageBan" = betterproto.message_field(1, group="reason") + ban_appeal: "BanAppeal" = betterproto.message_field(2, group="reason") + + +@dataclass +class ErrorProto(betterproto.Message): + code: int = betterproto.int32_field(1) + message: str = betterproto.string_field(2) + ban_reason: "BanReason" = betterproto.message_field(3) + + +@dataclass +class MetaProto(betterproto.Message): + upstream_time: datetime = betterproto.message_field(1) + start_time: datetime = betterproto.message_field(2) \ No newline at end of file diff --git a/google/protobuf/any.proto b/google/protobuf/any.proto new file mode 100644 index 0000000..441ae1b --- /dev/null +++ b/google/protobuf/any.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option go_package = "github.com/golang/protobuf/ptypes/any"; +option java_multiple_files = true; +option java_outer_classname = "AnyProto"; +option java_package = "com.google.protobuf"; + +message Any { + string type_url = 1; + bytes value = 2; +} diff --git a/google/protobuf/api.proto b/google/protobuf/api.proto new file mode 100644 index 0000000..f9b60e0 --- /dev/null +++ b/google/protobuf/api.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; + +package google.protobuf; + +import "google/protobuf/source_context.proto"; +import "google/protobuf/type.proto"; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option go_package = "google.golang.org/genproto/protobuf/api;api"; +option java_multiple_files = true; +option java_outer_classname = "ApiProto"; +option java_package = "com.google.protobuf"; + +message Api { + string name = 1; + repeated Method methods = 2; + repeated Option options = 3; + string version = 4; + SourceContext source_context = 5; + repeated Mixin mixins = 6; + Syntax syntax = 7; +} + +message Method { + string name = 1; + string request_type_url = 2; + bool request_streaming = 3; + string response_type_url = 4; + bool response_streaming = 5; + repeated Option options = 6; + Syntax syntax = 7; +} + +message Mixin { + string name = 1; + string root = 2; +} diff --git a/google/protobuf/compiler/plugin.proto b/google/protobuf/compiler/plugin.proto new file mode 100644 index 0000000..61ee7f4 --- /dev/null +++ b/google/protobuf/compiler/plugin.proto @@ -0,0 +1,34 @@ +syntax = "proto2"; + +package google.protobuf.compiler; + +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; +option java_outer_classname = "PluginProtos"; +option java_package = "com.google.protobuf.compiler"; + +message Version { + optional int32 major = 1; + optional int32 minor = 2; + optional int32 patch = 3; + optional string suffix = 4; +} + +message CodeGeneratorRequest { + repeated string file_to_generate = 1; + optional string parameter = 2; + repeated FileDescriptorProto proto_file = 15; + optional Version compiler_version = 3; +} + +message CodeGeneratorResponse { + optional string error = 1; + + repeated File file = 15; + message File { + optional string name = 1; + optional string insertion_point = 2; + optional string content = 15; + } +} diff --git a/google/protobuf/descriptor.proto b/google/protobuf/descriptor.proto new file mode 100644 index 0000000..6003bb8 --- /dev/null +++ b/google/protobuf/descriptor.proto @@ -0,0 +1,298 @@ +syntax = "proto2"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; +option optimize_for = SPEED; +option java_outer_classname = "DescriptorProtos"; +option java_package = "com.google.protobuf"; + +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +message FileDescriptorProto { + optional string name = 1; + optional string package = 2; + repeated string dependency = 3; + repeated int32 public_dependency = 10; + repeated int32 weak_dependency = 11; + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + optional FileOptions options = 8; + optional SourceCodeInfo source_code_info = 9; + optional string syntax = 12; +} + +message DescriptorProto { + optional string name = 1; + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + repeated ExtensionRange extension_range = 5; + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + optional ExtensionRangeOptions options = 3; + } + + repeated OneofDescriptorProto oneof_decl = 8; + optional MessageOptions options = 7; + + repeated ReservedRange reserved_range = 9; + message ReservedRange { + optional int32 start = 1; + optional int32 end = 2; + } + + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message FieldDescriptorProto { + optional string name = 1; + optional int32 number = 3; + + optional Label label = 4; + enum Label { + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + } + + optional Type type = 5; + enum Type { + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; + TYPE_SINT64 = 18; + } + + optional string type_name = 6; + optional string extendee = 2; + optional string default_value = 7; + optional int32 oneof_index = 9; + optional string json_name = 10; + optional FieldOptions options = 8; +} + +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +message EnumDescriptorProto { + optional string name = 1; + repeated EnumValueDescriptorProto value = 2; + optional EnumOptions options = 3; + + repeated EnumReservedRange reserved_range = 4; + message EnumReservedRange { + optional int32 start = 1; + optional int32 end = 2; + } + + repeated string reserved_name = 5; +} + +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + optional EnumValueOptions options = 3; +} + +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + optional ServiceOptions options = 3; +} + +message MethodDescriptorProto { + optional string name = 1; + optional string input_type = 2; + optional string output_type = 3; + optional MethodOptions options = 4; + optional bool client_streaming = 5 [default = false]; + optional bool server_streaming = 6 [default = false]; +} + +message FileOptions { + optional string java_package = 1; + optional string java_outer_classname = 8; + optional bool java_multiple_files = 10 [default = false]; + optional bool java_generate_equals_and_hash = 20 [deprecated = true]; + optional bool java_string_check_utf8 = 27 [default = false]; + + optional OptimizeMode optimize_for = 9 [default = SPEED]; + enum OptimizeMode { + SPEED = 1; + CODE_SIZE = 2; + LITE_RUNTIME = 3; + } + + optional string go_package = 11; + optional bool cc_generic_services = 16 [default = false]; + optional bool java_generic_services = 17 [default = false]; + optional bool py_generic_services = 18 [default = false]; + optional bool php_generic_services = 42 [default = false]; + optional bool deprecated = 23 [default = false]; + optional bool cc_enable_arenas = 31 [default = false]; + optional string objc_class_prefix = 36; + optional string csharp_namespace = 37; + optional string swift_prefix = 39; + optional string php_class_prefix = 40; + optional string php_namespace = 41; + optional string php_metadata_namespace = 44; + optional string ruby_package = 45; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + optional bool message_set_wire_format = 1 [default = false]; + optional bool no_standard_descriptor_accessor = 2 [default = false]; + optional bool deprecated = 3 [default = false]; + optional bool map_entry = 7; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 8, 9; +} + +message FieldOptions { + optional CType ctype = 1 [default = STRING]; + enum CType { + STRING = 0; + CORD = 1; + STRING_PIECE = 2; + } + + optional bool packed = 2; + + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + JS_NORMAL = 0; + JS_STRING = 1; + JS_NUMBER = 2; + } + + optional bool lazy = 5 [default = false]; + optional bool deprecated = 3 [default = false]; + optional bool weak = 10 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 4; +} + +message OneofOptions { + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message EnumOptions { + optional bool allow_alias = 2; + optional bool deprecated = 3 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 5; +} + +message EnumValueOptions { + optional bool deprecated = 1 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message ServiceOptions { + optional bool deprecated = 33 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message MethodOptions { + optional bool deprecated = 33 [default = false]; + + optional IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; + IDEMPOTENT = 2; + } + + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message UninterpretedOption { + repeated NamePart name = 2; + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +message SourceCodeInfo { + repeated Location location = 1; + message Location { + repeated int32 path = 1 [packed = true]; + repeated int32 span = 2 [packed = true]; + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +message GeneratedCodeInfo { + repeated Annotation annotation = 1; + message Annotation { + repeated int32 path = 1 [packed = true]; + optional string source_file = 2; + optional int32 begin = 3; + optional int32 end = 4; + } +} diff --git a/google/protobuf/duration.proto b/google/protobuf/duration.proto new file mode 100644 index 0000000..6492685 --- /dev/null +++ b/google/protobuf/duration.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/duration"; +option java_multiple_files = true; +option java_outer_classname = "DurationProto"; +option java_package = "com.google.protobuf"; + +message Duration { + int64 seconds = 1; + int32 nanos = 2; +} diff --git a/google/protobuf/empty.proto b/google/protobuf/empty.proto new file mode 100644 index 0000000..2b0503f --- /dev/null +++ b/google/protobuf/empty.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/empty"; +option java_multiple_files = true; +option java_outer_classname = "EmptyProto"; +option java_package = "com.google.protobuf"; + +message Empty { + +} diff --git a/google/protobuf/field_mask.proto b/google/protobuf/field_mask.proto new file mode 100644 index 0000000..7315ad9 --- /dev/null +++ b/google/protobuf/field_mask.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/protobuf/field_mask;field_mask"; +option java_multiple_files = true; +option java_outer_classname = "FieldMaskProto"; +option java_package = "com.google.protobuf"; + +message FieldMask { + repeated string paths = 1; +} diff --git a/google/protobuf/source_context.proto b/google/protobuf/source_context.proto new file mode 100644 index 0000000..c74b911 --- /dev/null +++ b/google/protobuf/source_context.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option go_package = "google.golang.org/genproto/protobuf/source_context;source_context"; +option java_multiple_files = true; +option java_outer_classname = "SourceContextProto"; +option java_package = "com.google.protobuf"; + +message SourceContext { + string file_name = 1; +} diff --git a/google/protobuf/struct.proto b/google/protobuf/struct.proto new file mode 100644 index 0000000..dfe00af --- /dev/null +++ b/google/protobuf/struct.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; +option java_multiple_files = true; +option java_outer_classname = "StructProto"; +option java_package = "com.google.protobuf"; + +message Struct { + map fields = 1; +} + +message Value { + oneof kind { + NullValue null_value = 1; + double number_value = 2; + string string_value = 3; + bool bool_value = 4; + Struct struct_value = 5; + ListValue list_value = 6; + } +} + +message ListValue { + repeated Value values = 1; +} + +enum NullValue { + NULL_VALUE = 0; +} diff --git a/google/protobuf/timestamp.proto b/google/protobuf/timestamp.proto new file mode 100644 index 0000000..50b8fa8 --- /dev/null +++ b/google/protobuf/timestamp.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/timestamp"; +option java_multiple_files = true; +option java_outer_classname = "TimestampProto"; +option java_package = "com.google.protobuf"; + +message Timestamp { + int64 seconds = 1; + int32 nanos = 2; +} diff --git a/google/protobuf/type.proto b/google/protobuf/type.proto new file mode 100644 index 0000000..1587723 --- /dev/null +++ b/google/protobuf/type.proto @@ -0,0 +1,89 @@ +syntax = "proto3"; + +package google.protobuf; + +import "google/protobuf/any.proto"; +import "google/protobuf/source_context.proto"; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/protobuf/ptype;ptype"; +option java_multiple_files = true; +option java_outer_classname = "TypeProto"; +option java_package = "com.google.protobuf"; + +message Type { + string name = 1; + repeated Field fields = 2; + repeated string oneofs = 3; + repeated Option options = 4; + SourceContext source_context = 5; + Syntax syntax = 6; +} + +message Field { + Kind kind = 1; + enum Kind { + TYPE_UNKNOWN = 0; + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; + TYPE_SINT64 = 18; + } + + Cardinality cardinality = 2; + enum Cardinality { + CARDINALITY_UNKNOWN = 0; + CARDINALITY_OPTIONAL = 1; + CARDINALITY_REQUIRED = 2; + CARDINALITY_REPEATED = 3; + } + + int32 number = 3; + string name = 4; + string type_url = 6; + int32 oneof_index = 7; + bool packed = 8; + repeated Option options = 9; + string json_name = 10; + string default_value = 11; +} + +message Enum { + string name = 1; + repeated EnumValue enumvalue = 2; + repeated Option options = 3; + SourceContext source_context = 4; + Syntax syntax = 5; +} + +message EnumValue { + string name = 1; + int32 number = 2; + repeated Option options = 3; +} + +message Option { + string name = 1; + Any value = 2; +} + +enum Syntax { + SYNTAX_PROTO2 = 0; + SYNTAX_PROTO3 = 1; +} diff --git a/google/protobuf/wrappers.proto b/google/protobuf/wrappers.proto new file mode 100644 index 0000000..52b8179 --- /dev/null +++ b/google/protobuf/wrappers.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/wrappers"; +option java_multiple_files = true; +option java_outer_classname = "WrappersProto"; +option java_package = "com.google.protobuf"; + +message DoubleValue { + double value = 1; +} + +message FloatValue { + float value = 1; +} + +message Int64Value { + int64 value = 1; +} + +message UInt64Value { + uint64 value = 1; +} + +message Int32Value { + int32 value = 1; +} + +message UInt32Value { + uint32 value = 1; +} + +message BoolValue { + bool value = 1; +} + +message StringValue { + string value = 1; +} + +message BytesValue { + bytes value = 1; +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e76d2ea --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +beautifulsoup4==4.9.1 +betterproto==1.2.5 +certifi==2020.6.20 +chardet==3.0.4 +grpclib==0.4.0 +h2==3.2.0 +hpack==3.0.0 +hyperframe==5.2.0 +idna==2.10 +lxml==4.5.2 +multidict==4.7.6 +requests==2.24.0 +robobrowser==0.5.3 +six==1.15.0 +soupsieve==2.0.1 +stringcase==1.2.0 +urllib3==1.25.10 +Werkzeug==1.0.1 diff --git a/sms_auth_v3.py b/sms_auth_v3.py new file mode 100644 index 0000000..8521954 --- /dev/null +++ b/sms_auth_v3.py @@ -0,0 +1,85 @@ +import requests +import random +import string +import uuid +from authgateway import * +import secrets +from pathlib import Path + + +class SMSAuthException(BaseException): + pass + + +class TinderSMSAuth(object): + + def __init__(self, email=None): + self.installid = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase + string.digits, k=11)) + self.session = requests.Session() + self.session.headers.update({"user-agent": "Tinder Android Version 11.23.0"}) + self.url = "https://api.gotinder.com" + self.funnelid = str(uuid.uuid4()) + self.appsessionid = str(uuid.uuid4()) + self.deviceid = secrets.token_hex(8) + self.authtoken = None + self.refreshtoken = None + self.userid = None + self.email = email + if Path("smstoken.txt").exists(): + with open("smstoken.txt", "r") as fh: + tokens = fh.read() + t = tokens.split(",") + self.authtoken = t[0] + self.refreshtoken = t[1] + print("authToken found: " + self.authtoken) + else: + self.login() + + def login(self): + payload = { + "device_id": self.installid, + "experiments": ["default_login_token", "tinder_u_verification_method", "tinder_rules", + "user_interests_available"] + } + self.session.post(self.url + "/v2/buckets", json=payload) + phonenumber = input("phone number (starting with 1, numbers only): ") + messageout = AuthGatewayRequest(Phone(phone=phonenumber)) + seconds = random.uniform(100, 250) + headers = { + 'tinder-version': "11.23.0", 'install-id': self.installid, + 'user-agent': "Tinder Android Version 11.23.0", 'connection': "close", + 'platform-variant': "Google-Play", 'persistent-device-id': self.deviceid, + 'accept-encoding': "gzip, deflate", 'appsflyer-id': "1600144077225-7971032049730563486", + 'platform': "android", 'app-version': "3994", 'os-version': "25", 'app-session-id': self.appsessionid, + 'x-supported-image-formats': "webp", 'funnel-session-id': self.funnelid, + 'app-session-time-elapsed': format(seconds, ".3f"), 'accept-language': "en-US", + 'content-type': "application/x-protobuf" + } + self.session.headers.update(headers) + r = self.session.post(self.url + "/v3/auth/login", data=bytes(messageout)) + response = AuthGatewayResponse().parse(r.content).to_dict() + print(response) + if "validatePhoneOtpState" in response.keys() and response["validatePhoneOtpState"]["smsSent"]: + otpresponse = input("OTP Response from SMS: ") + resp = PhoneOtp(phone=phonenumber, otp=otpresponse) + messageresponse = bytes(AuthGatewayRequest(phone_otp=resp)) + self.session.headers.update({"app-session-time-elapsed": format(seconds + random.uniform(30, 90), ".3f")}) + r = self.session.post(self.url + "/v3/auth/login", data=messageresponse) + response = AuthGatewayResponse().parse(r.content).to_dict() + print(response) + if "loginResult" in response.keys() and "authToken" in response["loginResult"].keys(): + self.refreshtoken = response["loginResult"]["refreshToken"] + self.authtoken = response["loginResult"]["authToken"] + userid = response["userId"] + with open("smstoken.txt", "w") as fh: + fh.write(self.authtoken + "," + self.refreshtoken) + return self.session.headers.update({"X-Auth-Token": self.authtoken}) + else: + raise SMSAuthException + else: + raise SMSAuthException + + +if __name__ == '__main__': + print("This script will use the sms login to obtain the auth token, which will be saved to smstoken.txt") + TinderSMSAuth() \ No newline at end of file From 80e190c13cefd3e03d1e91f0b1b11d2dc9d750a4 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 15 Sep 2020 12:32:05 -0700 Subject: [PATCH 02/10] unnecessary userid --- sms_auth_v3.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sms_auth_v3.py b/sms_auth_v3.py index 8521954..9372bba 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -70,7 +70,6 @@ def login(self): if "loginResult" in response.keys() and "authToken" in response["loginResult"].keys(): self.refreshtoken = response["loginResult"]["refreshToken"] self.authtoken = response["loginResult"]["authToken"] - userid = response["userId"] with open("smstoken.txt", "w") as fh: fh.write(self.authtoken + "," + self.refreshtoken) return self.session.headers.update({"X-Auth-Token": self.authtoken}) From 17d59ffe1b1b3b121dd56fb2544004b389ce3c84 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 15 Sep 2020 15:29:11 -0700 Subject: [PATCH 03/10] added prompts for additional email validation --- sms_auth_v3.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sms_auth_v3.py b/sms_auth_v3.py index 9372bba..b5f8037 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -67,6 +67,15 @@ def login(self): r = self.session.post(self.url + "/v3/auth/login", data=messageresponse) response = AuthGatewayResponse().parse(r.content).to_dict() print(response) + if "validateEmailOtpState" in response.keys(): + emailoptresponse = input("Check your email and input the verification code just sent to you: ") + refreshtoken = response["validateEmailOtpState"]["refreshToken"] + email = input("Input your email: ") + resp = bytes(AuthGatewayRequest( + email_otp=EmailOtp(otp=emailoptresponse, email=email, refresh_token=refreshtoken))) + r = self.session.post(self.url + "/v3/auth/login", data=resp) + response = AuthGatewayResponse().parse(r.content).to_dict() + print(response) if "loginResult" in response.keys() and "authToken" in response["loginResult"].keys(): self.refreshtoken = response["loginResult"]["refreshToken"] self.authtoken = response["loginResult"]["authToken"] From 28a5e8712d2c0c2aee05463c86258bbdc8656630 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 15 Sep 2020 18:46:56 -0700 Subject: [PATCH 04/10] gitignore --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index d1f11ae..5a8d5de 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,11 @@ __pycache__ find.py *.log *.egg-info + +.idea/ + +smstoken.txt + +google/protobuf/.DS_Store + +google/.DS_Store From 6c2e5894de10514e04479cb684b92aa6b31a8a45 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 22 Sep 2020 02:22:17 -0700 Subject: [PATCH 05/10] added extraneous folder to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5a8d5de..c889d95 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ smstoken.txt google/protobuf/.DS_Store google/.DS_Store +/google/ From c1283c40a74c72f91c6047b26e7ec31b0bbfd5cf Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Tue, 22 Sep 2020 03:55:19 -0700 Subject: [PATCH 06/10] remove extraneous .proto files --- google/protobuf/any.proto | 15 -- google/protobuf/api.proto | 38 ---- google/protobuf/compiler/plugin.proto | 34 --- google/protobuf/descriptor.proto | 298 -------------------------- google/protobuf/duration.proto | 16 -- google/protobuf/empty.proto | 15 -- google/protobuf/field_mask.proto | 15 -- google/protobuf/source_context.proto | 14 -- google/protobuf/struct.proto | 34 --- google/protobuf/timestamp.proto | 16 -- google/protobuf/type.proto | 89 -------- google/protobuf/wrappers.proto | 47 ---- 12 files changed, 631 deletions(-) delete mode 100644 google/protobuf/any.proto delete mode 100644 google/protobuf/api.proto delete mode 100644 google/protobuf/compiler/plugin.proto delete mode 100644 google/protobuf/descriptor.proto delete mode 100644 google/protobuf/duration.proto delete mode 100644 google/protobuf/empty.proto delete mode 100644 google/protobuf/field_mask.proto delete mode 100644 google/protobuf/source_context.proto delete mode 100644 google/protobuf/struct.proto delete mode 100644 google/protobuf/timestamp.proto delete mode 100644 google/protobuf/type.proto delete mode 100644 google/protobuf/wrappers.proto diff --git a/google/protobuf/any.proto b/google/protobuf/any.proto deleted file mode 100644 index 441ae1b..0000000 --- a/google/protobuf/any.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option go_package = "github.com/golang/protobuf/ptypes/any"; -option java_multiple_files = true; -option java_outer_classname = "AnyProto"; -option java_package = "com.google.protobuf"; - -message Any { - string type_url = 1; - bytes value = 2; -} diff --git a/google/protobuf/api.proto b/google/protobuf/api.proto deleted file mode 100644 index f9b60e0..0000000 --- a/google/protobuf/api.proto +++ /dev/null @@ -1,38 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -import "google/protobuf/source_context.proto"; -import "google/protobuf/type.proto"; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option go_package = "google.golang.org/genproto/protobuf/api;api"; -option java_multiple_files = true; -option java_outer_classname = "ApiProto"; -option java_package = "com.google.protobuf"; - -message Api { - string name = 1; - repeated Method methods = 2; - repeated Option options = 3; - string version = 4; - SourceContext source_context = 5; - repeated Mixin mixins = 6; - Syntax syntax = 7; -} - -message Method { - string name = 1; - string request_type_url = 2; - bool request_streaming = 3; - string response_type_url = 4; - bool response_streaming = 5; - repeated Option options = 6; - Syntax syntax = 7; -} - -message Mixin { - string name = 1; - string root = 2; -} diff --git a/google/protobuf/compiler/plugin.proto b/google/protobuf/compiler/plugin.proto deleted file mode 100644 index 61ee7f4..0000000 --- a/google/protobuf/compiler/plugin.proto +++ /dev/null @@ -1,34 +0,0 @@ -syntax = "proto2"; - -package google.protobuf.compiler; - -import "google/protobuf/descriptor.proto"; - -option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; -option java_outer_classname = "PluginProtos"; -option java_package = "com.google.protobuf.compiler"; - -message Version { - optional int32 major = 1; - optional int32 minor = 2; - optional int32 patch = 3; - optional string suffix = 4; -} - -message CodeGeneratorRequest { - repeated string file_to_generate = 1; - optional string parameter = 2; - repeated FileDescriptorProto proto_file = 15; - optional Version compiler_version = 3; -} - -message CodeGeneratorResponse { - optional string error = 1; - - repeated File file = 15; - message File { - optional string name = 1; - optional string insertion_point = 2; - optional string content = 15; - } -} diff --git a/google/protobuf/descriptor.proto b/google/protobuf/descriptor.proto deleted file mode 100644 index 6003bb8..0000000 --- a/google/protobuf/descriptor.proto +++ /dev/null @@ -1,298 +0,0 @@ -syntax = "proto2"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.Reflection"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; -option optimize_for = SPEED; -option java_outer_classname = "DescriptorProtos"; -option java_package = "com.google.protobuf"; - -message FileDescriptorSet { - repeated FileDescriptorProto file = 1; -} - -message FileDescriptorProto { - optional string name = 1; - optional string package = 2; - repeated string dependency = 3; - repeated int32 public_dependency = 10; - repeated int32 weak_dependency = 11; - repeated DescriptorProto message_type = 4; - repeated EnumDescriptorProto enum_type = 5; - repeated ServiceDescriptorProto service = 6; - repeated FieldDescriptorProto extension = 7; - optional FileOptions options = 8; - optional SourceCodeInfo source_code_info = 9; - optional string syntax = 12; -} - -message DescriptorProto { - optional string name = 1; - repeated FieldDescriptorProto field = 2; - repeated FieldDescriptorProto extension = 6; - repeated DescriptorProto nested_type = 3; - repeated EnumDescriptorProto enum_type = 4; - - repeated ExtensionRange extension_range = 5; - message ExtensionRange { - optional int32 start = 1; - optional int32 end = 2; - optional ExtensionRangeOptions options = 3; - } - - repeated OneofDescriptorProto oneof_decl = 8; - optional MessageOptions options = 7; - - repeated ReservedRange reserved_range = 9; - message ReservedRange { - optional int32 start = 1; - optional int32 end = 2; - } - - repeated string reserved_name = 10; -} - -message ExtensionRangeOptions { - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; -} - -message FieldDescriptorProto { - optional string name = 1; - optional int32 number = 3; - - optional Label label = 4; - enum Label { - LABEL_OPTIONAL = 1; - LABEL_REQUIRED = 2; - LABEL_REPEATED = 3; - } - - optional Type type = 5; - enum Type { - TYPE_DOUBLE = 1; - TYPE_FLOAT = 2; - TYPE_INT64 = 3; - TYPE_UINT64 = 4; - TYPE_INT32 = 5; - TYPE_FIXED64 = 6; - TYPE_FIXED32 = 7; - TYPE_BOOL = 8; - TYPE_STRING = 9; - TYPE_GROUP = 10; - TYPE_MESSAGE = 11; - TYPE_BYTES = 12; - TYPE_UINT32 = 13; - TYPE_ENUM = 14; - TYPE_SFIXED32 = 15; - TYPE_SFIXED64 = 16; - TYPE_SINT32 = 17; - TYPE_SINT64 = 18; - } - - optional string type_name = 6; - optional string extendee = 2; - optional string default_value = 7; - optional int32 oneof_index = 9; - optional string json_name = 10; - optional FieldOptions options = 8; -} - -message OneofDescriptorProto { - optional string name = 1; - optional OneofOptions options = 2; -} - -message EnumDescriptorProto { - optional string name = 1; - repeated EnumValueDescriptorProto value = 2; - optional EnumOptions options = 3; - - repeated EnumReservedRange reserved_range = 4; - message EnumReservedRange { - optional int32 start = 1; - optional int32 end = 2; - } - - repeated string reserved_name = 5; -} - -message EnumValueDescriptorProto { - optional string name = 1; - optional int32 number = 2; - optional EnumValueOptions options = 3; -} - -message ServiceDescriptorProto { - optional string name = 1; - repeated MethodDescriptorProto method = 2; - optional ServiceOptions options = 3; -} - -message MethodDescriptorProto { - optional string name = 1; - optional string input_type = 2; - optional string output_type = 3; - optional MethodOptions options = 4; - optional bool client_streaming = 5 [default = false]; - optional bool server_streaming = 6 [default = false]; -} - -message FileOptions { - optional string java_package = 1; - optional string java_outer_classname = 8; - optional bool java_multiple_files = 10 [default = false]; - optional bool java_generate_equals_and_hash = 20 [deprecated = true]; - optional bool java_string_check_utf8 = 27 [default = false]; - - optional OptimizeMode optimize_for = 9 [default = SPEED]; - enum OptimizeMode { - SPEED = 1; - CODE_SIZE = 2; - LITE_RUNTIME = 3; - } - - optional string go_package = 11; - optional bool cc_generic_services = 16 [default = false]; - optional bool java_generic_services = 17 [default = false]; - optional bool py_generic_services = 18 [default = false]; - optional bool php_generic_services = 42 [default = false]; - optional bool deprecated = 23 [default = false]; - optional bool cc_enable_arenas = 31 [default = false]; - optional string objc_class_prefix = 36; - optional string csharp_namespace = 37; - optional string swift_prefix = 39; - optional string php_class_prefix = 40; - optional string php_namespace = 41; - optional string php_metadata_namespace = 44; - optional string ruby_package = 45; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; - - reserved 38; -} - -message MessageOptions { - optional bool message_set_wire_format = 1 [default = false]; - optional bool no_standard_descriptor_accessor = 2 [default = false]; - optional bool deprecated = 3 [default = false]; - optional bool map_entry = 7; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; - - reserved 8, 9; -} - -message FieldOptions { - optional CType ctype = 1 [default = STRING]; - enum CType { - STRING = 0; - CORD = 1; - STRING_PIECE = 2; - } - - optional bool packed = 2; - - optional JSType jstype = 6 [default = JS_NORMAL]; - enum JSType { - JS_NORMAL = 0; - JS_STRING = 1; - JS_NUMBER = 2; - } - - optional bool lazy = 5 [default = false]; - optional bool deprecated = 3 [default = false]; - optional bool weak = 10 [default = false]; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; - - reserved 4; -} - -message OneofOptions { - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; -} - -message EnumOptions { - optional bool allow_alias = 2; - optional bool deprecated = 3 [default = false]; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; - - reserved 5; -} - -message EnumValueOptions { - optional bool deprecated = 1 [default = false]; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; -} - -message ServiceOptions { - optional bool deprecated = 33 [default = false]; - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; -} - -message MethodOptions { - optional bool deprecated = 33 [default = false]; - - optional IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; - enum IdempotencyLevel { - IDEMPOTENCY_UNKNOWN = 0; - NO_SIDE_EFFECTS = 1; - IDEMPOTENT = 2; - } - - repeated UninterpretedOption uninterpreted_option = 999; - - extensions 1000 to max; -} - -message UninterpretedOption { - repeated NamePart name = 2; - message NamePart { - required string name_part = 1; - required bool is_extension = 2; - } - - optional string identifier_value = 3; - optional uint64 positive_int_value = 4; - optional int64 negative_int_value = 5; - optional double double_value = 6; - optional bytes string_value = 7; - optional string aggregate_value = 8; -} - -message SourceCodeInfo { - repeated Location location = 1; - message Location { - repeated int32 path = 1 [packed = true]; - repeated int32 span = 2 [packed = true]; - optional string leading_comments = 3; - optional string trailing_comments = 4; - repeated string leading_detached_comments = 6; - } -} - -message GeneratedCodeInfo { - repeated Annotation annotation = 1; - message Annotation { - repeated int32 path = 1 [packed = true]; - optional string source_file = 2; - optional int32 begin = 3; - optional int32 end = 4; - } -} diff --git a/google/protobuf/duration.proto b/google/protobuf/duration.proto deleted file mode 100644 index 6492685..0000000 --- a/google/protobuf/duration.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/duration"; -option java_multiple_files = true; -option java_outer_classname = "DurationProto"; -option java_package = "com.google.protobuf"; - -message Duration { - int64 seconds = 1; - int32 nanos = 2; -} diff --git a/google/protobuf/empty.proto b/google/protobuf/empty.proto deleted file mode 100644 index 2b0503f..0000000 --- a/google/protobuf/empty.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/empty"; -option java_multiple_files = true; -option java_outer_classname = "EmptyProto"; -option java_package = "com.google.protobuf"; - -message Empty { - -} diff --git a/google/protobuf/field_mask.proto b/google/protobuf/field_mask.proto deleted file mode 100644 index 7315ad9..0000000 --- a/google/protobuf/field_mask.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/protobuf/field_mask;field_mask"; -option java_multiple_files = true; -option java_outer_classname = "FieldMaskProto"; -option java_package = "com.google.protobuf"; - -message FieldMask { - repeated string paths = 1; -} diff --git a/google/protobuf/source_context.proto b/google/protobuf/source_context.proto deleted file mode 100644 index c74b911..0000000 --- a/google/protobuf/source_context.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option go_package = "google.golang.org/genproto/protobuf/source_context;source_context"; -option java_multiple_files = true; -option java_outer_classname = "SourceContextProto"; -option java_package = "com.google.protobuf"; - -message SourceContext { - string file_name = 1; -} diff --git a/google/protobuf/struct.proto b/google/protobuf/struct.proto deleted file mode 100644 index dfe00af..0000000 --- a/google/protobuf/struct.proto +++ /dev/null @@ -1,34 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; -option java_multiple_files = true; -option java_outer_classname = "StructProto"; -option java_package = "com.google.protobuf"; - -message Struct { - map fields = 1; -} - -message Value { - oneof kind { - NullValue null_value = 1; - double number_value = 2; - string string_value = 3; - bool bool_value = 4; - Struct struct_value = 5; - ListValue list_value = 6; - } -} - -message ListValue { - repeated Value values = 1; -} - -enum NullValue { - NULL_VALUE = 0; -} diff --git a/google/protobuf/timestamp.proto b/google/protobuf/timestamp.proto deleted file mode 100644 index 50b8fa8..0000000 --- a/google/protobuf/timestamp.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/timestamp"; -option java_multiple_files = true; -option java_outer_classname = "TimestampProto"; -option java_package = "com.google.protobuf"; - -message Timestamp { - int64 seconds = 1; - int32 nanos = 2; -} diff --git a/google/protobuf/type.proto b/google/protobuf/type.proto deleted file mode 100644 index 1587723..0000000 --- a/google/protobuf/type.proto +++ /dev/null @@ -1,89 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -import "google/protobuf/any.proto"; -import "google/protobuf/source_context.proto"; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/protobuf/ptype;ptype"; -option java_multiple_files = true; -option java_outer_classname = "TypeProto"; -option java_package = "com.google.protobuf"; - -message Type { - string name = 1; - repeated Field fields = 2; - repeated string oneofs = 3; - repeated Option options = 4; - SourceContext source_context = 5; - Syntax syntax = 6; -} - -message Field { - Kind kind = 1; - enum Kind { - TYPE_UNKNOWN = 0; - TYPE_DOUBLE = 1; - TYPE_FLOAT = 2; - TYPE_INT64 = 3; - TYPE_UINT64 = 4; - TYPE_INT32 = 5; - TYPE_FIXED64 = 6; - TYPE_FIXED32 = 7; - TYPE_BOOL = 8; - TYPE_STRING = 9; - TYPE_GROUP = 10; - TYPE_MESSAGE = 11; - TYPE_BYTES = 12; - TYPE_UINT32 = 13; - TYPE_ENUM = 14; - TYPE_SFIXED32 = 15; - TYPE_SFIXED64 = 16; - TYPE_SINT32 = 17; - TYPE_SINT64 = 18; - } - - Cardinality cardinality = 2; - enum Cardinality { - CARDINALITY_UNKNOWN = 0; - CARDINALITY_OPTIONAL = 1; - CARDINALITY_REQUIRED = 2; - CARDINALITY_REPEATED = 3; - } - - int32 number = 3; - string name = 4; - string type_url = 6; - int32 oneof_index = 7; - bool packed = 8; - repeated Option options = 9; - string json_name = 10; - string default_value = 11; -} - -message Enum { - string name = 1; - repeated EnumValue enumvalue = 2; - repeated Option options = 3; - SourceContext source_context = 4; - Syntax syntax = 5; -} - -message EnumValue { - string name = 1; - int32 number = 2; - repeated Option options = 3; -} - -message Option { - string name = 1; - Any value = 2; -} - -enum Syntax { - SYNTAX_PROTO2 = 0; - SYNTAX_PROTO3 = 1; -} diff --git a/google/protobuf/wrappers.proto b/google/protobuf/wrappers.proto deleted file mode 100644 index 52b8179..0000000 --- a/google/protobuf/wrappers.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/wrappers"; -option java_multiple_files = true; -option java_outer_classname = "WrappersProto"; -option java_package = "com.google.protobuf"; - -message DoubleValue { - double value = 1; -} - -message FloatValue { - float value = 1; -} - -message Int64Value { - int64 value = 1; -} - -message UInt64Value { - uint64 value = 1; -} - -message Int32Value { - int32 value = 1; -} - -message UInt32Value { - uint32 value = 1; -} - -message BoolValue { - bool value = 1; -} - -message StringValue { - string value = 1; -} - -message BytesValue { - bytes value = 1; -} From 47e66d8d88d5dbbf9a36fd495d325e16b3dc222b Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Mon, 28 Sep 2020 14:20:22 -0700 Subject: [PATCH 07/10] bump version, add smstoken.txt note --- sms_auth_v3.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sms_auth_v3.py b/sms_auth_v3.py index b5f8037..5eb2e68 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -26,6 +26,7 @@ def __init__(self, email=None): self.userid = None self.email = email if Path("smstoken.txt").exists(): + print("smstoken.txt found, if you wish to auth again, delete smstoken.txt") with open("smstoken.txt", "r") as fh: tokens = fh.read() t = tokens.split(",") @@ -46,11 +47,11 @@ def login(self): messageout = AuthGatewayRequest(Phone(phone=phonenumber)) seconds = random.uniform(100, 250) headers = { - 'tinder-version': "11.23.0", 'install-id': self.installid, - 'user-agent': "Tinder Android Version 11.23.0", 'connection': "close", + 'tinder-version': "11.24.0", 'install-id': self.installid, + 'user-agent': "Tinder Android Version 11.24.0", 'connection': "close", 'platform-variant': "Google-Play", 'persistent-device-id': self.deviceid, 'accept-encoding': "gzip, deflate", 'appsflyer-id': "1600144077225-7971032049730563486", - 'platform': "android", 'app-version': "3994", 'os-version': "25", 'app-session-id': self.appsessionid, + 'platform': "android", 'app-version': "4023", 'os-version': "25", 'app-session-id': self.appsessionid, 'x-supported-image-formats': "webp", 'funnel-session-id': self.funnelid, 'app-session-time-elapsed': format(seconds, ".3f"), 'accept-language': "en-US", 'content-type': "application/x-protobuf" From faf8ce056e7dc3d47a232175a27829310f21af5c Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Mon, 28 Sep 2020 18:52:27 -0700 Subject: [PATCH 08/10] added refresh token usage, allows for commandline entry of email --- sms_auth_v3.py | 102 +++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 37 deletions(-) diff --git a/sms_auth_v3.py b/sms_auth_v3.py index 5eb2e68..57fe53a 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -5,6 +5,7 @@ from authgateway import * import secrets from pathlib import Path +import sys class SMSAuthException(BaseException): @@ -16,7 +17,7 @@ class TinderSMSAuth(object): def __init__(self, email=None): self.installid = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase + string.digits, k=11)) self.session = requests.Session() - self.session.headers.update({"user-agent": "Tinder Android Version 11.23.0"}) + self.session.headers.update({"user-agent": "Tinder Android Version 11.24.0"}) self.url = "https://api.gotinder.com" self.funnelid = str(uuid.uuid4()) self.appsessionid = str(uuid.uuid4()) @@ -25,16 +26,58 @@ def __init__(self, email=None): self.refreshtoken = None self.userid = None self.email = email + self.phonenumber = None if Path("smstoken.txt").exists(): - print("smstoken.txt found, if you wish to auth again, delete smstoken.txt") + print("smstoken.txt found, if you wish to auth again from scratch, delete smstoken.txt") with open("smstoken.txt", "r") as fh: tokens = fh.read() t = tokens.split(",") self.authtoken = t[0] self.refreshtoken = t[1] print("authToken found: " + self.authtoken) + self.login() + + def _postloginreq(self, body, headers=None): + if headers is not None: + self.session.headers.update(headers) + r = self.session.post(self.url + "/v3/auth/login", data=bytes(body)) + response = AuthGatewayResponse().parse(r.content).to_dict() + return response + + def loginwrapper(self, body, seconds, headers=None): + response = self._postloginreq(body, headers) + print(response) + if "validatePhoneOtpState" in response.keys() and response["validatePhoneOtpState"]["smsSent"]: + otpresponse = input("OTP Response from SMS: ") + if self.refreshtoken is not None: + resp = PhoneOtp(phone=self.phonenumber, otp=otpresponse, refresh_token=self.refreshtoken) + else: + resp = PhoneOtp(phone=self.phonenumber, otp=otpresponse) + messageresponse = AuthGatewayRequest(phone_otp=resp) + seconds += random.uniform(30, 90) + header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} + return self.loginwrapper(messageresponse, seconds, header_timer) + elif "validateEmailOtpState" in response.keys() and response["validateEmailOtpState"]["emailSent"]: + emailoptresponse = input("Check your email and input the verification code just sent to you: ") + refreshtoken = response["validateEmailOtpState"]["refreshToken"] + if self.email is None: + self.email = input("Input your email: ") + messageresponse = AuthGatewayRequest(email_otp=EmailOtp(otp=emailoptresponse, email=self.email, refresh_token=refreshtoken)) + seconds += random.uniform(30, 90) + header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} + return self.loginwrapper(messageresponse, seconds, header_timer) + elif "error" in response.keys() and response["error"]["message"] == 'INVALID_REFRESH_TOKEN': + print("Refresh token error, restarting auth") + phonenumber = input("phone number (starting with 1, numbers only): ") + self.phonenumber = phonenumber + messageresponse = AuthGatewayRequest(phone=Phone(phone=self.phonenumber)) + seconds += random.uniform(30, 90) + header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} + return self.loginwrapper(messageresponse, seconds, header_timer) + elif "loginResult" in response.keys() and "authToken" in response["loginResult"].keys(): + return response else: - self.login() + raise SMSAuthException def login(self): payload = { @@ -43,8 +86,13 @@ def login(self): "user_interests_available"] } self.session.post(self.url + "/v2/buckets", json=payload) - phonenumber = input("phone number (starting with 1, numbers only): ") - messageout = AuthGatewayRequest(Phone(phone=phonenumber)) + if self.refreshtoken is not None: + print("Attempting to refresh auth token with saved refresh token") + messageout = AuthGatewayRequest(refresh_auth=RefreshAuth(refresh_token=self.refreshtoken)) + else: + phonenumber = input("phone number (starting with 1, numbers only): ") + self.phonenumber = phonenumber + messageout = AuthGatewayRequest(phone=Phone(phone=self.phonenumber)) seconds = random.uniform(100, 250) headers = { 'tinder-version': "11.24.0", 'install-id': self.installid, @@ -56,39 +104,19 @@ def login(self): 'app-session-time-elapsed': format(seconds, ".3f"), 'accept-language': "en-US", 'content-type': "application/x-protobuf" } - self.session.headers.update(headers) - r = self.session.post(self.url + "/v3/auth/login", data=bytes(messageout)) - response = AuthGatewayResponse().parse(r.content).to_dict() - print(response) - if "validatePhoneOtpState" in response.keys() and response["validatePhoneOtpState"]["smsSent"]: - otpresponse = input("OTP Response from SMS: ") - resp = PhoneOtp(phone=phonenumber, otp=otpresponse) - messageresponse = bytes(AuthGatewayRequest(phone_otp=resp)) - self.session.headers.update({"app-session-time-elapsed": format(seconds + random.uniform(30, 90), ".3f")}) - r = self.session.post(self.url + "/v3/auth/login", data=messageresponse) - response = AuthGatewayResponse().parse(r.content).to_dict() - print(response) - if "validateEmailOtpState" in response.keys(): - emailoptresponse = input("Check your email and input the verification code just sent to you: ") - refreshtoken = response["validateEmailOtpState"]["refreshToken"] - email = input("Input your email: ") - resp = bytes(AuthGatewayRequest( - email_otp=EmailOtp(otp=emailoptresponse, email=email, refresh_token=refreshtoken))) - r = self.session.post(self.url + "/v3/auth/login", data=resp) - response = AuthGatewayResponse().parse(r.content).to_dict() - print(response) - if "loginResult" in response.keys() and "authToken" in response["loginResult"].keys(): - self.refreshtoken = response["loginResult"]["refreshToken"] - self.authtoken = response["loginResult"]["authToken"] - with open("smstoken.txt", "w") as fh: - fh.write(self.authtoken + "," + self.refreshtoken) - return self.session.headers.update({"X-Auth-Token": self.authtoken}) - else: - raise SMSAuthException - else: - raise SMSAuthException + response = self.loginwrapper(messageout, seconds, headers) + self.refreshtoken = response["loginResult"]["refreshToken"] + self.authtoken = response["loginResult"]["authToken"] + self.session.headers.update({"X-AUTH-TOKEN": self.authtoken}) + with open("smstoken.txt", "w") as fh: + fh.write(self.authtoken + "," + self.refreshtoken) + print("Auth token saved to smstoken.txt") if __name__ == '__main__': print("This script will use the sms login to obtain the auth token, which will be saved to smstoken.txt") - TinderSMSAuth() \ No newline at end of file + if len(sys.argv) > 1: + emailaddy = sys.argv[1] + else: + emailaddy = None + TinderSMSAuth(email=emailaddy) \ No newline at end of file From 4efc53ce24bc22c09d6bb4ec5ae877ed27c67c48 Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Sat, 17 Apr 2021 08:12:24 -0700 Subject: [PATCH 09/10] updated authgateway, fixed handling of refresh token --- .gitignore | 2 + authgateway.proto | 195 ++++++++++++++++------------ authgateway.py | 316 +++++++++++++++++++++++++++++++--------------- sms_auth_v3.py | 25 +++- 4 files changed, 342 insertions(+), 196 deletions(-) diff --git a/.gitignore b/.gitignore index c889d95..ab1faa8 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ google/protobuf/.DS_Store google/.DS_Store /google/ + +.DS_Store diff --git a/authgateway.proto b/authgateway.proto index 6fc1a90..9c9426b 100644 --- a/authgateway.proto +++ b/authgateway.proto @@ -8,87 +8,11 @@ import "google/protobuf/timestamp.proto"; option java_multiple_files = true; option java_package = "com.tinder.generated.model.services.shared.authgateway"; -message FacebookToken { - string external_token = 1; - google.protobuf.StringValue refresh_token = 2; -} - -message Phone { - string phone = 1; - google.protobuf.StringValue refresh_token = 2; -} - -message PhoneOtpResend { - google.protobuf.StringValue phone = 1; - google.protobuf.StringValue refresh_token = 2; -} - -message PhoneOtp { - google.protobuf.StringValue phone = 1; - string otp = 2; - google.protobuf.StringValue refresh_token = 3; -} - -message Email { - string email = 1; - google.protobuf.StringValue refresh_token = 2; - google.protobuf.BoolValue marketing_opt_in = 3; -} - -message EmailOtpResend { - google.protobuf.StringValue email = 1; - google.protobuf.StringValue refresh_token = 2; -} - -message GoogleToken { - string external_token = 1; - google.protobuf.StringValue refresh_token = 2; - google.protobuf.BoolValue marketing_opt_in = 3; - google.protobuf.BoolValue user_behavior = 4; -} - -message EmailOtp { - google.protobuf.StringValue email = 1; - string otp = 2; - google.protobuf.StringValue refresh_token = 3; -} - -message AppleToken { - string external_token = 1; - google.protobuf.StringValue refresh_token = 2; - google.protobuf.StringValue raw_nonce = 3; -} - -message GetInitialState { - google.protobuf.StringValue refresh_token = 1; -} - -message RefreshAuth { - string refresh_token = 1; -} - -message DismissSocialConnectionList { - string refresh_token = 1; -} - -message AuthGatewayRequest { - oneof factor { - Phone phone = 1; - PhoneOtp phone_otp = 2; - Email email = 3; - GoogleToken google_token = 4; - EmailOtp email_otp = 5; - FacebookToken facebook_token = 6; - PhoneOtpResend phone_otp_resend = 7; - EmailOtpResend email_otp_resend = 8; - GetInitialState get_initial_state = 9; - RefreshAuth refresh_auth = 10; - AppleToken apple_token = 11; - DismissSocialConnectionList dismiss_social_connection_list = 12; - } +message MetaProto { + google.protobuf.Timestamp upstream_time = 1; + google.protobuf.Timestamp start_time = 2; } - message GetPhoneState { google.protobuf.StringValue refresh_token = 1; } @@ -126,6 +50,7 @@ message ValidateEmailOtpState { message OnboardingState { string refresh_token = 1; string onboarding_token = 2; + google.protobuf.StringValue user_id = 3; } message LoginResult { @@ -163,6 +88,10 @@ message SocialConnectionList { repeated SocialConnection connections = 2; } +message ValidateEmailMagicLinkOtpState { + +} + message AuthGatewayResponse { MetaProto meta = 1; ErrorProto error = 2; @@ -176,8 +105,111 @@ message AuthGatewayResponse { LoginResult login_result = 8; SocialConnectionList social_connection_list = 9; AppleAccountNotFound apple_account_not_found = 10; + ValidateEmailMagicLinkOtpState validate_email_magic_link_otp_state = 11; + } +} + +message FacebookToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message Phone { + string phone = 1; + google.protobuf.StringValue refresh_token = 2; + + oneof check { + google.protobuf.StringValue captcha_token = 3; + google.protobuf.StringValue ios_device_token = 4; + google.protobuf.StringValue android_jws = 5; + } +} + +message PhoneOtpResend { + google.protobuf.StringValue phone = 1; + google.protobuf.StringValue refresh_token = 2; + + oneof check { + google.protobuf.StringValue ios_device_token = 3; + google.protobuf.StringValue android_jws = 4; + } +} + +message PhoneOtp { + google.protobuf.StringValue phone = 1; + string otp = 2; + google.protobuf.StringValue refresh_token = 3; +} + +message Email { + string email = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.BoolValue marketing_opt_in = 3; +} + +message EmailOtpResend { + google.protobuf.StringValue email = 1; + google.protobuf.StringValue refresh_token = 2; +} + +message GoogleToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.BoolValue marketing_opt_in = 3; + google.protobuf.BoolValue user_behavior = 4; +} + +message EmailOtp { + google.protobuf.StringValue email = 1; + string otp = 2; + google.protobuf.StringValue refresh_token = 3; +} + +message AppleToken { + string external_token = 1; + google.protobuf.StringValue refresh_token = 2; + google.protobuf.StringValue raw_nonce = 3; +} + +message GetInitialState { + google.protobuf.StringValue refresh_token = 1; +} + +message RefreshAuth { + string refresh_token = 1; +} + +message DismissSocialConnectionList { + string refresh_token = 1; +} + +message EmailMagicLink { + string email = 1; +} + +message EmailMagicLinkOtp { + string otp_token = 1; +} + +message AuthGatewayRequest { + oneof factor { + Phone phone = 1; + PhoneOtp phone_otp = 2; + Email email = 3; + GoogleToken google_token = 4; + EmailOtp email_otp = 5; + FacebookToken facebook_token = 6; + PhoneOtpResend phone_otp_resend = 7; + EmailOtpResend email_otp_resend = 8; + GetInitialState get_initial_state = 9; + RefreshAuth refresh_auth = 10; + AppleToken apple_token = 11; + DismissSocialConnectionList dismiss_social_connection_list = 12; + EmailMagicLink email_magic_link = 13; + EmailMagicLinkOtp email_magic_link_otp = 14; } } + message Verification { string type = 1; string state = 2; @@ -206,8 +238,3 @@ message ErrorProto { string message = 2; BanReason ban_reason = 3; } - -message MetaProto { - google.protobuf.Timestamp upstream_time = 1; - google.protobuf.Timestamp start_time = 2; -} diff --git a/authgateway.py b/authgateway.py index 6e6e5e5..6b5d102 100644 --- a/authgateway.py +++ b/authgateway.py @@ -21,69 +21,243 @@ class SocialConnectionService(betterproto.Enum): SERVICE_APPLE = 3 +@dataclass +class MetaProto(betterproto.Message): + upstream_time: datetime = betterproto.message_field(1) + start_time: datetime = betterproto.message_field(2) + + +@dataclass +class GetPhoneState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) + + +@dataclass +class ValidatePhoneOtpState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) + phone: str = betterproto.string_field(2) + otp_length: Optional[int] = betterproto.message_field( + 3, wraps=betterproto.TYPE_INT32 + ) + sms_sent: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) + + +@dataclass +class EmailMarketing(betterproto.Message): + show_marketing_opt_in: Optional[bool] = betterproto.message_field( + 2, wraps=betterproto.TYPE_BOOL + ) + show_strict_opt_in: Optional[bool] = betterproto.message_field( + 3, wraps=betterproto.TYPE_BOOL + ) + checked_by_default: Optional[bool] = betterproto.message_field( + 4, wraps=betterproto.TYPE_BOOL + ) + + +@dataclass +class GetEmailState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) + email_marketing: "EmailMarketing" = betterproto.message_field(2) + + +@dataclass +class ValidateEmailOtpState(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) + otp_length: Optional[int] = betterproto.message_field( + 4, wraps=betterproto.TYPE_INT32 + ) + email_sent: Optional[bool] = betterproto.message_field( + 5, wraps=betterproto.TYPE_BOOL + ) + email_marketing: "EmailMarketing" = betterproto.message_field(6) + unmasked_email: str = betterproto.string_field(2, group="email") + masked_email: str = betterproto.string_field(3, group="email") + + +@dataclass +class OnboardingState(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + onboarding_token: str = betterproto.string_field(2) + user_id: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + + +@dataclass +class LoginResult(betterproto.Message): + refresh_token: str = betterproto.string_field(1) + auth_token: str = betterproto.string_field(2) + captcha: "LoginResultCaptcha" = betterproto.enum_field(3) + user_id: str = betterproto.string_field(4) + auth_token_ttl: Optional[int] = betterproto.message_field( + 5, wraps=betterproto.TYPE_INT64 + ) + + +@dataclass +class AppleAccountNotFound(betterproto.Message): + will_link: bool = betterproto.bool_field(1) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + + +@dataclass +class SocialConnection(betterproto.Message): + service: "SocialConnectionService" = betterproto.enum_field(1) + + +@dataclass +class SocialConnectionList(betterproto.Message): + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) + connections: List["SocialConnection"] = betterproto.message_field(2) + + +@dataclass +class ValidateEmailMagicLinkOtpState(betterproto.Message): + pass + + +@dataclass +class AuthGatewayResponse(betterproto.Message): + meta: "MetaProto" = betterproto.message_field(1) + error: "ErrorProto" = betterproto.message_field(2) + get_phone_state: "GetPhoneState" = betterproto.message_field(3, group="data") + validate_phone_otp_state: "ValidatePhoneOtpState" = betterproto.message_field( + 4, group="data" + ) + get_email_state: "GetEmailState" = betterproto.message_field(5, group="data") + validate_email_otp_state: "ValidateEmailOtpState" = betterproto.message_field( + 6, group="data" + ) + onboarding_state: "OnboardingState" = betterproto.message_field(7, group="data") + login_result: "LoginResult" = betterproto.message_field(8, group="data") + social_connection_list: "SocialConnectionList" = betterproto.message_field( + 9, group="data" + ) + apple_account_not_found: "AppleAccountNotFound" = betterproto.message_field( + 10, group="data" + ) + validate_email_magic_link_otp_state: "ValidateEmailMagicLinkOtpState" = betterproto.message_field( + 11, group="data" + ) + + @dataclass class FacebookToken(betterproto.Message): external_token: str = betterproto.string_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) @dataclass class Phone(betterproto.Message): phone: str = betterproto.string_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + captcha_token: Optional[str] = betterproto.message_field( + 3, group="check", wraps=betterproto.TYPE_STRING + ) + ios_device_token: Optional[str] = betterproto.message_field( + 4, group="check", wraps=betterproto.TYPE_STRING + ) + android_jws: Optional[str] = betterproto.message_field( + 5, group="check", wraps=betterproto.TYPE_STRING + ) @dataclass class PhoneOtpResend(betterproto.Message): phone: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + ios_device_token: Optional[str] = betterproto.message_field( + 3, group="check", wraps=betterproto.TYPE_STRING + ) + android_jws: Optional[str] = betterproto.message_field( + 4, group="check", wraps=betterproto.TYPE_STRING + ) @dataclass class PhoneOtp(betterproto.Message): phone: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) otp: str = betterproto.string_field(2) - refresh_token: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 3, wraps=betterproto.TYPE_STRING + ) @dataclass class Email(betterproto.Message): email: str = betterproto.string_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) - marketing_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + marketing_opt_in: Optional[bool] = betterproto.message_field( + 3, wraps=betterproto.TYPE_BOOL + ) @dataclass class EmailOtpResend(betterproto.Message): email: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) @dataclass class GoogleToken(betterproto.Message): external_token: str = betterproto.string_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) - marketing_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) - user_behavior: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + marketing_opt_in: Optional[bool] = betterproto.message_field( + 3, wraps=betterproto.TYPE_BOOL + ) + user_behavior: Optional[bool] = betterproto.message_field( + 4, wraps=betterproto.TYPE_BOOL + ) @dataclass class EmailOtp(betterproto.Message): email: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) otp: str = betterproto.string_field(2) - refresh_token: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 3, wraps=betterproto.TYPE_STRING + ) @dataclass class AppleToken(betterproto.Message): external_token: str = betterproto.string_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) - raw_nonce: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) + raw_nonce: Optional[str] = betterproto.message_field( + 3, wraps=betterproto.TYPE_STRING + ) @dataclass class GetInitialState(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) + refresh_token: Optional[str] = betterproto.message_field( + 1, wraps=betterproto.TYPE_STRING + ) @dataclass @@ -96,6 +270,16 @@ class DismissSocialConnectionList(betterproto.Message): refresh_token: str = betterproto.string_field(1) +@dataclass +class EmailMagicLink(betterproto.Message): + email: str = betterproto.string_field(1) + + +@dataclass +class EmailMagicLinkOtp(betterproto.Message): + otp_token: str = betterproto.string_field(1) + + @dataclass class AuthGatewayRequest(betterproto.Message): phone: "Phone" = betterproto.message_field(1, group="factor") @@ -109,89 +293,13 @@ class AuthGatewayRequest(betterproto.Message): get_initial_state: "GetInitialState" = betterproto.message_field(9, group="factor") refresh_auth: "RefreshAuth" = betterproto.message_field(10, group="factor") apple_token: "AppleToken" = betterproto.message_field(11, group="factor") - dismiss_social_connection_list: "DismissSocialConnectionList" = (betterproto.message_field(12, group="factor")) - - -@dataclass -class GetPhoneState(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - - -@dataclass -class ValidatePhoneOtpState(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - phone: str = betterproto.string_field(2) - otp_length: Optional[int] = betterproto.message_field(3, wraps=betterproto.TYPE_INT32) - sms_sent: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) - - -@dataclass -class EmailMarketing(betterproto.Message): - show_marketing_opt_in: Optional[bool] = betterproto.message_field(2, wraps=betterproto.TYPE_BOOL) - show_strict_opt_in: Optional[bool] = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL) - checked_by_default: Optional[bool] = betterproto.message_field(4, wraps=betterproto.TYPE_BOOL) - - -@dataclass -class GetEmailState(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - email_marketing: "EmailMarketing" = betterproto.message_field(2) - - -@dataclass -class ValidateEmailOtpState(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - otp_length: Optional[int] = betterproto.message_field(4, wraps=betterproto.TYPE_INT32) - email_sent: Optional[bool] = betterproto.message_field(5, wraps=betterproto.TYPE_BOOL) - email_marketing: "EmailMarketing" = betterproto.message_field(6) - unmasked_email: str = betterproto.string_field(2, group="email") - masked_email: str = betterproto.string_field(3, group="email") - - -@dataclass -class OnboardingState(betterproto.Message): - refresh_token: str = betterproto.string_field(1) - onboarding_token: str = betterproto.string_field(2) - - -@dataclass -class LoginResult(betterproto.Message): - refresh_token: str = betterproto.string_field(1) - auth_token: str = betterproto.string_field(2) - captcha: "LoginResultCaptcha" = betterproto.enum_field(3) - user_id: str = betterproto.string_field(4) - auth_token_ttl: Optional[int] = betterproto.message_field(5, wraps=betterproto.TYPE_INT64) - - -@dataclass -class AppleAccountNotFound(betterproto.Message): - will_link: bool = betterproto.bool_field(1) - refresh_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) - - -@dataclass -class SocialConnection(betterproto.Message): - service: "SocialConnectionService" = betterproto.enum_field(1) - - -@dataclass -class SocialConnectionList(betterproto.Message): - refresh_token: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING) - connections: List["SocialConnection"] = betterproto.message_field(2) - - -@dataclass -class AuthGatewayResponse(betterproto.Message): - meta: "MetaProto" = betterproto.message_field(1) - error: "ErrorProto" = betterproto.message_field(2) - get_phone_state: "GetPhoneState" = betterproto.message_field(3, group="data") - validate_phone_otp_state: "ValidatePhoneOtpState" = betterproto.message_field(4, group="data") - get_email_state: "GetEmailState" = betterproto.message_field(5, group="data") - validate_email_otp_state: "ValidateEmailOtpState" = betterproto.message_field(6, group="data") - onboarding_state: "OnboardingState" = betterproto.message_field(7, group="data") - login_result: "LoginResult" = betterproto.message_field(8, group="data") - social_connection_list: "SocialConnectionList" = betterproto.message_field(9, group="data") - apple_account_not_found: "AppleAccountNotFound" = betterproto.message_field(10, group="data") + dismiss_social_connection_list: "DismissSocialConnectionList" = betterproto.message_field( + 12, group="factor" + ) + email_magic_link: "EmailMagicLink" = betterproto.message_field(13, group="factor") + email_magic_link_otp: "EmailMagicLinkOtp" = betterproto.message_field( + 14, group="factor" + ) @dataclass @@ -202,8 +310,12 @@ class Verification(betterproto.Message): @dataclass class UnderageBan(betterproto.Message): - underage_ttl_duration_ms: Optional[int] = betterproto.message_field(1, wraps=betterproto.TYPE_INT64) - underage_token: Optional[str] = betterproto.message_field(2, wraps=betterproto.TYPE_STRING) + underage_ttl_duration_ms: Optional[int] = betterproto.message_field( + 1, wraps=betterproto.TYPE_INT64 + ) + underage_token: Optional[str] = betterproto.message_field( + 2, wraps=betterproto.TYPE_STRING + ) verification: "Verification" = betterproto.message_field(3) @@ -225,9 +337,3 @@ class ErrorProto(betterproto.Message): code: int = betterproto.int32_field(1) message: str = betterproto.string_field(2) ban_reason: "BanReason" = betterproto.message_field(3) - - -@dataclass -class MetaProto(betterproto.Message): - upstream_time: datetime = betterproto.message_field(1) - start_time: datetime = betterproto.message_field(2) \ No newline at end of file diff --git a/sms_auth_v3.py b/sms_auth_v3.py index 57fe53a..e2db522 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -49,14 +49,17 @@ def loginwrapper(self, body, seconds, headers=None): print(response) if "validatePhoneOtpState" in response.keys() and response["validatePhoneOtpState"]["smsSent"]: otpresponse = input("OTP Response from SMS: ") - if self.refreshtoken is not None: - resp = PhoneOtp(phone=self.phonenumber, otp=otpresponse, refresh_token=self.refreshtoken) - else: - resp = PhoneOtp(phone=self.phonenumber, otp=otpresponse) + resp = PhoneOtp(phone=self.phonenumber, otp=otpresponse) messageresponse = AuthGatewayRequest(phone_otp=resp) seconds += random.uniform(30, 90) header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} return self.loginwrapper(messageresponse, seconds, header_timer) + elif "getPhoneState" in response.keys(): + self.refreshtoken = response['getPhoneState']['refreshToken'] + messageresponse = AuthGatewayRequest(refresh_auth=RefreshAuth(refresh_token=self.refreshtoken)) + seconds += random.uniform(30, 90) + header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} + return self.loginwrapper(messageresponse, seconds, header_timer) elif "validateEmailOtpState" in response.keys() and response["validateEmailOtpState"]["emailSent"]: emailoptresponse = input("Check your email and input the verification code just sent to you: ") refreshtoken = response["validateEmailOtpState"]["refreshToken"] @@ -66,6 +69,14 @@ def loginwrapper(self, body, seconds, headers=None): seconds += random.uniform(30, 90) header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} return self.loginwrapper(messageresponse, seconds, header_timer) + elif "getEmailState" in response.keys(): + refreshtoken = response['getEmailState']['refreshToken'] + if self.email is None: + self.email = input("Input your email: ") + seconds += random.uniform(30, 90) + header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} + messageresponse = AuthGatewayRequest(refresh_auth=RefreshAuth(refresh_token=refreshtoken)) + return self.loginwrapper(messageresponse, seconds, header_timer) elif "error" in response.keys() and response["error"]["message"] == 'INVALID_REFRESH_TOKEN': print("Refresh token error, restarting auth") phonenumber = input("phone number (starting with 1, numbers only): ") @@ -88,15 +99,15 @@ def login(self): self.session.post(self.url + "/v2/buckets", json=payload) if self.refreshtoken is not None: print("Attempting to refresh auth token with saved refresh token") - messageout = AuthGatewayRequest(refresh_auth=RefreshAuth(refresh_token=self.refreshtoken)) + messageout = AuthGatewayRequest(get_initial_state=GetInitialState(refresh_token=self.refreshtoken)) else: phonenumber = input("phone number (starting with 1, numbers only): ") self.phonenumber = phonenumber messageout = AuthGatewayRequest(phone=Phone(phone=self.phonenumber)) seconds = random.uniform(100, 250) headers = { - 'tinder-version': "11.24.0", 'install-id': self.installid, - 'user-agent': "Tinder Android Version 11.24.0", 'connection': "close", + 'tinder-version': "12.6.0", 'install-id': self.installid, + 'user-agent': "Tinder Android Version 12.6.0", 'connection': "close", 'platform-variant': "Google-Play", 'persistent-device-id': self.deviceid, 'accept-encoding': "gzip, deflate", 'appsflyer-id': "1600144077225-7971032049730563486", 'platform': "android", 'app-version': "4023", 'os-version': "25", 'app-session-id': self.appsessionid, From a02a446e0dc3079acdf88741a7f7d847a603948c Mon Sep 17 00:00:00 2001 From: jim zhou <43537315+jimtje@users.noreply.github.com> Date: Sat, 17 Apr 2021 20:42:53 -0700 Subject: [PATCH 10/10] testing to see which email payload triggers proper processing of token --- sms_auth_v3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sms_auth_v3.py b/sms_auth_v3.py index e2db522..ccdef68 100644 --- a/sms_auth_v3.py +++ b/sms_auth_v3.py @@ -75,7 +75,7 @@ def loginwrapper(self, body, seconds, headers=None): self.email = input("Input your email: ") seconds += random.uniform(30, 90) header_timer = {"app-session-time-elapsed": format(seconds, ".3f")} - messageresponse = AuthGatewayRequest(refresh_auth=RefreshAuth(refresh_token=refreshtoken)) + messageresponse = AuthGatewayRequest(email=Email(email=self.email, refresh_token=refreshtoken)) return self.loginwrapper(messageresponse, seconds, header_timer) elif "error" in response.keys() and response["error"]["message"] == 'INVALID_REFRESH_TOKEN': print("Refresh token error, restarting auth")