ホームページ  >  記事  >  バックエンド開発  >  Zhengfang Academic Affairs System を例として、PHP を使用してログインをシミュレートし、授業スケジュールと空き教室を把握します。

Zhengfang Academic Affairs System を例として、PHP を使用してログインをシミュレートし、授業スケジュールと空き教室を把握します。

WBOY
WBOYオリジナル
2016-06-13 12:19:58875ブラウズ

Zhengfang Academic Affairs System を例に挙げると、PHP を使用してログインをシミュレートし、授業スケジュールと空の教室を把握します

Course Grid と Super Course Schedule は、大学生が独自に使用するアプリケーションである必要があります。教育管理システムの学生 ID とパスワードを使用すると、自分の授業スケジュールをインポートして、いつでもどこでも携帯電話で確認できます。

実際、php について少し知っていれば、これと同様の Web アプリケーションを作成することもできます。

1. 検証コードを解決します

実際、これは Zhengfang の小さなバグです。ログイン インターフェイスに入ると、ブラウザがサーバーに要求し、サーバーは検証コードの画像を生成します。 。この画像をリクエストしない場合、Zhengfangの背景は対応する認証コードを生成しないため、それを利用する機会があり、しばらくの間は幸せになります〜現時点では、認証コードを入力せずに, とてもスムーズに入力できます。コンピュータ上の確認コードのアドレスへのアクセスを無効にして、それが真実かどうかを確認してください~ もちろん、これは肯定的な側にのみ機能します。

2. PHPのcurl模擬ログイン

スクリプトハウスによるcurlの説明はこちら http://www.jb51.net/article/51299.htm

次は関連するコード。多くの人は私と同じだと思います。彼らは例を見ることだけを好み、長い説明を避けます...しかし、この習慣は依然として良くありません...これ以上ナンセンスです。

//模拟登陆	function curl_request($url,$post='',$cookie='', $returnCookie=0){	        $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"); //填写教务系统url	        if($post) {	            curl_setopt($curl, CURLOPT_POST, 1);	            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));	        }	        if($cookie) {	            curl_setopt($curl, CURLOPT_COOKIE, $cookie);	        }	        curl_setopt($curl, CURLOPT_HEADER, $returnCookie);	        curl_setopt($curl, CURLOPT_TIMEOUT, 20);	        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);	        $data = curl_exec($curl);	        if (curl_errno($curl)) {	            return curl_error($curl);	        }	        curl_close($curl);	        if($returnCookie){	            list($header, $body) = explode("\r\n\r\n", $data, 2);	            preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);	            $info['cookie']  = substr($matches[1][0], 1);	            $info['content'] = $body;	            return $info;	        }else{	            return $data;	        }    }

3. 教育行政システムログインページの非表示フィールド

>
    <input type="hidden" name="__VIEWSTATE" value="dDwyODE2NTM0OTg7Oz61eIbnKVojBioGYtg2vsy2SklwiA==">

これらもログイン時に持参する必要があります。 ちなみに、関数が投稿され、ブロガーの学校が暴露されます... 王立農業大学 (主に正規表現の使用)

    <br />  //登陆页面的隐藏字段<br />  function getView(){	    $url = 'http://jw.hzau.edu.cn/default2.aspx';	    $result = curl_request($url);	    $pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is';	    preg_match_all($pattern, $result, $matches);	    $res[0] = $matches[1][0];	         	    return $res[0] ;	}

//教室クエリページの隠し値を返す
private function getViewJs($cookie,$xh){
$url = " http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}";
$result =curl_request($url,'',$cookie);
$pattern = '/ 76e3d884aa15b8c994c1b9a6703a104e/is';
preg_match_all($pattern, $result, $matches);
$res[ 0] = $matches[1][0];
return $res[0] ;
}

4. Cookie 取得

