自动化WHV申请工具

100
TaoAlpha
2015-05-202937 words9 minutes to read

大体思路

对于WHV新西兰的申请官网而言, 想要试图利用程序来实现自动申请的话, 主要需要攻克几个问题, 分步如下:

登录

我曾经试过很多种登录方式来试图登录whv的申请官网, 比如用常规的post请求, 以及后来使用mechanize, 甚至尝试过selenium+chrome的组合. 但最终都因为各种原因或失败或放弃了…

  • 常规的post解包分析法:

    这个的主要难点在于登录. 因为不知道是不是因为asp的原因, 每次通过模拟post获取的cookie都是无效的… 无法用于登录;

  • mechanize:

    mechanize是个很不错的python module, 对于常规的网站而言绝对足够, 其对表格提交的天然支持更是很多人脚本登录的最佳选择之一. 可惜此次依然不试用… 因为官网的form提交会经过一个js的函数验证, 而mechanize最悲剧的一点就是不支持js…ಥ_ಥ

  • selenium + chrome:

    可行. 但是非常慢! 不得不说, selenium和chrome的组合不愧是网页产品的自动化脚本测试神器啊. 写好运行然后就可以端碗饭在电脑前面坐等了哈哈

  • selenium + phantomjs:

    考虑到chrome在天朝的情况, 以及速度本身的恶心.. 我在了解selenium的时候发现了phantomjs, 这个没有界面的浏览器后台模拟器. 而selenium和phantomjs的合并就让我看到了突破登录的希望.

取cookie

如上所说, 我通过selenium和phantomjs的结合, 利用其自带的webdriver的get_cookies()函数成功的将登录后的cookie提取出来保存到了文件之中. 而通过这样”真实”的访问获取到的cookie也如愿以偿的让我成功实现了后来的环节.

这里的大体思路很简单, 就是通过phantomjs来模拟浏览器行为, 修改其自带的headers为chrome的标准headers来增加混淆程度. 因为selenium和phantomjs的易上手性, 基本这里也就5行代码搞定的节奏…

带cookie填表发post

获取到cookie后, 为了节省时间, 我并没有继续选用selenium和phantomjs的组合来填表. 毕竟他们真的太慢了… 而是换用了带cookie直接post的方式. 主要思路和步骤如下:

  • 利用urllib2,cookielib来制作opener并装上cookie;
  • 首先进行一次试探性访问, 获取到页面状态值:viewstate,viewstategenerator,eventvalidation; 有些页面存在只有两个或者更多个的情况, 可以根据页面进行修正;
  • 组合页面状态参数以及需要post的信息数据, 进行post;

基本来说, 只要确保post的时候key-value对好,那么, 在cookie有效期内是不会有啥问题的. 而想要做的更好更流畅, 在面对各种错误的情况下更抗压, 就得看容错这一步的做法了.

容错

一旦实现了cookie的获取和post, 那么想让工具正式能够使用就基本靠细心的容错了. 毕竟无论是页面超时, post失败, 是否已经有表格, 表格完整性验证等等, 都需要根据具体情况逐步完善, 下面也主要介绍下我的思路.

  • cookie有无以及是否失效问题;
  • 登录失败重试问题;
  • 流畅填表和中断单表填写(区分了正常情况下一张张表填和单独填某张表的情况, whv一共6个信息表要填写的);
  • 有无表格(无表格创建表格, 有表格获取表格id);
  • 表格完整性检验;
  • 表格所处状态检验(提交以及付款状态);
  • 表格post失败重试问题;
  • 超时问题;

基本以上就构成了一个基本完整, 有着自动重试功能的自动化whv脚本了.

测试情况

在名额开放前使用ireland名额测试情况如下:

  • 无cookie文件:

    登录获取cookie耗时: normal: 20s, min:13s, max: time-out;
    填表时间: normal: 5s-10s/表, min: 5s/表, max: time-out;
    全程时间: normal: 100s, min: 90s, max: time-out;

  • 有cookie文件:

    登录获取cookie耗时: normal: 0.000003s;
    填表时间: normal: 5s-10s/表, min: 5s/表, max: time-out;
    全程时间: normal: 80, min: 60s, max: time-out;

细节补充

看起来还是很简单的, 不过真的写起来挺恶心的… 尤其是你在测试中会遇到各种奇葩问题…

因为本文本来是10号写的, 但是后来一直拖到了20号才写完.. 昨天用脚本实况演练了下.. 发现真正开放名额这一天, 还是太恐怖… 登录都无法登录不上去… 一直处于不断重试的过程中… 居然还没我浏览器手动来的快… 最后把浏览器登录后的cookie放进去试了下,
因为本文本来是10号写的, 但是后来一直拖到了20号才写完.. 昨天用脚本实况演练了下.. 发现真正开放名额这一天, 还是太恐怖… 登录都无法登录不上去… 一直处于不断重试的过程中… 居然还没我浏览器手动来的快… 最后把浏览器登录后的cookie放进去试了下, 发现后面,
因为本文本来是10号写的, 但是后来一直拖到了20号才写完.. 昨天用脚本实况演练了下.. 发现真正开放名额这一天, 还是太恐怖… 登录都无法登录不上去… 一直处于不断重试的过程中… 居然还没我浏览器手动来的快… 最后把浏览器登录后的cookie放进去试了下
看起来还是很简单的, 不过真的写起来挺恶心的… 尤其是你在测试中会遇到各种奇葩问题…

看起来还是很简单的, 不过真的写起来挺恶心的… 尤其是你在测试中会遇到各种奇葩问题…
,
因为本文本来是10号写的, 但是后来一直拖到了20号才写完.. 昨天用脚本实况演练了下.. 发现真正开放名额这一天, 还是太恐怖… 登录都无法登录不上去… 一直处于不断重试的过程中… 居然还没我浏览器手动来的快… 最后把浏览器登录后的cookie放进去试了下, 发现后面的容错做的还算可以, 基本能保证程序不会意外退出… 不过因为体检的原因, 我也没等到程序跑完就走了…

和朋友讨论说到似乎cookie是可以计算出来的, 而计算方法在页面的js里面可以看到, 以后有时间可以去看看.

Module列表

1
2
3
4
5
6
7
from selenium import webdriver
import json
import re
import time
import urllib2
import urllib
import cookielib

以及需要把phantomjs的二进制文件放入到合适的路径中去, 为了便于移植, 我是放到了当前路径下…

结语

如上, 基本就能实现一个较为完整的自动脚本了~ 不过不解决cookie问题的话, 实际使用不会有多大帮助的… 毕竟那一天的网络太可怕…