Advertisement
Guest User

Untitled

a guest
Jul 19th, 2017
7,348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.37 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. from configparser import ConfigParser
  4. import json
  5. import os
  6. import re
  7. import requests
  8. import sys
  9.  
  10. import requests
  11.  
  12. from pyportify.gpsoauth import google
  13.  
  14. def getGoogleAccountTokenFromAuth():
  15.  
  16.     b64_key_7_3_29 = (b"AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3"
  17.                       b"iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pK"
  18.                       b"RI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/"
  19.                       b"6rmf5AAAAAwEAAQ==")
  20.  
  21.     android_key_7_3_29 = google.key_from_b64(b64_key_7_3_29)
  22.     encpass = google.signature(gmail, passw, android_key_7_3_29)
  23.     payload = {'Email':gmail, 'EncryptedPasswd':encpass, 'app':client_pkg, 'client_sig':client_sig, 'parentAndroidId':devid}
  24.     request = requests.post('https://android.clients.google.com/auth', data=payload)
  25.     token = re.search('Token=(.*?)\n', request.text)
  26.     if token:
  27.        return token.group(1)
  28.     else:
  29.        quit(request.text)
  30.  
  31.  
  32. def getGoogleDriveToken(token):
  33.     payload = {'Token':token, 'app':pkg, 'client_sig':sig, 'device':devid, 'google_play_services_version':client_ver, 'service':'oauth2:https://www.googleapis.com/auth/drive.appdata https://www.googleapis.com/auth/drive.file', 'has_permission':'1'}
  34.     request = requests.post('https://android.clients.google.com/auth', data=payload)
  35.     token = re.search('Auth=(.*?)\n', request.text)
  36.     if token:
  37.        return token.group(1)
  38.     else:
  39.        quit(request.text)
  40.  
  41. def rawGoogleDriveRequest(bearer, url):
  42.     headers = {'Authorization': 'Bearer '+bearer}
  43.     request = requests.get(url, headers=headers)
  44.     return request.text
  45.  
  46. def downloadFileGoogleDrive(bearer, url, local):
  47.     if not os.path.exists(os.path.dirname(local)):
  48.         os.makedirs(os.path.dirname(local))
  49.     if os.path.isfile(local):
  50.         os.remove(local)
  51.     headers = {'Authorization': 'Bearer '+bearer}
  52.     request = requests.get(url, headers=headers, stream=True)
  53.     request.raw.decode_content = True
  54.     if request.status_code == 200:
  55.         with open(local, 'wb') as asset:
  56.             for chunk in request.iter_content(1024):
  57.                 asset.write(chunk)
  58.     print('Downloaded: "'+local+'".')
  59.  
  60. def gDriveFileMap():
  61.     global bearer
  62.     data = rawGoogleDriveRequest(bearer, 'https://www.googleapis.com/drive/v2/files')
  63.     jres = json.loads(data)
  64.     backups = []
  65.     for result in jres['items']:
  66.         try:
  67.             if result['title'] == 'gdrive_file_map':
  68.                 backups.append((result['description'], rawGoogleDriveRequest(bearer, result['downloadUrl'])))
  69.         except:
  70.             pass
  71.     if len(backups) == 0:
  72.         quit('Unable to locate google drive file map for: '+pkg)
  73.     return backups
  74.  
  75. def getConfigs():
  76.     global gmail, passw, devid, pkg, sig, client_pkg, client_sig, client_ver
  77.     config = ConfigParser()
  78.     try:
  79.         config.read('settings.cfg')
  80.         gmail = config.get('auth', 'gmail')
  81.         passw = config.get('auth', 'passw')
  82.         devid = config.get('auth', 'devid')
  83.         pkg = config.get('app', 'pkg')
  84.         sig = config.get('app', 'sig')
  85.         client_pkg = config.get('client', 'pkg')
  86.         client_sig = config.get('client', 'sig')
  87.         client_ver = config.get('client', 'ver')
  88.     except(ConfigParser.NoSectionError, ConfigParser.NoOptionError):
  89.         quit('The "settings.cfg" file is missing or corrupt!')
  90.  
  91. def jsonPrint(data):
  92.     print(json.dumps(json.loads(data), indent=4, sort_keys=True))
  93.  
  94. def localFileLog(md5):
  95.     logfile = 'logs'+os.path.sep+'files.log'
  96.     if not os.path.exists(os.path.dirname(logfile)):
  97.         os.makedirs(os.path.dirname(logfile))
  98.     with open(logfile, 'a') as log:
  99.         log.write(md5+'\n')
  100.  
  101. def localFileList():
  102.     logfile = 'logs'+os.path.sep+'files.log'
  103.     if os.path.isfile(logfile):
  104.         flist = open(logfile, 'r')
  105.         return [line.split('\n') for line in flist.readlines()]
  106.     else:
  107.         open(logfile, 'w')
  108.         return localFileList()
  109.  
  110. def createSettingsFile():
  111.     with open('settings.cfg', 'w') as cfg:
  112.         cfg.write('[auth]\ngmail = alias@gmail.com\npassw = yourpassword\ndevid = 0000000000000000\n\n[app]\npkg = com.whatsapp\nsig = 38a0f7d505fe18fec64fbf343ecaaaf310dbd799\n\n[client]\npkg = com.google.android.gms\nsig = 38918a453d07199354f8b19af05ec6562ced5788\nver = 9877000')
  113.  
  114. def getSingleFile(data, asset):
  115.     data = json.loads(data)
  116.     for entries in data:
  117.         if entries['f'] == asset:
  118.             return entries['f'], entries['m'], entries['r'], entries['s']
  119.  
  120. def getMultipleFiles(data, folder):
  121.     files = localFileList()
  122.     data = json.loads(data)
  123.     for entries in data:
  124.         if any(entries['m'] in lists for lists in files) == False or 'database' in entries['f'].lower():
  125.             local = folder+os.path.sep+entries['f'].replace("/", os.path.sep)
  126.             if os.path.isfile(local) and 'database' not in local.lower():
  127.                 quit('Skipped: "'+local+'".')
  128.             else:
  129.                 downloadFileGoogleDrive(bearer, 'https://www.googleapis.com/drive/v2/files/'+entries['r']+'?alt=media', local)
  130.                 localFileLog(entries['m'])
  131.  
  132. def runMain(mode, asset, bID):
  133.     global bearer
  134.     if os.path.isfile('settings.cfg') == False:
  135.         createSettingsFile()
  136.     getConfigs()
  137.     bearer = getGoogleDriveToken(getGoogleAccountTokenFromAuth())
  138.     drives = gDriveFileMap()
  139.     if mode == 'info':
  140.         for i, drive in enumerate(drives):
  141.             if len(drives) > 1:
  142.                 print("Backup: "+str(i))
  143.             jsonPrint(drive[0])
  144.     elif mode == 'list':
  145.         for i, drive in enumerate(drives):
  146.             if len(drives) > 1:
  147.                 print("Backup: "+str(i))
  148.             jsonPrint(drive[1])
  149.     elif mode == 'pull':
  150.         try:
  151.             drive = drives[bID]
  152.         except IndexError:
  153.             quit("Invalid backup ID: " + str(bID))
  154.         target = getSingleFile(drive[1], asset)
  155.         try:
  156.             f = target[0]
  157.             m = target[1]
  158.             r = target[2]
  159.             s = target[3]
  160.         except TypeError:
  161.             quit('Unable to locate: "'+asset+'".')
  162.         local = 'WhatsApp'+os.path.sep+f.replace("/", os.path.sep)
  163.         if os.path.isfile(local) and 'database' not in local.lower():
  164.             quit('Skipped: "'+local+'".')
  165.         else:
  166.             downloadFileGoogleDrive(bearer, 'https://www.googleapis.com/drive/v2/files/'+r+'?alt=media', local)
  167.             localFileLog(m)
  168.     elif mode == 'sync':
  169.         for i, drive in enumerate(drives):
  170.             folder = 'WhatsApp'
  171.             if len(drives) > 1:
  172.                 print('Backup: '+str(i))
  173.                 folder = 'WhatsApp-' + str(i)
  174.             getMultipleFiles(drive[1], folder)
  175.  
  176. def main():
  177.     args = len(sys.argv)
  178.     if  args < 2 or str(sys.argv[1]) == '-help' or str(sys.argv[1]) == 'help':
  179.         print('\nUsage: '+str(sys.argv[0])+' -help|-vers|-info|-list|-sync|-pull file [backupID]\n\nExamples:\n')
  180.         print('python '+str(sys.argv[0])+' -help (this help screen)')
  181.         print('python '+str(sys.argv[0])+' -vers (version information)')
  182.         print('python '+str(sys.argv[0])+' -info (google drive app settings)')
  183.         print('python '+str(sys.argv[0])+' -list (list all availabe files)')
  184.         print('python '+str(sys.argv[0])+' -sync (sync all files locally)')
  185.         print('python '+str(sys.argv[0])+' -pull "Databases/msgstore.db.crypt12" [backupID] (download)\n')
  186.     elif str(sys.argv[1]) == '-info' or str(sys.argv[1]) == 'info':
  187.         runMain('info', 'settings', 0)
  188.     elif str(sys.argv[1]) == '-list' or str(sys.argv[1]) == 'list':
  189.         runMain('list', 'all', 0)
  190.     elif str(sys.argv[1]) == '-sync' or str(sys.argv[1]) == 'sync':
  191.         runMain('sync', 'all', 0)
  192.     elif str(sys.argv[1]) == '-vers' or str(sys.argv[1]) == 'vers':
  193.         print('\nWhatsAppGDExtract Version 1.1 Copyright (C) 2016 by TripCode\n')
  194.     elif args < 3:
  195.         quit('\nUsage: python '+str(sys.argv[0])+' -help|-vers|-info|-list|-sync|-pull file [backupID]\n')
  196.     elif str(sys.argv[1]) == '-pull' or str(sys.argv[1]) == 'pull':
  197.         try:
  198.             bID = int(sys.argv[3])
  199.         except (IndexError, ValueError):
  200.             bID = 0
  201.         runMain('pull', str(sys.argv[2]), bID)
  202.     else:
  203.         quit('\nUsage: python '+str(sys.argv[0])+' -help|-vers|-info|-list|-sync|-pull file [backupID]\n')
  204.  
  205. if __name__ == "__main__":
  206.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement