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

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

WBOY
リリース: 2016-08-08 09:24:01
オリジナル
1310 人が閲覧しました

コースグリッドとスーパーコース時間割は、大学生にとって馴染みのある2つのアプリケーションであり、教育システムの学生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.教育行政システムログインページの隠しフィールド

me in in in inmine\ ...王立農業大学 (主に正規表現の使用)

    <input type="hidden" name="__VIEWSTATE" value="dDwyODE2NTM0OTg7Oz61eIbnKVojBioGYtg2vsy2SklwiA==">
ログイン後にコピー
//Return the教室クエリページの隠し値

private function getViewJs($cookie,$xh){

$url = "http://jw. hzau.edu.cn/xxjsjy.aspx?xh={$xh}";

$ result =curl_request($url,'',$cookie);

$pattern = '//is';
preg_match_all($pattern, $result, $matches);
$res[0] = $matches[1][0];
return $res[0] ;
}


4. クッキーの取得

<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] ;
	}
ログイン後にコピー

5. 授業スケジュールを確認する機能を試してみましょう。形式がちょっと汚いので、なんとかしましょう

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'];
	}
ログイン後にコピー

6、空のクエリを実行してみます。教室をもう一度

//返回课表字符串
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[\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;
        }
	}
ログイン後にコピー

要約すると、各学校の教育管理システムは異なります。現時点では、FirefoxブラウザのFirebugを使用して、送信されたパケットを確認できます。それでもうまくいかない場合は、imzhongshan@126.com までご連絡ください

以上です。急いでください。試してみる!

上記では、例として Zhengfang Educational Affairs System を使用して、PHP を使用して授業スケジュールと空き教室をキャプチャするためのログインをシミュレートする方法について説明しました。関連するコンテンツも含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート