社工入门之如何分析一个人的作息规律

电影中的社工高手可以很轻易操控目标对象,使其愿意去做某项事(科幻片拍的像玄幻片…),虽然现实没有那么玄幻,但是真实的社工,或者你想要了解某个人,必然会有一个环节就是通过社交网络之类的对目标对象进行建模,即用一些特征来描述目标对象(也可想象为对人贴标签)。举一个例子我们平时如果加了一个新的QQ好友,可能会去QQ空间、腾讯微博等看下他以往的历史记录来确认他是个怎样的人,因为人的思维通常比较简单,所以当接触到一个陌生的人时急切需要在他身上寻找符合某个标签的某个特征,一旦这家伙显现出来某个特征,好,赶紧把对应的标签给他贴上,这样贴几个标签可以确定以后与其相处的策略,虽然可能比较偏激,但大多数人基本上都是这么干的。虽然你们可能没有说过几句话,但经过这么一番调查之后你已经对这个人有了一些比较深入的了解,至少是自以为有深入了解 :)

所以社工这玩意儿基本人人都会,说白了就是信息收集,如果是经常在网络上活动的人,留下的痕迹比较多,甚至有可能画出一条时间轴,能够大致描述他的人生轨迹,这个可以对自己感兴趣的人试一试,个人推荐使用时间轴作为主线的方式来分析。

对于信息收集,其中一个比较小的点就是如何分析一个人的作息规律,从而推测出特定的时间点他很有可能在做什么,比如统计某个人习惯在什么时间点刷知乎、泡论坛之类的,这个我有一个思路就是对于某类信息比较大,比如论坛上的留言,知乎上的点赞之类,可以通过爬虫技术先采集再分析。我想对自己有个更深刻的了解,所以这里就用一个例子,写一个小小的爬虫来分析我发博客的时间分布情况。

首先确定要抓取的字段,其实只需要发布时间字段就可以了,但是想到为了以后可能还会有其它的分析,就把其它方便抓取的字段比如阅读量、评论数之类一并抓取了。

PostMetaInfo:

package cc11001100.crawler;

import java.util.Date;

/**
 * @author CC11001100
 */
public class PostMetaInfo {

	private String id;
	private String title;
	private Date postTime;
	// like uv but not
	private Integer visited;
	private Integer reviewNum;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public Date getPostTime() {
		return postTime;
	}

	public void setPostTime(Date postTime) {
		this.postTime = postTime;
	}

	public Integer getVisited() {
		return visited;
	}

	public void setVisited(Integer visited) {
		this.visited = visited;
	}

	public Integer getReviewNum() {
		return reviewNum;
	}

	public void setReviewNum(Integer reviewNum) {
		this.reviewNum = reviewNum;
	}
}

CnBlogPostMetaInfoCrawler:

package cc11001100.crawler;

import com.alibaba.fastjson.JSON;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * 博客园活跃时间统计
 *
 * @author CC11001100
 */
public class CnBlogPostMetaInfoCrawler {

	private static final Logger log = LogManager.getLogger(CnBlogPostMetaInfoCrawler.class);

	private static void grabMetaInfoByUserName(String username) {
		final String savePath = getSavePathByUserName(username);
		final String urlPattern = String.format("http://www.cnblogs.com/%s/default.html?page=", username);
		for (int pageNum = 1; true; pageNum++) {
			String currentPageListUrl = urlPattern + pageNum;
			List<PostMetaInfo> parseResultList = parsePostList(currentPageListUrl);
			if (parseResultList.isEmpty()) {
				break;
			}
			save(parseResultList, savePath);
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				log.info("InterruptedException");
			}
		}
	}

	private static String getSavePathByUserName(String username) {
		return "CnBlog_" + username + "_post_meta_info.data";
	}

	private static void save(List<PostMetaInfo> postMetaInfoList, String savePath) {
		List<String> lineList = postMetaInfoList.stream().map(JSON::toJSONString).collect(toList());
		try {
			FileUtils.writeLines(new File(savePath), "UTF-8", lineList, "\n", true);
		} catch (IOException e) {
			log.info("save list to file={} failed", savePath);
		}
	}

	private static List<PostMetaInfo> parsePostList(String listUrl) {
		String htmlResponse = getHtml(listUrl);
		if (StringUtils.isBlank(htmlResponse)) {
			log.error("url={}, cannot get html content", listUrl);
			return Collections.emptyList();
		}

		Document document = Jsoup.parse(htmlResponse);
		return document.select(".postDesc").stream().map(elt -> {
			PostMetaInfo postMetaInfo = new PostMetaInfo();
			String text = elt.ownText();

			String id = extractByPattern(elt.select(">a").attr("href"), "postid=(\\d+)");
			postMetaInfo.setId(id);

			String title = document.select(String.format("a.postTitle2[href~=/p/%s.html]", postMetaInfo.getId())).text();
			postMetaInfo.setTitle(title);

			Date postTime = extractByPatternAndToDate(text, "posted @ (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})", "yyyy-MM-dd HH:mm");
			postMetaInfo.setPostTime(postTime);

			postMetaInfo.setVisited(extractByPatternAndToInt(text, "阅读\\((\\d+)\\)"));
			postMetaInfo.setVisited(extractByPatternAndToInt(text, "评论\\((\\d+)\\)"));
			return postMetaInfo;
		}).collect(toList());
	}

	private static String extractByPattern(String content, String pattern) {
		Matcher matcher = Pattern.compile(pattern).matcher(content);
		if (matcher.find()) {
			return matcher.group(1);
		}
		return "";
	}

	private static int extractByPatternAndToInt(String content, String extractPattern) {
		String rawString = extractByPattern(content, extractPattern);
		try {
			return Integer.parseInt(rawString);
		} catch (NumberFormatException e) {
			log.info("NumberFormatException, string={}", rawString);
		}
		return 0;
	}

	private static Date extractByPatternAndToDate(String content, String extractPattern, String dateFormatPattern) {
		String rawString = extractByPattern(content, extractPattern);
		try {
			return new SimpleDateFormat(dateFormatPattern).parse(rawString);
		} catch (ParseException e) {
			log.info("SimpleDateFormat parse exception, string={}", rawString);
		}
		return null;
	}

	private static String getHtml(String url) {
		final int DEFAULT_RETRY_TIMES = 10;
		for (int i = 1; i <= DEFAULT_RETRY_TIMES; i++) {
			try {
				return Jsoup.connect(url).execute().body();
			} catch (IOException e) {
				log.info("url={}, retry={}", url, i);
			}
		}
		return "";
	}

	private static void show(final String username) {
		final String savePath = getSavePathByUserName(username);
		try {
			List<String> postMetaInfoList = FileUtils.readLines(new File(savePath), "UTF-8");
			postMetaInfoList.stream().map(postMetaInfo -> JSON.parseObject(postMetaInfo, PostMetaInfo.class).getPostTime().getHours())
					.collect(Collectors.groupingBy(x -> x))
					.forEach((k, v) -> {
						// 柱状图总共使用1000个小条条,根据屏幕大小进行调节选择最舒适的视图
						int length = (int) (v.size() * 1000.0 / postMetaInfoList.size());
						System.out.printf("%2s : %s %d\n", k, StringUtils.repeat("=", length), v.size());
					});
		} catch (IOException e) {
			log.info("read file error, path={}", savePath);
		}
	}

	public static void main(String[] args) {
		final String username = "CC11001100";
		grabMetaInfoByUserName(username);
		show(username);
	}

}

上面的代码做的事情就是爬取某个人的所有博客,并将发布时间以小时为单位做一个group by … count,然后使用横向的柱状图画一个简单的图表,我的图表如下:

时间大部分集中在23:00~02:00之间,从上面的图表可以看出这个家伙很经常熬夜,由此恶毒的猜测他应该需要搞点枸杞泡着喝  :(

.

原文地址:https://www.cnblogs.com/cc11001100/p/9113925.html

时间: 2024-10-11 10:26:17

社工入门之如何分析一个人的作息规律的相关文章

基友分析的社工资料(转)

首先,我不是社工大牛.我只是谈下我个人的观点. 我只提供几个思路给大家,欢迎补充. 在这里我把我们要社工的人叫做A. 第一. 先在网上搜索他的QQ号,一般会得到百度贴吧.百度知道等一系列bbs.其中最有用的就是百度贴吧,里面包含了很多信息,比如学校.班级.年龄.生日.小号等.而这里面,小号是最有价值的.一般人不敢把自己的隐私发到大号上. 实例:有天上网时,朋友发我一张图片,里面是A盗用我的ID在卖刷钻技术.当时也无聊而且我最烦刷东西的.就手贱社下.因为A使用的是我的ID,而且朋友发的图片里有他的

简单的社工QQ密码破解

  今晚上在爷爷家过元宵节,跟群里一块瞎聊.然后A给我发信息说,qq号密码错误登陆不上,也拿不回来了.急需.我心思关系关系这么好就帮帮吧,先问他qq号有没有用过登陆过别的网站注册过账号,这样就会留下qq号码与密码,找数据表下载好了,不过也要搞权限,这个好办.他说没有,qq号都登不上了怎么能注册账号.好吧.然而我也不知道别的方法了,只好生撸了.他又跟我说密码应该是改错了,给我了他认为是正确的密码hsogifei!&*wwvv(因为涉及了个人隐私所以我随便打的).写出来第一是复习一下,第二是收徒弟以

使用ELK搭建社工库

https://mp.weixin.qq.com/s?__biz=MjM5MDkwNjA2Nw==&mid=2650373776&idx=1&sn=e823e0d8d64e6e31d22e89b3d23cb759&scene=1&srcid=0720BzuzPl916oZWVGfiwduR&key=77421cf58af4a65382fb69927245941b4402702be12a0f1de18b1536ac87135d4763eab4e820987f0

【社工】问君乎-隐私留几许?

网络中不要相信任何人,记住跟你聊天的就可能是头猪! 本来这类的文章我是不想弄的,一个是感觉我自己还没到那种程度,一个是怕你们瞎搞,但..你们安全意识也太...在挣扎了下,还是稍微说点,就以我的认知给那些完全没有安全意识的兄弟姐妹们提个醒... (就浅显的讲一下一些基础的社工[社工不是人肉],不要恶意利用) 现在人什么信息比较重要?从个人信息来说,估计也就是姓名,生日,照片,电话号码,身份证,家庭住址,喜欢的人,银行卡密码,QQ等常用的密码,工作地点,学校地址这几个了吧: 很多人不以为然,认为除了

如何防御黑客的社工?

首先,这里基于社会工程学的攻击该怎么理解?这将是一个讨论的前提. ——————————————————————我想利用社工进行的攻击就是基于对人性的分析理解而展开的攻击,而不再是基于对机器对编码的理解而进行的解密.规则突破等. 据我所知,很多很多能提权也就是能黑掉小至个人账户大到企业内网的黑客是不需要就编码进行过多分析的,甚至有些人并不具备编码能力.然而,事实是,他们真的把你黑了,把你眼中高大上的企业黑了. 所以基于社会工程学的攻击到了什么程度?——————————————————————答案是

社工库杂谈

"社工库"这个词很多人并不陌生,而且也有越来越多的新闻开始提及社工库,比如:1. 2016年3月,江苏淮安公安机关网络安全保卫部门成功侦破一起侵犯公民个人信息案,抓获犯罪嫌疑人8名,捣毁国内最大的网络社工库"K8社工库"(www.k8sec.com),查获公民个人信息20亿条.2. 2016年12月,南都记者700元就买到同事行踪,包括乘机.开房.上网吧等11项记录,很多数据源自社工库. 社工库这个产业链一直很火爆,不过国家也在打击,搜索"社工库"

如何抵御社工库类的黑客攻击?在明文密码已泄露的情况下保护自己?

说到社工库,现在很流行,数据也越来越庞大.详细,其威胁程度日愈严重. 其中威胁最高的就属密码库了,也是数量最大,影响范围最广的. 密码库主要来源就不说了,各种拖库-- 其中密码形式主要分这几种: 第一种是未加密的明文密码,威胁程度最高.(不得不说这种储存明文密码的站点有多么的二逼!更可悲的是这种站点有很多!!) 另一种是加密过的密码密文,威胁程度视加密等级而定. 第三种是破译成本很低的密码密文,例如仅一次MD5,等低强度加密算法,威胁程度最高. 其中无法破译的密文,情况还好点,暂时没什么大的影响

誉岚独家社工

姓名:朱胜佳 常用邮箱:[email protected] [email protected] 各大网站账户: 51cto cnzz 用户名:zsjdream      邮箱:[email protected]    密码:1234567 生日:19881115 当前所在地: 陕西 汉中 誉岚独家社工   QQ:2374567593

社工库源码大全(转)

部分源码存在云盘里,请根据下载名对应下载. searchku社工库源码 本程序采用ThinkPHP框架开发.框架在系统层面提供了众多的安全特性,确保你的网站和产品安全无忧.这些特性包括: XSS安全防护表单自动验证强制数据类型转换输入数据过滤表单令牌验证防SQL注入图像上传检测 https://github.com/fengxuangit/searchku ASWQL社工库源码 https://github.com/Mr9esx/ASWQL Sky_Sgk社工库源码 导入sky.sql修改网站用