免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10865 | 回复: 20

perl小程序--登录含验证码的站点 [复制链接]

论坛徽章:
0
发表于 2013-01-25 02:10 |显示全部楼层
本帖最后由 ykredrum 于 2013-01-25 02:10 编辑

很久没有发过贴了,睡不着起来发一个,lwp是个好模块,上网站自动完成点任务多方便的,不过很多操作都需要在你正确登录网站的前提下才能进行,登录一个没有验证码的网站还挺容易的,如果登录的时候要求你输入验证码就比较麻烦,你可以改cookie,但是如果每次登录账号不一样感觉比较麻烦,个人写了个小程序,登录的时候程序先自动将验证码图片下载下来,等人工识别然后人工输入,程序接受输入后再继续登录。 虽然麻烦点,不过还是算一种方法吧。

程序概述:

  1.程序根据特定的网站写的,所以大家就看看大概原理就是了,照搬到其他网站肯定不成功。

  2.大概原理,页面得到验证码是通过一个特定的链接,登录的时候直接通过这个链接得到验证码,然后加到账户信息里面post出去,登录就成功了。

代码如下:

  1. use strict;
  2. use warnings;
  3. use LWP;
  4. use LWP::ConnCache;


  5. # main procedure #
  6. my $ua = LWP::UserAgent->new( );
  7. # setup attribution #
  8. push @{ $ua->requests_redirectable }, 'POST'; # post之后能自动打开redirect页面
  9. $ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; AskTbFXTV5/5.11.3.15590)');
  10. $ua->cookie_jar( {} );  #打开cookie功能
  11. $ua->timeout(15);
  12. $ua->conn_cache( LWP::ConnCache->new() ); # keep alive

  13. if( &login ){
  14.     print "登录成功!\n";
  15. }else{
  16.     print "登录失败!\n";
  17. }


  18. sub login {
  19.     my $acc = shift || '这里填默认使用的账号';
  20.     my $pw  = shift || '这里填默认使用的密码';

  21.     my $response = $ua->get('http://www.xckjpx.net/user/login_inc/checkcode/checkcode.asp');

  22.     if ($response->is_success) {

  23.         # 抓取验证码图片 #
  24.         open my $check_code_image, "> verifycode.BMP"  #默认验证图片的位置在当前目录
  25.                 or die "$!";

  26.         binmode($check_code_image);
  27.         print $check_code_image $response->content;
  28.         close $check_code_image; #关闭print对句柄的控制

  29.         { # 输入验证码并登录 #

  30.           print "> enter verifycode:";
  31.           chomp( my $verifycode = <> );
  32.           $verifycode=~ s/\s//g; #删除空白

  33.           my $response = $ua->post(
  34.                                  'http://www.xckjpx.net/user/check.asp',
  35.                                  [username => $acc, password => $pw, xhccl => 'login', verifycode => $verifycode, Sub_sub =>''],
  36.                                   );

  37.           if ($response->is_success) {

  38.               return $response->content =~ /location='login.asp'/ ? 0 : 1;  # 根据是否重定向页面到登录界面来判断登录是否成功
  39.                                                                             # 登录成功返回 1     登录失败返回 0
  40.           }
  41.           else {
  42.               print '> failed to post data for login:  ' . $response->status_line . "\n";
  43.           }
  44.         } #

  45.     }
  46.     else {
  47.          print '> failed to get verifycode:  ' . $response->status_line . "\n";
  48.     }

  49. }
复制代码
最后:
程序里本来有个默认账号和密码,因为不是我自己的,不敢泄露别人隐私,大家就自己申请一个吧
login函数不填参数就使用默认账号和密码。

上面程序有正确账号和密码的话是能成功登录的,发帖前测试过。

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
发表于 2013-01-25 08:58 |显示全部楼层
我怎么觉得不靠谱呢,你得到验证码,然后再去请求时验证码已经变了:wink:

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
发表于 2013-01-25 10:21 |显示全部楼层
想研究一下,收了

论坛徽章:
0
发表于 2013-01-25 11:56 |显示全部楼层
本帖最后由 ykredrum 于 2013-01-25 11:57 编辑
bikong0411 发表于 2013-01-25 08:58
我怎么觉得不靠谱呢,你得到验证码,然后再去请求时验证码已经变了



你说的这个问题我考虑了的,程序里只get一次验证码的链接,就是说,验证码就没有改变过

而且上面的小程序测试成功了我才帖出来的,呵呵。
   

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
发表于 2013-01-25 12:48 |显示全部楼层
我记得有个项目里验证码是用 xdg-open 打开的,处理的比较好

论坛徽章:
0
发表于 2013-01-25 13:14 |显示全部楼层
本帖最后由 ykredrum 于 2013-01-25 13:52 编辑
ttcn_cu 发表于 2013-01-25 12:48
我记得有个项目里验证码是用 xdg-open 打开的,处理的比较好


谢谢,刚才去看了看, xdg-open 确实是个好东西,以前我不知道,又学习了,thx

不过Windows下 xdg-open 不能用.

论坛徽章:
0
发表于 2013-01-25 15:36 |显示全部楼层
简单验证码字母和数字加噪点等可以用Image::Magick识别
汉字和扭曲严重的就没想到什么好办法了

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
发表于 2013-01-25 16:42 |显示全部楼层
这个太复杂,使用 Mojo::UserAgent 可以做到只有这个 1/6 的代码

论坛徽章:
0
发表于 2013-01-26 23:39 |显示全部楼层
我去试试这个看看Image::Magick

论坛徽章:
0
发表于 2013-02-02 19:20 |显示全部楼层
好的,发个帖子,知道很多没有用过的模块,谢谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP