一个程序员查询妹子考研成绩的故事

来源:互联网 发布:管家婆 远程数据库 编辑:程序博客网 时间:2024/04/29 16:23

需求分析:

        考研成绩查询季节到了,一个程序员(额,为了方便下文就用第一人称吧 U•ェ•*U ,为了在不询问妹子的情况下关心其考研成绩\(^o^)/,想到了用专业技能尝试一下。该学校成绩查询网站需要身份证号和电话号码,验证设计简单,无弹窗和验证码等,为多次自动测试提供了可能。咳咳,我,知道信息:其出生地具体到县市级别,出生年月日,性别 (¬_¬) ,电话号码。 妥了,现在需要找到其身份证号后四位,并在网站循环测试

第一晚(了解身份证数字规律):

        之前就有初步了解到中华人民共和国公民身份证号码编排是有严格规范的,此番下来,我对该规范算是熟记于心了 ( ̄_, ̄ )。 说一下吧,公民身份证号码按照 GB11643—1999《公民身份证号码》国家标准编制,由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码,第18位为校验码。 很明显这个解释是粘贴过来的....,分析一点,前六位行政区代码,知道省市县就能网上很轻易查询到,顺序码:当天生日日期内该行政区出生人数,并且单号序列分给男性,双号序列分给女性(这也分单双号...难怪男同胞们单身多啊,ID CARD 分的是单号好不好!) 最后一位,是由前17位数字通过数学计算得出来的,计算过程:

1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。

当时第一次见到这个过程时才知道以前有周围同学最后一位是x的原因,原来不是因为他们天赋异禀,也不是因为他们是少数名族......

第二天(得到所有身份证号码序列,不多,也就500个.....):

        知道了数字规律,还得把所有数字序列拿到手,本来今天走路上时还在想着用代码实现输出,但又想到Excel神奇大法应该也能实现成的,就选择它。

        前14位固定数字已经得到,如13032119940516(地区和生日均非本人,如有雷同纯属有缘)一个数字占一列输入Excel,复制它500行;14-17位,000,002,004...998,共500个,用Excel自行得出,也需一个数字占一列,本操作细节有疑惑欢迎询问本人;粘贴至刚才500行后面,样式如图:


        后面空出第18列,在第19列mod函数能求出所需余数,如图:



   求最后一位验证码,前面知道该验证码是和第19列的余数有着对应关系,可用Excel中LOOKUP函数匹配求出,LOOKUP函数三个参数理解举例:R1需参考S1得出,参考规则从右边的两行数值得出,S1在V1-AF1中,R1在V2-AF2中,看清下图:



   由此,可将500行的第18列数字全部自动得出,但复制一个18列数字粘贴至文本发现数字没挨在一起,好吧,第20列,用CONCATENATE函数吧1-18列数字连接起来。



   至此,这里面肯定有一个女神妹子的CARD ID! 将500个数字串拷贝至文本中方便之后逐行读取。

第二天晚上(用程序在网站登录测试所有身份证号):

   用的python大法:-),思路自然是逐行读取身份证号输入还有输入固定值的电话号码,错误的话刷新网页再次登录,中间设置延时能够使人观察到页面是否登录成功(此处偶还不会自动判断...),得出代码段一:

# -*- coding: utf-8 -*-import timefrom selenium import webdriverdriver = webdriver.Firefox()driver.maximize_window()for line in open("test.txt"):    time.sleep(1)        driver.get("http://yzb.shisu.edu.cn/2016master/login/login.asp")    driver.find_element_by_xpath("//input[@name='zjhm']").send_keys(line)    #下面一行注释去掉后就运行异常,报错:不能找到passwd元素,但去掉这两行注释并注释上一行,也是能正确运行的.    #最终也没搞明白上一行代码为什么不能和下面两行代码共存.    #driver.find_element_by_name("passwd").send_keys("18862305472")    #driver.find_element_by_name("Submit").click()
        由于代码注释中提到的奇怪异常,我并没有很顺利的实现自动遍历测试登录(ーー゛),后来修改成while循环,出现同样的问题,把读取到的身份证号放入list中,再遍历list中element,出现同样的问题(此处有眼泪。﹏。)...

第三天(破釜沉舟):

   至此,由于技术有限,该小小程序员决定舍弃什么循环!可以把循环内的代码段复制它500遍啊!(忍住不哭...),代码段如下:

# -*- coding: utf-8 -*-import timefrom selenium import webdriverdriver = webdriver.Firefox()driver.maximize_window()driver.get("http://yzb.shisu.edu.cn/2016master/login/login.asp")driver.find_element_by_name("zjhm").send_keys("130321199405160001")driver.find_element_by_name("passwd").send_keys("18862305472")time.sleep(1)driver.find_element_by_name("Submit").click()driver.get("http://yzb.shisu.edu.cn/2016master/login/login.asp")driver.find_element_by_name("zjhm").send_keys("130321199405160025")driver.find_element_by_name("passwd").send_keys("18862305472")time.sleep(1)driver.find_element_by_name("Submit").click()#往下复制上面5行代码几十上百遍吧,其中身份证号需要手工替换,o(╯□╰)o

   当然500遍是极限情况,应该不会那么背吧,我分析了为数不少的现成真实身份证号码,发现15-17位的顺序号既然是当地当天出生人数排列序号,那么它就不会太大,因为毕竟行政单位不大嘛,比如我就是第251号(*^__^*),而我观察的一系列真实号码确实有此现象,所以代码中一次先搞个几十上百个试试嘛,这不,不试不知道,一试喜来到! 在第六十多位也就是三十多次的时候我就观察到网页页面登陆情况不是那个可恶的错误页面!瞬间喜大普奔!!! 知道走程序员道路有这种实惠福利后更加坚定了以后的路线方针了呢!

        整个过程还是走了不少弯路并查询不少资料的,两三天解决这个问题效率着实不算高,最后,for循环中那个纠结的问题还请江湖高手指教一下,毕竟最后还是用了很多手工劳动的,这严重不符合猿类的逼格啊 :-P,还有整个操作流程有更好操作方法的话欢迎留言,有相似需求的也欢迎相互交流。

2 0
原创粉丝点击