首页 PHP正文

将轻应用集成在易班内

webpro PHP 2018-08-15 520 0

将轻应用集成在易班内


以获取学生的学校为例


调用流程:(以易班内提供的HTTP协议接口为例)

前提准备:

首先在易班开发者平台创建轻应用,创建完成后,自动有测试权限

image.png

轻应用有三个URL参数

image.png

分别是站内地址,维护地址,应。用地址。站内地址指向的是应用地址,易班安全考虑,在易班集成时,用站内地址代替应用地址

建议将请求授权回调地址与应用地址设置成同一地址


另外我们需要有一个回调地址,来接收易班接口(说明地址https://open.yiban.cn/wiki/index.php?page=oauth/authorize)GET回来的参数code

此处code非access_token,需调用接口转化,上述步骤称为请求授权

接下来将会用到这个code来进行请求授权


这里演示采用的接口地址是

易班API接口(点击访问)

image.png


下面为流程


1、当用户访问轻应用,会出现一个授权窗口,提示用户是否将信息授权给轻应用


2、用户点确认后,code参数将通过GET方式传到回调地址。(建议将轻应用的入口地址与回调地址设置为同一页面)

备注:上述获code的回调地址必须填写轻应用的站内地址,即以易班域名为前缀的轻应用地址


3、接收到code参数,用code参数请求授权

接口地址:

https://oauth.yiban.cn/token/info

GET

param code

param APPID

param APPSECRET

param CALLBACK(回调地址)

return text/json



4、对上述获取到的json对象进行json_decode操作,转成数组


其中包含键名为access_token的数值,把这个数值存起来,即令牌,令牌有有效期,需注意


5、为严谨、安全起见,每次进入轻应用时,在这里重新核查一下令牌是否过期,过期回到第1步执行,接口略


6、通过以上步骤,获取了用户的access_token,有了这个令牌,就可以获取用户的信息


7、示例

获取用户的基本信息(开放授权)

https://openapi.yiban.cn/user/me

GET

param access_token

return text/json


下面附上PHP代码

// $userInfoJsonStr即上述返回的text/json
// 对返回的json对象进行解析
$userInfo = json_decode($userInfoJsonStr,true);
// 获取到的数据格式,二维数组
$_SESSION['school']=$userInfo['info']['yb_schoolname'];
// 将获取到的学校存储在SESSION内,便于其他页面使用


下面是集成的查询安徽工业大学学生成绩的PHP+html混编代码

需要提升该应用有校方权限

<?php
// error_reporting(0);
/**
 * 放在学校内网服务器中的数据探针
 * @author Bill
 * @version 0.0.1
 * 功能:
 * 获取A成绩、B学分绩
 */
header("Content-type:text/html;charset=utf-8;");
header('Access-Control-Allow-Origin', 'https://www.webpro.ltd/yiban/grade/');

class nwAPI{

public static function CURL($url,$headers,$method,$data,$showHeaders){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch,CURLOPT_HEADER, $showHeaders);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_NOBODY, false);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch,CURLOPT_COOKIEFILE,dirname(__FILE__) . "/cookie");
curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__) . "/cookie");
if ($method == 'POST')
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
//$this->htmlResult=$result;
}
/**
     * 获得页面隐藏值
     * @return array(__VIEWSTATE,__EVENTVALIDATION)
     */
public static function getHiddenValue($htmlDoc){
// echo $htmlResult;

// exit;

$htmlResult = $htmlDoc;
$name = "__VIEWSTATE";
preg_match(
"/<input type=\"hidden\" name=\"".$name."\" id=\"".$name."\" value=\"(.*?)\" \/>/",
$htmlResult,
$res
);
// print_r($res);
$__VIEWSTATE=$res[1];

$name = "__EVENTVALIDATION";
preg_match(
"/<input type=\"hidden\" name=\"".$name."\" id=\"".$name."\" value=\"(.*?)\" \/>/",
$htmlResult,
$res
);
$__EVENTVALIDATION=$res[1];

$res = array(
"__VIEWSTATE" => $__VIEWSTATE,
"__EVENTVALIDATION" => $__EVENTVALIDATION
);
return $res;
}

/**
      * 提取表格内容,行-列对应着x y
      * @param HTML表格文档
      * @return table_array
      */
