最近新部署了一个信息系统,厂家居然没有升级方案,所有数据都要重新输入,包括用户、角色等都要重新配置,真是操蛋。要是一个个录入简直是日狗了,这些用户在其他信息系统早已存在,但是每个都复制粘贴提交一遍也不是办法,于是就想用程序自动完成这些操作。步骤如下:
1、从其他信息系统的数据库导出用户信息,也可以直接从其他信息系统的界面把所有用户信息复制下来放在一个文本文件里,反正就是准备好数据源;
2、在需要录入用户信息的系统中,用人工操作的方式登录系统,并录入一个用户,同时用Wireshark抓包,查看整个过程要提交一些什么样的表单数据;
3、在程序中用httpclient提交同样的数据,完成登录,并从第1步的数据源中读取用户信息,然后循环提交录入用户所需的数据,完成用户的录入;
4、新系统没有默认的用户角色,是需要一个个修改的,是根据用户的ID来确定当前修改的用户,并且提交一个角色ID来进行设定,因此需要首先获取用户的ID,然后根据该ID来提交角色ID,而用户ID是通过用户列表页面获取到的,因此还需要通过正则表达式来获取所有用户的ID,然后循环提交角色ID,完成角色设定。
花了不少时间才搞定,有几个地方需要注意:
1、如果表单数据不包含中文,直接把表单的Name和Value加在HttpPost的URL的?后面即可,不需要专门建立NameValuePair,如下所示:
HttpPost httppost = new HttpPost("http://1.1.1.1/test/adduser?userid=abc&username=efg");
httpclient.execute(httppost);
但是,如果表单数据包含中文,例如姓名,用这种方式提交的表单数据会出现乱码,即使通过URLEncoder进行编码后再发也不行,必须建立NameValuePair,再加到HttpPost的Entity里面,如下所示:
HttpPost httppost = new HttpPost("http://1.1.1.1/test/adduser?userid=abc");
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username","张三"));
httppost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
httpclient.execute(httppost);
2、用于网页内容查找的正则表达式的使用方式一般为:
Pattern p = Pattern.compile(".*?abc(whattoget)123.*?");
Matcher m = p.matcher(line);
if(m.matches()){
String whattoget = m.group(1);
}
".*?abc(whattoget)123.*?"就是一个正则表达式,如果用于匹配一行的时候,由于要查找的内容是在行中间,所以前后需要加上.*?,表示前后可以是任意字符,也可以什么都没有,而表达式中间的(whattoget)就表示一个group,编号为1,编号为0的group是整个匹配的字符串,找到之后提取group(1)即可得到想要的内容。
测试正则表达式是一项很麻烦的工作,不过有个很好的软件可以完成此工作:RegexBuddy,支持各种语言的正则表达式的调试。
学习正则表达式的宝典是《Mastering Regular Expression》。