function login($xh,$pwd){	    $url = 'http://jw.hzau.edu.cn/default2.aspx';	    $post['__VIEWSTATE'] = $this->getView();	    $post['txtUserName'] = $xh; //填写学号	    $post['TextBox2'] = $pwd;  //填写密码	    $post['txtSecretCode'] = '';	    $post['lbLanguage'] = '';	    $post['hidPdrs'] = '';	    $post['hidsc'] = '';	    $post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '学生');	    $post['Button1'] = iconv('utf-8', 'gb2312', '登录');	    $result = curl_request($url,$post,'', 1);	    return $result['cookie'];	}

5. 授業スケジュールを確認する機能を試してみましょう。形式が少し汚いので、授業スケジュールを 2 次元の連想配列に変換してみます。

//返回课表字符串private function classresult($xh,$pwd){    	date_default_timezone_set("PRC"); //时区设置    	$classList = "";//声明课表变量    	$cookie = $this->login($xh,$pwd);    	$view = $this->getViewJs($cookie,$xh);//验证密码是否正确    	//如果密码正确        if (!empty($view)) {        	$url = "http://jw.hzau.edu.cn/xskbcx.aspx?xh={$xh}";	        $result = curl_request($url,'',$cookie);  //保存的cookies			preg_match_all('/<table id="Table1"[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out);	        $table = $out[0][0]; //获取整个课表	        preg_match_all('/<td [\w\W]*?>([\w\W]*?)<\/td>/',$table,$out);	        $td = $out[1];	        $length = count($td);	    	//获得课程列表	    	for ($i=0; $i < $length; $i++) { 	    		$td[$i] = str_replace("<br>", "", $td[$i]);	    		$reg = "/{(.*)}/";	    		    		if (!preg_match_all($reg, $td[$i], $matches)) {	    			unset($td[$i]);	    		}			}			$td = array_values($td); //将课程列表数组重新索引			$tdLength = count($td);			for ($i=0; $i < $tdLength; $i++) { 				$td[$i] = iconv('GB2312','UTF-8',$td[$i]);			}			//将课表转换成数组形式			function converttoTable($table){				$list = array(					'sun' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'mon' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'tues' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'wed' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'thur' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'fri' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					),					'sat' => array(						'1,2' => '',						'3,4' => '',						'5,6' => '',						'7,8' => '',						'9,10' => ''					)				);				$week = array("sun"=>"周日","mon"=>"周一","tues"=>"周二","wed"=>"周三","thur"=>"周四","fri"=>"周五","sat"=>"周六");				$order = array('1,2','3,4','5,6','7,8','9,10');				foreach ($table as $key => $value) {					$class = $value;					foreach ($week as $key => $weekDay) {						$pos = strpos($class,$weekDay);						// echo $pos;						if ($pos) {							$weekArrayDay = $key; //获取list数组中的第一维key 							foreach ($order as $key => $orderClass) {								$pos = strpos($class,$orderClass);								if ($pos) {									$weekArrayOrder = $orderClass; //获取该课程是第几节									break;								}							}							break;						}					}					$list[$weekArrayDay][$weekArrayOrder] = $class;				}				return $list;			}								//调用函数			return converttoTable($td);        }else{        	return 0;        }	}
6. 空き教室のクエリ機能を再度試してみる

現時点では、各学校の教育管理システムが異なります。 Firefox ブラウザの Firebug パケット キャプチャを使用して、送信された内容を確認します。成功しない場合は、送信すべきものが投稿されているかどうかを確認してください。それでも成功しない場合は、私に連絡してください。[email protected]

以上です。急いでください。立ち上がって試してみてください!
//空教室查询结果	public function roomresult(){		$xh = ""; //设置学号		$pwd = "";  //学号对应的密码		$cookie = $this->login($xh,$pwd);        $url = "http://jw.hzau.edu.cn/xs_main.aspx?xh={$xh}";        $result = curl_request($url,'',$cookie);  //保存的cookies        $url="http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}";        $post['Button2'] = iconv('utf-8', 'gb2312', '空教室查询');        $post['__EVENTARGUMENT']='';        $post['__EVENTTARGET']='';        $post['__VIEWSTATE'] = $this->getViewJs($cookie,$xh);        $post['ddlDsz'] = iconv('utf-8', 'gb2312', '单');        $post['ddlSyXn'] = '2014-2015'; //学年        $post['ddlSyxq'] = '1';         $post['jslb'] = '';        $post['xiaoq'] = '';        $post['kssj']=$_GET['start'];  //提交的开始查询时间          $post['sjd']=$_GET['class'];//提交的课程节次        $post['xn']='2014-2015';//所在学年        $post['xq']='2';//所在学期        $post['xqj']='6';//当天星期几        $post['dpDataGrid1:txtPageSize']=90;//每页显示条数        $result = curl_request($url,$post,$cookie,0);				preg_match_all('/<span[^>]+>[^>]+span>/',$result,$out);        $tip = iconv('gb2312', 'utf-8', $out[0][3]);//获取页面前部的提示内容        preg_match_all('/<table[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out);        $table = iconv('gb2312', 'utf-8', $out[0][0]); //获取查询列表				$this->load->view("classroom",array('tip'=>$tip,'table'=>$table));    }
フロア 1

——石——

よく書かれています ~ いいね
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。