public static function get_td_array($table='') {
// $table = "<table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>";
// file:///C:/Users/suxia/Desktop/nwAPI.class.php.html
// $table=file_get_contents("C:/Users/suxia/Desktop/nwAPI.class.php.html");
// if($table=''){exit;}
$table = preg_replace("'<table[^>]*?>'si","",$table);
$table = preg_replace("'<tr[^>]*?>'si","",$table);
$table = preg_replace("'<td[^>]*?>'si","",$table);
$table = str_replace("</tr>","{tr}",$table);
$table = str_replace("</td>","{td}",$table);
//去掉 HTML 标记 
$table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
//去掉空白字符 
$table = preg_replace("'([rn])[s]+'","",$table);
$table = str_replace(" ","",$table);
$table = str_replace(" ","",$table);
$table = explode('{tr}', $table);
array_pop($table);
foreach ($table as $key=>$tr) {
// $tr = str_replace(" ","",$tr);
// echo $tr;
// if($tr==''){continue;}
$td = explode('{td}', $tr);
array_pop($td);
$td_array[] = $td;
}
return $td_array;
// print_r($td_array);
}


/**
    * 查找某个字符在字符串中出现的所有位置
    * @param $str string 被查询字符串
    * @param$char string 查询字符
    * @return $arr  array() 返回数组
    */
public static function getCharpos2($str, $char){
$j = 0;
$arr = array();
$count = substr_count($str, $char);
for($i = 0; $i < $count; $i++){
$j = strpos($str, $char, $j);
$arr[] = $j;
$j = $j+1;
}
return $arr;
}

/**
     * 查成绩
     * @param $stuCard
     * @param $stuPrcNo
     * @param $drop_xn
     * @param $drop_xq
     * @return jsonMixed
     */
public static function getGrades($stuCard,$stuPrcNo,$drop_xn='defaultxn',$drop_xq='defaultxq'){
// if($userid=''){exit;}
// 获取默认时间,以服务器时间为准
date_default_timezone_set('PRC');
$year = date('Y');
$month = date('m');
// 默认学年是本学年
if($drop_xn=='defaultxn'){
if($month < 8 && $month > 1){
// 第2学期
// echo ($year-1)."-".$year."学年第2学期";
$drop_xn = ($year-1)."-".$year;
}
if($month <= 1 && $month > 8){
// 第1学期
// echo $year."-".($year+1)."学年第1学期";
$drop_xn = ($year-1)."-".$year;
}
}
// 默认学期是本学期
if($drop_xq=='defaultxq'){
if($month < 8 && $month > 1){
// 第2学期
// echo ($year-1)."-".$year."学年第2学期";
$drop_xq = '2';
}
if($month <= 1 && $month > 8){
// 第1学期
// echo $year."-".($year+1)."学年第1学期";
$drop_xq = '1';
}
}

// 模拟浏览器打开网站
$htmlResult = self ::CURL("http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",array(
"Accept: text/html, application/xhtml+xml, image/jxr, */*",
"Accept-Encoding: gzip, deflate",
"Accept-Language: zh-CN",
"Cache-Control: no-cache",
"Connection: Keep-Alive",
"Content-Type: application/x-www-form-urlencoded",
"Host: 211.70.149.134:8080",
"Referer: http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
),
"GET",
"",
false
);

// 获得页面的隐藏值(类似于token,有效期为1次)
$res = self::getHiddenValue($htmlResult);
$__VIEWSTATE = $res['__VIEWSTATE'];
$__EVENTVALIDATION = $res['__EVENTVALIDATION'];

// 从数据库调取用户学号和身份证号
// $stuCard = "159074319";
// $stuPrcNo = "342423199610203110";

$data = array(
"__EVENTVALIDATION" => $__EVENTVALIDATION,
"__VIEWSTATE" => $__VIEWSTATE,
"Button_cjcx" => "",
"drop_type" => "全部成绩",
"TextBox1" => $stuCard,
"TextBox2" => $stuPrcNo,
"drop_xn" => $drop_xn,
"drop_xq" => $drop_xq,
"hid_dqszj" => "",
);
$data = http_build_query($data);

// "Button_cjcx" => "第一专业平均学分绩",
// "Button_xfj" => "第一专业平均学分绩",
// "hid_dqszj" => "2017",

$htmlDocument = self::CURL("http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",array(
"Accept: text/html, application/xhtml+xml, image/jxr, */*",
"Accept-Encoding: gzip, deflate",
"Accept-Language: zh-CN",
"Cache-Control: no-cache",
"Connection: Keep-Alive",
"Content-Length: ".strlen($data),
"Content-Type: application/x-www-form-urlencoded",
"Host: 211.70.149.134:8080",
"Referer: http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
),"POST",$data,false);

if(strstr($htmlDocument,"没有返回记录!")){
$result[] = "没有查到相关记录!";
$json = json_encode($result,JSON_UNESCAPED_UNICODE);
return $json;
exit;
}

// 提取带有成绩的原生表格
$a = strpos($htmlDocument,"<table cellspacing=\"0\" cellpadding=\"3\"");
$c = self::getCharpos2($htmlDocument,"</table>");
$b = $c[4];
$str = substr($htmlDocument,$a,$b+8);

// 输出原生表格
// echo $str;

// 抓取表格数据存在二维数组内
$grades = self::get_td_array($str);

// 过滤无数据表格
foreach($grades as $key => $value){
// 过滤无效数组
@$value[1] = str_replace(" ","",$value[1]);
if($value[1]==''){continue;}
$newGrades[] = $value;
}

// // outPut 
// echo "<pre>";
// print_r($newGrades);
// echo "</pre>";

// 修改键名
// $kname = array('xn', 'xq', 'kch', 'kcm', 'xf', 'kcsx', 'jsh', 'jsxm', 'zscj', 'zpcj', 'qmcj', 'pscj', 'sycj', 'bkcj', 'bz');
// function foo(&$v, $k, $kname) {
// $v = array_combine($kname, array_slice($v, 1, -1));
// }
// array_walk($newGrades, 'foo', $kname);

$json = json_encode($newGrades,JSON_UNESCAPED_UNICODE);
// 过滤\n \r \t
$json = str_replace("\\n","",$json);
$json = str_replace("\\r","",$json);
$json = str_replace("\\t","",$json);
// 返回
return $json;
}

/**
     * 查学分绩
     * @param $stuCard
     * @param $stuPrcNo
     * @param $drop_xn
     * @param $drop_xq
     * @return jsonMixed
     */
public static function getXfj($stuCard,$stuPrcNo){
date_default_timezone_set('PRC');
$year = date('Y');

// 模拟浏览器打开网站
$htmlResult = self ::CURL("http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",array(
"Accept: text/html, application/xhtml+xml, image/jxr, */*",
"Accept-Encoding: gzip, deflate",
"Accept-Language: zh-CN",
"Cache-Control: no-cache",
"Connection: Keep-Alive",
"Content-Type: application/x-www-form-urlencoded",
"Host: 211.70.149.134:8080",
"Referer: http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
),
"GET",
"",
false
);

// 获得页面的隐藏值(类似于token,有效期为1次)
$res = self::getHiddenValue($htmlResult);
$__VIEWSTATE = $res['__VIEWSTATE'];
$__EVENTVALIDATION = $res['__EVENTVALIDATION'];

// 从数据库调取用户学号和身份证号
// $stuCard = "159074319";
// $stuPrcNo = "342423199610203110";

$data = array(
"__EVENTVALIDATION" => $__EVENTVALIDATION,
"__VIEWSTATE" => $__VIEWSTATE,
"Button_xfj" => "第一专业平均学分绩",
"drop_type" => "全部成绩",
"TextBox1" => $stuCard,
"TextBox2" => $stuPrcNo,
"drop_xn" => "",
"drop_xq" => "",
"hid_dqszj" => $year,
);
$data = http_build_query($data);

// "Button_cjcx" => "第一专业平均学分绩",
// "Button_xfj" => "第一专业平均学分绩",
// "hid_dqszj" => "2017",

$htmlDocument = self::CURL("http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",array(
"Accept: text/html, application/xhtml+xml, image/jxr, */*",
"Accept-Encoding: gzip, deflate",
"Accept-Language: zh-CN",
"Cache-Control: no-cache",
"Connection: Keep-Alive",
"Content-Length: ".strlen($data),
"Content-Type: application/x-www-form-urlencoded",
"Host: 211.70.149.134:8080",
"Referer: http://211.70.149.134:8080/stud_score/brow_stud_score.aspx",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
),"POST",$data,false);

// // 抓取表格数据存在二维数组内
$xfj = self::get_td_array($htmlDocument);
// print_r($xfj);
$x = json_encode(array("avgXFJ" => $xfj[13][1]),JSON_UNESCAPED_UNICODE);
$x = str_replace("\\n","",$x);
$x = str_replace("\\r","",$x);
$x = str_replace("\\t","",$x);
return  $x;
}
}

// // 可能用到的全部参数
// $act = 'null';
// $stuCard = 'null';
// $stuPrcNo = 'null';
// $xq = 'null';
// $xn = 'null';

// // 必传参数
// if(isset($GET['act']) && isset($GET['stuCard']) && isset($GET['stuPrcNo'])){
//     $act = $GET['act'];
//     $stuCard = $GET['stuCard'];
//     $stuPrcNo = $GET['stuPrcNo'];
//     echo $act;
// }else{
//     goto exitSub;
// }

// if($act=='getGrades'){
//     if(isset($GET['xq']) && isset($GET['xn'])){
//         // 可选参数
//         $xq = $GET['xq'];
//         $xn = $GET['xn'];
//     }
// }elseif($act!='getXfj'){
//     goto exitSub;
// }

// switch($act){
//     case 'getGrades':
//         if($xq=='null' && $xn=='null'){
//             echo nwAPI::gerGrades($stuCard,$stuPrcNo);
//         }else{
//             echo nwAPI::gerGrades($stuCard,$stuPrcNo,$xn,$xq);
//         }
//         break;

//     case 'getXfj':
//         echo nwAPI::getXfj($stuCard,$stuPrcNo);
//         break;

//     default:
//         // 退出
// }

// $x = json_decode(nwAPI::gerGrades("159074319","342423199610203110","2017-2018","1"));
// echo nwAPI::getGrades("159074319","342423199610203110","2017-2018","1");
// echo nwAPI::gerGrades("179074400","432522199812263737","2017-2018","1");
// $str = nwAPI::getGrades("159074319","342423199610203110","2017-2018","1");
// $str = nwAPI::getGrades("179074277","130826199905280017","2017-2018","2");
// $arr = json_decode($str);
// echo "<pre>";
// print_r($arr);
// echo "</pre>";

/**
 * 开放接口文件
 */
// 'xh': xh,
// 'sfzh': sfzh,
// 'xnxq': xnxq

// 设置跨域权限
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
$allow_origin = array(
'http://127.0.0.1:8020',
'https://www.webpro.ltd/yiban/grade/',
);
if(in_array($origin, $allow_origin)){
header('Access-Control-Allow-Origin:'.$origin);
header('Access-Control-Allow-Methods:POST,GET');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
}

if(@$_POST['xh']!=null){
$xh = $_POST['xh'];
$sfzh = $_POST['sfzh'];
$xnxq = $_POST['xnxq'];
// echo $xnxq;
// 下列情况静默退出
if($xh=='' || $sfzh=='' || $xnxq==''){goto exitSub;}
// 防注入,对学号和身份证号进行过滤,只保留数字和字母
$xh = (int)$xh;
$xh = (string)$xh;
$sfzh = htmlspecialchars($sfzh);
// $xnxq = htmlspecialchars($xnxq);
// echo $xnxq;
// 拆分学年学期
$arr = explode(" ",$xnxq);
$xn = $arr[0];
$xq = $arr[1];
// 获取数据
$str = nwAPI::getGrades($xh,$sfzh,$xn,$xq);
// 如果数据中包含null那么返回false
if(strpos($str,"null")){
$str = json_encode(array('0' => 'failed!'));
}
echo $str;
}

if(@$_GET['xh']!=null){
$xh = $_GET['xh'];
$sfzh = $_GET['sfzh'];
$xnxq = $_GET['xnxq'];
// echo $xnxq;
// 下列情况静默退出
if($xh=='' || $sfzh=='' || $xnxq==''){goto exitSub;}
// 防注入,对学号和身份证号进行过滤,只保留数字和字母
$xh = (int)$xh;
$xh = (string)$xh;
$sfzh = htmlspecialchars($sfzh);
// $xnxq = htmlspecialchars($xnxq);
// echo $xnxq;
// 拆分学年学期
$arr = explode(" ",$xnxq);
$xn = $arr[0];
$xq = $arr[1];
// 获取数据
$str = nwAPI::getGrades($xh,$sfzh,$xn,$xq);
// 如果数据中包含null那么返回false
if(strpos($str,"null")){
$str = json_encode(array('0' => 'failed!'));
}
echo $str;
}

// echo $xn;
// echo $xq;
// echo $xnxq;
// echo $xh;
// echo $sfzh;



// echo nwAPI::getXfj("179074277","130826199905280017");
// echo "<pre>";
// print_r($x);
// echo "</pre>";

// echo "please input AHUT username:";
// $stdin = fopen('php://stdin', 'r');
// $user = trim(fgets($stdin));
// echo "please input AHUT password:";
// $stdin = fopen('php://stdin', 'r');
// $pwd = trim(fgets($stdin));

// echo nwAPI::getXfj($user,$pwd);
// echo nwAPI::getXfj("179074400","432522199812263737");

// $str = "wowowowowo";
// // $pos = strpos($str, 'w', strpos($str,'w'));
// // echo $pos;
// print_r(getCharpos2($str,"w"));

exitSub:
// the end of the file


成绩获取脚本(UPDATING)


版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

运行

«   2019年11月   »
123
45678910
11121314151617
18192021222324
252627282930

WebPro统计

Top