处理微信朋友圈的数据


1、处理好友发布的朋友数据,例如:图片,文字信息,小视频等
2、处理微信朋友圈的点赞数据
3、处理微信朋友圈的评论数据

处理朋友圈数据工具类


package com.weixin;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;/*** SnsInfo:朋友圈数据表*      content:朋友圈数据*      attrBuf:朋友圈点赞数据,本条朋友圈所有的点赞*      type:3,分享;2,纯文字;1,文字+图片;15小视频* SnsComment:朋友圈评论表*      curActionBuf:评论数据,每行只有一条评论数据*      talker:评论人的id* * SnsInfo的snsID与SnsComment的snsId相同*/
@SuppressWarnings("unused")
public final class WeiXinUtils {private static Set<String> filterSet;private static Set<String> filterSet2;static {//精确匹配filterSet = new HashSet<String>();filterSet.add("");filterSet.add("\" * 2 8 H P :");filterSet.add("\" * 2 8 H P X e :");filterSet.add("\" * B");filterSet.add("\" B J R");//模糊匹配filterSet2 = new HashSet<String>();filterSet2.add("微信小视频");filterSet2.add("h p z");filterSet2.add("D D");filterSet2.add("D pD :GZ");filterSet2.add("qqmap_");filterSet2.add("\" * ");}/*** 传入文件的方式* 处理微信朋友圈评论的数据 最终将数据封装成对象返回*/private static WeiXinComment dealWeiXinDataOfComment(FileReader fileReader) {StringBuilder stringBuilder = new StringBuilder();try {int length = -1;char[] chars = new char[1024];while ((length = fileReader.read(chars)) != -1) {stringBuilder.append(chars, 0, length);}} catch (Exception e) {e.printStackTrace();}return dealWeiXinDataOfComment("", "", "", "", "", "", 0, stringBuilder.toString().toCharArray());}/*** 传入String的方式* 处理微信朋友圈评论的数据 最终将数据封装成对象返回*/public static WeiXinComment dealWeiXinDataOfComment(String weiXinCircleId, String meWeiXinId, String meAccount, String friWeiXinId,String friNickName, String custId, long weiXinCreateDate, String curActionBuf) {char[] charsOfCurActionBuf = null;if (curActionBuf != null && !"".equals(curActionBuf.trim())) {charsOfCurActionBuf = curActionBuf.trim().toCharArray();}return dealWeiXinDataOfComment(weiXinCircleId, meWeiXinId, meAccount, friWeiXinId, friNickName, custId, weiXinCreateDate,charsOfCurActionBuf);}/*** 传入char[]的方式* 处理微信朋友圈评论的数据 最终将数据封装成对象返回*/public static WeiXinComment dealWeiXinDataOfComment(String weiXinCircleId, String meWeiXinId, String meAccount, String friWeiXinId,String friNickName, String custId, long weiXinCreateDate, char[] charsOfComment) {WeiXinComment commentContent = new WeiXinComment();if (charsOfComment == null) {return commentContent;}try {commentContent.setMeWeiXinId(meWeiXinId);commentContent.setMeAccount(meAccount);commentContent.setFriWeiXinId(friWeiXinId);commentContent.setFriNickName(friNickName);commentContent.setCustId(custId);commentContent.setWeiXinCreateDate(new Date(weiXinCreateDate));commentContent.setCreateDate(new Date());commentContent.setWeiXinCircleId(weiXinCircleId);filterKongZhiChar(charsOfComment);String content = new String(charsOfComment);content = replaceStr(content);// 按回车分割成一行一行的String[] contentStrs = content.split("\n");String tempStr;StringBuilder sb = new StringBuilder();for (int i = 0; i < contentStrs.length; i++) {tempStr = contentStrs[i].replaceAll("\\s+", " ").trim();if (!filterSet.contains(tempStr) && filter(tempStr)) { // 过滤不需要的内容if (i == 1) {String[] strs = tempStr.split(" ");if (friWeiXinId == null || "".equals(friWeiXinId.trim())) {commentContent.setFriWeiXinId(strs[0]);commentContent.setMeWeiXinId(strs[1]);commentContent.setFriNickName(strs[2].substring(0, strs[2].length() - 1));commentContent.setMeAccount(strs[3].substring(0, strs[3].length() - 1));}sb.append(strs[4]).append("\n");} else {sb.append(tempStr).append("\n");}}}commentContent.setContent(sb.toString());} catch (Exception e) {e.printStackTrace();}return commentContent;}/*** 传入String的方式* 处理微信朋友圈的数据 最终将数据封装成对象返回*/public static WeiXinCircleContent dealWeiXinDataOfCircle(String weiXinCircleId, String meWeiXinId, String meAccount, String friWeiXinId,String friNickName, String custId, int type, long weiXinCreateDate, String content, String attrBuf) {char[] charsOfContent = null;char[] charsOfAttrBuf = null;if (content != null && !"".equals(content.trim())) {charsOfContent = content.trim().toCharArray();}if (attrBuf != null && !"".equals(attrBuf.trim())) {charsOfAttrBuf = attrBuf.trim().toCharArray();}return dealWeiXinDataOfCircle(weiXinCircleId, meWeiXinId, meAccount, friWeiXinId, friNickName, custId, type,weiXinCreateDate, charsOfContent, charsOfAttrBuf);}/*** 处理微信朋友圈的数据 最终将数据封装成对象返回*/private static WeiXinCircleContent dealWeiXinDataOfCircle(int type, FileReader fileReaderOfContent, FileReader fileReaderOfAttrBuf) {try {// 处理微信朋友圈的数据StringBuilder stringBuilder = new StringBuilder();int length = -1;char[] chars = new char[1024];while ((length = fileReaderOfContent.read(chars)) != -1) {stringBuilder.append(chars, 0, length);}char[] charsOfContent = stringBuilder.toString().toCharArray();// 处理微信朋友圈的点赞数据stringBuilder = new StringBuilder();while ((length = fileReaderOfContent.read(chars)) != -1) {stringBuilder.append(chars, 0, length);}char[] charsOfAttrBuf = stringBuilder.toString().toCharArray();return dealWeiXinDataOfCircle("", "", "", "", "", "", type, 0, charsOfContent, charsOfAttrBuf);} catch (Exception e) {e.printStackTrace();}return new WeiXinCircleContent();}/*** 处理微信朋友圈的数据 最终将数据封装成对象返回*/public static WeiXinCircleContent dealWeiXinDataOfCircle(String weiXinCircleId, String meWeiXinId, String meAccount, String friWeiXinId,String friNickName, String custId, int type, long weiXinCreateDate, char[] charsOfContent, char[] charsOfAttrBuf) {WeiXinCircleContent circleContent = new WeiXinCircleContent();if (charsOfContent == null) {return circleContent;}try {circleContent.setMeWeiXinId(meWeiXinId);circleContent.setMeAccount(meAccount);circleContent.setFriWeiXinId(friWeiXinId);circleContent.setFriNickName(friNickName);circleContent.setCustId(custId);circleContent.setType(type);circleContent.setWeiXinCreateDate(new Date(weiXinCreateDate));circleContent.setCreateDate(new Date());circleContent.setWeiXinCircleId(weiXinCircleId);filterKongZhiChar(charsOfContent);// 按回车分割成一行一行的String[] contentStrs = new String(charsOfContent).split("\n");int startIndex = -1;int endIndex = -1;// 整理出需要的内容String tempStr;StringBuilder content = new StringBuilder();for (int i = 0; i < contentStrs.length; i++) {tempStr = contentStrs[i].replaceAll("\\s+", " ").trim();if (!filterSet.contains(tempStr) && filter(tempStr)) { // 过滤不需要的内容if (i == 1) { // 第一行数据包含微信号和文字内容,取出String[] strs = tempStr.split(" ");// 没有传进微信号时if (friWeiXinId == null || "".equals(friWeiXinId.trim())) {if (strs.length < 2) { // 微信号在第二行开头的情况tempStr = contentStrs[++i].replaceAll("\\s+", " ").trim();strs = tempStr.split(" ");strs[1] = strs[0];}circleContent.setFriWeiXinId(strs[1]);}// 文字内容for (int j = 2; j < strs.length; j++) {content.append(strs[j]);}content.append("\n");continue;}// 除第一行外的数据if (tempStr.contains("http://")) {// 图片、小视频的路径if (type == 1) { // 文字+图片startIndex = tempStr.indexOf("http://");endIndex = tempStr.indexOf("/0(") + 2;}if (type == 15) { // 小视频startIndex = tempStr.indexOf("http://");endIndex = tempStr.indexOf("( 2 ");}if (type == 3) {String[] strs = tempStr.split(" ");circleContent.addUrl(strs[0]);circleContent.setShareTitle(strs[1]);break;}//对应手机上微信文件夹下的图片目录circleContent.addImgNames(getCircleImg(tempStr.substring(0, 20)));//朋友圈图片、小视频的网络路径tempStr = tempStr.substring(startIndex, endIndex);circleContent.addUrl(tempStr);// url} else { // 文字内容content.append(tempStr).append("\n");}}}char c = content.charAt(1);int subStartIndex = 1;if (c == '*') {subStartIndex = 2;}circleContent.setContent(content.substring(subStartIndex, content.lastIndexOf("2"))); // 文字内容,去掉最后的"2"//处理微信朋友圈的点赞数据if (charsOfAttrBuf != null) {Map<String, String> friMapOfCP = dealWeiXinDataOfClickPraise(charsOfAttrBuf);circleContent.setFriMapOfCP(friMapOfCP);}} catch (Exception e) {e.printStackTrace();}return circleContent;}/*** 传入char[]的方式* 处理微信朋友圈点赞的数据 最终将数据封装成对象返回*/private static Map<String, String> dealWeiXinDataOfClickPraise(char[] charsOfAttrBuf) {// 点赞的好友:key,点赞的好友微信Id。// value,点赞的好友昵称。Map<String, String> friMap = new HashMap<String, String>();try {filterKongZhiChar(charsOfAttrBuf);String content = new String(charsOfAttrBuf);// 按回车分割成一行一行的String[] contentStrs = content.split("\n");String tempStr;for (int i = 0; i < contentStrs.length; i++) {// haoyou272355  ️京品匯️     *     0 8 @ P X h p tempStr = contentStrs[i].replaceAll("\\s+", " ").trim();if (!filterSet.contains(tempStr) && filter(tempStr)) {if (i != 0) {String[] strs = tempStr.split(" ");friMap.put(strs[0], strs[1]);}}}return friMap;} catch (Exception e) {e.printStackTrace();}return friMap;}/*** 获取微信好友的头像* 数据库:EnMicroMsg.db* 表:rcontact* 字段:usermane* * 返回值:处理好友的好友头像路径*/public static String getFriAvatar(String username) throws IOException {String md5 =  Md5.getMd5Value(username);String path1 =md5.substring(0,2) ;String path2 =md5.substring(2,4) ;return "/avatar/"+path1+"/"+path2+"/user_"+md5+".png";}/*** 获取微信朋友圈的图片路径* 数据库:SnsMicroMsg.db* 表:SnsInfo* 字段:content* * 返回值:处理好的图片路径*/private static String getCircleImg(String imgName) throws IOException {String md5 =  Md5.getMd5Value(imgName);String path1 =md5.substring(0,1) ;String path2 =md5.substring(1,2) ;return "/sns/"+path1+"/"+path2+"/snst_"+imgName;}/*** 过滤掉不需要的行*/private static boolean filter(String tempStr) {for (String string : filterSet2) {if (tempStr.indexOf(string) != -1) {return false;}}return true;}private static void filterKongZhiChar(char[] chars) {// 去掉控制字符for (int i = 0; i < chars.length; i++) {if (chars[i] == 10 || chars[i] == 13) {chars[i] = '\n';continue;}if (chars[i] < 32 || chars[i] == 65533) {chars[i] = ' ';continue;}}}private static String replaceStr(String content) {content = content.replaceAll("\\( 0 8     B ", " ");content = content.substring(0, content.lastIndexOf("H P"));return content;}/*** 只用于测试时显示大概的过滤结果* 过滤掉控制字符直接打印*/private static void print(FileReader fileReader) throws IOException {char[] chars = new char[1024];StringBuffer sb = new StringBuffer();int length = -1;// 去掉控制字符while ((length = fileReader.read(chars)) != -1) {for (int i = 0; i < length; i++) {if (chars[i] == 10 || chars[i] == 13) {chars[i] = '\n';continue;}if (chars[i] < 32 || chars[i] == 65533) {chars[i] = ' ';continue;}}sb.append(new String(chars, 0, length));}System.out.println(sb.toString());}public static void main(String[] args) throws FileNotFoundException, IOException {//获取朋友圈图片的调用//System.err.println(getCircleImgs());//获取好友头像的调用System.err.println(getFriAvatar("yonghai-168"));}
}

保存微信朋友圈数据的对象(图片,文字信息,小视频,点赞信息等)


package com.weixin;import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;@SuppressWarnings("serial")
public class WeiXinCircleContent implements Serializable {private String meWeiXinId;  // 当前手机登录的账号idprivate String meAccount;   // 当前手机登录的账号private String friWeiXinId; // 好友的微信idprivate String friNickName; // 好友的昵称private String custId;      // 客户idprivate int type;           // 朋友圈类型private String shareTitle;  // 类型为分享时,输入的文字private String content;     // 文字private Set<String> urls = new HashSet<String>();   // 图片、小视频网络路径private Set<String> imgNames = new HashSet<String>();// 图片、小视频名称private Date weiXinCreateDate;// 发布时间private Date createDate;    // 采集时间private String weiXinCircleId;// 微信朋友圈数据的id,snsidprivate int clickPraiseSum; // 这条朋友圈的点赞数量// 点赞的好友:key,点赞的好友微信Id。// value,点赞的好友昵称。private Map<String, String> friMapOfCP = new HashMap<String, String>();/****************************************  start  ***************************************************/public void addUrl(String url) {if (url.startsWith("http://") || url.startsWith("https://")) {urls.add(url);}}/*** 增加点赞的好友:* key,点赞的好友微信Id。* value,点赞的好友昵称。*/public void addClickPraiseFri(String friWeiXinId, String friNickName) {friMapOfCP.put(friWeiXinId, friNickName);}public void addImgNames(String imgName) {imgNames.add(imgName);}/******************************************  end   *************************************************/public String getCreateDateStr() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");if (createDate == null) {createDate = new Date();}return sdf.format(createDate);}@Overridepublic String toString() {StringBuilder sBuilder = new StringBuilder();sBuilder.append("微信号:").append(friWeiXinId).append("\n")//.append("时间:").append(getCreateDateStr()).append("\n")//.append("类型:").append(type).append("\n")//.append("内容:").append(content).append("\n")//.append("分享标题:").append(shareTitle).append("\n");sBuilder.append("路径:").append("\n");for (String urlTemp : urls) {sBuilder.append(urlTemp).append("\n");}sBuilder.append("文件名:").append("\n");for (String urlTemp : imgNames) {sBuilder.append(urlTemp).append("\n");}return sBuilder.toString();}public String getMeWeiXinId() {return meWeiXinId;}public void setMeWeiXinId(String meWeiXinId) {this.meWeiXinId = meWeiXinId;}public String getFriWeiXinId() {return friWeiXinId;}public void setFriWeiXinId(String friWeiXinId) {this.friWeiXinId = friWeiXinId;}public String getFriNickName() {return friNickName;}public void setFriNickName(String friNickName) {this.friNickName = friNickName;}public String getCustId() {return custId;}public void setCustId(String custId) {this.custId = custId;}public int getType() {return type;}public void setType(int type) {this.type = type;}public String getShareTitle() {return shareTitle;}public void setShareTitle(String shareTitle) {this.shareTitle = shareTitle;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Set<String> getUrls() {return urls;}public void setUrls(Set<String> urls) {this.urls = urls;}public Date getWeiXinCreateDate() {return weiXinCreateDate;}public void setWeiXinCreateDate(Date weiXinCreateDate) {this.weiXinCreateDate = weiXinCreateDate;}public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}public String getMeAccount() {return meAccount;}public void setMeAccount(String meAccount) {this.meAccount = meAccount;}public String getWeiXinCircleId() {return weiXinCircleId;}public void setWeiXinCircleId(String weiXinCircleId) {this.weiXinCircleId = weiXinCircleId;}public Set<String> getImgNames() {return imgNames;}public void setImgNames(Set<String> imgNames) {this.imgNames = imgNames;}public int getClickPraiseSum() {return clickPraiseSum;}public void setClickPraiseSum(int clickPraiseSum) {this.clickPraiseSum = clickPraiseSum;}public Map<String, String> getFriMapOfCP() {return friMapOfCP;}public void setFriMapOfCP(Map<String, String> friMapOfCP) {this.friMapOfCP = friMapOfCP;}
}

保存微信评论数据的对象

package com.weixin;import java.io.Serializable;
import java.util.Date;@SuppressWarnings("serial")
public class WeiXinComment implements Serializable {private String meWeiXinId;  // 当前手机登录的账号idprivate String meAccount;   // 当前手机登录的账号private String friWeiXinId; // 好友的微信idprivate String friNickName; // 好友的昵称private String custId;      // 客户idprivate String content;     // 评论的内容private Date weiXinCreateDate;//评论的时间private Date createDate;    //统计时间private String weiXinCircleId;// 微信朋友圈数据的id,snsidpublic String getMeWeiXinId() {return meWeiXinId;}public void setMeWeiXinId(String meWeiXinId) {this.meWeiXinId = meWeiXinId;}public String getMeAccount() {return meAccount;}public void setMeAccount(String meAccount) {this.meAccount = meAccount;}public String getFriWeiXinId() {return friWeiXinId;}public void setFriWeiXinId(String friWeiXinId) {this.friWeiXinId = friWeiXinId;}public String getFriNickName() {return friNickName;}public void setFriNickName(String friNickName) {this.friNickName = friNickName;}public String getCustId() {return custId;}public void setCustId(String custId) {this.custId = custId;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Date getWeiXinCreateDate() {return weiXinCreateDate;}public void setWeiXinCreateDate(Date weiXinCreateDate) {this.weiXinCreateDate = weiXinCreateDate;}public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}@Overridepublic String toString() {return "WeiXinComment [meWeiXinId=" + meWeiXinId + ", meAccount=" + meAccount + ", friWeiXinId=" + friWeiXinId+ ", friNickName=" + friNickName + ", custId=" + custId + ", content=" + content + ", weiXinCreateDate="+ weiXinCreateDate + ", createDate=" + createDate + "]";}public String getWeiXinCircleId() {return weiXinCircleId;}public void setWeiXinCircleId(String weiXinCircleId) {this.weiXinCircleId = weiXinCircleId;}}

加密解密的工具类

package com.weixin;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** md5加密方法*/
public class Md5 {/** Determine encrypt algorithm MD5 */private static final String ALGORITHM_MD5 = "MD5";/** UTF-8 Encoding */private static final String UTF_8 = "UTF-8";/*** 32位MD5加密方法* 16位小写加密只需getMd5Value("xxx").substring(8, 24);即可*/public static String getMd5Value(String sSecret) {try {MessageDigest bmd5 = MessageDigest.getInstance("MD5");bmd5.update(sSecret.getBytes());int i;StringBuffer buf = new StringBuffer();byte[] b = bmd5.digest();// 加密for (int offset = 0; offset < b.length; offset++) {i = b[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}return buf.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}public static void main(String[] args) throws Exception {// chrome://net-internals/#events//获取微信数据库的密码String Imei = "###################";String uin = "########";String password = Md5.getMd5Value(Imei + uin).substring(0, 7);System.err.println(password);}
}

Android问题—处理微信朋友圈的数据相关推荐

  1. Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能

    一.测试 实现: 二.添加依赖包: implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.recycl ...

  2. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  3. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  4. Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。

    转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动 ...

  5. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)

    原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...

  6. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码

             原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...

  7. python3 爬虫实战 :用 Appium 抓取手机 app 微信朋友圈的数据

    From:https://blog.csdn.net/Fan_shui/article/details/81413595 本编教程从 appium 的环境配置开始,到抓取手机 app 微信朋友圈结束. ...

  8. android 打开微信好友动态图片,Android GridView仿微信朋友圈显示图片

    最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友圈的图片显示一样. 利用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律,下面说一下自己的思路: 1 ...

  9. android开发--仿微信朋友圈界面

    话不多说,先来看两张效果图 看图片效果还凑合,就是"朋友圈"三个字和头像的动画过渡效果和微信朋友圈的实际效果还是有点差距,可以的话以后慢慢再优化吧,这里贴出相关的代码,可能部分代码 ...

最新文章

  1. web前端知识点太多_初学web前端,学习方法容易走偏,这是为什么?
  2. 在注意力中重新思考Softmax:分解非线性,这个线性transformer变体实现多项SOTA
  3. 计算机xp怎么做备份,怎样备份xp系统电脑上的所有数据?在xp系统中备份所有文件的方法...
  4. PHP正则表达式大全
  5. 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框
  6. 深入了解React新引擎:React Fiber
  7. 校园导游java版,校园导游系统Word版
  8. 《Python Cookbook 3rd》笔记(5.15):打印不合法的文件名
  9. 2-2:套接字(Socket)编程之深入了解套接字
  10. No compiler is provided in this environment. Perhaps you are running on a JRE
  11. codeforces621C. Wet Shark and Flowers【求期望】
  12. NOIP 2017 PJ
  13. myeclipse 10破解
  14. android定义键盘示例(斗地主或跑得快的记牌器)
  15. JAVA:实现求Median中位数算法(附完整源码)
  16. Java poi ppt图片置于底层_POI之PPT图片插入简单实例
  17. NYOJ-47 过河问题
  18. PlantUML(程序员绘制流程图专用工具)
  19. excel查找并返回多行数据
  20. python开发飞机小游戏_Python开发的飞机打外星人小游戏

热门文章

  1. The content of element type configuration must match (properties?,setting
  2. 【03.04】大数据教程--html+css基础
  3. 算法导论第三版第二章思考题答案
  4. Visual C++ 6.0 写一个简单的程序
  5. 前端实现pdf,word,doc等Office文档格式在线预览
  6. jar包调用dll lib等外部库文件失败解决办法
  7. 西游之路——python全栈——Django之ORM操作
  8. apk文件反编译成android代码
  9. Python-下载第三方模块,更换pip下载源
  10. 真无线蓝牙耳机排行榜:2020年蓝牙耳机十大名牌排行