var Enum = require('enum')
/**
* @namespace
*/
var constants = module.exports = {
// ---------------------------------------------------------------------------
// Enums
// ---------------------------------------------------------------------------
/** @enum **/
SnapPrivacy: new Enum({
'Everyone': 0,
'Friends': 1
}),
/** @enum **/
StoryPrivacy: new Enum({
'Friends': 0,
'Everyone': 1,
'Custom': 2
}),
/** @enum **/
AddSource: new Enum({
'Phonebook': 1,
'Username': 2,
'AddedBack': 3
}),
/** @enum **/
MediaKind: new Enum({
'Image': 0,
'Video': 1,
'SilentVideo': 2,
'FriendRequest': 3,
'StrangerImage': 4,
'StrangerVideo': 5,
'StrangerSilentVideo': 6
}),
/** @enum **/
MessageKind: new Enum({
'Text': 0,
'Media': 1,
'DiscoverShared': 2
}),
/** @enum **/
SnapStatus: new Enum({
'None': -1,
'Sent': 0,
'Delivered': 1,
'Opened': 2,
'Screenshot': 3
}),
/** @enum **/
FriendStatus: new Enum({
'Confirmed': 0,
'Unconfirmed': 1,
'Blocked': 2,
'Deleted': 3
}),
// ---------------------------------------------------------------------------
// Static constants
// ---------------------------------------------------------------------------
screen: {
width: 720,
height: 1280,
maxVideoWidth: 480,
maxVideoHeight: 640
},
attestation: {
// The user agent specific to making the attestation request.
userAgent: 'SafetyNet/7329000 (klte KOT49H); gzip',
// The sha256 digest of the certificate used to sign the Snapchat APK, base 64 encoded. It should never change.
certificateDigest: 'Lxyq/KHtMNC044hj7vq+oOgVcR+kz3m4IlGaglnZWlg=',
// Google Play Services version used to make the attestation request.
GMSVersion: 7329038,
// Authentication token sent to verify requests with the server to prevent abuse.
auth: 'cp4craTcEr82Pdf5j8mwFKyb8FNZbcel',
// Casper™ attestation request URL. Special thanks to Liam!
URLCasper: 'https://api.casper.io/security/login/attestation',
// Casper™ auth URL
URLCasperAuth: 'https://api.casper.io/security/login/signrequest',
// digest values for different versions of snapchat
'digest9_8': 'vXCcGhQ7RfL1LUiE3F6vcNORNo7IFSOvuDBunK87mEI=',
'digest9_9': 'Yk9Wqmx7TrTatldWI+5PWbQjGA8Gi8ZoO8X9OUAw1hg=',
'digest9_10': 'JJShKOLH4YYjWZlJQ71A2dPTcmxbaMboyfo0nsKYayE=',
'digest9_11': 'nNsTUhHYJ943NG6vAPNl+tRr1vktNb9HpvRxZuu/rrE=',
'digest9_12_0_1': 'W4snbl56it9XbT2lsL4gyHwMsElnmOPBDp+iIYqbGcI=',
'digest9_12_1': 'fGZExseKdFH1bltkKloaAGfGx0vnKDDymKiJAiLo3dU=',
'digest9_12_2': 'LMQNajaQ4SO7vNaQS1FRokxCtQXeIHwKZiJYhMczDGk=',
'digest9_12_3': 'bnVK+fT6BdldrY279ShOR9QZx0OIRJxGoPslBn70vng=',
'digest9_13': 'BWDe2a5b3I26Yw6z4Prvh2aEMRcf2B1FMs8136QIeCM=',
'digest9_14': 'k6IftsTIpJeVhZDoHZv9zxDhE7HuN50PpO3O/zIXxsU=',
'digest9_14_1': 'pS+fbZ4Xw0ThusoWRo2eCldGmHohNYvau/VULlJbBnQ=',
'digest9_14_2': '5O40Rllov9V8PpwD5zPmmp+GQi7UMIWz2A0LWZA7UX0=',
// returns the digest for the current version of the snapchat client
digest: function () {
// var value = constants.attestation['digest9_14']
var value = constants.attestation['digest9_14_2']
if (!value) throw new Error('constants.attestation.digest invalid value')
return value
},
// Authentication token sent to verify requests with the server to prevent abuse.
'droidGuard': 'CgbMYHoVNWLYAQE4YRoMCMKa2IIDEKC349kCqgERCLikhu8CEKL-jf34_____wHoAfLYvrb7_____wHoAbjLt877_____wE4azhLEokMuKToh_JDOAH8CvNUrmmbUkT045BmT6P_KNQSwOPtKxfJzK43U0I8A3x9lhvIbj5rbW3EREoNXLsI4okM7eonVUPt_PNYSK-b3U-T_bCfQkhKZ6hQ2ByXyi81LMp9IbzCho9KzRi_3zn9ffewSW2UjaGj71_gm4iapZXcQCigaWJ28VW10g8aeVcXVnXMg7UfDfx7NXghb0ZtlNXu8QxSCTWzUrW5nQH_TcYVKKhO4uFkX_sPr9MVwchg5oUSfvAZ2X2ZnsrkszrUr_NtlLS3w56DnPJvcOnN7X0N70p5Hj8Uqlx-a39c6BO4zfd_TAsqiV02zLoVctaht332OHA8Ejh1tIs89d0xKryMBq3OUSKKfLuMcfohU9gLuYF5_yfh3LGt2A4KSlUF1_DKcgxhiBV-QlNJWOL45fXjPl1_h7KcxfegJy19tpZ8cZ_KAWd4W00NJb5AmSGnzIB0iAkh0iC6fwpxngWS9ew_1gQC68wHrxZ8oBsLjZyzWk1eV69Xt3FSsTRzhpaIgnveaEtRZt6KsZUy2sCgzU1BvBF-Cm9kW1taPLvhURVxljUABxyKSsEmCFkyJbKDqz6bnTmAEXoJVJ3OW0OW9bpLX7IsKSlnIKOAnET0aH0e7CLkpj2nke8h8nv5PoW-s60Cc_5SirP4hTZRJDvXJecYljQcTTX6MOKx-gRiLdvc0NWzow8yrGTuCqQ0rYBEUELh8U7dGYQk6WX92aJEWa6uZb3AN9WFGg0GxiY1Bpq9kO58mHSBqeJXCrQ4mq2GJJxhxUE13zzbqsWyPi66MbTH1-YRTrjVPj5nkZqomuCtWIyWnC573IyG37lt8eYLXLNTbwuVDmUfaXytgntNExITdf9iiN2zFEYAlKSEROMc3FEKwApy9zzeTC9ItHsXGm63vv9s_2zaKEk4kUP3ozNfIMYeImk2piUs5OhEzpdAx_xyHbQICac2IA5arJ0_kqZ42tcuIjnzw8IJuU4xTDfEK12Ju7HaK8KA2i8v5Wtv28EQdqUUXByM39t_u16yI2y_Me545HGO18r-GCH3XJPe1GqwMq_J8vJSx3ecZhEXWBOZsyW5OvZ4YjHULRBDphZpyOmVsW7pLUprr42cU1BtitQy0aJm-qzd1ud4FspjRf-bsuRvWruqdqPTG80NbB-WUPCDNTSZ49bwQ9_CW0VQbqzDRupyG-xl16DwCWvqeWVd-v2DYTKCESsKfJhUHmYyK_GbTgsEioZIKmgN6UERMYLxKRRibkT8r0vWpsqx53xB_MenVzfOmpsOCJt5ITalsMVINUnuYekYw1YG9b6HRLtR4dSZj36j6gMDwGpOEPtHeEt6Fjym0SjMNA6kL2qp8rqxSiKrc37RE7Y6f6d2RlarGZG5woPl59F4onBR3Z1SR5mc9Srzrsezn6petEl19w0GtPocw5mrbYphgmjqGKNKqgLCKQ5yhfA1FQMkaZQQSJRd_zg5DuKUr7Bi_fc0ag-iJ1YqCrSiR-AmZV2DUGcNuYe9BOKt70GpfYfyc2DIcSA6oNNnRyi5uqjA7FUvggsWh80s-1yHSl4klFmQN0X10X-FszbmP2PYOlipbG6lNe2qCdlT49XgO17625Spfu7ehpeP-wRjWxgG5A-l7HabM3BrJRvYiW4YXWmloH2C8qOiqnHtC_mDjWAChSK9unVfMLQOeHiBInGR3s44wZvgtVzn_uSHuIacbqCr8VW-efmRVJ5m3iNado9smCCn74xnkMFR4_nRTCz-uwTsQp6Vvk7A6B-avGIkSBWK26nn7p0wB-btIYVZhbHlvs7eRL4PF5sc7gDgS6fpTVOVTCUEUYDfOeyu2TD-JUv0tnNxyH8zdeMHYjtQKgHDNMoWHlA1ly_1BqbU2urn3N07I4BuoBWhSfzcsRmOXtBtylCrVRhC9MEOR-I8QGgFByZfixG4XwGQnbCx-LyAtn6ngcii79W0pA8AoG_-a0s-3aIebEpcz2_qPXqxZ1qk4ByA10VjIBTC73vY1_ChkHg6bvmOsgYcrOFmD9nrbBCgapBGOx_yWsPLLwAD-cGj'
},
core: {
// The API URL. iOS uses the /bq endpoint, Android clients use the /ph endpoint.
baseURL: 'https://feelinsonice-hrd.appspot.com',
// A set of possible API proxies
baseList: [
'https://feelinsonice-hrd.appspot.com',
'https://app.snapchat.com'
],
// Before updating this value, confirm that the library requests everything in the same way as the app.
// Snapchat/9.10.0.0 (HTC One; Android 4.4.2#302626.7#19; gzip)'
// userAgent: 'Snapchat/9.12.2.0 (SM-N9005; Android 5.0.2; gzip)',
// userAgent: 'Snapchat/9.14.0.0 (SM-N9005; Android 5.0.2; gzip)',
userAgent: 'Snapchat/9.14.2.0 (SM-N9005; Android 5.0.2; gzip)',
// An alternate base URL for sending certain POST requests.
eventsURL: 'https://sc-analytics.appspot.com/post_events',
// The base URL for sending analytics.
analyticsURL: 'https://sc-analytics.appspot.com/analytics/bz',
// The API secret used to create access tokens.
secret: 'iEk21fuwZApXlz93750dmW22pw389dPwOk',
// Used when no session is available.
staticToken: 'm198sOkJEn37DjqZ32lpRu76xmw288xSQ9',
// Used to encrypt and decrypt media.
blobEncryptionKey: 'M02cnQ51Ji97vwT4',
// Used to create the token for each request.
hashPattern: '0001110111101110001111010101111011010001001110011000110001000110',
// Used to separate form fields when sending snaps.
boundary: 'Boundary+0xAbCdEfGbOuNdArY',
deviceToken1i: 'dtoken1i',
deviceToken1v: 'dtoken1v',
googleDefaultPublicKey: 'AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pKRI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/6rmf5AAAAAwEAAQ=='
},
headers: {
timestamp: 'X-Timestamp',
userAgent: 'User-Agent',
contentType: 'Content-Type',
acceptLanguage: 'Accept-Language',
acceptLocale: 'Accept-Locale',
clientAuth: 'X-Snapchat-Client-Auth',
clientAuthToken: 'X-Snapchat-Client-Auth-Token',
values: {
language: 'en',
locale: 'en_US'
}
},
featureSettings: {
frontFacingFlash: 'front_facing_flash',
replaySnaps: 'replay_snaps',
smartFilters: 'smart_filters',
visualFilters: 'visual_filters',
powerSaveMode: 'power_save_mode',
specialText: 'special_text',
swipeCashMode: 'swipe_cash_mode',
travelMode: 'travel_mode'
},
endpoints: {
misc: {
ping: '/loq/ping',
locationData: '/loq/loc_data',
serverList: '/loq/gae_server_list',
doublePost: '/loq/double_post',
reauth: '/bq/reauth',
suggestFriend: '/bq/suggest_friend'
},
update: {
all: '/loq/all_updates',
snaps: '/bq/update_snaps',
stories: '/bq/update_stories',
user: '/loq/update_user', // just /update_stories?
featureSettings: '/bq/update_feature_settings'
},
account: {
login: '/loq/login',
logout: '/ph/logout',
twoFAPhoneVerify: '/loq/two_fa_phone_verify',
twoFARecoveryCode: '/loq/two_fa_recovery_code',
setBestsCount: '/bq/set_num_best_friends',
settings: '/ph/settings',
snaptag: '/bq/snaptag_download',
registration: {
start: '/loq/register',
username: '/loq/register_username',
getCaptcha: '/bq/get_captcha',
solveCaptcha: '/bq/solve_captcha',
verifyPhone: '/bq/phone_verify',
suggestUsername: '/bq/suggest_username'
},
avatar: {
set: '/bq/upload_profile_data',
get: '/bq/delete_profile_data',
remove: '/bq/delete_profile_data',
getFriend: '/bq/download_friends_profile_data'
}
},
chat: {
sendMessage: '/loq/conversation_post_messages',
conversation: '/loq/conversation',
conversations: '/loq/conversations',
authToken: '/loq/conversation_auth_token',
clear: '/ph/clear',
clearFeed: '/loq/clear_feed',
clearConvo: '/loq/clear_conversation',
typing: '/bq/chat_typing',
media: '/bq/chat_media',
uploadMedia: '/bq/upload_chat_media',
shareMedia: '/loq/conversation_share_media'
},
device: {
IPRouting: '/bq/ip_routing',
IPRoutingError: '/bq/ip_routing_error',
identifier: '/loq/device_id',
device: '/ph/device'
},
discover: {
channels: '/discover/channel_list?region=',
icons: '/discover/icons?icon=',
snaps: '/discover/dsnaps?edition_id=', // &snap_id= &hash= &publisher= &session.resourceParamName=session.resourceParamValue
intros: '/discover/intro_videos?publisher=' // &intro_video= &session.resourceParamName=session.resourceParamValue
},
friends: {
find: '/bq/find_friends',
findNearby: '/bq/find_nearby_friends',
bests: '/bq/bests',
friend: '/bq/friend',
hide: '/loq/friend_hide',
search: '/loq/friend_search',
exists: '/bq/user_exists'
},
snaps: {
loadBlob: '/bq/blob', // /ph/blob ?
upload: '/ph/upload',
send: '/loq/retry',
retry: '/loq/send'
},
stories: {
stories: '/bq/stories',
upload: '/ph/upload',
blob: '/bq/story_blob?story_id=',
thumb: '/bq/story_thumbnail?story_id=',
authBlob: '/bq/auth_story_blob?story_id=',
authThumb: '/bq/auth_story_thumbnail?story_id=',
remove: '/bq/delete_story',
post: '/bq/post_story',
retryPost: '/bq/retry_post_story'
},
cash: {
checkRecipientEligibility: '/cash/check_recipient_eligible',
generateAccessToken: '/cash/generate_access_token',
generateSignature: '/cash/generate_signature_for_phone',
markViewed: '/cash/mark_as_viewed',
resetAccount: '/cash/reset_account',
transaction: '/cash/transaction',
updateTransaction: '/cash/update_transaction',
validateTransaction: '/cash/validate_transaction'
},
android: {
findNearbyFriends: '/bq/and/find_nearby_friends',
changeEmail: '/loq/and/change_email',
changePass: '/loq/and/change_password',
getPassStrength: '/loq/and/get_password_strength',
registerExp: '/loq/and/register_exp'
},
sharedDescription: '/shared/description'
},
// ---------------------------------------------------------------------------
// Dynamic Constants
// ---------------------------------------------------------------------------
addSourceFromString: function (addSource) {
if (addSource === 'ADDED_BY_PHONE') {
return constants.AddSource.Phonebook.value
} else if (addSource === 'ADDED_BY_USERNAME') {
return constants.AddSource.Username.value
} else if (addSource === 'ADDED_BY_ADDED_ME_BACK') {
return constants.AddSource.AddedBack.value
}
return 0
},
stringFromAddSource: function (addSource) {
if (addSource === constants.AddSource.Phonebook.value) {
return 'ADDED_BY_PHONE'
} else if (addSource === constants.AddSource.Username.value) {
return 'ADDED_BY_USERNAME'
} else if (addSource === constants.AddSource.AddedBack.value) {
return 'ADDED_BY_ADDED_ME_BACK'
}
return null
},
stringFromMediaKind: function (mediaKind) {
return constants.MediaKind.get(mediaKind).key
},
stringFromStoryPrivacy: function (storyPrivacy) {
if (storyPrivacy === constants.StoryPrivacy.Everyone.value) {
return 'EVERYONE'
} else if (storyPrivacy === constants.StoryPrivacy.Friends.value) {
return 'FRIENDS'
} else if (storyPrivacy === constants.StoryPrivacy.Custom.value) {
return 'CUSTOM'
}
return null
},
messageKindFromString: function (messageKind) {
messageKind = (messageKind || '').toLowerCase()
if (messageKind === constants.MessageKind.Text.key.toLowerCase()) {
return constants.MessageKind.Text.value
} else if (messageKind === constants.MessageKind.Media.key.toLowerCase()) {
return constants.MessageKind.Media.value
} else if (messageKind === constants.MessageKind.DiscoverShared.key.toLowerCase()) {
return constants.MessageKind.DiscoverShared.value
}
return null
},
mediaKindIsImage: function (mediaKind) {
return mediaKind === constants.MediaKind.Image.value ||
mediaKind === constants.MediaKind.StrangerImage.value
},
mediaKindIsVideo: function (mediaKind) {
return mediaKind === constants.MediaKind.Video.value ||
mediaKind === constants.MediaKind.SilentVideo.value ||
mediaKind === constants.MediaKind.StrangerVideo.value ||
mediaKind === constants.MediaKind.StrangerSilentVideo.value
}
}