package moe.chionlab.wechatmomentstat; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Environment; import android.util.Log; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedWriter; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import dalvik.system.DexClassLoader; import moe.chionlab.wechatmomentstat.Model.SnsInfo; /** * Created by chiontang on 2/17/16. */ public class Task { protected Context context = null; public SnsReader snsReader = null; public Task(Context context) { this.context = context; this.makeExtDir(); } public void restartWeChat() throws Throwable { ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses(); int pid = -1; for (int i = 0; i < pids.size(); i++) { ActivityManager.RunningAppProcessInfo info = pids.get(i); if (info.processName.equalsIgnoreCase(Config.WECHAT_PACKAGE)) { pid = info.pid; } } if (pid != -1) { Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("kill " + pid + "\n"); outputStream.writeBytes("exit\n"); outputStream.flush(); outputStream.close(); } Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(Config.WECHAT_PACKAGE); context.startActivity(launchIntent); } public void copySnsDB() throws Throwable { String dataDir = Environment.getDataDirectory().getAbsolutePath(); String destDir = Config.EXT_DIR; Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("mount -o remount,rw " + dataDir + "\n"); outputStream.writeBytes("cd " + dataDir + "/data/" + Config.WECHAT_PACKAGE + "/MicroMsg\n"); outputStream.writeBytes("ls | while read line; do cp ${line}/SnsMicroMsg.db " + destDir + "/ ; done \n"); outputStream.writeBytes("sleep 1\n"); outputStream.writeBytes("chmod 777 " + destDir + "/SnsMicroMsg.db\n"); outputStream.writeBytes("exit\n"); outputStream.flush(); outputStream.close(); Thread.sleep(1000); } public void testRoot() { try { Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("exit\n"); outputStream.flush(); outputStream.close(); } catch (Exception e) { Toast.makeText(context, R.string.not_rooted, Toast.LENGTH_LONG).show(); } } public String getWeChatVersion() { PackageInfo pInfo = null; try { pInfo = context.getPackageManager().getPackageInfo(Config.WECHAT_PACKAGE, 0); } catch (PackageManager.NameNotFoundException e) { Log.e("wechatmomentstat", e.getMessage()); return null; } String wechatVersion = ""; if (pInfo != null) { wechatVersion = pInfo.versionName; Config.initWeChatVersion(wechatVersion); return wechatVersion; } return null; } public void makeExtDir() { File extDir = new File(Config.EXT_DIR); if (!extDir.exists()) { extDir.mkdir(); } } public void copyAPKFromAssets() { InputStream assetInputStream = null; File outputAPKFile = new File(Config.EXT_DIR + "/wechat.apk"); if (outputAPKFile.exists()) outputAPKFile.delete(); byte[] buf = new byte[1024]; try { outputAPKFile.createNewFile(); assetInputStream = context.getAssets().open("wechat.apk"); FileOutputStream outAPKStream = new FileOutputStream(outputAPKFile); int read; while((read = assetInputStream.read(buf)) != -1) { outAPKStream.write(buf, 0, read); } assetInputStream.close(); outAPKStream.close(); } catch (Exception e) { Log.e("wechatmomentstat", "exception", e); } } public void initSnsReader() { File outputAPKFile = new File(Config.EXT_DIR + "/wechat.apk"); if (!outputAPKFile.exists()) copyAPKFromAssets(); try { Config.initWeChatVersion("6.3.13.64_r4488992"); DexClassLoader cl = new DexClassLoader( outputAPKFile.getAbsolutePath(), context.getDir("outdex", 0).getAbsolutePath(), null, ClassLoader.getSystemClassLoader()); Class SnsDetailParser = null; Class SnsDetail = null; Class SnsObject = null; SnsDetailParser = cl.loadClass(Config.SNS_XML_GENERATOR_CLASS); SnsDetail = cl.loadClass(Config.PROTOCAL_SNS_DETAIL_CLASS); SnsObject = cl.loadClass(Config.PROTOCAL_SNS_OBJECT_CLASS); snsReader = new SnsReader(SnsDetail, SnsDetailParser, SnsObject); } catch (Throwable e) { Log.e("wechatmomentstat", "exception", e); } } public static void saveToJSONFile(ArrayList<SnsInfo> snsList, String fileName, boolean onlySelected) { JSONArray snsListJSON = new JSONArray(); for (int snsIndex=0; snsIndex<snsList.size(); snsIndex++) { SnsInfo currentSns = snsList.get(snsIndex); if (!currentSns.ready) { continue; } if (onlySelected && !currentSns.selected) { continue; } JSONObject snsJSON = new JSONObject(); JSONArray commentsJSON = new JSONArray(); JSONArray likesJSON = new JSONArray(); JSONArray mediaListJSON = new JSONArray(); try { snsJSON.put("isCurrentUser", currentSns.isCurrentUser); snsJSON.put("snsId", currentSns.id); snsJSON.put("authorName", currentSns.authorName); snsJSON.put("authorId", currentSns.authorId); snsJSON.put("content", currentSns.content); for (int i = 0; i < currentSns.comments.size(); i++) { JSONObject commentJSON = new JSONObject(); commentJSON.put("isCurrentUser", currentSns.comments.get(i).isCurrentUser); commentJSON.put("authorName", currentSns.comments.get(i).authorName); commentJSON.put("authorId", currentSns.comments.get(i).authorId); commentJSON.put("content", currentSns.comments.get(i).content); commentJSON.put("toUserName", currentSns.comments.get(i).toUser); commentJSON.put("toUserId", currentSns.comments.get(i).toUserId); commentsJSON.put(commentJSON); } snsJSON.put("comments", commentsJSON); for (int i = 0; i < currentSns.likes.size(); i++) { JSONObject likeJSON = new JSONObject(); likeJSON.put("isCurrentUser", currentSns.likes.get(i).isCurrentUser); likeJSON.put("userName", currentSns.likes.get(i).userName); likeJSON.put("userId", currentSns.likes.get(i).userId); likesJSON.put(likeJSON); } snsJSON.put("likes", likesJSON); for (int i = 0; i < currentSns.mediaList.size(); i++) { mediaListJSON.put(currentSns.mediaList.get(i)); } snsJSON.put("mediaList", mediaListJSON); snsJSON.put("rawXML", currentSns.rawXML); snsJSON.put("timestamp", currentSns.timestamp); snsListJSON.put(snsJSON); } catch (Exception exception) { Log.e("wechatmomentstat", "exception", exception); } } File jsonFile = new File(fileName); if (!jsonFile.exists()) { try { jsonFile.createNewFile(); } catch (IOException e) { Log.e("wechatmomentstat", "exception", e); } } try { FileWriter fw = new FileWriter(jsonFile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(snsListJSON.toString()); bw.close(); } catch (IOException e) { Log.e("wechatmomentstat", "exception", e); } } }