关于验证码登录

在爬取某些网站,有些需要登录才能获取访问权限。如果仅仅只是需要登录,这里可以推荐大家一个工具,很好用的

在火狐浏览其中有个插件firebug(需要安装),通过这个插件可以详细的查看网站的访问过程(链接的跳转和访问先后顺序),以及每次链接的请求头信息、响应头信息,同时也可以查看post提交的数据。当然在IE和谷歌浏览器中也有些开发工具,F12直接唤出,但是个人感觉火狐的firebug比较好用,IE的和谷歌的,我也偶尔使用。

通过上面介绍的工具可以获取模拟的详细过程,然后模拟登录,都是很容易的事。

这里我是介绍的是登录如果需要验证码,就有些麻烦了,我这里想到一种解决办法,比较常用,就是弹出验证码

实现如下,模拟登录

public class LoginByCode {

	public static void main(String[] args) {
		CloseableHttpClient httpClient = HttpClientBuilder.create().build();
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
		String path = "d:/img/tmp/" + format.format(new Date()) + ".jpg";
		try {
			String imgurl = "http://www.shanghaiip.cn/wasWeb/login/Random.jsp";
			HttpUriRequest get = new HttpGet(imgurl);
			HttpResponse res = httpClient.execute(get);
			res.setHeader("Content-Type", "image/gif");
			byte[] img = EntityUtils.toByteArray(res.getEntity());//下载验证码图片
			saveFile(path, img);
			String code = new ImgDialog().showDialog(null, path);//弹出验证码,获取填写验证码
			String login = "http://www.shanghaiip.cn/wasWeb/login/loginServer.jsp";
			HttpPost post = new HttpPost(login);
			List<NameValuePair> data = new ArrayList<NameValuePair>();
			data.add(new BasicNameValuePair("username", "zhpatent"));
			data.add(new BasicNameValuePair("password", "5ca072839350b0733a2a456cc4004371"));//火狐里面用firebug可以查看密码是加密后的
			data.add(new BasicNameValuePair("newrandom", code));
			post.setEntity(new UrlEncodedFormEntity(data));
			res = httpClient.execute(post);
			Header[] headers = res.getHeaders("Location");//获取跳转链接
			get = new HttpGet(headers[0].getValue());
			res = httpClient.execute(get);
			String body = EntityUtils.toString(res.getEntity());
			if (body.contains("zhpatent")) {
				System.out.println("模拟登录成功:" + body.substring(body.indexOf("zhpatent") - 40, body.indexOf("zhpatent") + 40));
			}
		} catch (Exception e) {
			System.out.println("异常:" + e.getMessage());
		} finally {
			File file = new File(path);
			if (file.exists()) {
				file.delete();
			}
			try {
				httpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static void saveFile(String path, byte[] data) {
		int size = 0;
		byte[] buffer = new byte[10240];
		try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
			ByteArrayInputStream is = new ByteArrayInputStream(data)) {
			while ((size = is.read(buffer)) != -1) {
				bos.write(buffer, 0, size);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

验证码工具类

public class ImgDialog {

	public String message = null;
	private JButton confirm;
	private JDialog dialog = null;
	private TextField field;
	String result = "";

	public String showDialog(JFrame father, String path) {
		JLabel label = new JLabel();
		label.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		label.setBounds(10, 10, 125, 51);
		label.setIcon(new ImageIcon(path));

		field = new TextField();
		field.setBounds(145, 10, 65, 20);

		confirm = new JButton("确定");
		confirm.setBounds(145, 40, 65, 20);
		confirm.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				result = field.getText();
				ImgDialog.this.dialog.dispose();
			}
		});

		dialog = new JDialog(father, true);
		dialog.setTitle("请输入图片中的验证码");
		Container pane = dialog.getContentPane();
		pane.setLayout(null);
		pane.add(label);
		pane.add(field);
		pane.add(confirm);
		dialog.pack();
		dialog.setSize(new Dimension(235, 110));
		dialog.setLocation(750, 430);
//		dialog.setLocationRelativeTo(father);
		dialog.setVisible(true);
		return result;
	}
}

实验效果如下

运行会下载验证码并弹出

输入验证码,在登录后跳转的页面中获取到我的用户信息。

我这里是使用的httpclient模拟登录的,httpclient不用管理cookies,所以用起来方便,不会出现验证码对不上号的问题。

如果是使用Jsoup模拟登录就稍微麻烦点,得自己管理cookies,在访问验证码页面的时候同时得下载验证码和拿到cookies,然后在模拟登录的时候需要带上cookies

时间: 2024-10-07 08:29:48

关于验证码登录的相关文章

Linux使用ssh动态验证码登录机器

ssh动态验证码登录机器 Google Authenticator是一个动态验证码程序,兼容各种智能手机平板设备,可以用来做各种帐号的二次验证,增加帐号的安全性.SSH是Linux系统的最重要防线之一,为了防止密码泄露或者被爆破,可以使用Google Authenticator来做二次验证,使用方法也很简单 谷歌身份验证器生成的是动态验证码,默认30秒更新.修改配置,SSH登录必须在输入密码之前输入动态验证码.即使账号和密码泄露,验证码输入错误,仍然无法登录.苹果或者安卓手机端可以安装身份验证器

Membership添加验证码登录

1.在公共类ImageHelper中编写公共方法,产生随机验证码 /// <summary> /// 产生随机验证码 /// </summary> /// <returns></returns> public string GetString() { string randString = ""; Random random = new Random(); do { //使用DateTime.Now.Millisecond作为生成随机数的

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

Spring Security 实现手机验证码登录

思路:参考用户名密码登录过滤器链,重写认证和授权 示例如下(该篇示例以精简为主,演示主要实现功能,全面完整版会在以后的博文中发出): 由于涉及内容较多,建议先复制到本地工程中,然后在细细研究. 1.   新建Maven项目  sms-code-validate 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem

Selenium—通过cookies跳过验证码登录

通过cookies跳过验证码登录 现在很多的登录都需要验证,而验证相对复杂,需要花费大量的时间,那么我们就可以通过cookie,来跳过登录 cookie怎么获取 我们可以通过手动登录,来获取登录时的cookie值 通过Fiddler抓包获取cookie值 通过开发者工具--Network 中获取cookie值 以 https://www.gglott.com.cn/WXDefault.aspx?home=1 登录为例 添加cookie driver.add_cookie() 思路: 手动登录获取

vue实现短信验证码登录

无论是移动端还是pc端登录或者注册界面都会见到手机验证码登录这个功能,输入手机号,得到验证码,最后先服务器发送请求,保存登录的信息,一个必不可少的功能 思路 1,先判断手机号和验证是否为空, 2,点击发送验证码,得到验证码 3,输入的验证码是否为空和是否正确, 4,最后向服务发送请求 界面展示 1.准备工作 这个会对input进行封装处理 <template> <div class="text_group"> <div class="input_

短信验证码登录思路

短信验证码登录 public class ValidateCode { private String code; //有效期 private LocalDateTime expireTime; public ValidateCode(String code, int expireTime) { this.code = code; this.expireTime = LocalDateTime.now().plusSeconds(expireTime); } public String getCo

python验证码登录

如何跳过验证码去登录系统: 1.最简便的方法就是让开发提供你一个万能验证码,这样就可以直接使用万能验证码登录 2.添加cookie登录信息,绕过验证码登录 Driver.add_cookie()      add_cookie()括号里的参数一定要有name,value的参数,例: driver.add_cookie({'name':'loginType','value':'1'}) 添加的cookie参数是 'loginType':’1’ 3.如果登录信息存放在loacalstorage中的话

Python Scrapy 验证码登录处理

一.Form表单分析 以豆瓣登录页面为例分析,豆瓣登录页是:https://accounts.douban.com/login,浏览器打开之后查看源码,查找登录的form表单HTML结构.如下: 包括了form_email.form_password.captcha-solution四个表单参数,需要注意之处是name,而不是id. 二.验证码图片处理 1.分析验证码参数图片的构建如下图,获取id为captcha_image的src图片即可.可以采用人工输入,或第三方图片验证码识别API获得.

项目总结手机号+短信验证码登录

首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取手机验证码. 其次,你需要后台给你手机短信的验证接口,各个公司用的不一样,这个身为前端,不需要你来考虑,你只要让你后台给你写好接口,你直接调用就好了. activity_login.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr