Просмотр исходного кода

Feature/instagram (#41)

* Add facebook registered phone number
* Change intagram_profile report name
* Instagram recent searches report
* Instagram following user ids report
* Instagram facebook integration friends data
Alberto Güerere 7 лет назад
Родитель
Сommit
cee0185381

+ 4 - 0
tools/index.js

@@ -33,6 +33,10 @@ var reportTypes = {
   'facebook_profile': require('./reports/facebook_profile'),
   'facebook_messenger_friends': require('./reports/facebook_messenger_friends'),
   'spotify': require('./reports/spotify'),
+  'instagram_profile': require('./reports/instagram_profile'),
+  'instagram_recent_searches': require('./reports/instagram_recent_searches'),
+  'instagram_following_users_coded': require('./reports/instagram_following_users_coded'),
+  'instagram_fb_friends': require('./reports/instagram_fb_friends'),
   'speed_dial': require('./reports/speed_dial'),
   'bluetooth_devices': require('./reports/bluetooth_devices'),
   'safari_open_tabs': require('./reports/safari_open_tabs'),

+ 61 - 0
tools/reports/instagram_fb_friends.js

@@ -0,0 +1,61 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const file = fileHash('Library/Preferences/group.com.burbn.instagram.plist', 'AppDomainGroup-group.com.burbn.instagram')
+
+module.exports.name = 'instagram_fb_friends'
+module.exports.description = 'Show Instagram and Facebook friends data'
+
+// Specify this reporter requires a backup.
+// The second parameter to func() is now a backup instead of the path to one.
+module.exports.requiresBackup = true
+
+// Specify this reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  instagramRecentSearchesReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: { 
+          'Fb_id': el => el.fb_id,
+          'Name': el => el.full_name,
+          'Profile Pic': el => el.profile_pic_url,
+          'Invited': el => el.is_invited
+        }
+      })
+
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+const instagramRecentSearchesReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var results = []
+    var filename = backup.getFileName(file)
+    try {
+      let instagramPlist = bplist.parseBuffer(fs.readFileSync(filename))[0]
+      let regex = /[0-9]*-fb-friends$/g;
+      let fbFriendsKey = Object.keys(instagramPlist).filter(key => regex.test(key))
+      console.log(fbFriendsKey)
+      fbFriendsKey.forEach(key => {
+        let fbFriends = instagramPlist[key]
+        results.push(...fbFriends)
+      })
+
+      resolve(results)
+    } catch (e) {
+      reject(e)
+    }
+  })
+}

+ 56 - 0
tools/reports/instagram_following_users_coded.js

@@ -0,0 +1,56 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const file = fileHash('Library/Preferences/group.com.burbn.instagram.plist', 'AppDomainGroup-group.com.burbn.instagram')
+
+module.exports.name = 'instagram_following_users_coded'
+module.exports.description = 'Show Instagram following users coded data'
+
+// Specify this reporter requires a backup.
+// The second parameter to func() is now a backup instead of the path to one.
+module.exports.requiresBackup = true
+
+// Specify this reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  instagramRecentSearchesReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: { 
+          'Identifier': el => el
+        }
+      })
+
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+const instagramRecentSearchesReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var results = []
+    var filename = backup.getFileName(file)
+    try {
+      let instagramPlist = bplist.parseBuffer(fs.readFileSync(filename))[0]
+      let followingUsersKey = Object.keys(instagramPlist).filter(key => key.indexOf('-following-users.coded') !== -1)
+      followingUsersKey.forEach(key => {
+        let followingUsers = instagramPlist[key]
+        results.push(...followingUsers)
+      })
+
+      resolve(results)
+    } catch (e) {
+      reject(e)
+    }
+  })
+}

+ 61 - 0
tools/reports/instagram_profile.js

@@ -0,0 +1,61 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const file = fileHash('Library/Preferences/com.burbn.instagram.plist', 'AppDomain-com.burbn.instagram')
+
+module.exports.name = 'instagram_profile'
+module.exports.description = 'Show Instagram profile/user data'
+
+// Specify this reporter requires a backup.
+// The second parameter to func() is now a backup instead of the path to one.
+module.exports.requiresBackup = true
+
+// Specify this reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  instagramProfileReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: { 
+          'Key': el => el.key,
+          'Value': el => el.value
+        }
+      })
+
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+function KeyValue (property, plist) {
+  this.key = property
+  this.value = plist[property] ? plist[property] : 'N/A'
+}
+
+const instagramProfileReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var results = []
+    var filename = backup.getFileName(file)
+    try {
+      let instagramPlist = bplist.parseBuffer(fs.readFileSync(filename))[0]
+      
+      results.push(new KeyValue('last-logged-in-username', instagramPlist))
+      results.push(new KeyValue('prefill_fb_email', instagramPlist))
+      results.push(new KeyValue('prefill_fb_phone', instagramPlist))
+
+      resolve(results)
+    } catch (e) {
+      reject(e)
+    }
+  })
+}

+ 57 - 0
tools/reports/instagram_recent_searches.js

@@ -0,0 +1,57 @@
+const log = require('../util/log')
+const path = require('path')
+const sqlite3 = require('sqlite3')
+const bplist = require('bplist-parser')
+const fs = require('fs')
+const plist = require('plist')
+
+
+// Derive filenames based on domain + file path
+const fileHash = require('../util/backup_filehash')
+
+const file = fileHash('Library/Preferences/group.com.burbn.instagram.plist', 'AppDomainGroup-group.com.burbn.instagram')
+
+module.exports.name = 'instagram_recent_searches'
+module.exports.description = 'Show Instagram recent searches coded data'
+
+// Specify this reporter requires a backup.
+// The second parameter to func() is now a backup instead of the path to one.
+module.exports.requiresBackup = true
+
+// Specify this reporter supports the promises API for allowing chaining of reports.
+module.exports.usesPromises = true
+
+module.exports.func = function (program, backup, resolve, reject) {
+  instagramRecentSearchesReport(backup)
+    .then((items) => {
+      var result = program.formatter.format(items, {
+        program: program,
+        columns: { 
+          'Type': el => el.type,
+          'Identifier': el => el.identifier
+        }
+      })
+
+      resolve(result)
+    })
+    .catch(reject)
+}
+
+const instagramRecentSearchesReport = (backup) => {
+  return new Promise((resolve, reject) => {
+    var results = []
+    var filename = backup.getFileName(file)
+    try {
+      let instagramPlist = bplist.parseBuffer(fs.readFileSync(filename))[0]
+      let recentSearchesKey = Object.keys(instagramPlist).filter(key => key.indexOf('-blended-search-recent-item-order') !== -1)
+      recentSearchesKey.forEach(key => {
+        let recentSearches = instagramPlist[key]
+        results.push(...recentSearches)
+      })
+
+      resolve(results)
+    } catch (e) {
+      reject(e)
+    }
+  })
+}