linux php验证码,openwrt路由器搭建PHP并用PHP识别验证码

  • Post author:
  • Post category:php


首先要知道为什么要在openwrt搭建PHP环境并且识别验证码

因为很多宽带在登录上为了防止路由器或者其他的原因,添加了验证码,而我们就是不想去手动输入,有人问为什么不用ocr,目前我见到的是用Python在Linux上运行ocr,问题是openwrt的内存太小了,装Python是老鼠吃大象(当然可以挂载U盘去装)。

9f2843366e430c67d97bf376e446c14b.png

首先更新openwrt的软件源opkg update

安装PHP环境opkg install php5 php5-mod-gd php5-mod-curl php5-mod-session php5-mod-pdo php5-mod-mcrypt php5-mod-mbstring php5-fastcgi php5-cgi php5-mod-ctype php5-mod-exif php5-mod-iconv php5-mod-json php5-mod-sockets php5-mod-sqlite3 php5-mod-tokenizer php5-mod-zip

在/etc/httpd.conf最后面添加如下config uhttpd web

list    listen_http 0.0.0.0:88

option  home    /www/php

option  cgi_prefix  /cgi-bin

option  index_page  “index.html index.php”

list    interpreter “.php=/usr/bin/php-cgi”

上面监听http的88端口

设置88端口的根目录为/www/php

然后重启http服务/etc/init.d/uhttpd restart

然后打开/www/php

在里面添加php文件,然后添加如下的识别验证码的代码

(PHP验证码识别由HS5233提供)

注意!!!只能识别特别方正的全数字验证码!!!

放好以后,可以通过 路由器IP:88 访问PHP页面

最后写一个shell脚本,让路由器启动就自行登录#! /bin/sh –

while true

do

pinga=`ping 180.76.76.76 -c 1`

case “$pinga”

in

*ttl* ) ;;

*  ) pingb=`ping 180.97.33.107 -c 1`

case “$pingb”

in

*ttl* ) ;;

*  ) curl -g “http://192.168.1.1:88/index.php”;;

esac

esac

done

然后把本shell添加到路由器启动项里面即可!

我在验证码里面改动了一下,让他识别后帮我提交:<?php

error_reporting(0);

$cookie = dirname(__FILE__).”/valid.tmp”;//注意要先给当前目录777权限!

//执行

$validCode=getIdentify($cookie);

//需要开启PHP的shell_exec

$ip=shell_exec(“ifconfig eth1| grep ‘10.1’ | cut -f 2 -d ‘:’ | cut -f 1 -d ‘ ‘”);

$ip=substr($ip,0,-1);

//此处用var_dump($ip)查看截取多少位

$url=’http://125.88.59.131:10001/login.do’;

$username=””;//账号

$pwd=””;//密码

$data=”edubas=113.98.13.29&eduuser=”.$ip.”&userName1=”.$username.”&password1=”.base64_encode($pwd).”&rand=”.$validCode;

$result=http_post_request($url,$data,$cookie);

$str1=mb_convert_encoding($result, “utf-8”, “gb2312”);

if(preg_match(‘/success/’,$str1)){

echo “login success!”;

}else{

echo “login failed!”;

}

function http_post_request($url,$data,$cookie){

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)’);

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($curl, CURLOPT_AUTOREFERER, 1);

curl_setopt($curl, CURLOPT_REFERER, $url);

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($curl);

curl_close($curl);

return $result;

}

function getIdentify($cookie){

$t=time();

$url = “http://125.88.59.131:10001/common/image.jsp?time=”.$t;       //验证码地址

$curl = curl_init($url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);

curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

$img = curl_exec($curl);

curl_close($curl);

$fp = fopen(“identify.jpg”,”w”);

fwrite($fp,$img);

fclose($fp);

$res = imagecreatefromjpeg(“identify.jpg”);     //创建图像

$size = getimagesize(“identify.jpg”);           //获得图像大小

// print_r($size);

//echo ‘

‘;                 //显示验证码

// exit;

$img_w = $size[0]-5;       //图像宽度

$img_h = $size[1]-4;        //图像高度

//二值化

for($i=3,$_i=0;$i

for($j=7,$_j=0; $j

$rgb = imagecolorat($res,$j,$i);                 //返回 image 所指定的图形中指定位置像素的颜色索引值。

$rgbarray = imagecolorsforindex($res, $rgb);     //本函数用来取得调色盘上指定索引的颜色值。

if($rgbarray[‘red’]+$rgbarray[‘green’]+$rgbarray[‘blue’]<400){

$data_array[$_i][$_j] = 1;  //验证码部分为1

// echo ‘■’;

}else{

$data_array[$_i][$_j] = 0;  //空白为0

// echo ‘□’;

}

}

// echo ‘

‘;

}

// exit;

$img_h -= 3;

$img_w -= 7;

// 切割

for($i=0;$i

for($j=0;$j

if($i<9){

$Vword[0] .= $data_array[$j][$i];

}else if($i>=13&&$i<22){

$Vword[1] .= $data_array[$j][$i];

}else if($i>=26&&$i<35){

$Vword[2] .= $data_array[$j][$i];

}else if($i>=39){

$Vword[3] .= $data_array[$j][$i];

}

}

}

//四个字符查看,教学使用

// echo $Vword[0].’|’.strlen($Vword[0]).’

‘;

// echo $Vword[1].’|’.strlen($Vword[1]).’

‘;

// echo $Vword[2].’|’.strlen($Vword[2]).’

‘;

// echo $Vword[3].’|’.strlen($Vword[3]).’

‘;

// exit;

//字典

$array[0] = array(

‘000111111100001111111111100110000000110110000000001111000000000111100000000011011000000011001111111111100001111111000’

);

$array[1] = array(

‘000000000000001100000000110110000000011111000000001111111111111111111111111111000000000001100000000000110000000000011’

);

$array[2] = array(

‘011000000011111000000011111100000011011110000011001111000011000111100011000011011111000001100111000000110000000000000’

);

$array[3] = array(

‘011000000011011000110000111100011000011110001100001111000110000111100111100111011110111111001110001111000000000000000’

);

$array[4] = array(

‘000000001100000000011110000000111111000000111001100001110000110001111111111111111111111111100000000110000000000011000’

);

$array[5] = array(

‘111111100011011111110000111100011000011110001100001111000110000111100001100111110000111111011000001111000000000000000’

);

$array[6] = array(

‘000011111100000111111111100111001100110110001100001111000110000111100011000011110001110011101100011111100000000111100’

);

$array[7] = array(

‘000000000000011000000000001100000000011110000000111111000001111001100011100000110011000000011111000000001110000000000’

);

$array[8] = array(

‘000000001110001111001111101111111100111110011100001111000110000111100011100011111111110011101110001111100000000011100’

);

$array[9] = array(

‘001111000000001111110001101110011100011110000110001111000011000111100001100011011001100111001111111111000001111110000’

);

//根据字符串相似度识别

for($tmp_count=0;$tmp_count<4;$tmp_count++){

foreach($array as $key=>$value){

foreach($value as $v){

similar_text($Vword[$tmp_count],$v,$similarResult);

if($similarResult>$result[$tmp_count][‘similar’]){

$result[$tmp_count][‘similar’] = $similarResult;

$result[$tmp_count][‘num’] = $key;

}

}

}

}

return $result[0][‘num’].$result[1][‘num’].$result[2][‘num’].$result[3][‘num’];

}

?>