精华内容
下载资源
问答
  • 使用C#登录带验证码的网站使用C#登录带验证码的网站使用C#登录带验证码的网站使用C#登录带验证码的网站使用C#登录带验证码的网站使用C#登录带验证码的网站使用C#登录带验证码的网站
  • 最近接了个项目,其中有需求是要登录带验证码的网站,获取数据,但是我们不可能人为的一直去记录数据,想通过自动采集的方式进行,下面小编给大家带来的相关代码,对php curl 模拟登录带验证码的网站感兴趣的朋友...
  • 使用程序模拟登录一个带验证码的网站,我先获取验证码图片的路径, 然后把验证码图片保存到本地,手动识别后,将验证码和用户名和密码一起 post提交模拟登录,我怀疑是获取的验证码和提交的验证码不一致的导致的, ...
  • python使用requests模拟登录带验证码的专利网站demo
  • 大家可能都遇到过网站带验证码的,用httpclient去获取会给我们造成许多困扰和麻烦,网站的写法多变,有直接赋值的、有用ajax赋值的各种各样,下面就为大家解释一下怎么获取带验证码的网站。 首先、你要知道他的...

    大家可能都遇到过网站带验证码的,用httpclient去获取会给我们造成许多困扰和麻烦,网站的写法多变,有直接赋值的、有用ajax赋值的各种各样,下面就为大家解释一下怎么获取带验证码的网站。

    首先、你要知道他的验证码是怎么生成的,用工具火狐浏览器,或者Http Analyzer 直接抓取他获取验证码的连接。

    然后写一个方法,读取他的验证码流吐到你的页面上。

    其次、你要保证你i获取验证码和提交时一个请求。

    那么怎么才能保证验证码和你的提交请求时一个请求呢,有俩种方法。

    一、如果你的服务器不是分布式的,直接上来就new 一个HttpClient 放到session中。然后获取验证码和提交求情都从sesssion中获取httpclient。

    二、如果你的服务器是分布式的,那么直接从cookie入手,由于大多服务器都是分布式的,这里只对分布式进行讲解。

    首先获取cookie。

    /**
         * Description:获得cookie值
         * Date:Dec 10, 2013
         * @author Christopher
         * @return 
         * @return String
         */
        private String getCookie(){
            HttpClient httpClient = new HttpClient();
            httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);//让HttpClient使用浏览器的策略
            GetMethod getMethod = new GetMethod("http://www.mdjzfgjj.cn/mdjweb/website/trans/ValidateImg");
            String tmpCookies= "";
            try {
                int status = httpClient.executeMethod(getMethod);
                if (status == HttpStatus.SC_OK) {
                    
                    Cookie[] cookies=httpClient.getState().getCookies();//获取cookie
                    for(Cookie cookie:cookies){
                        tmpCookies += cookie.toString()+";";
                    }
                }
            } catch (HttpException e) {
                log.error(" 执行 HTTP GET 请求时,发生异常!", e);
                e.printStackTrace(System.err);
            } catch (IOException e) {
                log.error("返回的HTTP响应信息流转换发生问题", e);
            } finally {
                getMethod.releaseConnection();
            }
            return tmpCookies;
        }

     

     获得cookie以后,你可以放到session中,或者放到request里面带到页面,在带回来。

    其次就是获得cookie了,本代码是放到session中的。

    下面是获取验证码:

    /**
         * 读取验证码图片
         */
        public  String ImageGet(){
            Long time=new Date().getTime();
            String passTime=time.toString();
            InputStream sos=null;
            HttpClient httpClient = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true));
            GetMethod getMethod = new GetMethod("http://www.mdjzfgjj.cn/mdjweb/website/trans/ValidateImg?d="+passTime);
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                    new DefaultHttpMethodRetryHandler());
            String cookie=session.get("cookie");
            if(! "".equals(cookie)){
                getMethod.setRequestHeader("cookie",cookie);
            }else{
                System.out.println("cookie  is   not  found!!!!");
            }
            try {
                int statusCode = httpClient.executeMethod(getMethod);
                System.out.println("statusCode = "+statusCode);
                if (statusCode == HttpStatus.SC_OK) {
                    response.setContentType("multipart/form-data");
                    sos = getMethod.getResponseBodyAsStream();
                    byte[] imageByteArray = IOUtil.getByteArray(sos);    //转换完byteArray以后直接关闭了sos
                    ServletOutputStream servletOutputStream = null;
                    response.setContentType("multipart/form-data");
                    try {
                        servletOutputStream = response.getOutputStream();
                        servletOutputStream.write(imageByteArray);
                    } catch (Exception e) {
                        log.error("AccumulationFundSearch_MDJ:ImageGet",e);
                        e.printStackTrace();
                    }finally{
                        servletOutputStream.flush();
                        servletOutputStream.close();
                    }
                }
            } catch (Exception e) {
                if(!"Software caused connection abort: socket write error".equals(e.getCause().getMessage())&&!"Connection reset by peer: socket write error".equals(e.getCause().getMessage())){
                    log.error("AccumulationFundSearch_MDJ:ImageGet",e);
                    e.printStackTrace();
                }
            }finally{
                getMethod.releaseConnection();
            }
            return null;
        }

    页面直接调用。为了方便给大家上jsp代码。

    <tr>
                      <td  align="right">验证码:</td>
                      <td>
                      <input type="text" name="verify" id="verify" style="height:22px;width:80px" class="apps_w140 apps_hdlt" maxlength="4"/>
                      <a href="#" onclick="imageChange('1')">
                      <img src="AccumulationFundSearch_MDJ!ImageGet.action" id="image" name="image" onclick="imageChange('1');"/>
                      </a>
                      </td>
                  </tr>

    js方法如下:

    function imageChange(flag){
        var timenow = new Date().getTime();
        document.getElementById("image").src="AccumulationFundSearch_MDJ!ImageGet.action?d="+timenow;
    }

    然后就是提交请求了,请求方法如下:

    private Map<String, String>  getSetCookie(String time,String accnum,String certinum,String password,String mark,String verify,String cookie){
            Map<String, String> map=new HashMap<String, String>();
            HttpClient httpClient = new HttpClient();
            httpClient.getHostConfiguration().getParams().setParameter("http.default-headers",setHeader(cookie));
            PostMethod method = new PostMethod("http://www.mdjzfgjj.cn/mdjweb/website/trans/gjjquery.do?className=TRC310504");
            method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            method.setParameter("time", time);
            method.setParameter("accnum", accnum);
            method.setParameter("certinum", certinum);
            method.setParameter("password", password);
            method.setParameter("mark", mark);
            method.setParameter("txt", "1");
            method.setParameter("verify", verify);
            try{
                int state=httpClient.executeMethod(method);                        //网页返回状态
                if(state==HttpStatus.SC_OK){
                    Cookie[] cookies=httpClient.getState().getCookies();
                    if(cookies.length>0){
                        for(int i=0;i<cookies.length;i++){
                            if(cookies[i].toString().contains("gjjaccnum")){
                                map.put("gjjaccnum", cookies[i].toString());
                            }
                            if(cookies[i].toString().contains("gjjaccname")){
                                map.put("gjjaccname", cookies[i].toString());
                            }
                        }
                    }
                }
            }catch(Exception e){
                log.error("AccumulationFundSearch_MDJ:getSetCookie",e);
                e.printStackTrace();
            }finally{
                method.releaseConnection();
            }
            return map;
        }

    这样我就获得了我需要查询的数据。。如果大家没有看明白的话,求留言,如看到留言会为你一一解答,谢谢观看!

    转载于:https://www.cnblogs.com/xiehaoyu/p/3467584.html

    展开全文
  • 我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法。验证码的由来几年前,大部分网站、论坛之类的是没有验证码的...

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法。
    验证码的由来
    几年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据。为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码!
    验证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操作。这样各种机器人程序就被拒之门外了!
    但是随着计算机科学的发展,模式识别等技术越来越成熟,于是编写机器人程序的家伙可以通过程序将直接写在图片中的内容识别出来,然后提交到服务器,这样验证码将形同虚设。为了防止机器人程序的识别,验证码的图片生成也不断在发展,加入干扰点、干扰线,文字变形、变换角度位置,颜色不同……各种防止计算机识别的技术也应用到验证码中。就在这两种技术的竞争中,于是便形成了我们现在看到的验证码,已经有很多人在抱怨“这是什么验证码哦,人眼都分辨不清楚是什么”,一切也是无奈。
    验证码的使用
    验证码是针对各种机器人程序的,所以验证码图片中的内容是不能存放在Cookie、HTML和URL中的,如果看到一个验证码图片的URL是http://xxxxxx.com/Expwd.aspx?code=1af8 而验证码图片中的内容就是1af8那将是十分可笑的事情。同时,如果通过抓包发现了Cookie中保存了验证码的值或者查看HTML时看到了形如:<input type="hidden" id="exPwd" name="exPwd" value="1af8"/>这样将验证码的内容放在隐藏元素中也是不可思议的。对于这些行为,显然是这个程序员不知道验证码是拿来干什么的,只是别人的网站上有验证码,与自己的网站也弄一个来赶时髦。另外还有一种好笑的是验证码看上去像是验证码,结果看HTML代码居然不是一个图片,而是一个<span>1</span><span>a</span><span>f</span><span>8</span>。大家不要不以为然,以上这几种情况还真是我现实生活中遇到过的,当年写投票机器人的时候遇到这种情况我最高兴了!!!
    验证码的内容必须保存在服务器端,一般我们可以将随机生成的验证码的内容放入Session中,用户提交的时候将提交的内容与Session中的验证码进行比较判断。在生成验证码的页面后台代码可以写为:

    protected void Page_Load(object sender, EventArgs e)
    {
    string checkCode = CreateCode(4);
    Session["CheckCode"] = checkCode;
    CreateImage(checkCode);
    }
    View Code

    比如在登录进行验证的时候可以写为:

    protected void btnLogin_Click(object sender, ImageClickEventArgs e)
    {
    if (Session["CheckCode"] == null)
    {
    UIHelper.Alert(Page, "验证码已过期,请重新输入");
    return;
    }
    if (Session["CheckCode"].ToString().ToLower() != txbCode.Text.ToLower())//验证码忽略大小写
    {
    UIHelper.Alert(Page, "验证码错误");
    return;
    }
    //数据库验证……
    }
    View Code

    使用C#登录带验证码的网站
    前面我们已经对整个验证码的原理和使用有了基本的了解,现在言归正传,讲讲如何登录带验证码的网站。这里我们以CSDN的登录为例。

    1.在IE中正常登录一次并把登录时候的数据包抓下来。
    2.分析其中的登录原理如下:
    1)请求http://passport.csdn.net/UserLogin.aspx页面,与服务器建立会话,服务器返回一个SessionID在HTTP的Header中,如下,其他内容我们可以忽略。
    ASP.NET_SessionId=ydebagnqgiiixi2dvihfw355; path=/; HttpOnly,ABCDEF=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,QWERTOP=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,activeUserName=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,UserName=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,PName=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,ClientKey=; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,userid=0; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,ClientKey=933ffb09-5096-4fbb-b90f-5f0bff335b41; path=/
    2)该页面返回的HTML中有一个<input type="hidden" name="ClientKey" value="a50b14fa-2a75-4364-bbeb-3b498b72aa46" />这个值在登录提交时也需要,所以需要从HTML代码中分离出来。
    3)将该SessionID作为Cookie的内容发送到验证码生成的页面http://passport.csdn.net/ShowExPwd.aspx 该页面将返回一个图片的二进制流。
    4)将返回的二进制流转换为图片并呈现给用户。
    Image img = new Bitmap(
    Http.GetStreamByBytes("http://passport.csdn.net" , "http://passport.csdn.net/ShowExPwd.aspx", b,
    aspcookie, out header));//获得验证码图片
    this.pictureBox1.Image = img;

    5)用户输入用户名、密码和验证码,然后和同前面分离出的ClientKey按如下的格式POST到http://passport.csdn.net/UserLogin.aspx进行验证。
    __EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE4NDgzMDI2NjcPFgIeCkZpbmlzaFN0YXloFgJmD2QWBAIBDxYCHgRUZXh0BQznlKjmiLfnmbvlvZVkAgIPZBYCAgMPZBYCAgEPFgIeB1Zpc2libGVoZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUeY3RsMDAkQ1BIX0NvbnRlbnQkY2JfU2F2ZVN0YXRlBR1jdGwwMCRDUEhfQ29udGVudCRJbWFnZV9Mb2dpbr5SL%2FGtMqVCJ%2FCh4jH%2FXp4DhlVU&ctl00%24CPH_Content%24tb_LoginNameOrLoginEmail=studyzy&ctl00%24CPH_Content%24tb_Password=123&ctl00%24CPH_Content%24tb_ExPwd=wgssj&ClientKey=a50b14fa-2a75-4364-bbeb-3b498b72aa46&ctl00%24CPH_Content%24cb_SaveState=on&from=http%3A%2F%2Fhi.csdn.net%2Fmy.html&MailParameters=&MailParameters=&ctl00%24CPH_Content%24Image_Login.x=26&ctl00%24CPH_Content%24Image_Login.y=11
    6)验证成功的话将返回包含用户信息(发帖数、积分、博客排名等等)的HTML,验证失败将返回具体的错误信息。
    3.以上将CSDN的登录原理分析清楚了,那么接下来就是代码实现了,代码实现比较简单,我直接在上篇文章所使用的Demo代码上修改的,所以写的不是很漂亮,大家若有兴趣可以看看。/Files/studyzy/LoginCSDNDemo.rar
    成功登录后如图:

    现在当前用户已经成功登录了,那么接下来是要在CSDN上发表博客、论坛发帖只需要将当前的SessionID放入Cookie中,在提交时使用该Cookie即可。

    转载于:https://www.cnblogs.com/blogpro/p/11340737.html

    展开全文
  • 登陆带验证码的网站

    2019-09-15 19:08:38
    String valicodeStr = JOptionPane.showInputDialog("请输入验证码:"); f2.setVisible(false); HtmlElement submit = page.getElementById("Submit"); HtmlSubmitInput submit2 = (HtmlSubmitInput) submit; ...
    WebClient client = new WebClient(BrowserVersion.INTERNET_EXPLORER_7);
    	client.setJavaScriptEnabled(false);
    	HttpWebConnection httpwebconnection = new HttpWebConnection(client);
    	httpwebconnection.setUseInsecureSSL(true);
    	client.setWebConnection(httpwebconnection);
    	HtmlPage page = client.getPage("http://tongji.baidu.com");
    	HtmlElement username = page.getElementById("UserName");
    	HtmlElement password = page.getElementById("Password");
    	HtmlElement valiCode = page.getElementById("Valicode");
    	HtmlImage valiCodeImg = (HtmlImage) page.getElementById("cas_code");
    	ImageReader imageReader = valiCodeImg.getImageReader();
    	BufferedImage bufferedImage = imageReader.read(0);
    
    	JFrame f2 = new JFrame();
    	JLabel l = new JLabel();
    	l.setIcon(new ImageIcon(bufferedImage));
    	f2.getContentPane().add(l);
    	f2.setSize(100, 100);
    	f2.setTitle("验证码");
    	f2.setVisible(true);
    	
    	String valicodeStr = JOptionPane.showInputDialog("请输入验证码:");
    	f2.setVisible(false);
    	HtmlElement submit = page.getElementById("Submit");
    	HtmlSubmitInput submit2 = (HtmlSubmitInput) submit;
    	username.click();
    	username.type("gabazi");
    	password.click();
    	password.type("******");
    	valiCode.click();
    	valiCode.type(valicodeStr);
    
    	HtmlPage resultPage = submit2.click();
    	System.out.println(resultPage.asText());
    	System.exit(0);
    }
    catch(Exception e)
    {
    	e.printStackTrace();
    }

    转载于:https://my.oschina.net/u/2322791/blog/382922

    展开全文
  • vb.net如何使用HttpWebRequest模拟登陆带验证码的网站 2014-06-23 21:54 玛瑙与翡翠 | 分类:C#/.NET | 浏览99次 Public Function 发送信息(strUrl As String, strPostData As String, Optional ByVal 发送...
    vb.net如何使用HttpWebRequest模拟登陆带验证码的网站
    
    2014-06-23 21:54 玛瑙与翡翠 | 分类:C#/.NET | 浏览99次
    Public Function 发送信息(strUrl As String, strPostData As String, Optional ByVal 发送方式 As Boolean = True) As HttpWebResponse
            Dim myHttpWebRequest As HttpWebRequest = WebRequest.Create(strUrl)
            If 发送方式 Then
                myHttpWebRequest.Method = "POST"         
            Else
                myHttpWebRequest.Method = "GET"
            End If
            '填充基本信息
            myHttpWebRequest.Accept = "text/html, application/xhtml+xml, */*"        
            myHttpWebRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MALCJS)"
            myHttpWebRequest.Headers.Add("Accept-Language", "zh-CN")
            myHttpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate")
            myHttpWebRequest.Headers.Add("DNT", "1")
            myHttpWebRequest.KeepAlive = True     
            myHttpWebRequest.Timeout = 8000         
            myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials   
            myHttpWebRequest.AllowAutoRedirect = True                     
            myHttpWebRequest.MaximumAutomaticRedirections = 4
    
            myHttpWebRequest.CookieContainer = New CookieContainer()        
            myHttpWebRequest.CookieContainer = myCookie
      
            Dim postData As String = strPostData '+ ChrW(61)
            Dim encoding As New ASCIIEncoding()
            Dim postByte As Byte() = encoding.GetBytes(postData)
            If Not postByte Is Nothing Then
                If postByte.Length > 0 Then
                    myHttpWebRequest.ContentLength = postByte.Length
                    Dim newStream As Stream = myHttpWebRequest.GetRequestStream()
                    newStream.Write(postByte, 0, postByte.Length)
                    newStream.Flush()
                    newStream.Close()
                End If
            End If
    
            Dim myHttpWebResponse As HttpWebResponse
            Try
                myHttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
            Catch ex As Exception
            End Try
            If Not myHttpWebResponse Is Nothing Then
                Return myHttpWebResponse
            Else
                Return Nothing
            End If
            myHttpWebResponse.Close()
        End Function
    展开全文
  • 需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\Controller; use ...
  • C#远程登陆带验证码的网站

    千次阅读 2008-04-24 12:56:00
    C#远程登陆带验证码的网站第一步:添加空间引用using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Net;using ...
  • python requests模拟登陆带验证码的网站

    万次阅读 多人点赞 2017-08-12 17:41:27
    作为之前专利爬虫续篇,本篇准备描述如何通过pythonrequests模块登录专利查询网站。环境准备 python 3.6 requests chrome尝试首先,我们使用chrome尝试登录专利网站,并通过network分析各个请求相关信息。 ...
  • 该系统需要用户名,密码,验证码 (验证码为正楷数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过http登陆页面获取相关CookieCollection 例如登陆页面为 http://www.某域名....
  • // 验证码的相对路径,从源代码看出来就行了 client.executeMethod(post); InputStream is = post.getResponseBodyAsStream(); BufferedImage image = ImageIO.read(is); File file = new File("D...
  • 首先获取验证码并保存...要实现模拟登陆,首先需要了解登陆网站时请求中都包含什么信息,需要用到工具是[url=]HttpWatch[/url],这是抓包需要工具,然后还有一个jar包,叫[url=]Jsoup[/url],这是用来解析网页H

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 543
精华内容 217
关键字:

带验证码的网站