From 9e58d784b030b044561cd3cc5db2fe91c44dda15 Mon Sep 17 00:00:00 2001 From: Bigsk Date: Fri, 20 May 2022 19:21:39 +0800 Subject: [PATCH] First Commit --- LICENSE | 2 +- README.md | 8 +- api/getCookie.py | 13 + api/id/index.php | 39 ++ api/index.json | 1 + api/libraries/entrance.php | 15 + api/libraries/func.php | 104 ++++ api/libraries/key.php | 13 + api/libraries/libraries/app.php | 34 ++ api/libraries/libraries/auth.php | 34 ++ api/libraries/libraries/main.php | 71 +++ api/libraries/libraries/post.php | 27 ++ api/libraries/libraries/setting.php | 13 + api/libraries/libraries/task.php | 23 + api/libraries/libraries/token.php | 34 ++ api/libraries/libraries/user.php | 45 ++ api/new/index.php | 134 ++++++ api/new/logs.txt | 1 + api/search/index.php | 39 ++ database/fmhs_music.sql | 103 ++++ database/fmhs_radio_song.sql | 151 ++++++ site/admin/auth.php | 91 ++++ site/admin/index.php | 91 ++++ site/admin/list.php | 92 ++++ site/admin/song.php | 159 +++++++ site/center/auth.php | 100 ++++ site/center/authProcess.php | 48 ++ site/center/entrance.php | 15 + site/center/libraries/app.php | 34 ++ site/center/libraries/auth.php | 34 ++ site/center/libraries/main.php | 71 +++ site/center/libraries/post.php | 27 ++ site/center/libraries/setting.php | 13 + site/center/libraries/task.php | 23 + site/center/libraries/token.php | 34 ++ site/center/libraries/user.php | 45 ++ site/center/login.php | 91 ++++ site/center/logout.php | 5 + site/center/user.php | 96 ++++ site/song/api.php | 450 ++++++++++++++++++ site/song/confirm.php | 91 ++++ site/song/cookie.conf | 1 + site/song/getCookie.py | 13 + site/song/index.php | 222 +++++++++ site/song/information/2019.json | 1 + site/song/information/2020.json | 1 + site/song/information/2021.json | 1 + site/song/list.php | 135 ++++++ site/song/myRecord.php | 107 +++++ site/song/process.php | 220 +++++++++ site/song/record.php | 101 ++++ site/song/search.php | 110 +++++ site/song/template/confirm.html | 159 +++++++ user_center/fmhs_radio_song.sql | 151 ++++++ user_center/interface/api.php | 222 +++++++++ user_center/interface/oauth.php | 281 +++++++++++ user_center/libraries/app.php | 408 ++++++++++++++++ user_center/libraries/auth.php | 314 ++++++++++++ user_center/libraries/database.php | 17 + user_center/libraries/entrance.php | 18 + user_center/libraries/hash.php | 45 ++ user_center/libraries/ip.php | 62 +++ user_center/libraries/log.php | 15 + user_center/libraries/mail.php | 261 ++++++++++ user_center/libraries/post.php | 24 + user_center/libraries/setting.php | 25 + user_center/libraries/task.php | 199 ++++++++ user_center/libraries/user.php | 383 +++++++++++++++ user_center/template/403.html | 57 +++ user_center/template/agreement.html | 45 ++ .../authentication/authentication.html | 92 ++++ .../template/authentication/failed.html | 38 ++ .../template/authentication/success.html | 38 ++ user_center/template/log/en_US.html | 334 +++++++++++++ user_center/template/log/zh_CN.html | 332 +++++++++++++ user_center/template/logWarn/en_US.html | 42 ++ user_center/template/logWarn/zh_CN.html | 42 ++ user_center/template/oauth/en_US.html | 336 +++++++++++++ user_center/template/oauth/zh_CN.html | 335 +++++++++++++ user_center/template/reg/en_US.html | 359 ++++++++++++++ user_center/template/reg/zh_CN.html | 359 ++++++++++++++ user_center/template/regMail/en_US.html | 43 ++ user_center/template/regMail/zh_CN.html | 43 ++ .../template/regMailCheck/failed_en_US.html | 45 ++ .../template/regMailCheck/failed_zh_CN.html | 43 ++ .../template/regMailCheck/success_en_US.html | 45 ++ .../template/regMailCheck/success_zh_CN.html | 43 ++ 87 files changed, 8679 insertions(+), 2 deletions(-) create mode 100644 api/getCookie.py create mode 100644 api/id/index.php create mode 100644 api/index.json create mode 100644 api/libraries/entrance.php create mode 100644 api/libraries/func.php create mode 100644 api/libraries/key.php create mode 100644 api/libraries/libraries/app.php create mode 100644 api/libraries/libraries/auth.php create mode 100644 api/libraries/libraries/main.php create mode 100644 api/libraries/libraries/post.php create mode 100644 api/libraries/libraries/setting.php create mode 100644 api/libraries/libraries/task.php create mode 100644 api/libraries/libraries/token.php create mode 100644 api/libraries/libraries/user.php create mode 100644 api/new/index.php create mode 100644 api/new/logs.txt create mode 100644 api/search/index.php create mode 100644 database/fmhs_music.sql create mode 100644 database/fmhs_radio_song.sql create mode 100644 site/admin/auth.php create mode 100644 site/admin/index.php create mode 100644 site/admin/list.php create mode 100644 site/admin/song.php create mode 100644 site/center/auth.php create mode 100644 site/center/authProcess.php create mode 100644 site/center/entrance.php create mode 100644 site/center/libraries/app.php create mode 100644 site/center/libraries/auth.php create mode 100644 site/center/libraries/main.php create mode 100644 site/center/libraries/post.php create mode 100644 site/center/libraries/setting.php create mode 100644 site/center/libraries/task.php create mode 100644 site/center/libraries/token.php create mode 100644 site/center/libraries/user.php create mode 100644 site/center/login.php create mode 100644 site/center/logout.php create mode 100644 site/center/user.php create mode 100644 site/song/api.php create mode 100644 site/song/confirm.php create mode 100644 site/song/cookie.conf create mode 100644 site/song/getCookie.py create mode 100644 site/song/index.php create mode 100644 site/song/information/2019.json create mode 100644 site/song/information/2020.json create mode 100644 site/song/information/2021.json create mode 100644 site/song/list.php create mode 100644 site/song/myRecord.php create mode 100644 site/song/process.php create mode 100644 site/song/record.php create mode 100644 site/song/search.php create mode 100644 site/song/template/confirm.html create mode 100644 user_center/fmhs_radio_song.sql create mode 100644 user_center/interface/api.php create mode 100644 user_center/interface/oauth.php create mode 100644 user_center/libraries/app.php create mode 100644 user_center/libraries/auth.php create mode 100644 user_center/libraries/database.php create mode 100644 user_center/libraries/entrance.php create mode 100644 user_center/libraries/hash.php create mode 100644 user_center/libraries/ip.php create mode 100644 user_center/libraries/log.php create mode 100644 user_center/libraries/mail.php create mode 100644 user_center/libraries/post.php create mode 100644 user_center/libraries/setting.php create mode 100644 user_center/libraries/task.php create mode 100644 user_center/libraries/user.php create mode 100644 user_center/template/403.html create mode 100644 user_center/template/agreement.html create mode 100644 user_center/template/authentication/authentication.html create mode 100644 user_center/template/authentication/failed.html create mode 100644 user_center/template/authentication/success.html create mode 100644 user_center/template/log/en_US.html create mode 100644 user_center/template/log/zh_CN.html create mode 100644 user_center/template/logWarn/en_US.html create mode 100644 user_center/template/logWarn/zh_CN.html create mode 100644 user_center/template/oauth/en_US.html create mode 100644 user_center/template/oauth/zh_CN.html create mode 100644 user_center/template/reg/en_US.html create mode 100644 user_center/template/reg/zh_CN.html create mode 100644 user_center/template/regMail/en_US.html create mode 100644 user_center/template/regMail/zh_CN.html create mode 100644 user_center/template/regMailCheck/failed_en_US.html create mode 100644 user_center/template/regMailCheck/failed_zh_CN.html create mode 100644 user_center/template/regMailCheck/success_en_US.html create mode 100644 user_center/template/regMailCheck/success_zh_CN.html diff --git a/LICENSE b/LICENSE index 2071b23..0710f05 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) +Copyright (c) 2022 Bigsk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index 4a1a296..a7f6804 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ # fmhsong -凤高点歌系统 Ver1 \ No newline at end of file +凤高点歌系统 Ver1 Alpha + +本系统存在BUG,且不再后续更新 + +需要更多支持,请关注后续项目[InfiniteMusic](https://gitea.ghink.net/ghink/InfiniteMusic) + +使用Python Flask构建,对接Ghink Center Ver2 \ No newline at end of file diff --git a/api/getCookie.py b/api/getCookie.py new file mode 100644 index 0000000..f874126 --- /dev/null +++ b/api/getCookie.py @@ -0,0 +1,13 @@ +import requests,json + + +def main(): + cookies=[""] + session=requests.session() + info={"phone":"","md5_password":cookies[0]} + cookie=json.loads(session.post("https://music-netease.vercel.app/login/cellphone",data=info).text)["cookie"] + with open("cookie.conf","w+") as fp: + fp.write(cookie) + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/api/id/index.php b/api/id/index.php new file mode 100644 index 0000000..71ea51c --- /dev/null +++ b/api/id/index.php @@ -0,0 +1,39 @@ +prepare("SELECT `sid`, `name`, `alid`, `arid`, `hash` FROM `songs` WHERE `sid`=?"); + $sql->bind_param("i",$id); + $sql->execute(); + $sql->bind_result($sid,$name,$alid,$arid,$hash); + while($sql->fetch()){ + array_push($songs,array("sid"=>$sid,"name"=>$name,"alid"=>$alid,"arid"=>$arid,"hash"=>$hash)); + } + //理顺结果 + foreach ($songs as $value){ + $artistsFormat=array(); + foreach (json_decode($value["arid"]) as $value2){ + array_push($artistsFormat,getArtist($conn,$value2)); + } + $albumFormat=getAlbum($conn,$value["alid"]); + array_push($result,array("id"=>$value["sid"],"name"=>$value["name"],"url"=>"https://cache.music.ghink.net/song/".$value["hash"],"hash"=>$value["hash"],"ar"=>$artistsFormat,"al"=>$albumFormat)); + } + $conn->close(); + exit(json_encode(array("status"=>"success","message"=>"success","result"=>$result))); +}else{ + exit(json_encode(array("status"=>"failed","message"=>"need song info"))); +} \ No newline at end of file diff --git a/api/index.json b/api/index.json new file mode 100644 index 0000000..72b693f --- /dev/null +++ b/api/index.json @@ -0,0 +1 @@ +{"status":"success","code":200} \ No newline at end of file diff --git a/api/libraries/entrance.php b/api/libraries/entrance.php new file mode 100644 index 0000000..d04bd49 --- /dev/null +++ b/api/libraries/entrance.php @@ -0,0 +1,15 @@ +prepare("SELECT `sid`, `name`, `alias`, `alid`, `arid`, `hash` FROM `songs` WHERE `name`=?"); + $sql->bind_param("s",$sName); + $sql->execute(); + $sql->bind_result($sid,$name,$alias,$alid,$arid,$hash); + $name=""; + while($sql->fetch()){ + if($name==$sName){ + $rSId=$sid; + $rName=$name; + $rAlias=$alias; + $rArId=$arid; + $rAlId=$alid; + $rHash=$hash; + } + } + if($name!="" && json_decode($rArId)==json_decode($sArid)){ + return array("sid"=>$rSId,"name"=>$rName,"alias"=>$rAlias,"arid"=>json_decode($rArId),"alid"=>$rAlId,"hash"=>$rHash); + }else{ + $sql=$conn->prepare("INSERT INTO `songs`(`name`, `alias`, `alid`, `arid`, `hash`) VALUES (?,?,?,?,?)"); + $sql->bind_param("ssiss",$sName,$sAlias,$sAlid,$sArid,$sHash); + $sql->execute(); + $sid=mysqli_insert_id($conn); + return array("sid"=>$sid,"name"=>$sName,"alias"=>$sAlias,"arid"=>json_decode($sArid),"alid"=>$sAlid,"hash"=>$sHash); + } +} +function addAlbum($conn,$alName,$alAlias=NULL,$alCover=NULL){ + $sql=$conn->prepare("SELECT `alid`, `name`, `alias`, `cover` FROM `albums` WHERE `name`=?"); + $sql->bind_param("s",$alName); + $sql->execute(); + $sql->bind_result($alid,$name,$alias,$cover); + $name=""; + while($sql->fetch()){ + if($name==$alName){ + $rAlId=$alid; + $rName=$name; + $rAlias=$alias; + $rCover=$cover; + } + } + if($rName!=""){ + return array("alid"=>$rAlId,"name"=>$rName,"alias"=>$rAlias,"cover"=>$rCover); + }else{ + $sql=$conn->prepare("INSERT INTO `albums`(`name`, `alias`, `cover`) VALUES (?,?,?)"); + $sql->bind_param("sss",$alName,$alAlias,$alCover); + $sql->execute(); + $alid=mysqli_insert_id($conn); + return array("alid"=>$alid,"name"=>$alName,"alias"=>$alAlias,"cover"=>$alCover); + } +} +function addArtist($conn,$arName,$arAlias=NULL,$arPic=NULL){ + $sql=$conn->prepare("SELECT `arid`, `name`, `alias`, `pic` FROM `artists` WHERE `name`=?"); + $sql->bind_param("s",$arName); + $sql->execute(); + $sql->bind_result($arid,$name,$alias,$pic); + $name=""; + while($sql->fetch()){ + if($name==$arName){ + $rArId=$arid; + $rName=$name; + $rAlias=$alias; + $rPic=$pic; + } + } + if($name!=""){ + return array("arid"=>$rArId,"name"=>$rName,"alias"=>$rAlias,"pic"=>$rPic); + }else{ + $sql=$conn->prepare("INSERT INTO `artists`(`name`, `alias`, `pic`) VALUES (?,?,?)"); + $sql->bind_param("sss",$arName,$arAlias,$arPic); + $sql->execute(); + $arid=mysqli_insert_id($conn); + return array("arid"=>$arid,"name"=>$arName,"alias"=>$arAlias,"pic"=>$arPic); + } +} +function getArtist($conn,$arid){ + $sql=$conn->prepare("SELECT `arid`, `name`, `alias`, `pic` FROM `artists` WHERE `arid`=?"); + $sql->bind_param("i",$arid); + $sql->execute(); + $sql->bind_result($arid,$name,$alias,$pic); + $name=""; + while($sql->fetch()){ + $rArId=$arid; + $rName=$name; + $rAlias=$alias; + $rPic=$pic; + } + return array("arid"=>$rArId,"name"=>$rName,"alias"=>$rAlias,"pic"=>$rPic); +} +function getAlbum($conn,$alid){ + $sql=$conn->prepare("SELECT `alid`, `name`, `alias`, `cover` FROM `albums` WHERE `alid`=?"); + $sql->bind_param("i",$alid); + $sql->execute(); + $sql->bind_result($alid,$name,$alias,$cover); + $name=""; + while($sql->fetch()){ + $rAlId=$alid; + $rName=$name; + $rAlias=$alias; + $rCover=$cover; + } + return array("alid"=>$rAlId,"name"=>$rName,"alias"=>$rAlias,"cover"=>$rCover); +} \ No newline at end of file diff --git a/api/libraries/key.php b/api/libraries/key.php new file mode 100644 index 0000000..027b413 --- /dev/null +++ b/api/libraries/key.php @@ -0,0 +1,13 @@ +$token,"tokenCheck"=>$tokenCheck); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAppToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } + //获取APP等级 + function checkLevel($token,$tokenCheck){ + $data=array("token"=>$token,"tokenCheck"=>$tokenCheck); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAppLevel",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/libraries/libraries/auth.php b/api/libraries/libraries/auth.php new file mode 100644 index 0000000..d6cfab1 --- /dev/null +++ b/api/libraries/libraries/auth.php @@ -0,0 +1,34 @@ +$token,"uid"=>$uid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAuth",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["auth"]; + }else{ + return false; + } + } + //查询用户实名信息 + function getData($token,$uid){ + $data=array("token"=>$token,"uid"=>$uid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getAuthInfo",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/libraries/libraries/main.php b/api/libraries/libraries/main.php new file mode 100644 index 0000000..815c171 --- /dev/null +++ b/api/libraries/libraries/main.php @@ -0,0 +1,71 @@ +id=$sId; + $this->key=$sKey; + $token=new token; + $this->token=$token->getTokenApp($this->id,$this->key); + if($this->token==false){ + die("Connect to Ghink Center failed!"); + } + } + //检查APP Token是否有效 + function checkTokenApp($token){ + $app=new app; + return $app->checkToken($this->token,$token); + } + //查询APP开发者等级 + function checkLevelApp($token){ + $app=new app; + return $app->checkLevel($this->token,$token); + } + //拼接oauth地址 + function loginAddr($tid,$location){ + return "https://center.ghink.net/v1/interface/oauth.php?type=oauth&tid=".$tid."&location=".$location; + } + //检查用户Token + function checkToken($token){ + $user=new user; + return $user->checkToken($token,$this->token); + } + //申请登录任务 + function applyLogin(){ + $task=new task; + return $task->applyOauth($this->token); + } + //检查登录是否成功 + function checkLogin($tid){ + $token=new token; + return $token->getTokenUsr($this->token,$tid); + } + //读取用户uid + function getUid($token){ + $user=new user; + return $user->getUid($token,$this->token); + } + //读取用户名 + function getName($uid){ + $user=new user; + return $user->getName($uid,$this->token); + } + //检查用户是否实名 + function checkAuth($uid){ + $auth=new auth; + return $auth->check($this->token,$uid); + } + //读取用户实名信息 + function readAuth($uid){ + $auth=new auth; + return $auth->getData($this->token,$uid); + } +} \ No newline at end of file diff --git a/api/libraries/libraries/post.php b/api/libraries/libraries/post.php new file mode 100644 index 0000000..fd2a398 --- /dev/null +++ b/api/libraries/libraries/post.php @@ -0,0 +1,27 @@ + array( + 'method' => 'POST', + 'header' => 'Content-type:application/x-www-form-urlencoded', + 'content' => $postdata, + 'timeout' => 15*60 + ), + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $context=stream_context_create($options); + $result=file_get_contents($url,false,$context); + return $result; +} \ No newline at end of file diff --git a/api/libraries/libraries/setting.php b/api/libraries/libraries/setting.php new file mode 100644 index 0000000..038259a --- /dev/null +++ b/api/libraries/libraries/setting.php @@ -0,0 +1,13 @@ +$token); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=authTask",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["tid"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/libraries/libraries/token.php b/api/libraries/libraries/token.php new file mode 100644 index 0000000..0de4fa4 --- /dev/null +++ b/api/libraries/libraries/token.php @@ -0,0 +1,34 @@ +$sId,"skey"=>$sKey); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=appToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["token"]; + }else{ + return false; + } + } + //取回用户Token + function getTokenUsr($token,$tid){ + $data=array("token"=>$token,"tid"=>$tid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=authBack",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["token"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/libraries/libraries/user.php b/api/libraries/libraries/user.php new file mode 100644 index 0000000..4e600cd --- /dev/null +++ b/api/libraries/libraries/user.php @@ -0,0 +1,45 @@ +$tokenUsr,"tokenApp"=>$tokenApp); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getUid",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["uid"]; + }else{ + return false; + } + } + //检查用户Token是否有效 + function checkToken($tokenUsr,$tokenApp){ + $data=array("tokenUsr"=>$tokenUsr,"tokenApp"=>$tokenApp); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return true; + }else{ + return false; + } + } + //取回昵称 + function getName($uid,$token){ + $data=array("uid"=>$uid,"token"=>$token); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getName",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["name"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/new/index.php b/api/new/index.php new file mode 100644 index 0000000..230397c --- /dev/null +++ b/api/new/index.php @@ -0,0 +1,134 @@ +checkTokenApp($_POST["token"])){ + if($debug || @$sdk->checkLevelApp($_POST["token"])=="official"){ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + switch (@$_POST["pid"]){ + case "0": + $conn->close(); + exit(); + case "1"://手动添加 + if(@$_POST["info"]!=""){ + $json=json_decode($_POST["info"]); + }else{ + exit(json_encode(array("status"=>"failed","message"=>"need song info"))); + } + $conn->close(); + exit(); + case "2"://网易云 + if(@$_POST["sid"]!=""){ + //不阻塞开关 + if(@$_POST["noWait"]=="true"){ + echo(json_encode(array("status"=>"success","message"=>"task add success"))); + fastcgi_finish_request(); + } + //取回cookie + $cookie=file_get_contents("../cookie.conf"); + //拉取歌曲信息 + $details=json_decode(file_get_contents("http://cloud-music.pl-fe.cn/song/detail?ids=".$_POST["sid"]."&cookie=".urlencode($cookie))); + $sql=$conn->prepare("SELECT `sid`, `name`, `alias`, `alid`, `arid`, `hash` FROM `songs` WHERE `name`=?"); + $sql->bind_param("s",$details->songs[0]->name); + $sql->execute(); + $sql->bind_result($sid,$name,$alias,$alid,$arid,$hash); + $rName=""; + while($sql->fetch()){ + if($name==$details->songs[0]->name){ + $rSId=$sid; + $rName=$name; + $rAlias=$alias; + $rAlId=$alid; + $rArId=$arid; + $rHash=$hash; + } + } + //检测是否已经存在 + //理顺歌手信息 + $artists=$details->songs[0]->ar; + $artistsFormat=array(); + foreach ($artists as $value){ + array_push($artistsFormat,addArtist($conn,$value->name)); + } + $artistsList=array(); + foreach ($artistsFormat as $value){ + array_push($artistsList,$value["arid"]); + } + //检索本地歌手信息 + $artistsLocal=array(); + foreach (json_decode($rArId) as $value){ + array_push($artistsLocal,getArtist($conn,$value)); + } + if($rName==$details->songs[0]->name && $artistsList==$artistsLocal){ + $album=getAlbum($conn,$rAlId); + echo(json_encode(array("status"=>"success","message"=>"success","result"=>array("id"=>$rSId,"name"=>$rName,"url"=>"https://cache.music.ghink.net/song/".$rHash,"hash"=>$rHash,"ar"=>$artistsLocal,"al"=>$album)))); + }else{ + //判断是否有返回值 + if(count($details->songs)==0){ + echo(json_encode(array("status"=>"failed","message"=>"cannot find the song"))); + }else{ + //拉取URL + $data=json_decode(file_get_contents("http://cloud-music.pl-fe.cn/song/url?id=".$_POST["sid"]."&cookie=".urlencode($cookie))); + $url=$data->data[0]->url; + //判断是否拉取成功(避免网易云去世) + if($url!=""){ + //拉取歌曲文件信息 + $md5=$data->data[0]->md5; + $name=$details->songs[0]->name; + //拉取封面 + $coverUrl=$details->songs[0]->al->picUrl; + $coverFile=file_get_contents($coverUrl); + $coverHash=md5($coverFile); + file_put_contents("../cache/cover/".$coverHash,$coverFile); + //理顺专辑信息 + $albumFormat=addAlbum($conn,$details->songs[0]->al->name,NULL,$coverHash); + //拉取歌曲文件 + while (true){ + $songFile=file_get_contents($url); + $songHash=md5($songFile); + if($songHash==$md5){ + break; + } + } + file_put_contents("../cache/song/".$songHash,$songFile); + //入库 + $song=addSong($conn,$name,$albumFormat["alid"],json_encode($artistsList),$md5); + //输出 + echo(json_encode(array("status"=>"success","message"=>"success","result"=>array("id"=>$song["sid"],"name"=>$song['name'],"url"=>"https://cache.music.ghink.net/song/".$song['hash'],"hash"=>$song['hash'],"ar"=>$artistsFormat,"al"=>$albumFormat)))); + }else{ + echo(json_encode(array("status"=>"failed","message"=>"failed to quest the api"))); + } + } + } + }else{ + echo(json_encode(array("status"=>"failed","message"=>"need song info"))); + } + $conn->close(); + exit(); + default: + $conn->close(); + exit(json_encode(array("status"=>"failed","message"=>"wrong platform"))); + } + }else{ + exit(json_encode(array("status"=>"failed","message"=>"no permission"))); + } + }else{ + exit(json_encode(array("status"=>"failed","message"=>"wrong app token"))); + } + }else{ + exit(json_encode(array("status"=>"failed","message"=>"need song info"))); + } +}else{ + exit(json_encode(array("status"=>"failed","message"=>"need app token"))); +} \ No newline at end of file diff --git a/api/new/logs.txt b/api/new/logs.txt new file mode 100644 index 0000000..00b69f7 --- /dev/null +++ b/api/new/logs.txt @@ -0,0 +1 @@ +[20, 21][20,21] \ No newline at end of file diff --git a/api/search/index.php b/api/search/index.php new file mode 100644 index 0000000..ef49958 --- /dev/null +++ b/api/search/index.php @@ -0,0 +1,39 @@ +prepare("SELECT `sid`, `name`, `alid`, `arid`, `hash` FROM `songs` WHERE `name` LIKE ? OR `sid`=?"); + $keyword="%".$_GET['keyword']."%"; + $sql->bind_param("si",$keyword,$_GET['keyword']); + $sql->execute(); + $sql->bind_result($sid,$name,$alid,$arid,$hash); + while($sql->fetch()){ + array_push($songs,array("sid"=>$sid,"name"=>$name,"alid"=>$alid,"arid"=>$arid,"hash"=>$hash)); + } + //理顺结果 + foreach ($songs as $value){ + $artistsFormat=array(); + foreach (json_decode($value["arid"]) as $value2){ + array_push($artistsFormat,getArtist($conn,$value2)); + } + $albumFormat=getAlbum($conn,$value["alid"]); + array_push($result,array("id"=>$value["sid"],"name"=>$value["name"],"url"=>"https://cachev1.radio.fmhs.club/song/".$value["hash"],"hash"=>$value["hash"],"ar"=>$artistsFormat,"al"=>$albumFormat)); + } + $conn->close(); + exit(json_encode(array("status"=>"success","message"=>"success","result"=>$result))); +}else{ + exit(json_encode(array("status"=>"failed","message"=>"need song info"))); +} \ No newline at end of file diff --git a/database/fmhs_music.sql b/database/fmhs_music.sql new file mode 100644 index 0000000..663285e --- /dev/null +++ b/database/fmhs_music.sql @@ -0,0 +1,103 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- 数据库: `fmhs_music` +-- + +-- -------------------------------------------------------- + +-- +-- 表的结构 `albums` +-- + +CREATE TABLE `albums` ( + `alid` int(11) NOT NULL, + `name` text NOT NULL, + `alias` json DEFAULT NULL, + `cover` text +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `artists` +-- + +CREATE TABLE `artists` ( + `arid` int(11) NOT NULL, + `name` text NOT NULL, + `alias` json DEFAULT NULL, + `pic` text +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `songs` +-- + +CREATE TABLE `songs` ( + `sid` int(11) NOT NULL, + `name` text NOT NULL, + `alias` json DEFAULT NULL, + `alid` int(11) NOT NULL, + `arid` json NOT NULL, + `hash` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- 转储表的索引 +-- + +-- +-- 表的索引 `albums` +-- +ALTER TABLE `albums` + ADD PRIMARY KEY (`alid`); + +-- +-- 表的索引 `artists` +-- +ALTER TABLE `artists` + ADD PRIMARY KEY (`arid`); + +-- +-- 表的索引 `songs` +-- +ALTER TABLE `songs` + ADD PRIMARY KEY (`sid`); + +-- +-- 在导出的表使用AUTO_INCREMENT +-- + +-- +-- 使用表AUTO_INCREMENT `albums` +-- +ALTER TABLE `albums` + MODIFY `alid` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- 使用表AUTO_INCREMENT `artists` +-- +ALTER TABLE `artists` + MODIFY `arid` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- 使用表AUTO_INCREMENT `songs` +-- +ALTER TABLE `songs` + MODIFY `sid` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/database/fmhs_radio_song.sql b/database/fmhs_radio_song.sql new file mode 100644 index 0000000..c23cdbf --- /dev/null +++ b/database/fmhs_radio_song.sql @@ -0,0 +1,151 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- 数据库: `fmhs_radio_song` +-- + +-- -------------------------------------------------------- + +-- +-- 表的结构 `blacklist` +-- + +CREATE TABLE `blacklist` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `history` +-- + +CREATE TABLE `history` ( + `date` date NOT NULL, + `list` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `record` +-- + +CREATE TABLE `record` ( + `recId` int(11) NOT NULL, + `date` date NOT NULL, + `pid` int(11) NOT NULL, + `id` text NOT NULL, + `uid` int(11) NOT NULL, + `time` bigint(20) NOT NULL, + `status` text +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `system` +-- + +CREATE TABLE `system` ( + `notice` longtext NOT NULL, + `timeInterval` text NOT NULL, + `openWeek` text NOT NULL, + `refreshDay` tinyint(4) NOT NULL, + `switcher` tinytext NOT NULL, + `ignoreTime` tinytext NOT NULL, + `systemKey` tinyint(4) NOT NULL DEFAULT '1' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `users` +-- + +CREATE TABLE `users` ( + `uid` int(11) NOT NULL, + `type` text NOT NULL, + `nickname` text NOT NULL, + `songNumsLimit` int(11) NOT NULL DEFAULT '1000', + `songTimeUsed` int(11) NOT NULL DEFAULT '0', + `songLastTime` date NOT NULL DEFAULT '1970-01-01', + `name` text, + `status` tinytext, + `ban` tinytext, + `message` longtext, + `auth` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `whitelist` +-- + +CREATE TABLE `whitelist` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- 转储表的索引 +-- + +-- +-- 表的索引 `blacklist` +-- +ALTER TABLE `blacklist` + ADD PRIMARY KEY (`id`); + +-- +-- 表的索引 `history` +-- +ALTER TABLE `history` + ADD PRIMARY KEY (`date`); + +-- +-- 表的索引 `record` +-- +ALTER TABLE `record` + ADD PRIMARY KEY (`recId`); + +-- +-- 表的索引 `system` +-- +ALTER TABLE `system` + ADD PRIMARY KEY (`systemKey`); + +-- +-- 表的索引 `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`uid`); + +-- +-- 表的索引 `whitelist` +-- +ALTER TABLE `whitelist` + ADD PRIMARY KEY (`id`); + +-- +-- 在导出的表使用AUTO_INCREMENT +-- + +-- +-- 使用表AUTO_INCREMENT `record` +-- +ALTER TABLE `record` + MODIFY `recId` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/site/admin/auth.php b/site/admin/auth.php new file mode 100644 index 0000000..da9fe54 --- /dev/null +++ b/site/admin/auth.php @@ -0,0 +1,91 @@ + + + + + + + 管理后台 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/site/admin/index.php b/site/admin/index.php new file mode 100644 index 0000000..91b7df7 --- /dev/null +++ b/site/admin/index.php @@ -0,0 +1,91 @@ + + + + + + + 管理后台 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/site/admin/list.php b/site/admin/list.php new file mode 100644 index 0000000..e86778c --- /dev/null +++ b/site/admin/list.php @@ -0,0 +1,92 @@ + + + + + + + + 管理后台-凤鸣高级中学广播站 + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/site/admin/song.php b/site/admin/song.php new file mode 100644 index 0000000..da4dadc --- /dev/null +++ b/site/admin/song.php @@ -0,0 +1,159 @@ + + + + + + + + 管理后台-凤鸣高级中学广播站 + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/site/center/auth.php b/site/center/auth.php new file mode 100644 index 0000000..638cfe3 --- /dev/null +++ b/site/center/auth.php @@ -0,0 +1,100 @@ + + + + + + + 实名认证系统 - 凤鸣高级中学广播站 + + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/site/center/authProcess.php b/site/center/authProcess.php new file mode 100644 index 0000000..da8a5f1 --- /dev/null +++ b/site/center/authProcess.php @@ -0,0 +1,48 @@ +alert('".$text."');"; +} + +if ((($_FILES["upload"]["type"] == "image/gif") +|| ($_FILES["upload"]["type"] == "image/jpeg") +|| ($_FILES["upload"]["type"] == "image/jpg") +|| ($_FILES["upload"]["type"] == "image/pjpeg") +|| ($_FILES["upload"]["type"] == "image/x-png") +|| ($_FILES["upload"]["type"] == "image/png")) +&& in_array($extension, $allowedExts)){ + if ($_FILES["uploadfile"]["error"] > 0){ + alert("错误:".$_FILES["upload"]["error"]); + }else{ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $file=file_get_contents($_FILES["upload"]["tmp_name"]); + $file=base64_encode($file); + $info=json_encode(array($_FILES["upload"]["type"],$file)); + $sql=$conn->prepare("UPDATE `users` SET `auth`=? WHERE `uid`=?"); + $sql->bind_param("si",$info,$_COOKIE["uid"]); + $sql->execute(); + $conn->close(); + alert("上传成功!请等待审核!"); + /* + alert("上传文件名: ".$_FILES["upload"]["name"]); + alert("文件类型: ".$_FILES["upload"]["type"]); + alert("文件大小: ".($_FILES["upload"]["size"] / 1024)."kB"); + alert("文件临时存储的位置: ".$_FILES["upload"]["tmp_name"]); + if (file_exists("upload/".$_FILES["upload"]["name"])){ + alert($_FILES["upload"]["name"]." 文件已经存在"); + }else{ + move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/".$_FILES["upload"]["name"]); + alert("文件存储在: "."upload/".$_FILES["upload"]["name"]); + } + */ + } +}else{ + alert("非法的文件格式"); +} +echo ""; \ No newline at end of file diff --git a/site/center/entrance.php b/site/center/entrance.php new file mode 100644 index 0000000..d04bd49 --- /dev/null +++ b/site/center/entrance.php @@ -0,0 +1,15 @@ +$token,"tokenCheck"=>$tokenCheck); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAppToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } + //获取APP等级 + function checkLevel($token,$tokenCheck){ + $data=array("token"=>$token,"tokenCheck"=>$tokenCheck); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAppLevel",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/site/center/libraries/auth.php b/site/center/libraries/auth.php new file mode 100644 index 0000000..d6cfab1 --- /dev/null +++ b/site/center/libraries/auth.php @@ -0,0 +1,34 @@ +$token,"uid"=>$uid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkAuth",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["auth"]; + }else{ + return false; + } + } + //查询用户实名信息 + function getData($token,$uid){ + $data=array("token"=>$token,"uid"=>$uid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getAuthInfo",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["result"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/site/center/libraries/main.php b/site/center/libraries/main.php new file mode 100644 index 0000000..815c171 --- /dev/null +++ b/site/center/libraries/main.php @@ -0,0 +1,71 @@ +id=$sId; + $this->key=$sKey; + $token=new token; + $this->token=$token->getTokenApp($this->id,$this->key); + if($this->token==false){ + die("Connect to Ghink Center failed!"); + } + } + //检查APP Token是否有效 + function checkTokenApp($token){ + $app=new app; + return $app->checkToken($this->token,$token); + } + //查询APP开发者等级 + function checkLevelApp($token){ + $app=new app; + return $app->checkLevel($this->token,$token); + } + //拼接oauth地址 + function loginAddr($tid,$location){ + return "https://center.ghink.net/v1/interface/oauth.php?type=oauth&tid=".$tid."&location=".$location; + } + //检查用户Token + function checkToken($token){ + $user=new user; + return $user->checkToken($token,$this->token); + } + //申请登录任务 + function applyLogin(){ + $task=new task; + return $task->applyOauth($this->token); + } + //检查登录是否成功 + function checkLogin($tid){ + $token=new token; + return $token->getTokenUsr($this->token,$tid); + } + //读取用户uid + function getUid($token){ + $user=new user; + return $user->getUid($token,$this->token); + } + //读取用户名 + function getName($uid){ + $user=new user; + return $user->getName($uid,$this->token); + } + //检查用户是否实名 + function checkAuth($uid){ + $auth=new auth; + return $auth->check($this->token,$uid); + } + //读取用户实名信息 + function readAuth($uid){ + $auth=new auth; + return $auth->getData($this->token,$uid); + } +} \ No newline at end of file diff --git a/site/center/libraries/post.php b/site/center/libraries/post.php new file mode 100644 index 0000000..df6469d --- /dev/null +++ b/site/center/libraries/post.php @@ -0,0 +1,27 @@ + array( + 'verify_peer' => false, + ), + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type:application/x-www-form-urlencoded', + 'content' => $postdata, + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + $result=file_get_contents($url,false,$context); + return $result; +} \ No newline at end of file diff --git a/site/center/libraries/setting.php b/site/center/libraries/setting.php new file mode 100644 index 0000000..038259a --- /dev/null +++ b/site/center/libraries/setting.php @@ -0,0 +1,13 @@ +$token); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=authTask",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["tid"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/site/center/libraries/token.php b/site/center/libraries/token.php new file mode 100644 index 0000000..0de4fa4 --- /dev/null +++ b/site/center/libraries/token.php @@ -0,0 +1,34 @@ +$sId,"skey"=>$sKey); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=appToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["token"]; + }else{ + return false; + } + } + //取回用户Token + function getTokenUsr($token,$tid){ + $data=array("token"=>$token,"tid"=>$tid); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=authBack",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["token"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/site/center/libraries/user.php b/site/center/libraries/user.php new file mode 100644 index 0000000..4e600cd --- /dev/null +++ b/site/center/libraries/user.php @@ -0,0 +1,45 @@ +$tokenUsr,"tokenApp"=>$tokenApp); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getUid",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["uid"]; + }else{ + return false; + } + } + //检查用户Token是否有效 + function checkToken($tokenUsr,$tokenApp){ + $data=array("tokenUsr"=>$tokenUsr,"tokenApp"=>$tokenApp); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=checkToken",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return true; + }else{ + return false; + } + } + //取回昵称 + function getName($uid,$token){ + $data=array("uid"=>$uid,"token"=>$token); + $result=sendPost("https://center.ghink.net/v1/interface/api.php?type=getName",$data); + $result=json_decode($result,true); + if($result["status"]=="success"){ + return $result["name"]; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/site/center/login.php b/site/center/login.php new file mode 100644 index 0000000..3eca444 --- /dev/null +++ b/site/center/login.php @@ -0,0 +1,91 @@ +checkLogin($_GET["tid"]); + $uid=$sdk->getUid($token); + $nicknameRead=$sdk->getName($uid); + $authInfo=json_decode($sdk->readAuth($uid)); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `ban`,`type` FROM `users` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($ban,$type); + while($sql->fetch()){ + $rBan=$ban; + $rType=$type; + } + if($rType==""){ + $name=$authInfo->idcard_confirm->name; + $number=$authInfo->idcard_confirm->idcard_number; + $authList=array(); + for($i=2019;$i<=2021;$i++){ + $authList=array_merge($authList,json_decode(file_get_contents("../song/information/".strval($i).".json"),true)); + } + $authStatus=null; + foreach ($authList as $value){ + if(md5($number)==$value && $number!=null){ + $authStatus="passed"; + } + } + $sql=$conn->prepare("SELECT `nickname` FROM `users` WHERE `name`=?"); + $sql->bind_param("s",$name); + $sql->execute(); + $sql->bind_result($nickname); + while($sql->fetch()){ + $rNickname=$nickname; + } + if($rNickname==""){ + $type="user"; + $sql=$conn->prepare("INSERT INTO `users`(`uid`, `type`, `nickname`, `name`, `status`) VALUES (?,?,?,?,?)"); + $sql->bind_param('issss',$uid,$type,$nicknameRead,$name,$authStatus); + $sql->execute(); + setcookie("token",$token,$ts+604800,"/"); + setcookie("uid",$uid,$ts+604800,"/"); + setcookie("name",$nicknameRead,$ts+604800,"/"); + }else{ + exit(""); + } + }else if($rBan=="true"){ + exit(""); + }else{ + $name=$authInfo->idcard_confirm->name; + $number=$authInfo->idcard_confirm->idcard_number; + $authList=array(); + for($i=2019;$i<=2021;$i++){ + $authList=array_merge($authList,json_decode(file_get_contents("../song/information/".strval($i).".json"),true)); + } + $authStatus=null; + foreach ($authList as $value){ + if(md5($number)==$value && $number!=null){ + $authStatus="passed"; + } + } + $sql=$conn->prepare("UPDATE `users` SET `name`=?,`nickname`=?,`status`=? WHERE `uid`=?"); + $sql->bind_param('sssi',$name,$nicknameRead,$authStatus,$uid); + $sql->execute(); + setcookie("token",$token,$ts+604800,"/"); + setcookie("uid",$uid,$ts+604800,"/"); + setcookie("name",$nicknameRead,$ts+604800,"/"); + } + $conn->close(); + header("location:".$_COOKIE["refer"]); + }else{ + echo "登录失败!"; + } + exit(); + default: + setcookie("refer",$_GET["location"],$ts+604800,"/"); + $tid=$sdk->applyLogin(); + $location=urlencode("https://radio.fmhs.club/center/login.php?type=callBack&tid=".$tid); + header("location:".$sdk->loginAddr($tid,$location)); + } +}else{ + header("location:".$_GET["location"]); +} \ No newline at end of file diff --git a/site/center/logout.php b/site/center/logout.php new file mode 100644 index 0000000..09559d0 --- /dev/null +++ b/site/center/logout.php @@ -0,0 +1,5 @@ + + + + + + + 个人信息 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/site/song/api.php b/site/song/api.php new file mode 100644 index 0000000..3968f0e --- /dev/null +++ b/site/song/api.php @@ -0,0 +1,450 @@ +$toDay){//星期日到星期五 + $used=0; + } + } + if(($limit-$used)>0){ + return true; + }else{ + return false; + } +} +function getSat(){ + $ts=time(); + $today=date("w",$ts); + if($today==6){ + return date("Y-m-d",$today); + }else{ + $result=$ts-(84600*abs($today+1)); + return date("Y-m-d",$result); + } +} +function sendGet($url, $get_data) { + $result="?"; + foreach ($get_data as $key => $value){ + if($key==end($get_data)){ + $result=$result.$key."=".urlencode($value); + }else{ + $result=$result.$key."=".urlencode($value)."&"; + } + } + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + return file_get_contents($url.$result, false, $cxContext); +} + +if(@$_GET["type"]!=""){ + switch($_GET["type"]){ + case "system": + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `notice`,`switcher`,`ignoreTime`,`timeInterval` FROM `system` WHERE `systemKey`=1"); + $sql->execute(); + $sql->bind_result($notice,$switcher,$ignoreTime,$timeInterval); + while($sql->fetch()){ + $rNotice=$notice; + $rSwitcher=$switcher; + $rIgnoreTime=$ignoreTime; + $rTimeInterval=$timeInterval; + } + if($rSwitcher=="true"){ + $rSwitcher=true; + }else{ + $rSwitcher=false; + } + if($rIgnoreTime=="true"){ + $rIgnoreTime=true; + }else{ + $rIgnoreTime=false; + } + $conn->close(); + exit(json_encode(array("notice"=>$rNotice,"switcher"=>$rSwitcher,"igTime"=>$rIgnoreTime,"timeInt"=>json_decode($rTimeInterval)))); + break; + case "user": + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>false))); + }else{ + if(!$sdk->checkToken($_COOKIE["token"])){ + setcookie("token","",-1,"/"); + setcookie("uid","",-1,"/"); + setcookie("name","",-1,"/"); + header("Refresh:0"); + $conn->close(); + exit(json_encode(array("status"=>false))); + }else{ + //刷新账号信息 + $uid=$sdk->getUid($_COOKIE["token"]); + $nicknameRead=$sdk->getName($uid); + $authInfo=json_decode($sdk->readAuth($uid)); + $name=$authInfo->idcard_confirm->name; + $number=$authInfo->idcard_confirm->idcard_number; + $authList=array(); + for($i=2019;$i<=2021;$i++){ + $authList=array_merge($authList,json_decode(file_get_contents("information/".strval($i).".json"),true)); + } + $authStatus=null; + foreach ($authList as $value){ + if(md5($number)==$value && $number!=null){ + $authStatus="passed"; + } + } + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("UPDATE `users` SET `name`=?,`nickname`=?,`status`=? WHERE `uid`=?"); + echo mysqli_error($conn); + $sql->bind_param('sssi',$name,$nicknameRead,$authStatus,$uid); + $sql->execute(); + $sql=$conn->prepare("SELECT `status`,`songNumsLimit`,`songTimeUsed`,`songLastTime`,`name`,`type`,`auth` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$_COOKIE["uid"]); + $sql->execute(); + $sql->bind_result($status,$songNumsLimit,$songTimeUsed,$songLastTime,$name,$type,$auth); + while($sql->fetch()){ + $rStatus=$status; + $rSongTimeLimit=$songNumsLimit; + $rSongTimeUsed=$songTimeUsed; + $rSongLastTime=$songLastTime; + $rName=$name; + $rType=$type; + $rAuth=$auth; + } + if($rStatus=="passed"){ + $auth=true; + }else{ + $auth=false; + } + if($rAuth!=null){ + $examineAuth=true; + }else{ + $examineAuth=false; + } + $conn->close(); + $ghinkAuth=$sdk->checkAuth(intval($_COOKIE["uid"])); + exit(json_encode(array("status"=>true,"detail"=>array("uid"=>$_COOKIE["uid"],"nickname"=>$_COOKIE["name"],"name"=>$name,"auth"=>$auth,"examineAuth"=>$examineAuth,"ghinkAuth"=>$ghinkAuth,"type"=>$rType,"song"=>array("limit"=>$rSongTimeLimit,"used"=>$rSongTimeUsed,"last"=>$rSongLastTime,"balace"=>songBalace($rSongTimeLimit,$rSongTimeUsed,$rSongLastTime)))))); + } + } + break; + case "list": + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取黑名单 + $black=array(); + $sql=$conn->prepare("SELECT `id` FROM `blacklist` WHERE 1"); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + $result=json_decode(file_get_contents("https://apiv1.radio.fmhs.club/id/?id=".$id, false, $cxContext)); + array_push($black,$result->result[0]); + } + + //获取白名单 + $white=array(); + $sql=$conn->prepare("SELECT `id` FROM `whitelist` WHERE 1"); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + $result=json_decode(file_get_contents("https://apiv1.radio.fmhs.club/id/?id=".$id, false, $cxContext)); + array_push($white,$result->result[0]); + } + $list=array("white"=>$white,"black"=>$black); + $conn->close(); + exit(json_encode($list)); + break; + case "record": + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取列表 + $records=array(); + $sql=$conn->prepare("SELECT `date`, `id`, `uid` FROM `record` WHERE `status`=\"passed\" ORDER BY `time` DESC"); + $sql->execute(); + $sql->bind_result($date,$id,$uid); + while($sql->fetch()){ + + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + $result=json_decode(file_get_contents("https://apiv1.radio.fmhs.club/id/?id=".$id, false, $cxContext)); + array_push($records,array("date"=>$date,"user"=>$uid,"song"=>$result->result[0])); + } + foreach ($records as $key => $value){ + $sql=$conn->prepare("SELECT `nickname` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$records[$key]["user"]); + $sql->execute(); + $sql->bind_result($nickname); + while($sql->fetch()){ + $records[$key]["user"]=$nickname; + } + } + $conn->close(); + exit(json_encode($records)); + break; + case "myRecord": + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>false))); + }else{ + if(!$sdk->checkToken($_COOKIE["token"])){ + setcookie("token","",-1,"/"); + setcookie("uid","",-1,"/"); + setcookie("name","",-1,"/"); + header("Refresh:0"); + $conn->close(); + exit(json_encode(array("status"=>false))); + }else{ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取列表 + $records=array(); + $sql=$conn->prepare("SELECT `date`, `id` FROM `record` WHERE `uid`=? ORDER BY `date` DESC"); + $sql->bind_param("i",$_COOKIE["uid"]); + $sql->execute(); + $sql->bind_result($date,$id); + while($sql->fetch()){ + + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + $result=json_decode(file_get_contents("https://apiv1.radio.fmhs.club/id/?id=".$id, false, $cxContext)); + array_push($records,array("date"=>$date,"song"=>$result->result[0])); + } + $conn->close(); + exit(json_encode($records)); + } + } + break; + case "playlist": + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取列表 + $records=array(); + $sql=$conn->prepare("SELECT `id`, `uid` FROM `record` WHERE `status`=\"passed\" AND `date`=? ORDER BY `time`"); + $sql->bind_param("s",date("Y-m-d",time())); + $sql->execute(); + $sql->bind_result($id,$uid); + while($sql->fetch()){ + + $aContext = array( + 'ssl' => array( + 'verify_peer' => false, + ), + ); + $cxContext = stream_context_create($aContext); + $result=json_decode(file_get_contents("https://apiv1.radio.fmhs.club/id/?id=".$id, false, $cxContext)); + array_push($records,array("user"=>$uid,"song"=>$result->result[0])); + } + foreach ($records as $key => $value){ + $sql=$conn->prepare("SELECT `nickname` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$records[$key]["user"]); + $sql->execute(); + $sql->bind_result($nickname); + while($sql->fetch()){ + $records[$key]["user"]=$nickname; + } + } + $conn->close(); + echo json_encode($records); + break; + case "adminAuth": + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>false))); + }else{ + if(!$sdk->checkToken($_COOKIE["token"])){ + setcookie("token","",-1,"/"); + setcookie("uid","",-1,"/"); + setcookie("name","",-1,"/"); + header("Refresh:0"); + $conn->close(); + exit(json_encode(array("status"=>false))); + }else{ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `type` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$_COOKIE["uid"]); + $sql->execute(); + $sql->bind_result($type); + while($sql->fetch()){ + $rType=$type; + } + if($rType=="member"){ + $authList=array(); + $sql=$conn->prepare("SELECT `uid`, `nickname`, `name`, `auth` FROM `users` WHERE `status` IS NULL AND `auth` IS NOT NULL"); + $sql->execute(); + $sql->bind_result($uid,$nickname,$name,$auth); + while($sql->fetch()){ + array_push($authList,array($uid,$nickname,$name,json_decode($auth))); + } + $conn->close(); + exit(json_encode(array("status"=>true,"detail"=>$authList))); + }else{ + $conn->close(); + exit(json_encode(array("status"=>false))); + } + } + } + break; + case "adminSong": + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>false))); + }else{ + if(!$sdk->checkToken($_COOKIE["token"])){ + setcookie("token","",-1,"/"); + setcookie("uid","",-1,"/"); + setcookie("name","",-1,"/"); + header("Refresh:0"); + $conn->close(); + exit(json_encode(array("status"=>false))); + }else{ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `recId`, `date`, `pid`, `id`, `uid`, `time` FROM `record` WHERE `status` IS NULL ORDER BY time"); + $sql->execute(); + $sql->bind_result($recId,$date,$pid,$id,$uid,$time); + $songFall=array(); + $outOfDateFall=array(); + while($sql->fetch()){ + if(($time/1000 >= strtotime(getSat())) || ((((strtotime($date) >= time())) && date("w",time())!=0) || (((time() - strtotime($date)) >= 86400)) && date("w",time())==0)){ + switch($pid){ + case 1: + $getData=array("keyword"=>$id); + $reqResult=json_decode(sendGet("https://apiv1.radio.fmhs.club/search/",$getData)); + foreach ($reqResult->result as $value){ + if($value->id==$id){ + $result=$value; + } + } + break; + } + array_push($songFall,array("recId"=>$recId,"date"=>$date,"pid"=>$pid,"id"=>$id,"uid"=>$uid,"time"=>$time,"detail"=>$result)); + }else{ + array_push($outOfDateFall,$recId); + } + } + for($i=0;$iprepare("UPDATE `record` SET `status`='outOfDate' WHERE `recId`=?"); + $sql->bind_param("i",intval($outOfDateFall[$i])); + $sql->execute(); + } + $conn->close(); + exit(json_encode(array("status"=>true,"detail"=>$songFall))); + } + } + break; + case "adminSongOperate": + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>false))); + }else{ + if(!$sdk->checkToken($_COOKIE["token"])){ + setcookie("token","",-1,"/"); + setcookie("uid","",-1,"/"); + setcookie("name","",-1,"/"); + header("Refresh:0"); + $conn->close(); + exit(json_encode(array("status"=>false))); + }else{ + if(@$_GET["operate"]!="" && @$_GET["recId"]!=""){ + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `id`,`status` FROM `record` WHERE `recId`=?"); + $recId=intval($_GET["recId"]); + $sql->bind_param("i",$recId); + $sql->execute(); + $sql->bind_result($id,$status); + $flag=false; + while($sql->fetch()){ + if($status==null){ + $flag=true; + } + $rId=$id; + } + if($flag && ($_GET["operate"]=="pass" || $_GET["operate"]=="reject" || $_GET["operate"]=="ignore")){ + $operate=array("pass"=>"passed","reject"=>"rejected","ignore"=>"ignored"); + $sql=$conn->prepare("UPDATE `record` SET `status`=? WHERE `recId`=?"); + $recId=intval($_GET["recId"]); + $sql->bind_param("si",$operate[$_GET["operate"]],$recId); + $sql->execute(); + if($_GET["operate"]=="pass"){ + $sql=$conn->prepare("SELECT `id` FROM `whitelist` WHERE `id`=?"); + $sql->bind_param("i",$rId); + $sql->execute(); + $sql->bind_result($id); + $exists=false; + while($sql->fetch()){ + if($id!=null){ + $exists=true; + } + } + if(!$exists){ + $sql=$conn->prepare("INSERT INTO `whitelist`(`id`) VALUES (?)"); + $sql->bind_param("i",$rId); + $sql->execute(); + } + }else if($_GET["operate"]=="reject"){ + $sql=$conn->prepare("SELECT `id` FROM `blacklist` WHERE `id`=?"); + $sql->bind_param("i",$rId); + $sql->execute(); + $sql->bind_result($id); + $exists=false; + while($sql->fetch()){ + if($id!=null){ + $exists=true; + } + } + if(!$exists){ + $sql=$conn->prepare("INSERT INTO `blacklist`(`id`) VALUES (?)"); + $sql->bind_param("i",$rId); + $sql->execute(); + } + } + echo json_encode(array("status"=>true)); + }else{ + echo json_encode(array("status"=>false)); + } + $conn->close(); + }else{ + echo json_encode(array("status"=>false)); + } + } + } + break; + default: + break; + } +} \ No newline at end of file diff --git a/site/song/confirm.php b/site/song/confirm.php new file mode 100644 index 0000000..002953c --- /dev/null +++ b/site/song/confirm.php @@ -0,0 +1,91 @@ +=604800){ + return true; + }else{ + if($refresh==6){ + $refresh=date("Y-m-d",strtotime(getDay($refresh))-604800); + if(strtotime($refresh)>=strtotime($last) && $limit!=0){ + return "true"; + }else{ + if(($limit-$used)>0){ + return "true"; + }else{ + return "false"; + } + } + }else{ + $refresh=getDay($refresh); + if(strtotime($refresh)<=strtotime($last) && $limit!=0){ + return "true"; + }else{ + if(($limit-$used)>0){ + return "true"; + }else{ + return "false"; + } + } + } + } +} +function getDay($week){ + $ts=time(); + $today=date("w",$ts); + if($today==0){ //礼拜天忽略当天禁止点播当天(审核日与节目日重合) + $result=$ts+(84600*abs($today-$week)); + return date("Y-m-d",$result); + }else if($today==6){ //礼拜六计算下个礼拜(当天放假) + $result=$ts+(84600*($week+1)); + return date("Y-m-d",$result); + }else if($today>=$week){ + return false; + }else{ + $result=$ts+(84600*abs($today-$week)); + return date("Y-m-d",$result); + } +} +//数据库连接 +$conn=new mysqli(database::addr,database::user,database::pass,database::name); +$sql=$conn->prepare("SELECT `switcher`,`ignoreTime`,`timeInterval`,`openWeek`,`refreshDay` FROM `system` WHERE `systemKey`=1"); +$sql->execute(); +$sql->bind_result($switcher,$ignoreTime,$timeInterval,$openWeek,$refreshDay); +while($sql->fetch()){ + $rSwitcher=$switcher; + $rIgnoreTime=$ignoreTime; + $rTimeInterval=$timeInterval; + $rOpenWeek=$openWeek; + $rRefreshDay=$refreshDay; +} +$sql=$conn->prepare("SELECT `status`,`songNumsLimit`,`songTimeUsed`,`songLastTime` FROM `users` WHERE `uid`=?"); +$sql->bind_param("i",$_COOKIE["uid"]); +$sql->execute(); +$sql->bind_result($status,$songNumsLimit,$songTimeUsed,$songLastTime); +while($sql->fetch()){ + $rStatus=$status; + $rSongTimeLimit=$songNumsLimit; + $rSongTimeUsed=$songTimeUsed; + $rSongLastTime=$songLastTime; +} +$balace=songBalace($rSongTimeLimit,$rSongTimeUsed,$rSongLastTime,$rRefreshDay); +if($rStatus=="passed"){ + $auth="true"; +}else{ + $auth="false"; +} +$conn->close(); +$option=""; +$openWeek=json_decode($rOpenWeek,true); +$arr=array("天","一","二","三","四","五","六"); +foreach ($openWeek as $value){ + $week=getDay($value); + if($week!=false){ + $option=$option.''; + } +} +echo str_replace("{{option}}",$option,str_replace("{{balace}}",$balace,str_replace("{{timeQuatum}}",$rTimeInterval,str_replace("{{igTime}}",$rIgnoreTime,str_replace("{{switcher}}",$rSwitcher,str_replace("{{auth}}",$auth,str_replace("{{uid}}",$_GET["uid"],str_replace("{{name}}",$_GET["name"],str_replace("{{cookie}}",$cookie,str_replace("{{id}}",$_GET["id"],str_replace("{{pid}}",$_GET["pid"],file_get_contents("template/confirm.html")))))))))))); +?> \ No newline at end of file diff --git a/site/song/cookie.conf b/site/song/cookie.conf new file mode 100644 index 0000000..cdcaeeb --- /dev/null +++ b/site/song/cookie.conf @@ -0,0 +1 @@ +MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/eapi/feedback;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/eapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/eapi/feedback;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/wapi/feedback;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/wapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/neapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/weapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/api/feedback;;NMTID=00Ou54cQZaKWU2sKEqMqVmcJO8qbbYAAAF_mzbnzA; Max-Age=315360000; Expires=Mon, 15 Mar 2032 04:09:01 GMT; Path=/;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/weapi/feedback;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/eapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/openapi/clientlog;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/openapi/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/api/clientlog;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/neapi/feedback;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/weapi/feedback;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/weapi/clientlog;;__remember_me=true; Max-Age=1296000; Expires=Sat, 2 Apr 2022 04:09:01 GMT; Path=/;;__csrf=1435f3d8adba9fb751f244838b797cc6; Max-Age=1296010; Expires=Sat, 2 Apr 2022 04:09:11 GMT; Path=/;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/api/clientlog;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/wapi/clientlog;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/wapi/feedback;;MUSIC_U=fda39638a3fa82936d0cb8aac944a529722acefa4e32be9a52891ef91830e3872db2b90205957188d78b6050a17a35e705925a4e6992f61d07c385928f88e8de; Max-Age=1296000; Expires=Sat, 2 Apr 2022 04:09:01 GMT; Path=/;;MUSIC_SNS=; Max-Age=0; Expires=Fri, 18 Mar 2022 04:09:01 GMT; Path=/;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/api/feedback;;MUSIC_R_T=1522502740217; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/neapi/feedback;;MUSIC_A_T=1522502710766; Max-Age=2147483647; Expires=Wed, 5 Apr 2090 07:23:08 GMT; Path=/neapi/clientlog; \ No newline at end of file diff --git a/site/song/getCookie.py b/site/song/getCookie.py new file mode 100644 index 0000000..cf98143 --- /dev/null +++ b/site/song/getCookie.py @@ -0,0 +1,13 @@ +import requests,json + + +def main(): + cookies=["879abe98b06a4d769429a79794065af3","c3c1d4d3b1467791405729457459c4cd"] + session=requests.session() + info={"phone":"19537806644","md5_password":cookies[1]} + cookie=json.loads(session.post("https://music-netease.vercel.app/login/cellphone",data=info).text)["cookie"] + with open("cookie.conf","w+") as fp: + fp.write(cookie) + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/site/song/index.php b/site/song/index.php new file mode 100644 index 0000000..6897adc --- /dev/null +++ b/site/song/index.php @@ -0,0 +1,222 @@ + + + + + + + + 在线点歌-凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/site/song/information/2019.json b/site/song/information/2019.json new file mode 100644 index 0000000..b82d92d --- /dev/null +++ b/site/song/information/2019.json @@ -0,0 +1 @@ +["49dd9b88905c6c30143a4b32ba8093a5","f78d9a2a262d7a06926b0fa2355a33f7","e718c84bbdc2562b84b91e12dd3092f0","bd9a59c726fd78fb1b618a179a8de99e","b4bd64c351cd755a70716b35401063b5","940a053d3f8778e3965ad4436d2e0fd3","ae85a4fc7ec4f5ecea4b081fb5311e5f","503292b333f4e70bcf98b18d18122af2","927087808fa1e01e097c2c4a269f1696","c05e348a12edcffc1d170e00e34877c2","0323e79a73918371eacbc745abd3c1d8","6ef0319c54dd6e67cc567283e9456314","dd10f566b4ac4bab0519136913d67b8c","a2f850b249692920b6e6e334d3a592d7","51e7f070ab358edb37d8253006268785","76d28c309b6d75470f8c727163bd3fce","5754744a987b201533ec7d0e3ba44bcc","b2b3b187f87e9a2800f4618505f40ce6","68e1d15a0a587136247e3f90d9e41a60","77a778bccd0fc3c8ec4cb93fb1c1643c","e0cad320c80331b4498b3ae43c144fe2","386e88d7a31c58e82890fb0d04431503","9c18368ecac0557316e6db72a35ccde0","393b3d576449f17507ddb7d10b3d4af1","01cbc890cd7d2b3d4e808368ce9cc47d","d03eac1b3acae842fa077ec2aa55d076","fc9ef6eed5f00c3f0fb6a1609e918d49","5713b1438b57fdef77450141686960b4","22fe6b7f8bd56ec5c07b45869bf17f3c","9cf692fe9483b0a1b86316656225c684","bbe1b946c0b5a3a453961faa67af1923","d7bdf404b54cfb7d52d29a7b14e98e5f","0e16f34cc9176aa01d109d7deb2e5d70","7ba913e090b07560cb2d824306f7011e","11ab0433d5cd6d6b84f296fb2f2165be","2dfc55c9f10a7da87df61e1dea9d74db","acb7430d7429dceea18d4b1b7f33436b","6f13d1aec7c9640381a404281d1360e1","c7d949867dd4ceadf4e0837330eaf28c","224b1511640cb0c91662f830264dc894","85e304be3c2cb52cc58999d206df36e0","abec7cce7680c122629c34993e9d1dc1","e74ebac04ad7c7cd5eed49ee0abae80a","8af58bba557a602bd7e0ccfa4a46821b","073ccff2f05506f54997b7de9f1befb2","30a42f431b55f5a4edf16ce1759c373c","88c51bcd8fc51edb37679d21ec1e82ea","8a92a404a9250c2675f3c9772735d415","2d1f8d7a9c32a24b7281f83a8543f8ec","69d3b961de7caf04d8c939db7ceaa08f","5c59a8c09c9c51fcf2c9e8735a61df40","58fb8e4db77c447ea7df45089ca41cce","d606b945d62e1bdc92515e036f2be932","f3d11865650019d379f99465696334cb","5830b7868852a185f0167465b2d7dcd9","a2cc382f133f99f7d673e695cc588111","cb5882898609ac1b5e3f1f0c9c112f6a","8e741164f8bbdc436de6c7aa04e18b77","dc9281bd3e6e36364da4a1225952770a","558b6ae92af74028f6710f74b6bab3e2","163a04d47519bbdd6a552cf15bc21fa2","433b50a50659f6f359fc9c5e36f2e4cc","bc5cc88b9aac674bf96342bde7f8786c","11b970026f2f2a5fcbe0940ed88359e2","bc345be7c654d0bea6f16f502bb82aa7","95eefb02c1646bac8e35605e0a0a0bb3","6d2417171d94354889dfaa9f56d5b72f","8828153e86311a25a9d3948768330d64","e664db66e0e10081fdec89f09a103f6b","ca854b0862764957f2b0320439de23c1","788461e85a4bde3e3043405e5147bdf2","3b24fa49a8e79784738f9f320caec017","177f452b80de5ae4798b1dd4a3ad87b3","953f0e195ec8ea4ab92f7d3f9363be11","2c84d40f1e3ffe953faa7a1891520361","f07a815a261905a3edab6a559f448c80","410da906d013ad15ea6ee369c1ab6ad4","a1156ca962b6c3a71802833f44ac7e83","dccd6c2dd47da7c6eb61170a8ab970f8","3d32e25ab0ebab206636c95d51af6378","d5815a40b7c6a01bfb1af183f8cb8570","7488e6caa846975f133d11cec36942e2","8436edaeb57e9d0439426f05b1301963","fa5ec97d6bd6ab82b3c3d5f01cd6f445","36d124d12430e04e287fdba619233a3e","a5f850f9be96ff761741e16927c11193","008023092b18c8fe57ff647122ef55a1","c372db68dd10d2e3dc1c96944d1d6ce7","1d978e2a1c2b4cc8b158902a4a2c28b6","37952caac84a5832554093d62956a130","1e8cebe6ee4ba8b12671817d392b97d5","7e13563b919595ca89685458ed02f73f","57151ad67ade0044c7ab7a839a637ac5","b72036c72af7ed3f4e8fae0c58448620","19eedb5bfb6b54c12396e180d6da4a8b","b4ffbfe6b456d4457f4321e0cf6f819f","2298cfc1a3aa81c5c27647ca6f6f4748","d41d8cd98f00b204e9800998ecf8427e","98a66d32e1a85eeae126abdb14bd5116","3de8a14f29e82a7c7aaa77b8d6deab9b","6ef895d3d34ae8e547066bd2a0cce1cc","a4771290e7a1a5f91af46c6f2338773f","cc8c4209be130e8ac9cdc554258623a4","9899a15cde2ac96a1eaa077a07888e8d","95877377558a5afa530fd50f8b747f0f","d5ec09ce387413c12ea287365800d272","7ce8b9686c23878ae0b49710cb1e8ab7","677f50295f18c0bbd2cfed5f2d104b1c","cd29e1d26060f9ec28dfaff9962ac01a","44a60a9c1e6f5ff513aa84e577af60fb","3c1a2e2d0a1c34faf17b80c3b3468ae7","58e5de86c6690b781eb97e7894a83d96","6df747f5c124bc0c4499b78e2d81378b","43493143e4890b78bc2546b9b64de28f","b521655c1dd77982da7aca0fa4b95ec8","d7003535475f4eb72b45140164be4c02","4c8ebfd2d45cf268992907323f6b4b3e","9b2548c56007aa7b625c06ef825270de","52d9590b76f21fe764d41eea273e8aa3","a82401fe3394ea426c8bace350a3af47","a228c943351e980959303df8b95ad8fd","ad6b77a8a185ada4150a2b0f80ac2c14","67927935672c646b08f0f4620c87828e","7eefdc5482417d72278e5773125e8e6e","7313470731495795afb28554b8df08f6","af265a7e796f40127340ec321b738860","a2a4a55712f594765e8fbb0cc1dedb9f","00646418ee9b7b9a2a5bc23161248d08","ae247c5817fc0edc840f5bc633ff715e","cf923d1f2cf50122f14582826b0b230a","574aa47524da6fa38f860764e718a145","5693ba38d959d010f222b8a1d322da4b","ed8f242cc7c9a14f52a9e8326ef29cd5","01f7f5f6ed881863e6944317d96b96d2","a1a89af2f2980e40283f7a15af2f76b3","ca99712703dd7c6b3fd18bead22c030b","2316c39b37c05fb9060e9960b601dfa3","333ee4cddc76af4b507f2c015c188887","84a0f2cbebe2fe845e56a1364e713eda","dfa87416513a2d7060d5a8bd25de7951","d986d6a8fd711120c5e8157e521f0637","f75a41d2cffd9af632d8debb4abaffc1","239562d68ab5d5800c325bde8cb8db73","f0b600e423ee633844002dda2ef0c35b","19bcdcb0b3479bba240325f666044b16","7651af19275eccf410bd6dd60bf567b7","d71c82a8dbe436001f500f4e5bdc94e2","02279df0e9d1d96513d1e3a80f5cb3e1","8c8748127c2a62c0b6213b000385d8ab","4e98e0cde2bb55086afd66959bdf101d","339400b6b1d969fb0e64c039acddcddc","15866b8278c7f5f5105fbdefe2a2d0ba","1ce8e5173192b29b244ba772bac1cff5","8e5b05945c179a21c4e0d91db08950ed","fb531703bc590f577f948d2ffcee2543","a1b7f0ab8093e284c16db018c314f89b","8cdaa864a85563ccf6ed94e84f130021","45374c7e1a655b0bec1f93f83a99f5d0","a16905795c7e014649212120113b1c17","8199bc5a7b2e6ef2e120a1d8451024e6","bd4b5a1f8feb4178d955af91da7b7951","a40bf9f5b4678dca1b81def490e2ae23","d5f9e548505e7e212c66e1d9c070f5ac","a472fb51a31e26da698b217409fab382","a0f2b88dd5e39aa552c7825ec35288f5","d54636bd1f58f4bec4ae217eaf2774f6","e264369fa862ea9a8a61609c4031a96d","a3e9c12a4f6a0256d744bee7bc4baa92","88554d914db7f65e5cd3c6c26ef73521","41d82b3aa4556f595394e5f9127af9cc","85199e02c9e0a325c7eec3ccd3eefb25","414829d1147769e7e829b0f7b3ba858c","b1dd02c36a61735667bdc84d348f831a","afa4d3b8ae494275cebcedc123ee0de4","5326f4239ae9ee755255fbb7223729a2","49860140654bd7fd730927b6c66787d4","d6ee5a6477d28f3123c0d414a65bd799","58c9d604d5701ad1facf878c76e9dc17","183804faaa0ed26938e23079fe856582","0c11ed471be19c33d3e004912b289424","e6069017bb94d65a001dbee4f1164980","e3c50fdeaa94e441a5d288db551fc08a","efb68bb950c58b447b6dce361f53327b","3cb2013af6cad47094d3c83d339d41b1","d61ca0a7a390e216f2b901a15a2e6642","5d5f514e5fe79842869df8ab1f18e1ea","6a7a0c080ea53c85b734fd9c1e9a0583","375573b0c79bb108d9aba89724872516","4e8468ebd92a37c54a6567b8aeee04d2","b126c20daffa5ba18fdf13eeb2d57431","d0729dde7a1b680242c1e6e278ddeb8a","52ceb3e6f1552e5f615129811d70e99a","d188df6aa006e54965b521c4cb4a07c4","9703d7db37beada31919eb54349b3384","5def849b62b0b4667a223c09662fb6f9","d10c209dceea10b3f2002c9a63bde9c1","5f01c3c2be7a41128dce2137f07d921b","46fe68fc89b4a6fa156089860260f9f6","9963336d93b29ab3b7b23ecf18cbeebd","f2923a0866d614c0b2c19ec24b80821d","27f81027b73e0e6e6c4bee54b144d4a0","cfbc6acfa061b6cb888875f237abcaf8","d5b9a47c5eda127cedd49522231cc2b4","a24325739899f6d3aaa02a36e37457ca","dc39518d48a11a03e90547b35c06faf4","8b0b9a76459f6303db2f6ba881d0cb1b","775c784efe0515a3a705cef0e72e2ed5","e7dae1d70672fb9d945a048efb9a4288","110a096018b43dc5a0ccad437152d232","59f10eccae31e39d9256f188aaaf16bc","570dd540965fd2792db2e027989cb9a5","a59724b8ce2aedc6c09046e5eb5484de","c83ca4080a5b383921f798637a50ccb5","65494585a7b4cd3f2c9effb1c563b450","1d3a7b36f9515a978997bf602f3f4eb1","d52bbb8a0fd06a2adf7b65b1220d4503","2c8f238ace76a3519df5f554f93f5e1e","307a38397777ca7f3297500ff28aa3d3","bee6759186bbc3c007602c55f2a79c59","e9e5c13e3b87d37dea0ae5ebf11c5eaf","34a346c2bf6da9f6991622851672b139","c386e02969b4b60c3077173d2345e4d9","6aa5d132490339b03ffafbeb7d6ec1fa","87c99fd263ea3be7ba443df13f1d535e","4505eba77df8d91e8f5592bf083883d4","acf6400d3aee5b2e9ada34a4933503e5","38c91b792cb008cb4b5ad3d291ef2198","b9e9e05f6ee27be4a021d5ef0f2c7ba2","28f32dde38892a510e2005f32cac8b9d","eace041815f434b1321d6617a47ccdbc","02637a90c9d27aaebe1a242f38b1191d","101c741a2ef24aa29edf95b412fa3402","e61a5d46c6b3f3daa856f171c5ab6393","ff36b8c4d226e6324367dcbfe8172345","717800a1c6f2197c7b872f03493fcc92","5fd55a74bd0458ddff5b6ebbd9d7efcc","33d868e14ddf369ccf0ca0f410e8494b","9bb4e2767ca69cd7bf5ea9634cfeb757","8f561d131721bea3950ad47c50a523f5","734c9ecabca24d72576b1474a0050845","cb4934a43af3cf8f9817ebe6c5d8d421","fb62f1371ea85fb118657c542f886b40","14c3268aa00993265ce6ec05fc4da671","f33bc0d4bbcc214e72f1d57e0ed7ce8a","6456bd75b7459f5f883280668aede72a","67336fbacaa53a1c5a915873ee2ed285","4aece118a6e16872423252d19f3ce51d","20b8eabe672ea8a98d19259337509caf","74d08da0e9a3c502721945c3a21536af","8fee294353e90b4efee5d1627e214b41","972036b28bd70093859eb5b2a37162f2","6dce97a510a7bf47381f8e5262e0add5","2961196fadb3f12df4c89a4dcb78c980","033b0aa6d53a5b1eb56ffe9d88892c48","0096f5639c61139b2bd9d499d05888b8","e2641794b21100dff99aa440b0d147d1","935162742203afef37dc37342f1b75fb","49910c46120e1900f0705b7102038601","ca5c4cf48565672d0f989fdee19f27ac","b8b6036ae067a4bed05d285c1e7aff09","45f9853cb0a4bd100b7ca88096ed35c6","1c9394b704f4f39056ae337500a95100","9371d0c83f3d3adf4eb62b10601eed55","ba77d80adafe424e4b327a16d38c1f82","45c89c401ddc2e6ac91aed6c629e602e","d59b94a570d8664766e70339d12814c9","f348f90c3681df00d2e74a93cb4745f9","2c799ad5ff1d82507c4aa6bb64815ee5","5c2b04f20838b53f6a4bbab6cd2e870e","2f5f5579d2f2ecf72043d63fc98c053a","db94d1b8bec0a4d4b9c5736a94413922","9e82a7bee0a823effb94795b20192f75","85c388e65fad2062e0ca5af8e3be1a4a","94051d2d4a29aaed3e19d943e0e3f540","775335315b939f960709e1ea7fd991b9","e694c447b0d5645ae6370648bfb66528","b1e61b44ab7a197c7b788a8cba2adb56","c82f963a164744b817d8b961bb360376","db99b1e190245c4199bb5bb1a0741a43","afe2de62518be641e3a76ecd1f660211","cffe45278e51a707082a28c6087dfed9","cdc2340e74d03c11bf189d8feaec5139","f5c1cdd59e500af3f80f71280f06197e","21b33e71a7f6dc8bdf5bbfcfe9d04320","66b2b6309d968889030d3ad5cbcfdcf5","5360b16f83d134a4539660bb1257b310","ec5b90ff782cf5cb148ddd98321f363a","b094a7d12101adf1d45c890028449008","796e28233a275f14a02aa624564ed544","499b1fa3a3a5340553880335fc4de344","467c7d745339186af22f47661dedb475","0ab20d5e10f052e5d3f0153c24a47c4d","c1e189a4b670362779abec6c21fd49e5","afbdc1e0f16425a2f94ab5df3160fa9a","136e4a3996205610ab8eb59eb9d08b7d","278c1e04189564cc5fccb81d89af6fa2","f36246785917984603296b4d516d40b7","be33c619d0e6ac6a9d9958492e950ebb","4b9b62f1521e38e1116c059216e1d4ff","e95c6b6fd581248c4b3f7b97e0a35354","eb017b322c803f37a7d9c441e0662bc8","620d6f43f11acbef82e5a065128cbeb4","27f22b0adf93cbd4ccd07b94bb93fcf8","f6077bd150c74edf2d53578e686db89c","935f1d06a0ecfe574456d11d24e3d0e3","f2222ab7e71775b8ab99856d4424fb01","179c769b1d2bbf5b714d1fbd36becddd","1ddabc23bdb9c1cc2627e9837540398e","657f859c1dafc4b79800c5bf4f18b40c","9b17439ece528b786735bcdc4d3e8ffa","88c2064ec74618d1e576431ba2f711ce","780d652d641ad0090e4e59f202282bbb","021be290903633357aef89384db980d9","64a55b3afea7eacd039e82672fb1e170","154da8b9019392a9e822495ba1b0ab3a","eac0a06b4e0c74a4e23c26e7b506aba8","bed725157203c8138546d3225fed5448","277bc91d3628e6692a0fdd9ce6450b32","5226914a307c4624e590fd4ee937d1b0","5dc434bb1c20e405bec68830ac6d6080","0c5fa906abf9618f2eca2f30f289cfde","b09ba4fd723f5eb2c64bba0e77568a73","fd68d377f125d35c48dc40a6d6340b3f","006d56fbab926c15f06ca08937c9f65d","b8695d0c915a6a5f488355f4fff402a6","9441991b50f33e2733b75e426c294723","0afcfac71b80f94064324c8fcad4c16a","7345e1d468d1ec9f821346fd43c4c1d0","89766f8fb76b3535cb1437839e7d5837","5cf4caed5413fcf2c5521b3b53c073d2","4d634b676fd02780d8403f31082f6575","9e9b96e277111ea0b0d3347a0dd7303e","2cc4a4e3b96b6d1cb0691a13904afdc1","97ffe43bda366add20b7bf332cdc7f08","ed0368a4db9eff16f8a53d83db801f25","235880a0550b1e6cbe0b02a17cec45c1","7abb66d78bd86beb5965d08bd258fd5d","2596ab8ffab4c059728cc5c5a6e0f57b","815d3a7d0f6ab469b88576094da0f0ef","ec4b93a37c57207e8abc08e60bd7c0c9","2ca420da145ecf305c3a8175ea912395","fe6726a742693719bd6ede0c04860886","7e06f0888c64fabbca83faccbc79fb21","3b94712ef33710e425610379267de233","2b45bfb7c23efb6b96301e14172ff82a","969c22f06b7aed83a7b04ae1c3dcda27","4c9c380add44fbb80556b80c7b7bd6f6","d1551a7b006b83806c3f688664e72023","23e2c11821dcdc304d3f85c54271eebd","660c9341cdb183d76a34299834ca1ca2","9072dd125fd167252ab873eb28c09790","5a13105c1a01eaa3876a8ee38b9f24de","4f58485ab71dbd12ab3ff62686bbef28","570c8c0b32cfdc67e265dc90e97063cf","ef5b89c1703a27c02540c7a9569376dd","03e12a5183fb2fbecc9bc10b94f107b4","a48b1a68196dd3149847f6af2ab08137","420be0e0783b033e21e85bfc8254bc99","44e4f0c5e421c7c19c4ea474c833137b","d257d7a3834cccd99f0707767175c794","d3942d97e8b827e7aac70bdf42a6e688","a270b0ad72578e02d8ab0bf34ef22bc4","9f193858a7837d767e66f743555664e9","2fb1e91e98c9ed448fead15ec112ac15","da569b32c735ab9829d67a9c9a145789","8d2c577d88ee1086c40288c68be0082c","a2fa77dbda82a4b353262638f6ec4321","2fe13f5a4abdd4ffe33a1475b8f2011c","e4fe3ef027a6a57726750b61ce8571ab","a5cef48d459033ee966100fef3501fd9","259bc9ef8d4630174d172f932b04d487","ca5f98df13e6c7285049de577fe2f74f","21523e496dd3e6f294aaa8319d70e40b","b1d4dcb1677be48b71a6ae21c0648295","5d988eca6afba007b238e122075ffa46","9e469bcf4a89e054d8ac27eb912102ae","a77c862a3db8ed52021aaad81ab1527c","996d308f2743c57871701ed49c096868","e41cd907b04d78cfc82ca8f80d8456c8","8431769312cab412565b7b4349ec575a","0c764bc3bceb965c5fc9fb8ba1e5cd46","aaf9fe7421524ce7381ee653d4a19697","4273448895a5a221626a2d56325c1cd4","d7c109d8e92108403d07e00f639d52bc","33b5ca23efebd219218cc3250325875c","bf0047591fb114cfdaa55f1fd5c75807","fda729affb7b0c850227fbbed96802f5","aa7a45b56b8c31c95320c6b68a47ee1d","bc25d269937abf93b5911c4501b538b2","5625cbdc8b9c2b9cb5a9ca23d976f678","7c910d3b11f4d0d9f59f9122397cbf1f","4a13a56231d5c4d52fcca93ae328bd5e","52acd65f0232b72576d110087d5996e7","1be3f60849338905ddc64bc5c87585be","6f0c1ae283dfee06ac2d40ff2d8b6fcd","9076cbd62b018634983f2d9349eca5ca","2c86a7fdddbd93a37c410ca63451b539","29db30847d1462ee9bee94cf9b5a016e","741adeb5a66045bee6ea43708fc12cd2","107e8e1889b900843ecdb6f20456b1c5","6fcf03017aa9d270ce75e70f1c4d68bc","273c4e3614b069756e7b02160c8ffd02","b25d90c76c450340412b4479924c89ab","d8908264dda7f8449f6ed971fd2fd501","9d28d15101c23ee0fb619217519a1c15","0a625a7e3d498430c633ba766fdec46b","03ac78e918e71f8e7ec4ff37444a718f","22ebed1a45040a42ae0b2f7e97ebe93f","18dca53f4731041db34dcdd4a87a09ff","251f1a6568e3905b9a0c449de005e3a9","b10a8d8b7581cb6d3d1f183190beb35c","50a3be61e0ec20b88cfd073698cba801","077f1c882cf2202ccacbb9646287e75c","13677e7d8bb99efd68f6d08bc13c7c80","84d54adf237eee497aa9e525a550a0e5","74d59d9c67cd3f629ec7b7dab68a0f47","e49e2307c0fd33413c8f84dbc175a1ed","7a955c64446fde0f52552309849b0ebf","81aacd7b9ddd107fff4bb4aa9fda6a62","90172a477cf633b1dfcbc1324b44d827","ca0318b1ef367d8941cc8bc013d1cd96","2d2e1922e95885a6f8e30739f3843223","6d675ba0d6e13d2d9e7abce9d772237e","f66c86cfc6ccf61e32ea1e96b8cccce2","e97f893ad6bac12ff0afb800f70dadf6","094d306bb502438ae43d17ee91fcfc99","2ef601bede4b2e866f1e1002053bfe45","901f6b3546fe582feff965d905af370b","8b575dda33d97fdf82211dbb177bb466","735348fb41fa6173ec551ed4ac15f143","e568b9b21d416d95654d5356be6bacce","eeef7cc3a3ac3f0d9c4ed45ef30f9328","0b63b04905493ba84597614ed9aa419c","2ed6b9aa0932f8331364a2aa206f2715","4c36cbfbb7c44162004a9fec3399bd50","0ccf55d7ef3ef1cfe432c386f049aaf8","5f9afb53f0ae9ebfa97c0fe86f9ab1b5","c1e502fb57403f49fa5926608d477f47","f81185758287c3a4894b185451cdfec0","ad5f1f3ad204f2a27baf6770fedfe688","3b4ecb6c0272a831f29f0fe12382ba48","7028fba3f0545a191f14af3a0a9835e4","5e889342f9a2b29a40b057a40fc9d4fa","79b085ae6ef83252072e2856498f01a4","37584ec99c9879c368aaf8762bad0a00","b645c3077610eef70ea5bc6310413a5e","a6f25cdfa00132dca77489f18c33633b","d3238b13747a7f4594e9284097436b90","027ebf6ac53ae626cfae08d23602cb8d","05d96606c3ea07dc5f727274a45c7359","b3ffcc10ea1d6a3a4e67b0dfd9a4f5cd","33cbfd3fe6052bfe45f932b5326e0969","1be964bdd01650d284a973ef71770005","67356917622ec6dd575e49a0b9376dee","aa0c34001ad91455dcef4db9c3660036","d4211c7318e76b26ca64d187c8709d47","90944367162665277c9ad66fe527caae","bb8a8c66da7ef724cb37ea1ad93e04f5","25ab00f8cd6a209f6fff2bb0b1833d53","649ab18998c978a3b33e5208d9407524","7e32094acf941b008ca264994df6dff0","85eb9ebb13f67dbb26db0c30c5e12b1a","eab5efc2fd01a33c9d1cd398ab236e41","778fc65c6c883207acce5d36e956720b","cc58fd5f007246a8d3c2c3937f782063","600d097ef4459354b74429aeb86c5daa","45b09480a8cd539cf669b05a87730fe0","7b2142620a0e16e92d7780f6e3b13bd5","789096a444d33816a73cc8fc55465db0","1f6b9946e2cc6fe60b563de6f011a84e","347c0f7e8e308dd0af5399c9eec83a4e","799fc4428d12a6874893414857a68a80","1254244b8febc4debf1521a2946eee8b","495f75856d939e906dc137a4214fcbde","fb3439607b1ad873decc102dbd4992a8","98e041f49f12d2d84503821f9bf779f7","82f53d56764d16e1420171cb53aa61f9","d58a27d275c4ff519acc477d18b59bcf","47dcfb58c9d031acf91f64210947d458","e4098ae7af30aa8ebc082a078372b4a5","fe1ba33b6acafc2ae84dbf82fe96b318","59b701b78f3590a0322c3d5a8a96e38c","a3b033fc8b19b577f5c32237121f9566","ef4ce05192d9e463b146bed6caf7bd20","044bc0c3964d3b5db1446e740289ebee","c7f9f27135a59633e3901a4f366e5da0","68b703e31e6fd1f6ab3a7016983b45b0","bfe10519d6e5e076c7547c630f8e2f97","68bfd2c59c76bf99867ced0e1f074371","c6b9559a2b7eaba8dcc2611dba7960f2","8e6aa20a6b9fe61779c5da157307042b","2ffb89ececa9f7e1c3867962de326b5c","46781a4a9f11825991838d1b0593f251","7b0d118d12d772d527f703e449c6a0b5","7db99bfe4bf03462c753973a70f881af","a825353454a1e7774fa553953528e37b","1fb2c068a894e0df9a486e30c75b1436","c75c798d6a58ccd36c83abb87877718f","932377d9f7881d8bb544ac97ed84ea06","b652d7217104d4934a1f6fc197a48a2f","1cff5394f4e2b056707f5320cb062e99","d44c5d16e1a9807b058be2b4c6342eb4","e0483821298ec786e62ffc8c3285a91e","c775059324e95bd47a07aef380c1e231","331ac5ca31ceed23edde4093454e4853","be21e33bd9ff3cf4aca4719528416946","1d72a114587d6ff9ecb9ce8c55de65b3","cd02d20d3b521c66e1018f73aabb4175","0dc227e21fe60241b9377912e540a9b4","29144b2c00df40664112f4d5064a85e5","edceb7218e1d1a48b3513af67eb168d1","49d22e99dde7bd7f7aad4e69dfb7592b","3701cd1ef65f4dcbd1b6558698fd7628","b95429edc6b3024af2fddb5707b7e0f2","e624ca84eb649aab422000b0cef6043c","e8721c08d4b4f85b43fbc19191343794","67b145938954707de2b4a0ab8f5c3b98","520ef0176ed9f6c987e7a3b73b4e6aaf","4ec455e2aa760bca3ec342d05ba3015d","6c623ea7245789ac58ec0930196b9af4","e4397f2521bbb68c1f2bf3eea1166d4f","dc7529c1ffe95fc3e3a4f05d759d5d74","5b1395137f6555976c41b17722e1b18d","9a75c4d74c9fa3709b23db1e5819abc8","287f7b84e333d2324adbd6bab0a7fbfb","9ba31b449fb2bb4c5377abb4ad19572a","975f5f833bdc061c65a8ed9f1b7ed78e","be37d9869ca05d1247b8d420fbf6ed43","8e115e58ddc28b13433aa2d225df1e6c","0d69a5dbcf58e7a27c68ce1da2e89945","b60758dcc34222d4957ea6681e653a69","01985b7421736a84b8d8291a7c6c937e","f88d413ad974f49a952e5b8000e18b92","87414787725cad12baac5ed62d32afe5","19ffbd64641cc41e9413af1fa6e99e54","d043aee90ff25b23f77c5d59c20e0a74","2510abf03ba2c750a57c2502b29bae97","1a24bbacbe7636a05d1d273fc4e0e82f","ce69ebaf1cc156ce9ec79c29fd57d9bb","811fc29efd2a70584c9c3e8abfa526f3","054b0ca983572d6c4409671a2e76ef44","0eae680cd14d05d29e66326d7ff43691","11b01bc028b47442beab43f541ca272c","98f58a81cc01c52a659840d73b5f20ef","5833ee89f14865408459d0ee2dbab98c","534c29790940c3554fbd270f7c2a5a95","156b80eb3b9fbf0a2f0f4092540d8d61","3113c6fa9c52ea9f2981b0076cbbfe98","9f3ce795f4949b960216c712689b6cc8","2a01114973fd57a3dfa18005cae0b4bd","32630a8055a44629b64312fc37d7a6b8","c0df18482d27eafdbd79a0903e2099f5","1de44644f31bdaa94b8402a063bce68a","7eb4ced6874de40e27c820cec3102e5a","f3b969b8be766126116ad964820a4521","04038726df46849e987f768cb600d933","3e1f101c87f1c390d278b86bf303bcb0","e552b389c5da17a4ec0b4b7810dad068","36f645b2d0c6676df9667c8acf399da4","d62ea5c8d3c77cb02cfe569700ec0bae","00d29009f76c464342618653c3e3640f","c0d53c2f75a18ff93999bcdafbd4eeb8","51604e8455f61bf66034e753b79070a4","bf98bf2ba767fc6a53e0d50266e144d6","4122e971bc79dee0e8412821eb0a4557","1a93f0aa7f8c5602a9242a26817851b6","06c2c99ae0d0a9f3f8465216f3ecb46e","073c600a1f8caa8d14ca33c7e8d182e6","f20ba0de3816918ee4137259ac6f4011","02b4ff3c7a21565550cb2145c860dd3b","8ad3cee4bf8081ff217a5093b6b1ab7f","93654c456b25979c6ac9ca934302f980","2b4623dec1e3f983a693ad531939d51e","0223dafec087b971640b98c856d4eb92","342030b7cb6b106b8f3f604f411ecd63","d0cbea83ac2a283638c92c9e047463b8","6f54dc7c666362cd21bf5c1d140bcfad","252784280ae0af8c0893264a4c16b5dd","f6472087815bd4b97c468ac680f23c98","59af59f13aad650fa725ed63eace3f89","2dda1e2d083b5bff1551d3f31843ff1e","dab4d39b474eafa99d14f877d3ef721b","dc7092aac6478c3a906b4e6ae9c7dae0","e634189936f98084850e24620e48fc59","b66efa1197cb96c831f04bbd08445778","ae872dfe23602e9055e3f17a4ee45204","8c5359aea52ced55c74d6ac9e64e646d","e9e5aa2b493fa925bda2a19de5d44903","727910ad09da478f0477e05b7c0be9cd","9d8077b8cb288150a7a1d9a287c3dea9","da1368293fb6a666d90b30288708f7c9","3e4ed706a1b0ab013ffbe096d81c8f17","6b9e8759c9f970385b88d4b128a7a9bd","49185506a8262279ef25477a7eb8eb95","5447ed97d976930b0e7db8e3caa6d0ee","f669f14c4f9f5c0f6b790336a6d33853","8ad1d4ec998f5c450c8a2342400a4268","478962f2c6470b7dd160c5306dac89f6","054ba7481a7c110a92d046cc1404cb43","0fc368ee62f079e667e715559a49aafd","59d52dc8bdc8fb6e4678e84654a71fe7","03d180e7ca44f9283f76915e792a291e","71d45d25834d427ba032fc5ac5e3f737","d08b60a0b0512fd71e7e4ad471faa687","ca1a31937dd85db7e3916b6439cfe138","49c11dbf474e040b0650230c7c461d6d","73935736a1c9f650a3c40efa57b036af","04c3d14abe2a2f4bbbf8129d69f5f84f","62feddeee922b731872a8e1890174b54","3ce27a831983fca49ddd8ac0f0fd698e","74aa6e334dd6724598e197fa077e51a0","f0269e7051f633307490a207f13204da","6385be04fa0ba98179508227fddce36b","98742f6f18106f940d069042e6839831","4ff4164a625bbae44a984b023a6df87d","a7dcb9de62a7dbf19720d96b6c8747af","494431997a0594750849281bc0a04597","7e09ae35453fd65a3d52b7431b17fae5","fa6229a530df7066e0fcf62452588429","8da20770101a544ae1989b3d4745cd0e","8d0c3bcb2a0fbc600eaabab41814a0c0","9902c3077db88b36b59e41a0c75b89a3","8927022735167a169c0aeeac6e4172eb","89c24395676f02899ac2a66a281faea5","8a0fa4d75ff9207419440b8fb646d90e","8b9bbd398e9f7fa2a6630e854f13a37e","52155faeb865b0812cc2f004e123fdcd","95677ab58b1b5ba8f473865e00cb02c5","a176b01aa0c2df1a0ff8a06223214c9b","b63af66315178450a1296bcdc3aa03a8","9975d9c75de125a5d6bfe238a8165a13","81058d68fc6ce3c33b4adf7e564a4672","89e59066ec56f00bf256a088b117c91b","56603161fcfa6135a99416b316ef80ce","62531571d761e864481fdb7883becae7","96e2024fc6f98eb00cebef9bf014ad32","75c8a8a819d8dcbeadbe024a9e83e953","b1599964e0f79885731108418e609e29","a716effcd0ee40eb7d1b94df69865737","7a5439c9ef98ab16de47391d6793147b","484022fb69d9a0c716e6178cfe83c6af","86c6bdafdfdeda82df635e9f6e9d7d5b","26fea4859462bcc7f16f659014c0189e","48989e323339974eca2ba10d178df40a","4d6d14774e8da2b02c37c5e37834206f","5b2fee36f50f490636ef7d020ff94baf","4a8f44cef004713312d62aa64e207e24","531659143d7133768413698bde32abcb","43c029836840bca666b10848d51c5687","c5206c40619ee0fcf76e512b3d9b1ad7","ef3b2ab985d25de5d077521065a09ddb","3d711d6aaad92eb9fd8001d9d1e89c62","4297269533d82759ee9a766451a01037","c5d02443784781a495bd1a78f38242a6","6c445c930ff65c246c1204a6155a5fb5","206b64f8a4e313418ddef57f9703b221","49dbc1a85b02054f00f4a60a41d6d2a5","5d101c7c2707046a42f1c0ef3ad3a8c9","86f963e96f826c167582afdc14c3dcb6","8cefc76b7704b6d6b278cd9e169a0b9e","4812adbb2d53723bddb1b16aab8b7194","2ee81448c8716db521020b7d94ef9363","d196a24173a396cd71833222e432450d","f7071d2ec68e3d9d3daac4dc33ec4352","15ab652f575415788bd71c0b87624072","5caa891a622c0b4ecbdffad5cfb77b4f","7cdca3acea01c9c8e1364ac2132ea3fc","3b0a4a3d54c054209cf98af1703ed165","2393e2496e3162e493043582677e158b","0d5f0575f989790333521d910a1fa9ed","4e395e2a60483802e5e7a2bcc9b6f629","5a85c88dbaad14acf555b33808833aec","6523fa45d7077ab5744416efe5bb7dc8","bcf8bf27e2fcd68ea7990886b5829a49","116e5aa54440f2f887bde850792eeb75","12e7afa920168dd59f434788f74f9846","e863c74d93bbe2dccf93147666bd49c0","b634736d8a286a5ff424e623e9426dc4","ad9170ca905848c53cb6567d5e7ce3fd","48896679958e4331bdcbceb31f960496","68988a76a8ce0bf613d357a61dfbef99","615e68b05b323123432c24d4d3a84ad5","a4891b4dd67c0ddcf9c20660cd788ff4","ffbce211fba9097e91eb33876577ae64","2bbb99b668b87640881994a24cd52dd2","6b7d84095dad2c544d9ac9babe8655f6","5c642978d8991a0a184970e3f8635610","33d26cddab35fa8fd72ed9463c0f5f23","44a150288e3b06e4de354962c36ed096","44575faf159fb388e167fb82956dcd80","070f31e29c4bd1ecb5877134ad606cef","4233bdb6b12d2ec1aed5de203cd92f25","2910472a56b2e77df0811ef2fd8d54b0","bae85bb36f78bd8363c0ac017113fad1","698883b509534668d3d34a216e896532","6e8f510faa4f02598a125b91aedd4359","78cbbbd42de7227acc7ee77f593c2363","4aa636b522992dd413ca40efa821a0c7","a4b25998e4e08f2afc59a168fbc7dced","ce32d6d51fc2c097f251b30df3ef21ed","59321340fddce262daf9c87aaa414f0e","259d5d4893bb553de5c2ead9df85c1a0","1b0e8a02f139e7939ef0ca6e01dad8b5","2a22e3cbdff1316bc4294fc9a0ae2aa2","a31da8035d94f3733059efd42983b990","24cbd03fa80e3c54034dbe0558b3d38e","25dba6e023b32f4730e2f6ebac4f3608","7bfbbfa58965ab621e76c79a893daa9b","0efefe56f3c152e4f878370d25044a90","dfa048bb4a612196ad1fd2d48bcb736e","79f76fddcb7697853ff9b055f27868ea","84742ff38c93e8b4cf5e0b92e7ac3b89","de35c9f943e316bd2f7b4b836fceec46","2f07ff3ae4dff83844af3b092e76b66c","188953fc3f37b40859792e2b2863a362","a8aa6a7719f2bef4ddce40cab72eb3e7","5ee41a3a06914c6b5e0d6ba7f3cca976","6f51f011784c98729f9f7eeef9ebff33","7361e33e169c8061c6fd08e0b6dca239","d97beb60e1320f9e206f46f1a1bafe74","46504e4afcb6d32a0e04530c8bfcc115","e560019cb264709ac97edb0cfde869cd","443bddaa8f84ac33401467a7e2eed88e","f4edb0ffb6ff7dd0b6c77c45a413f874","2b961810906d9050a40cbd4f30796b2d","292a17288437bb9c9b07424d8be049bf","e107000365d032244c665a2b3fb416ec","670394bc4b5a1b4050057188112501a8","d6a1a0574ce021390a2a1d7181fddf50","a8c0935ecc3226d00d2ebe20191db999","66c003cb2b0c0508f7bc8c9eb1d0dbea","d73d2ceccb216c285e1f6667d5bb6cf2","b4d30821b0006554476ad071d3dcc139","6508c4b85f5f0ad67af48d3f0e559dbf","96f2dc4a1f2330f70d35603836e1c151","8b0e44b1a477fc10f78cb1dad0745f78","4b3592d853800c779ca67351d56ac1c2","8f803528ea61789e02b5c317c0510392","4494bca44203dda12e8713d7f18fdbc8","059fa629e38e10dee42b0179440f991b","103f91eb170b743ab4b610cf0a22548e","55c7c064954bb3832838d6eb67d347da","d09b009fead4fd26f0ec55bde04c46c4","ac40f920fe192d5db0e693fed243a981","8fe50e160e3beeac47b3af8fbcf65852","4968eb47e88c0e05386ca5577e98b204","9c5e7132dc5c2051d872b3461ddd1e50","05c44853a3180621d8a151d2a4ffe864","4eb96b570002e10c48fa9f7b1bc1eeef","ae440da801bf5baa7df9c16430a7cda8","5cd460c3ed9c200e7b53db4ca2eada34","19ba56c6c97896ef0ac1271fdec05611","5686cf968d1206436989ecc5b8a7a7a9","866eda618d0560d173b8aa6696052d8b","f974eee1b2c45f1ed616968170eda81b","db3b6a89e79f0395956ad287d646a51e","ffd525010a1763d07a67a30fd76b78bf","02575ba7c4f5b58f155e1eeb0b6390ec","a65549851bd7ed43d7cea0689f91ffea","b98fea8891f77fd98311f3d67e217911","6361a2b54226107e45adf63b675dc3ba","5327bfc8f790286f5307e86e88a018a8","026ef89b09432b2019c23cd6a90f6596","4d273a40e4e84999d8d09027450ae6e2","4634fe41d8889efc5d0b2d6fe4d04e21","8392ee36a5e8aabda64a4f604dceb5df","66460995d6c3f5f3ce9d45228ee45a86","ce3069b86dd972b60c8a3e31b8bd1b8b","f5d7d519fc5ed80c5214f5630b6794d2","80ab28e3508580bb68eaf7e8cb6ec645","edfa58954158bc08ad1bf431d99bcdf8","f519e6b901f3e25e3db04392d118023c","195926668f0a4accc57cb15fc39be883","8e7b13aacdd84c4778e88a935428b03c","9ff053c01be18dfa91a8568ef5603849","d4d91b38526c7c32f40c9185d19b8a09","8f8bf5ac44142c52bd6b483fe4266a8e","8306078be49dc228c228469fcbdde306","b22df6976b896fa2214d71296f15c3a4","e4184ee2f216f7e86f11a9fa30182266","f2d7ca77398001866bd08a10934c9d4c","2313aaa67462a3809084ec8d85d10de4","887a3e01c9f3332a26f374c48f09d98d","869355034b74ae86cf723b084b0c88a2"] \ No newline at end of file diff --git a/site/song/information/2020.json b/site/song/information/2020.json new file mode 100644 index 0000000..40b7cbd --- /dev/null +++ b/site/song/information/2020.json @@ -0,0 +1 @@ +["b44dcabdec6df1a444b8311d6ca9d594", "4d9e7e0a41a6feb60e24b35ef493ca86", "6407d4c255ad6ffb292ab11fca4244b0", "ce67508402f6ed93ba28cb631b9068f5", "7fa3b96208f99ae71c333fec961b8fb8", "38521e83176d6a8398b17cc790851c45", "0c496e8fd5d0e5409e8be124191cefe7", "c44951069fd3acdff70b8932a9f07a54", "645aa0ce46ce1af52e186aa2d5d3e984", "2639308ea56f44d8f3495ec7a61ce3b2", "00e377e825e5723105f40808663634c3", "9ebb8f51050688a265644a1b9671604e", "b25a2190113d5e63572d8facea6f658b", "fa60979aefe1c4419f64b58403040421", "fd3bae0885eece6c67b0f2f8a05dd1ea", "c73bff14e57612b6b84e3b1d3c566bc3", "e74d5a67cf5b4ea7e0d94cac0db2db4e", "e7ed21dac758d15a87b483abceb62e12", "8162eb646949d09ff889d32e3f62a0d0", "bb1de5e1366af7756c778fc868ed04e6", "68e442d2368f46eb9ba656f7323d3e9d", "f9c66808e57a97ab83d45509f5f4158f", "47774061a1ee6b835219a39899cb5af8", "24d2ca0e03b1ad56dbbcf8e43d9a94f9", "ec1684ae2b24f2d5de2a0117bfb81783", "f825f2947384e65c15ee30ed9b452fb0", "f66a54d31e9c519c3fb4d10acbfd7596", "5681f6d897baac9117846e0d4e8356cc", "d534a26e92587be0723e1abdd051282f", "273c1fdeb6f3063bcb84c74a815028cf", "f41d36a4a3763492e0d63e822f0d69f1", "496ae37606c344dc47835026dd652e37", "eee1210cfdffeb356b5c97ade4953715", "e40e91ca134990857101157d9b6d5921", "c49548b309c76bba012cc670c87f7b39", "f9699d20fe05475b0453056eb1a25024", "acd1e3f9e9b1a1f0f2ddb10fb35a3aa5", "243b4d87aa334ba81e0cbd94d0be2388", "05c86ef188498eab0275134b5d368999", "5d402a66bfbe32acb2731f490dc2993b", "ec3006fb07631fadbae67079db11ba71", "e188e233235a6bec4f266078af7c343f", "c45369a508a6f8f5aff6f5c919d82265", "8e16c3509347aa08a259405f619a4fde", "1f92613bba6488776e03faa13034d8f6", "6f556cb35d4073b3377d27cdf3529f05", "d41d8cd98f00b204e9800998ecf8427e", "4d97eb975f9b211650a3f129c08f7ec7", "f35bc08aecf64213f0b6ba6de641c0d8", "b6e8ede199c45293fa82c7e7d9730f74", "cdd521bb15454657012e2448e5a64fa5", "121ae043df4922d7ca400d355622c13f", "e3e2129d60c4644bac18f15f9044e9be", "4784328a0d8da3eeade55da3faef382a", "d5cbcabe606de9715aee10e2a5c05b26", "afec0c0776b08493ee1da33588dfe1f7", "ba61b4d9c158e84e18952c79ca3c1d60", "1131e6c24c3f80343602e1416c59e5db", "ec93b607f33484fcaab7295818abd3fb", "094588606056622f4349f434690de721", "7d9da5649ffe0de967511b4e6fe8d955", "7c6df3c782c138e2a6ab1eb3488d14f1", "4150dae0481f61264cf036c3c5be15de", "9a8d3af3c814c0cc2e44f598158f90a5", "068f9b3a26adbdeddd30351ba140ff91", "95edfc638fa8a0a62318e6a9e1e26f7e", "a661f33c3a71081ea3d71457b9e3a9eb", "f6e4496cbbae4f79dd351ed45541c886", "2b4e3bb07356ab26c2730e6b8480fe66", "6782d177fdd0e2519a9167c915550d8c", "9b42cae598b74a363881a905937a2cf2", "dfea575202657f459142def5e074a1b4", "9134bb563b073396c2af0546dcc1506b", "1b0eb26fe59a6d1c7b78615a2bb7eb61", "c740145c26091071ebeda528c1766255", "c9d53d6633d9829db9f2087cfea86708", "893bb1374ddc8c4f87f520580f0c20aa", "51239888edf4bb93cb7f459aeaf4dae5", "9c333a2d3f32ed3272b850801e9ef67c", "8b0bd0f1e8a60eb39634945b064de74e", "8ae631edfde236900e8ae0ebd091d88e", "b6e8c69e23585562dd19c38713e7576c", "24ef93e389b7110c69d0c2763fee1d44", "b7bb94c4fd9c06f1c7292e501956fcdb", "a79577346179dc4a06c78c2e05f023bc", "8e6b854f28316425ce148f1d8839c333", "a07b34ac34b0c7d16fdb7007ed2a4a62", "6a81d2c7e13287efed0ddb94a5de7ba0", "c5738df51ceb2eba20bafefc06715d7b", "b08a873c391f45cd6f6b6ad69a0acd7d", "d41d8cd98f00b204e9800998ecf8427e", "d20e4a17bbdf0737052ff2d6ef39e42f", "d9d7e332503d3ddc4cea83124471f3aa", "ec11ba6787c9e1615733a755099f1394", "28c6b352e97ce2865534b5cbba29f77e", "fc03b500f9b87b29a40fbc8efc896052", "7743ad80f032522ca74c5c5ab80b721b", "32190b30be5ac37ea6d704a943976677", "bc0e22713cacf937d0ba5b50c1475916", "331ee00c7aca80118f3c8488d9c99c4c", "fb6ebce30a9aec4c881c47058803145b", "4ed2516964f20660b68ff0f552ae5ece", "423dc52c1f81ca680967887995dadda1", "d41d8cd98f00b204e9800998ecf8427e", "746fc1591d1112b5173d20381fc89573", "d70124b04eb31f04799a9d9e5d3b8b6c", "41f59a5377faa694da48fc5b6025df80", "517da130bf4439179c0cb79c1366ef5d", "eec4f3364b595dfafd1134778a54c5f9", "adf72d322adb4597b8e2c1fc2ebaea0c", "560e0930d3555e93685dcc794b8b676e", "63153f26b868b5f0f53f9dce7228f2dc", "35aec686246f6ca8c88aa50bcbc51b03", "48554a07f7d77c613ebec0077ea6738a", "e5513fdcb18198725b0427db8b254a2e", "eea0ebb6a5d2a506f94eef92e9857495", "c15e85ef9159c72949af4f8f6675a318", "595b92f75523d5c7fb25282f5060f32d", "73295f4b28f7ae8155a5de22882197cd", "1931bfa0048dbd197938c7a301431db7", "2e661729a5253547c12d39ae10712ffe", "0484a0b152a07aa8df585c224bd4ef39", "2d74c42e01167614de0d08f3b67e28b6", "4dff3d72e8da7a1842ca10a5722861b6", "7dc79ab1cfb5f069e57e0c4ed7e5e262", "7c18a0bc283b32f9c578df5208fa2cc0", "d09600f994045d6f9b1393bad81286cf", "b236235c513a28b999d9ea133bb17cd0", "9f09b20f973add991d6e8004bac2c3f1", "9b2b6f2cdf70d100bcff727200b701d3", "8697728c00960082c0f31abe526ce2bf", "d41d8cd98f00b204e9800998ecf8427e", "a36c4e969fea59b7bd8af2ed80d13c56", "bdf626ef04757dceb3d0a67cfce2e747", "a85a19d3a7a1ed91841da66fdb3fa13e", "0c4edf6548961dec447f972f4b262b5c", "bb2443f983db0607e81875cc51bb8e7f", "1fcf78ca2021b8b58bae2384dbdacd0e", "f03f0adc9fd50d682cd1507233ab0a3f", "d868a4f431b2d938f13ba860d4344ea0", "8af5f4a047b9f656a6159356732a90eb", "5133c5922bb2df2563d9b780d091305d", "9a8b5687fb1f62a665a9f9ce57493966", "3b455f552bf8433c63fcff1793e97d4a", "e3eff886f4e6ef09e3af6e1d24e0841f", "5e9a5540358a578d2114b8978e381985", "bd8b347775b34cfd253324f3aed61178", "6fd30c0ca68e0a85eab25ce803359875", "3dc6b548dc9061e13b88a1cdd9f90b2a", "0811d8e748ffb14a251fdd39fe9dfa69", "2296f974e8cfbdddd5a2d6fc762bf90d", "92d4b28b5b8274119dad89c5f990e8ad", "ee98478280828182c65a2677ae0afe8d", "70d57f49b2a0cad211ac53a7290bab9f", "70dfb28c4a5986ed7da9b6fe7afd972b", "50d7d0cd54888d84ae89dd920213e042", "01096ef3cd5b2ea7ae8b40b928967b67", "48a559a6c3334c0a763fdc213f80da5c", "ee5b23a6cb5f9cf363854788efe1b174", "9262fb4e3781c31f378853e98c95cd6c", "da8bfa91d04cd0e4e187ec1facf9bfb3", "6ca110d346a27cae7e5a28d602920b81", "0dadd3121ae0b36425afb94f90937ee3", "c797a1bf7331588b5a92baa4eb090cb8", "25cce7f3f375ea3ba2bfc9e47136d6b6", "923b16f57c1778d23f0bcabfdc26c107", "112f726fe94f688acb015a0e041ec33f", "b8805bce38d62043f4a513245c262c04", "2968329dc6c1753873194553ab3d4b04", "d4ad62e011dbe4067de46d88406596e8", "976ed5e4fed90d500db067300f95505b", "6dfcd687c7b0093809277e2b229effde", "4ed57813b0622cff2d44ff605b4b13c7", "d9895e91a612a66d69a97192cff34d55", "14fafdef61b2e8c56e7f024aef98d8d8", "f9ecfb1ab4c7bf11993edda7e97e94c2", "114409d5473a57be39a97808a2814a44", "335f63b0cd96c9fd0a3d01db3e1167fa", "ba111b7ea305c3debc91bc614f90cd37", "07e51b286bc0a19a266208b6f5121beb", "d41d8cd98f00b204e9800998ecf8427e", "f7689b619caca07753490ebb4190437d", "fc6f1a8a5547069e9e7bcecd26aa5203", "88a75316c1ceb6cb976c651df584d04c", "d711d22bd5117aa1fc4ae30f2d814b1e", "9821e2b7ba2d2f286893bbab09c7c05b", "f3a2a485b80c01c558a3511911ccf2d3", "d56350a2e29ceeb69afddaff4f1e6de0", "db4ec09578e9bfd87c441e45bc645b5e", "993f8b12c2c3b65d2ca09de064cdcdf5", "8ad623df9bd067a4930b9babc2d7da6b", "89289b6796ab26af3b0ab81960e14934", "cdf6e2e2044970cc3b0a55bb19a8635b", "58835194aec244131bc748e0a02f0189", "7f3f1dff5694283d6708c0e93a15bb2b", "3b558ca2f15e8c05732f511f2347b9e5", "b22309ddb724ec49588575ab6c7cd4b7", "960d9136ff809a7595a6b4f7f462e336", "be916db5238d82956b4e31231e56fa01", "f57fea37d4bf1871f4a7a6d0c8f3038d", "a0e9615418bafb6bbc6118ec505b6c1f", "4aaea5ec54f39e3ad2ea94f9353f2d95", "830f7888ef8ecae27065be66781098c6", "baa5aaa88add12d2085029ff850c083c", "9a34ba3b0f487304cfa6ec064e8f72ed", "3557946b5fcedd15496e32dd099082d2", "f8b2ad2f9d59ba13c683e30603521288", "a0384575306b459325fc27b0785a0642", "119c6ebaf06f9c558bf942f557014074", "87a883dca96b55777a002c8df69dbe40", "ac9f7971c4e67aafb758738a529c12dc", "1663c8c084431e4212c5cea100e951cb", "f663708e9b2b80e983eb42c81e3aaade", "cb04abce2a2d39e3356c2c6db5742771", "5ae7ae704456bd9af86f00bf51c6b605", "69a15d21ef622e4dfa0e1ec0d6cba2b4", "673d533a7fdf9a2928148508490e3edf", "d69be1c64b8db1d1668e1d4675c62268", "75efc57abef4cbcaa3bd6f304ec8716a", "a21c261a635efad5857c618c35071c1b", "35116bfdae63fea2af4579967d4f954c", "a6bf33808714141b4095bac9e95b2449", "9257afdbdfea98c07af6baf827b6fe7c", "c4b2d5922e8d25d4c7e88f33539711d5", "14d10a2a641b5f3fc351b02d9a4df296", "bb73427aec3f69aead055facd5cd8bfd", "54b0d2de96e5e1f9bef3eed04bb07870", "a74c9d9fdec6f63d92463b185f142256", "86e29e6558452a94634aee1bb80950a5", "f9454413e2edc0469fc730b6dc342f81", "51c817a0b90bf342f04bac1b616719b4", "d9c6dbc73263e80f6f2fbd014c5fa760", "a2f63c9db6a03ecf8bede148d3266322", "1adebb99726cddd8cf0093fbd0466418", "e2ef17f5aa7dab05d347decc7da5edd9", "d41d8cd98f00b204e9800998ecf8427e", "dcd2f4df8a2f37fd6ade60e47e4f2ec3", "537337897c1f349b7fa4deddd80d3eea", "b6e402cd720a99dd2116be69f979e647", "0a8f0ab4ceae09af73204ea4ad3f9a7e", "801295f7591cf5f77415d61c8d70143b", "783d5fc63cd14cc9eda39e2ef9be1896", "96a02d577f27ceec3d9bb800c30da01d", "4c568b0ef2b518b634fea08c70ea8638", "6a94f5223715a561f258e2109aa3be14", "d80ece2eb7ec62f2305d928695121ee3", "19e39723e4423a2826f5f9dcaa9fca9d", "0e33d6cc41c7948e8fb5fe25a3250255", "4e08153230bdac693e2e8b5abe14ad2b", "baa01d1cfc9976d2e73d19234c305568", "c7df712ff9ce113bb3768547be578d34", "b056c2af6a52d85aa5852aee5b0ed195", "18d7f019046d94d612e4cd695c6de1bd", "800cb65fcc6708294a813aefd4e3ef78", "1f7939fac5447112cfe2d48e3e9ebe77", "4e29125a670416f87b118452a00a389a", "394bde708cd28278361e3feefccb7bf6", "93178c3379c6a7f7a110d27ee8657050", "39b282778b28aa80c4b7eca2646d9b46", "b9d83630caf6fe685edd3170a4dd858c", "2fa5b8932397952648013813a2543c9c", "41d4f08b77417d5a6409ab6cacc88a76", "843a97c5dc2e4b8340d884f4c5857271", "b7b085751b5e48f33950fabef4c079a6", "b97fdef7951f0cfc6c945d5e3e6588ec", "175dfa312edb13b0c29502b41e59f26a", "5c73d52fc33e1c9c599ee743ca5816b4", "3df3bf2c94d8cfe8419f5a2e153cf277", "4f917271f6875722e35158a107a7947d", "a18a8dfb82421ae89609f63ce5d48bd5", "0091a1fb37b3aceebf11092abbb7acab", "37aa46170d56714d05a164e8464daad8", "7690a7f2c288062a93cb86e88b952333", "f2906e50a062eaf67ebf7f8782a931fc", "999b88dd49ef5676f80f3e261198e46d", "011287c1fd934e42ac89c84b927707bd", "ff3de55e08676d0394b22e258df7573b", "0a60da6e9b4fb733d640c8f666696ab5", "949aec45e51464e6a033d688587117fc", "8423dc7e2597c127df63262dab1bb84d", "7fa82a65ad1c72ee1a6bf448219d8595", "a493ecb88a3be022db30a15ef59d164d", "93668a814973dca11e3ec15c3c24932f", "c1a5bb1057fd7a6bf2b90e2faded5fcb", "394d6cd3f0f4aea8d7855c92a351d5ce", "d2e5d5ae108ee10f79612850e8f0f86d", "d8c341d41cf07d95df9b25a3719f0ffb", "61745d98133fd70e5a54d29dda9127c7", "3cc08fada89e5c0353b65637255c6f74", "df9dfd8790ea6dc5c04a62141dfc26ff", "c016f8ae4fd0e912fbbfc2e33a2b6b3e", "99a8a4ede474a2b1f0ad640d33401ea2", "e1b56af9387fdab03300909206ce39e5", "c729b28f989e493402a981a5506ec8a6", "9b2a0b77538a2fe3be06e6e3e8cecc8c", "5ddb897c19a849f1dda13a1b3d59639f", "8ebc581b513b159d8cbf94b59387b51d", "12ca1654ae047cc7dd746a74e233bc16", "92d70231011b5171634f6214a066a6d9", "470c23cc9242fa50bd8929c07a5faaa9", "73b730bcba96d1a5267d35b90515e4dd", "fe9455494d035eee37232bc8fafe00fa", "b10100583df805dd082762dad0163a63", "f68c9f7327bdabee9c2b5a873792fd15", "5d71b954cf573731cb3fff3f82d0f0be", "d7cb1b874b9a8d336db5e631364a19c3", "11059284b1197929281ea2c701e3474c", "68b24b8a09d4134f774d8b8777549633", "c2db787835f90e8b40abca650f15ddd5", "d0136ef1414bab116b73f7c04e642de0", "8dc2a7b079647ee672110209cc85bb0a", "6fe2d521f1431e6d0be788d16ad08490", "d1a6b97cb791feccfd4a004ba32223cf", "54d30bea76db6c27666de65020468b94", "ddbdbca7841ddbf60892e5617630e28c", "63b0718e0d3068b46b479262edf86ea9", "0c25f472e406d4dc364a7f9239e467ff", "0240bdf8b4748bd662adb590e663f72e", "2d0c6c1a48b8edcf63955429b27a5301", "229726589bbe968fe16e984e6d7898a6", "d41d8cd98f00b204e9800998ecf8427e", "2a9dd1d8275d4249a4fbdbf13faa9109", "bd7707c97f38862dedab06fe95360eeb", "7af0fb321d1711e21c5b2f87300389a9", "e24174043a4eaaf9aa871702c67b0a05", "d0c5645e83aeefefe2c05ce66c03906f", "ec1951f3c1565f3b25c41dd19c378675", "156b1e1fa87fe14e8799a8c5a2665e32", "4b3cc1736fa5823a74e8081ab8cc4a96", "3361e83fc5c59279a4e0b8f72338f82b", "21ad03dcb18b5b2052328c868213bf4a", "65c2cad737150c7d85b69b5c81706125", "0d4785c9bb1724247104d426b1277b53", "1dcc4687752204f929cca82e53ca984d", "2983458d14a802271eeb8573c5ddf875", "9e3ea8950e2dcf71a98c3e9dde275b6c", "fb648945269b019608d07072c8e14917", "6c3415eb56adff08f98f8fde3b27e119", "1b5eaef107cc9ba2992718a4530af670", "091d477708e7622e202abc2e036bf26c", "4bc3af71d77e92449962c84082f26d45", "db94d0c7404f63f30676a02cc579d4f0", "79fa6d6064388cddb7c05d110316e042", "3e1811af3480cbd3321fa05ad843d614", "642c5ac6ed46dbd425c632912cc645e3", "d8891c14c72f4dc97b84903c9fbf0292", "d41d8cd98f00b204e9800998ecf8427e", "b5c461f30dfdeadc6c2446f08af0ef4b", "e60f2520b8cb19da25b0c11ad94ed28b", "17a96c8cea3dec19e76ea516eb34d57e", "8e6c217a465740610d0711937f63cd1c", "b9f634b3f64ca01509f4ec0ac7b98ea7", "c28957ed7a1cf746524eaa4322552642", "83dc5bd56bdc9606ea28fc23bfee4b7b", "6dd13b8fb9d079c12c17373257d5e7ab", "ca192a5900b11ec8116c8d4e4cb5ba91", "6efe3519d75bbfb2671c8b6d61a8a855", "d716587afaeff925cf5256559d3d5047", "bd135898ca06487b37828b2460681dcf", "d09b683e402d54de395eefb0acd6c2cb", "5ce2c594010c4daa13131c14cd72f1ad", "f478cb8ab5ad85959b807fc7da72581a", "695066005b04df15c022cf0ba489c5ef", "2fbf4cfddcf3be1a8ca18cf105f73585", "a9d14e94c42e984e9abd019f10af81c4", "25854e1995f31754a14f9f07e7007b2a", "f93bd2b7d3c256d34c16d10085f75dae", "d93d8c783876dc5af837f52bb24309a9", "2e73f398270b147d1d1fe496a0d5048d", "d4e8dc2a847b102dcf3d27bab1a40395", "74681deec7bff29194f2aa0f4b3415a6", "bc684c1703c6ab37c1d074f9332483b1", "4b53936c97d7eeb90849569c505440a0", "35f747c4f8f3a68c6918f185de172a4b", "785cfe51adcaf9e798fc31d62aa24b71", "5d391b8339211b5638b88ab88e22249d", "fc5abaeb61849ff068cc435eb8430a07", "10cd80b0163c2328f55e6658ef225435", "01224f6333234fc42fc559095155b5ea", "363b7cbd1c2f747bbd8ea7862f67a0e9", "8c7a9d3769063e9855fb4d0e4b0982b3", "99c49aa9f94e4c8b8f45a8babfb0f741", "faf0a9ec5a485c56f24484fa8d67565f", "181661a47c7e8c02a3c3e7c435aae161", "69a6e970306584d3da3c608e28cad4af", "d41d8cd98f00b204e9800998ecf8427e", "dc8501113e870d5081bf699714e121b4", "f916605583c0ceedccac5a4b65b66e76", "62084bdcd60035566672863467d21a65", "494f02afdd2b51873454ca8e0703bfac", "96971907c4a20ba7908641e1f95ef800", "3682c74a26f31e506c7b37ac6790f909", "81ddfdb6062883952938b9646a0cb873", "552d3b342b10b6dfeae6e3a46e59fa64", "6f9f7cf1501e80ace818eb42944dfaf4", "536e980192c0dcac48bbaa02ce57b0b2", "ae59a787235eaee92e84ce5d601e286a", "566b32c0a03dc1314340f25b8001f71a", "d0e1a264fe0c37e60a3dc9db5e8772d6", "944a23bee5eabcd03817d889056b290c", "dd3cb22e9d6709eca7c2afcfbf289d0c", "e9a309fa841fb84e111c14f0dd94f391", "7fe1b6587bd09b3473af66552dacf6dd", "91abbf6e8dc3b5c69952305666dd779c", "66216930775a8483d8b0a7e84d8e7cda", "20134f26182be23e7bec0e80c5e5baa8", "da23b68eff453d5c18818056926a7f31", "7c933c1d688ec7f8ce38f805cffec3d9", "cd2046b7dee822f110c2d9146ff5593b", "e6afc84fa043a26a8199d9f6327c3369", "5c6be98f4c89293df6124a5061b1ee5d", "0c016a1b8d22c827617120fb28d9e715", "fd6ada09dbdc14005d1856aec31ad644", "a9c73ca5504c25834f561e1627f36679", "54e8bd79642a62d091f57d71fa27efd6", "eaf2590002d80a1f740d2166d6896fb1", "754a1533047659382d484b1b4f414a95", "db570f786f29dc2d2f0f11bdc3e207a6", "33166439d255dbde4cf1d2bc27af8346", "b97a441f2ec807919ecff43139472e12", "7504d5a080770f032d41f5052f5df202", "a73525244fea0fd4baa27e329e369e0c", "042c27d99737afe5441c7a93db1b30cd", "80a29f86df6c3150401d7913a5b6d1fc", "256b5a4c3f2879ca8489335413528d76", "7c54bcdd22b581fc2483d22490cc6077", "34683effbd510a3a2e93ddb92a9e4172", "29a30451717b4217eb24a899ba726363", "d4c904b593fd2c32760d5a83d662fcbe", "f052f1594fd385bacbd7eb07fa350c48", "a9fe5f140289d2ee21eadec7380cee72", "cf308467dee31dde6501eb600176e9a5", "993c74a58e28e6acd3e05aefc4300304", "1e19e6dd69b2c4e511efa456538df5d2", "42c5ca0026e594e041e8ac71619b89d5", "11cf96c0bbb8af342deb8723762ba66f", "1568659bc6fe58e2a293a72995e4aa3a", "c6b89a8553556ef9f27a2d46b7a6327f", "4e8944bcba6d521d6be2ba2be977f873", "70b7a28f238433cc0e8565d25c0ccdcb", "c2a420174438b60a1a9807c030667209", "8cba42121633f4ef43ab3bb79cc08773", "d835e17f0bff8bfc9cedc0d3e42dc277", "8a7c7c132064b6ec9258737b2383b217", "e2429cb5d3d3bedfd4f3e9bb001261bf", "ae1ffdeb178c5c92caf78038cc228242", "f8b1a5c1d987715540a64a2e211a7fbe", "0fb5d78333571853243f2fcb300f4600", "fb573b01fc7bdc6bc3fc6bd002f618c2", "8b68ddbeab5f2842865867dcbdd415ee", "f139638dbe0e83fc7c8da3b3c46e1ccf", "7b83b176291fb1f96b39895fcfccd97c", "892298dc7861de5d68d3d101009bff79", "f3ebbbcc5a4accc70196fc947b21a410", "4ac1670b917e09ed55d0ed805fef4816", "8afd275469f5a65c7cd7612488efa542", "f11fa2da511513aa8ca5313db283138c", "913f8b31a8a8c64fb7719358531e25b3", "ada64f2cb96c49c959d0ce3ab158fc3a", "a76c91e42f2115fe94682ceac9e1b0be", "0717c14580e81c3b15b1fa9cca9f974f", "e3f1fc80371cc86342feb9f5c4bfa70b", "6db3dc024622abbef8db0f2925413df7", "4623349ba28076d67d0788ed6f9a77a5", "e27a3310129ee4559bc814e03bd1280d", "820807cb948f03637b9d8061f270d1f5", "519b18e9164ce58df797605ba8b92e72", "bde103042607947c6ede220afcd564f0", "0142c238aec125c20cc9cb9c184729c8", "4043f92bf8372d8de42f3205e6b3d2d0", "85a13e742aa690e11d2542d354714b8d", "10bf86b83596e0ec7141a817e1605c8e", "a68e30dee4abe4bdc2afda720c2163f0", "769c6681b63781ad4d60257a0ef1d59f", "bb9781d85e8033968cea790aa4e970b8", "98c863bef5b74ca0aaafda3e3b65ed22", "bb679aabc06046072ba854606fe8537c", "5d78a3f854ca7b99615cd28e747369dd", "f1d445d1de5d28696659d9a19903a6cc", "41bb10576852ccbe29ae462fefed8502", "0c265ce1b8ee7ff279ee5fde25ad5732", "f9a1418d50adba6225e4c92d9d62a31b", "e96884300ea7608d49866ace5fde702d", "ae218a5bd6923309729c6b54316c4280", "436148be1320126861b2b33b140f64be", "59000f67fa0f2dfd631643dd1b9dad7e", "5eaa4bb2facdf01e9665eb35b97fb595", "fa95ab9108b89b8b900b3aadc330b0df", "89fbd2c5afe2b37d6159c2b3363ce2d4", "c0a2219abd629436cf856d57abd4cab3", "782b892a5932ca57ab9eadf87d223860", "b941b1de6abbecd7a0f0815fcd3c7f47", "1c5d0f3fefb8e2fd89c967b839959e5d", "4d97e3899d8b233605f916dd39cc0afd", "993ec7cfd1522bcbfb2b09ed2494488c", "fafe1c48b8ce93cd581f4ee4f223bbf1", "463fc68792d379861687d2e0cae3645a", "146013195bcb47a35299733c065a29d7", "d78102f5057e2ad4182d05e50086e845", "0479100d0dff0be2ceff6229bc443a02", "cf6e35b2b472fa8428c4369fde129123", "4385d7cd26db1569752670967b00633b", "099c75bf0c5fba8279ec32d996343740", "9738c3efa1fa093e0838079cc6a4f399", "1ea2582d4ffb6e64240d8f7f818b11bd", "afe39eb7b1ea309e457e7c9e399aae89", "e58b6526e55fc82bda698a8d7235d8da", "f2329864cf06c567883507dff3a1869f", "3aa26173caaf3614ec0d60609243df72", "5db84e2b418ffb185fc5086f10bb4dd8", "01e4fc81d86811e0c590af91f1d4f34a", "8b48eab807a6dcd39968339eda0ad2d1", "01953ee193e3637f6fe2699293223428", "c7ecbe8299ccd387157f4d642c1a6d8b", "cc1e703f56fb7c15bab11cd6600a3e1c", "4fa1473daf1a9677c9ab20c083ca6f42", "d0f1433b93298c5bb99bc5cf72774d58", "e7e6ef0f7075930ee0f449ef9dc31057", "3edd0e76c7494ab9c60c1e6402ce74db", "2216d1767c90fe442ed355c66a125f6e", "ec2accf97eb23068f33dcf733e0d1320", "da6327a1ee7e59ae5493ee7e34495986", "ccd5bc041bbc2672a23a13399045f474", "39093387971d8709007ebf33a32ee116", "d7c40f1891809f9d5a1ca6a26a8e9718", "c5ccdf851c592f7daa0f952be795b2ce", "2442fdf3248327b492750fcda5344ed2", "fcf63e8ab123a52edb03e9628ad1e4e8", "c16d6f5d23b1e34f8f2b52a84ec8c668", "f634ff1c8d13a425ae12cde47de56bbb", "514de5224e24c5168fda258e8a2819e6", "3d356d82f58d9950b0dd103d0894784a", "f99b96d4e03741c810c2899f2b6c7f01", "c91f6bf55c6fd0cc653673c02aeff4e4", "ace14765a644f2cb3c5974cf0ff74a46", "cadfa328e10ce1b95878d21f2a84b9d2", "97e897c2cdbd7dd20a440ec3abd27f11", "27dad3871a67f6a86b2e49f9498bf122", "77c1af5f8ef440abf05f028dd920d064", "f4f1ebc5641586e2c949ef90a56b34e4", "2c2a449c69c36ac60270e1681e061f89", "804d8940f955997274ce8a2ec982e287", "9c191f7b99d42ce8dc643fa4b74eff71", "d0c5a1b75a29440df1ec4742449f518d", "cb884c9c1bd28fa4d152795f79fe2ee6", "41076cc4d3200730c378845947b98427", "1ec642dbbdca6d7653e4e21e147d64d5", "8d7acfcb931fdd62b3534cc44f4bdd98", "2e7f10677e826d634fa9867d2b850671", "dae6a2dc67d38df8cfc93729ef9619a3", "16fb6ce388ba7736995460a1588439af", "953bf595cfcc067702dd5000998e66b4", "583a1bb1b00641a02a5c46bc4a1d1511", "f16727e7bffee8594bf01a6b9da5a5a7", "b680168501c54622f4bd79a887507c3c", "d7568edc7c95dabac245edbb23adcb0f", "711ad0fd7b491950f619b11ca7b864ea", "0ab8868b555ea621ef3937d00d51060e", "4a7ae51b838c07667ff5883d511f3770", "d1fa1c0c5908327c412fb2e5b81d9d4c", "b97611d2f76db1bac276d26cc7d5cb7b", "1076ca1bed3694c788095f4c6f3562d5", "692cdf505d98eea46b50d7b833550152", "b5f9835e27d34dd24e32ce4ccc12cf7f", "e3aba5b7deb8960943ea2cdeb7922b36", "230a76070753bb7a2f71c5e470d664fb", "a06400deb696d8fbfa070494b39ad0c9", "5a299dadf76eaaa5e056b5511ae0776d", "51e99018cd487935c857038080b7a971", "f758a724c8faa769bce1292abddb42dc", "b8b0352afaf24e6b74c56ea19a4dafbe", "da338b9afae6f7bb5a83461e8dd301aa", "927380a0b16a4bbb33eb69e209198f65", "98138c6a246cb5409ebbcaa060f5a37a", "4a2dacdb3a15f2f5a895b8b177ac1f55", "00dc97bc51f012b9edaae49d50c4453c", "3d9a54bc829b62af9a11ab06da743b63", "f05b0d4b90d8f2e8de4384195dc3af94", "ea3c037d6045354992236b318d294bc4", "a828b0369a75e80f7452a12985bdde3f", "5b2833efdf775b41f5de75ab47c9da14", "cf95d0dcb926f1330c4f9967f83e2087", "475fd964ebf5b352406877f60ea37216", "d171199de79b51e1a7a1a588ff7bae1b", "4de21551dc25f2d84385d2d182c0047b", "afe3ed4cf61351e3b66297f947eac660", "43abd89c4b4be6838e29639203666c67", "276ee1b88c60b2d6b42a214cbd204618", "8a6aef6bea3edd4d2cc82fb707e817a5", "ae79ba906ede34314941bc74bf6a7888", "c4c2719bb050a8c9398c23aae44e1537", "f1ece188973aaa3f969dc3120e11be91", "b67f2ff58f9aa2c40916b49ac274f482", "da0c63b1d66a5aa34eff1c0b10724409", "5990f357a43c0a3a707158c7253e64ee", "abf320a51f46538c8165506e14d32317", "6e72b5d77085b6f0d05e49c6eec8f730", "b671337a211e4410aed1d327f05a5904", "287ba848f84c8912d26a1c0a8b24bd18", "ed805d3773930894e4333dff7c15d384", "f180ea345acb085b05c62537ca590577", "542a89dd5ef6db108fd76ba33117baba", "e0cc3aac0188a7fab99938051bfb313d", "2f266017e2b1d1f5213ce9472b71edee", "c0c764e2f10770172de6660e4ed294b1", "c4f9ea5c2598f4fd06703c1f9d87f5e8", "bf7f800ddc277cc809e2a384ed55f3f9", "06d2e322a47440e2201c02da046d1e87", "db70f4c85a0a134944410808183a8efb", "e8b67c42a4b23d2b675208a748b17299", "9975a27e08071a33d8f7c1b9a0753827", "e22271eb6deaf099e936b1a1af00b190", "0908ecd71d238d7b2462b7ff8870aee1", "1cce373fd92a515aadb145823d5ed52e", "9cfc80e277baf2b9a5595759935f6c79", "c7488486bb3fde160c79d7c718e751df", "9b707e36200225400b61c3c2510e2734", "ebdf26417df7f553b1a6e8748a0e4b3e", "741c9169c180d323b735ceec558c63ea", "267095bc04ecdb05e243944470d60d87", "1f04375894d62129fa25e45515784ef6", "648f24025c8383ec5748e2c8a623f711", "99592f5ba681781dfdf3529435ebd694", "ccb73a9832701a634b46d8849eeb8603", "e4d8079fa1266aa08b52f45297c587c0", "26fec0f64ab7703ad6b33b0b46db4c3b", "8fae0bd0b3f4ddc844534616ad97b7e2", "d9f2f778360198b3d2cff6cc81a6ac9a", "18cc2890dfaba47c886e8bbe3f1f279d", "faf3fd0339f6612fe7acee1155fe9d40", "527f4acbcd62d35b23e7f2183e3ca06c", "e6a468e7417f930026d5667dcc703853", "389ae58fe723f3976351f1d1a2fb2e10", "9c01fdf66f661df8f8ad2bf0e118c31b", "8000a9de5696436de331690ab4015ace", "f4dfbb7acc693b585be73b5d676bab85", "7df6ccdcc14362fa34129409c635797d", "fed01ae946b51b077116c34d5b70c650", "274d013bc7eba49b1ef92bad36716a90", "988a45266926812bfbbe06912bc344dd", "e77300c8428a426f2f4064b878d3118b", "03aca06b86ab0fd3f1ae4fcb5e4a7eda", "ccbdb8509141a1a49ccc78d7667832dc", "0b53cca5dfb193eff8dad1faa8f57e65", "7df94f3e7fa4023f0012e994853c3f8d", "d41d8cd98f00b204e9800998ecf8427e", "4e18f75829ed868e8bea28cb9aa5e690", "5ee1e354c624e054fc4436c2e569f022", "44dc984f963448afc303c68357ebc37d", "69ea4eed999796d02a12f29e68a63f42", "942136efcb492492bc68d907f80150e0", "989dac96f991c41e3ecc71ec7cf2637e", "15d91d77c43979d0931cf9cd09046fbe", "036493864c5793bf752d5b0eb7609e90", "f0cc9bed8a12cf3e51c0dd2763e08369", "b01d52db40fb98acfdfb6613e81d8f67", "03ed89fb00ef378d15d8996245b46b67", "9f7de5a245f142ac5d04df842432a956", "275e95e5b58d3b80f3ccec3c3f8127b7", "f9e9c2623fa0d2d3911b4c0a1c35ade8", "06d5f4c3a1828c03b0c5e1b44cdb0ebe", "6179ec82226d429a7c64c255f811d837", "849c0ed031338448aca4a7972571d5eb", "1f5f1a8b042bde5bd5dda61e8029d1fa", "725e4713602a54cfabe58033c57e6155", "0d398deabfb2022b3a25ac7a104f0a94", "82ac53d62e6269bde2ad5433b715579d", "1fe10f8a3fc68c89da477384134bc0af", "2904bae24ac62278099554d28812b991", "037b1dd770f2385db086b061141c450f", "b8c80ea48bf6d60ffcc392665234799f", "ede5b79053fcbda11db2b43ff188f4f8", "09cc37363cd65591c86131b17e4d72c9", "159908dcdbc86ee6766a05c7ded4d250", "ff1166e299a3d4ee184baf9e679bbff7", "d571d6dea9d0693a3ada74b22fbb10b7", "ec9fd196d8335f8645763d6a49d9b5df", "eb899741e0b202992f19cda4ed764b6b", "a3287e79706e56aa9c83bca925e94010", "642a6990b2178c546ca81a76ada17e22", "a9b926cedf8bc09e38133becbd0e4dd5", "55bbd6956e43c69e7713b9318ce107c6", "b5326afc43eb505e3f29de827202282b", "2dd71c4ec8a64f93dfff6a570b8f0ac6", "2a1a206192d1b5124c2e4dca45bed82f", "79e3f579c01c5673266b88ebc478c983", "5ef1aeeee6eec426e697c1a8905c9287", "8cd7e543ad44f3a2ccafe5bc634c9466", "d8487261a53df999c5ae1ec7d32c5287", "7d6569ed81aefb6883d82b2effbc6bc7", "162ffd346049310e291982cce417e46c", "8aa4693a69975d12b3ae38955a459cde", "8a7f834ab8325ca90c3cae47b0e47e3b", "b49b369da1131e90ac72bcd47ae66783", "ade0a2a5d6d976f73f759da288f582a4", "b490032571698bcccdafccdaac269666", "b50731873a32e5bec6f2ce7ffcc0d1e3", "6c42d7f7f47183b7abbc8843141fcfca", "0dc9f015a4a29574976174605b0575a0", "33271a627b118c52facf1cc003ae37ef", "fa836cae66021b151b820f01954b351d", "8c01e7b90199a7bd1d1ebff34ce0a2e4", "cb44f195f46c636365096c3d9f63577c", "e20d31f16e7e9d1d0f479f899ca72480", "397b868a8ee8c1c37bbfbbd590f28e7c", "fe1b47dc604af36f02ab829ae1c56f6c", "0bf183f27904d0185d710ec64c80fd2f", "9da6b134fe65da09f9b5e5335e1d4cbe", "0eb5704e79960d98b42a935dc10fe9f3", "7d1ae1a38058cff74fbc8e91fa083e1a", "2b7bc5b86dd50c2c10cab34ad82824bc", "1eb755d532b649e425d78e979013b6dc", "142a4b0242f678b883ed82d326201e1a", "c82416fe6ceb60e1c7be395ad52fbc68", "1cf11260275fe8adddac5136a0a9c37d", "d825a140c7dea1778481c0fc586e3ecf", "1ec18f4e91f5a92198099a9c43f0c06f", "d34684b8b2764c750b2cc3da7238808d", "5e98c319ef7765cdfa154e2a2bb52e96", "7c93a53adf00eea2dcd61ae260cb2e3e", "0c866f248eb5b589d11a0b579c8b8523", "12435941fe2f01f929754eb96826ebd4", "ce752944ecc9d6e4307083761e93bc47", "4e4476ed9b386eb1f11a3a72f1e86424", "a22015bc57f83bdfa03b2d7c0de6e216", "05a148cc6ca185bc12835d040bdab4e2", "60251a513503126ceeaffe38aee2367b", "c8901130e22afac75b44fbf8c3bdfb19"] \ No newline at end of file diff --git a/site/song/information/2021.json b/site/song/information/2021.json new file mode 100644 index 0000000..cc847e7 --- /dev/null +++ b/site/song/information/2021.json @@ -0,0 +1 @@ +["7c677c975b834cb9558adb4b141e23c6","eadaa77008e575ec87c0912f63ff7b4a","49990c47fa3fe4ab08117e25c9cb59b3","4d1f40ee31f0fec622ff1b3bc035c7f6","2693c8d0a9122e8246ab2f503fd573df","f0f9c71dccfedba4f1f2e55bd06a4189","cdc446f3cff322f9ac796fdc355bb766","5fb8e8fb1350c6f0fb1a87f260739a2f","f356e7d67f717a27194c6cc2945ce76c","446d9f6a112dfa37d8348a7cd4bb32ae","b295f98593376a071868bc7ca79b0653","3077bbe10a8e53d38b70685c25b92f03","81e163e8c835c2e22b592cf62ec47f89","a38d79bf389d933d904517508792a2ef","799b12d11ce304af8796ff3ddea09e85","13440bf90ce36e01beafdf248f75c26c","b12999be099a3d322075c6c9f44e7eae","5e764f713ccbb6a1e99b522a4a0418dc","bfde96262fb58d5ae842f88533082f7d","bbe214cc95777a5a5e18595e812d7a16","a94610876143c78015b6c03017c25759","eeadfefa3d6b4dad25e5b1e43c9ec45a","fa5387a9f1c30b808c79d8bef143d786","14bb478c183400ff63e666ada3c29b0d","ce7484756468f6f1a279d12a7dae7e76","0152f8fc343e52807d5a69422d8181b7","98368ad9147c63ff7ea2484fe673a0ba","39c52ff6c4346227eb0ba7d6efa94e3e","d04101ef6a210cd1e7bd8ac549f3515c","a809e470b2f85cee5b0d4567922d6ed3","60ac6421923787a9588b8116dd036faa","ab3a27abcdb2afbcb0252283e8e92fab","556636d2ff2e7a13cf54c7421f275d1c","f9539e388835092db26b2450efa36507","b2c8a9ef9d3a2a87d71c9c9c5835d32a","e03d90b3ebe2b0edc90bc18fd6df6cfe","ff6629dbbd3006a1634b1ca4e7cd95da","0b006f1eee8f8eadfa0bda9d864899fb","b813df36c9aacf272fbe65f628e52868","e104da80b5f6cca0549a80c02e1a0d15","62bae0a084ae54fb4612496f9be1653a","71557c3fa08d8c5c80fc4e5d717d5971","7d5fdc1e829e17b644a0f2484a679856","1386e87ef1c93992a81455b0fd7688af","bb833ca3dcf9ed026ada4b6b4e472d6c","5520c64581c717fefe6f8c9e3316bd56","838e1136719636598677841b3351d6a0","411a23e604879ccaea71b1268d3571e2","9a8d6c931db3571dee8b958242460b6a","eb9fbc94a4cb8934077c32416415e9fb","bb202149c624d114034e903812c1f53b","946495542255de6daf3ed1abed34e5a3","253d003895e2deec7e40f3795ab8fd79","9d835aa8fa774983f430463ea49920ea","10f7f2934a1ff9dd315ebb7651b5c500","3c295ced873032d4e8821bd523b0940f","af1511cd9dc61018f62269826659e2ab","71083cf64b71926ded0fc95a655ebb56","ed9d8c932f363698e9c02cf67a8bf434","3ee0b9b71c597784efba16b76174db70","f7cb3f9e2c3e8fc8f386756ceff2d322","b62056470416436b33d70412469078bb","3ef23586f96cadf44e25e3e4f55f6405","92d848eeb717448e74ba284406cffaa4","634621a2bd5e96bbb11edf1f8da7cea2","07fde52fd1722c46cfa066de45602e16","d5a30fef69526189aba9ab73127a7f16","65a9250b76879a26c98e06461f7a5fd8","bb5841b44225bceb2efc5afac11da381","60b0398c561f8d84b55246d558ee7e9a","e8c3bce7a12c576fece5ef44567a1689","00030adf0fa2b941e8ce1a6d9d6c76ae","226f88e84c98520c125e58894357e258","1470cb263bd7e1e969ff527bab3b0f5c","229a9a3e49da97dc7cd5b0d07579b03a","df7d149fa38f53d82c415467922f9e3b","8392599fc0f5a11490f03bb63426eaa5","8f5ab1a70184a07c9a0cd69adf6a85ad","f1bd6a2e910eecf2f633bacefe3ea69c","1d4f83e3eda98076450d9dee813f930a","5e1351b5f9f16f281018ea3017c7e662","54953d2f1b51b7f069e6d30f1a358370","d3775bc08d32103316bfbbfc0d00badf","858f8a31a0ae970d8f9cff7908fce56f","9dfad8d5acc51fd469d5281dd7ac927a","f10eb042c87852e7f053962f8ce6ca1d","a650296b5c6a0a9124899a120d1b3a0d","075ae8bc5c0eb8cca8f951cf65be16dd","7e24a851930cb2f23dff17187e18ecd0","8caec304f50bc83114faf3c8d2aa2140","1968b28e74eb06516a4bffef55a37aa7","2e3c8610c5d70a67ec15a17506a76dcc","f8631839ddb04a57a1b3541f6d845332","111968df57ea85d3b0f18a5f003e2f9b","2636242a42df9c6f3da0d950d6239ea2","99bf5ed3e25b80162c0be247897b40cc","9f1df9ab4087293587957c67627c130d","37a41962bdbecec8725b4fdae5792b00","ea220b5e77aa695901f4274a1f8c2914","78e3969201f9b5e07d7393ecf9fcc119","df9e4f5a6e82c35ae34890c5b8403567","66fa62cce5290c4e1cd1c9e1696a30e8","9b0d6854dacbeb4debe06f96e0b3342e","a4d13e6c4b5d76c2ce08f947d45b754a","972782322cb9cbdb569656819d32e16f","46879f75c16a8e67e4a3cf926b592319","7f9f466943d593624f87b48e4be197b7","b114e89076ab3726b27a32434a3e23cf","a8e1c4e678c0cc09d40049f804ac7f75","a8ecf6776debb5279e74c32cad4f6ec7","dd542bb8ef8233d0b6bf5c5d89fc2716","8238a6dd1645819f0b07b06ed8decd09","2c0aa0607c203ef3f24edaafcdcf6e43","3cfb9cdae5e97c9e27f2c541a6addfd9","f62f1c155361d886c101a8b719dcb975","98040ce16f4a64b4d81a563c13bbf519","73d33a355f4282432f531739f75dac7a","c729bc99529cf9da5f84e722faf292f8","2714f7a004fc664ac01deb5e5818b791","8ec818d590f9e003371281663df96e02","2b5b3c712d9a9e8ee1612f6e7571de3b","d28d35f816615b3ebf6990a3ed810105","f846bdde0e1c4a1ae8ff12d60ddab613","34f0fb767c3e8e774791376ebf65aa3b","17e25b0883a93c8d8f10c3df154add2f","6f0676cbd63ca5859690cee138432bb0","3b76965efe6dcd9bb587c11a289851ae","879e9d6fd7695462361e7fa4b7d3f7e0","98e4fdf5c637715fdae6368eedc031ba","38978e63ed26e9b49157db6f80c263ac","500fa430bef1aca3bb00ba53948de5b9","3c64b6a036f25423e06f70a7e0a44959","7d08d45e5f39dd0f4796b54ed07f9f13","790d88c6aa7757b60b8872005c87402c","9250a6dd20f55e37127ec850e6f418b4","6f6dff2e35de7217be603914f46b5e18","a8e6b77c33e16715c444ee02ef49b85b","962911c798ffcc3eaef7b11fd617aeee","18b8ee6181f70fc5fb4c1f650999df5a","25d2fcd3ce207f993d36825c9705c1c8","2a902a82d5660768fede010dd8de19f6","c769b67385c845cb097a56dc35d3a103","5345052ff729bd9dd04e024cc3594673","6aa8fe40ba824500a08e722e9e0c5548","f66c68975b18005935bfc1f9ab82316e","84a8000d8dfdfabcf75a90aeed91acf1","b022b6c79d996f955b0bd414d2537cfc","26df2c4d61ad9a7bb5bb8dc65e5e383c","57bd1b6f4b82f9f27ef382984924e230","7d92ab1621c8b2dd9bfb4d2f9afc3996","d5784f191348c61152f18704714e205c","4543436345a243e662acf83c31cd391c","641749c12a480e86ba9bc5ea39dfe54c","04e8ac9a9579aedfcdb99de78f46b191","94bbefb8780a4a7075284dceb3b63201","535a3f2d1afa2d14c746a8d8bbdf604e","5e75d27ad18e6dd32a11834604eb4c3d","5e55ded051fc4153a6e69682f9f63ccd","07908b0f2417d0fc9714cfb34ae21c2c","e764435e7aa0d6afd00cf5722b1b3d56","2a702fdfdc89ffe876218633ebfd822e","d7feda00d93db69b94f0cbe5f23a6369","ba561e78487a2f5540dcaaa681a37396","63b51c0ab1f9b86e5cc53ce0264984d9","5d5712c764b1f7c065a016263c26b099","245c4a2337becc47b54c2d4cab3a84e6","12f1c00117f0b39c318f54f901e94af6","ffb997c47afd230a6a8e7fdfbc519c2d","15dfec315138d1cb1fdc94ca5505d131","81f0a5b5d65d49d6e639c1274230cddb","e47ee7e51da3427be077b32a7d0f1c6a","623b0837e3e9da3a15785f407bc0b2b2","7de40c7b9125abf5a393757901a2da5e","0c3c505a5230fdefb5f310d56190b9d1","80d538f6aa050125ecdb61f8a0eef36b","93d2cf2c4f543d6abe4a54189be808c2","30be81dc4cc298d0a24d2353065e4f6b","bc742235dc109105ee2c54a924583ee4","51ad0df00735df9af56259310733a1ff","d6253a0d515060f323aed2ee12800f67","f049e91639432458ed21809ae928f12c","17a945ee10723e1ec4cab94470189b89","7770372d2f63e523f7090c684347104d","4a8919998e936d97965a6eab30ba71e7","8adbb34bde1c0c54db62d0f188f97299","5d9bd632c94196821838df10ee95bfe3","beecefd737cb8c7c7f345e4d2ac52bf8","8620b246749b46d70a3600a7824895fc","f0e8abdc138ec2a38cd6cf08d7efd0ec","2eff6856ae90877f8f766503a9239058","8755d5b533dfc4a14b65c5e8c57e5df6","ac8e0ab5c589ee7b305ad716809d4be6","edfa3a556b2f7a92350f543a592396e3","20b0eae12e5991bf05e74275b4d957e3","392a818a3723f2281afae23b4cdfd49e","3dc3ce6041969fd424852d55749840f7","4266c5c48f3b7cafe0ccf8f8114fee01","c989f94ffd7589e74fb235658b07937f","7a3836e823877a3842d78c27591b5b04","ecc065e0997a5cf23677235acdf75067","0c77fd678543c4c81cdd2a42bce267c7","eb4b72e29b001b153c9ec96e649a5feb","20be4079485b0fb93b56e41b617e508f","475582eae895f0c517fb3e31ed9d7f91","8743700c3e0296b47e5d2bf53c5f9105","bd2048256b4c5ad2b0b9dc376aca9d3a","a013fcb468c4d8607fd3c7f6c0ce21dc","8904f9f7cc0a7c7665c4c9657c6fc0b5","2172fcbb2d373481050d95f19c4cad61","c520a21c1327a42024aebab67b0eb59d","3bae168ee8f701d5e638fd4ecced6bc2","5d216b4a56134bec5c62d8bff77d3f9a","f4ba2b16fd6430e067d64d552591f3dd","12b7d10452e96084435f0b0e9eed08f9","230eb7d149687c8e1ec65de4170e4bf6","da499b89621cd4e8a28fb7497a26fe91","fbc16a53c50d262487c996e7b4521bfc","69b6d586324c0e8f6458d06ea92941bf","d2fb7106acbfa979111ed76307da79df","2fba153c15838756c5c9703bfeb2cd84","dc1a5b7a5038dd20f6a64326c09f629b","7ae46a12401c2531e1bca50681e26829","ea9280d840f8d11fc61c758f2bab6d2e","ed6324182ad5484d673e8854e88164b1","be7c566d89aacbb2fc5a89774420c0bb","688bb796802ae92c54e711b4092c7d3e","47450e59c5a819190468f9fd0369fd57","912807a6759cacc39dd2e9e1dd587798","da4e04463a3a3681bc9f5d6f345a572e","c8b52f0798dce8d2d7bc4231a72eed72","73799b8dd9e23b5b44e29964d84c403f","c72cc545e13cade129f502e3a76262e0","04cf40565a63e24e40bd396c0e3a37b3","c564deacdc80579174f7f257bb98364f","35b60819b2af8b605e131a4e2963516b","b78ea3ced970947e8a5c8f9d0f0a07d6","7cbcfd83387325c4aa65a6167c14fdcd","bf80ebcac97c7d361616c7445d20d3fc","9c41fe1bf740f51c0e621a8f901df3d4","18da3add6f5cc12ff89be16ec080e6c9","99e52fcbdc9a280d0864a83396392b59","ac11ef15b4ed2e8e19b1b7c54b410084","4d15092be39d48f7259b1efcf5c04126","2e7b5a8259dddf10b0dd6fc3ee4a3c14","ef4df46e5882359187ed12289632c480","3abefbb9176ea67e12b7ea7b920924d3","27098f534f6acf4be5ace7d4bce5980f","af6e7bf620be534b1b100823e9b9aa4b","3e8c5ac7703773e12cab9ce751638985","b9bd0a47de7e76559021c03fda04b359","668918bee8fdf9d424bbd29b4c2ba109","440164663794fce1da0e81fc63108318","685733b2764e64daf2fe3402c843f53a","2530ce6d3d36ff0d093e2fb53a52b941","5fbfb2f0312ea0532ce60edab14c1269","4f3f6c285d8e38b21570f00680b0f7c9","c8ab5a3b5affb8902c6f0a63f5bc1eed","cd95c14277c6bb785d11af4a588462b5","b7c17514b2df2e194fe119553d645ab4","74408bdec75cae7b4870be81daa869ed","a1fe777d2c1d4f1afead04932344e87d","635e90c22b1b3987987d278615ccb2d0","a2eedd742e334d14cf6b778df35390b1","d90fc6961e6eac3b127fff8ea89d182a","b648aef8e150f13531d41fdd61138b37","14e816b33b94197d29ed7bb92d82d6e8","950f5c139ffb1562017ed136f531a4c3","e4b350fd31a448fdf3b30fa731b73f31","b3af9f620c81aa2bcd665bc2ad1ea52e","13d2803b645e178dcf3ad218f16456af","92985dadd5304550fbddbcefc48e180f","ea722d24f7ae54cb4a7775b8cf19e508","843711f68cbf437e4c9b37fb4a1d0fa2","bf4429e25fb423e3f029d29af3ca00ef","9726491070609618da727ffcd0a5b980","ed44b86c35abf45be6c6daac7cfd54e0","98f008ee29f4a5290a10c9c193362370","577df2c225273e0ba2677ca525e057c2","dc4307a210fa2f8b19d690038cf472c7","8edac283c53d84903065edcb20763a61","6cdaad72c1cd9a8e360b1f7580de43ac","cfa5fd72e11404430af0a9d6525b20fe","9ac0ba36481985ccb3c4d686cc8bf236","f17274be9f332bb1f26dfd9e4fa8535a","f7329da59bda80f9a096366c76770d72","95a0b5d1ba475e2b1b7fbc1e2b41ffce","9d51fffcc4bc8866e6a53424709d11f2","ceb51bcad491d103a13f5792fa2936b0","0bb7f33770168a81c7ad61bdf63ad006","351a0e13c90253080f9d5cfe6305a70a","2fcd81c54e2d05faf1dbab1b1f9c0a49","bcce17523f6ae5001f96fe1e0684c39d","a8345f8b1832f7263bccca986679698d","88197c8d7c214109e17c175ae57b74d3","60699ac69a4c2bb959f4206d41799e8a","d3ac61abc5294dcaa4510ca75390e33b","216dc4f77ea228005a3e5a23b570c3aa","67d404d0e799a659895bc1433d91d5fe","5e5f03c4fd329fe03839652d2dd62ae7","4b1745bc98d2f4477ccd3c326a5ec16d","a60211237ca9619124d52050ffc3c618","a70695962dd665169a02aa8e7ec77f20","bfa936b12dd5582fc81d75d8ad1e085a","064e16044213a83b0a83f3f0ace4fbb0","c9cb54054ac9f792cafcf982e9606868","02e203b228aa5f01edc95161dc9a3c4f","97acd1d3f930eca8a4bd585bb44598c4","44f01d919f7a54701d140c9a989919b2","c5355c2aec57874dcde73de8da58c50a","29bdd43f9431beaad617f51e9e15dbdc","819a7280bfe6a3271f61e0b5e0c41d90","9dd55f145e162b36f920c5786974540b","8dce82ac4e01703f9db45c8ca25bcd69","a43bbfe20c04c49d3148a421d9274fad","14f0044022be65be99a8a2ee155296fa","b73316b937c42a33cbaf727bcbca7ba7","93e93f77d9b8a85581b04bcbe63d14b3","df608fe3712198c30f478b98ca6eebe2","9a23148bbf1926baea96c9e538e39cc9","44806a713af347eb0373660705fd6b23","17e185d1915e0a514944d26459389fb1","10a6f69987f2eefbe5e39bb27be7d404","ecabd3c15ecf238c7dfffc2e7bf1822f","286caf16956d30562f49900746fcda79","f4fafbdccd71afec3f8b7b8c1afedd18","a028e30eba6976f81304d20ff41ff480","92bf8b1f1dfdd7a06b78cef11e1f268b","3ff27d8d5d0b97d23035d8cf62c98c7b","ee5f3fbec744cb481bdb9f5897937a39","0b5f2b299b2b14044c7534d2f4d325cc","ced1d5ab3161f48a979041b4ed093634","151983d4506746d3c866aad918d4194b","f7d005afc283362eb7ef4cf6dd0b643b","ebfa5f706f4f59ca2c2607416da93758","2e88721c2ee684e08ebe32c00e6b7b42","72c53ec41566f43ced624e2f22c1d63e","a0b123bab1e36c401f92f08af1fdb921","9980fd18214c99a7361ebea97114ab71","b08eb1c81a1c72a2c9b937f058e27ef9","22798c75d83928d55ba245c1d9c797c3","06bb816db2a73922f42dde1a3f385b43","dde25801d4811c3d682079ddfad8c922","499b6ceebfa54500a89f2619129e28b3","dadcfab502b1f07c0909d161a935229d","9cd34e21281699ccf69c855bb0ca2d9c","0abbe023269719ee828e976889bd7464","dd2b914f93b869511c20ed9882d244bb","a8432682efbfe8bc0b46a86183ea7983","002d1247b6ff7297dd30110e20cb7e89","826c2ec5e12be046034a7f317da3316c","c7730cdc6a7bc592dff94583a0fc66c3","3e56a4d2fe175c5dab37262465f03b7c","19ec765c9d4a43836498cfa4a6dcd778","41342143c23cf4d4e343d26ea2c367ce","e4d40f74a9513cfabd95f276a95ef35a","930e681da0a8a08711184524a74e6592","f43b977e63be913cb3f24a6124897792","bf505c5f0515538c70989c9d5168cb3a","b315b262a0889b1073cf1f57bae53f0a","b1cbc71c0d3e5cf8e7eda649bda4fc37","7ca1cd71ca769b2572e1b53e8460b7c4","61f2393e0c1e54df457953a6a023aa70","9afd9b3d78adce46d223bc78a3772495","517aea005767b2f65805c8f331575bc8","a5b210823c4acdf792bf665f7854107d","4250a4642b5135ba519aa168a800b302","9310efc136114f152ae659d5e8f1641a","97d954acc3e157227224a5b9b79fcc14","29e99f5764daef6623cfe3d832c3ec5e","07b4e8529a22a3b835b953f5b26b306d","619661ea6a998e1e43c6d6f130fb7e44","c288999e23e8c5ff097e3de4d167eac1","406c09819c2a42f737d851f1adf1cad1","bce40904256d0101ecb9250c004d255f","976cb599b173d4a174798fd3edebf01b","b7ef22641d3627613226c17947a1ed3a","ab50ee025387a9bd708f9d7aa7453962","50d0344e1995ab2131b6e013a7e57d22","38b5afc920432eb13038075f03231c71","f357414095d694586109c43afa4fa6fa","99f57165a4906e74f2ebf14ec986dc2f","11c3c998e7bf47fdafe4d198f20d803c","b781640e82ee03215d420b737f066437","2b41a7b57f3f59be4225fe1aa9303a73","b630ee892b381e6ace0bed29d762425b","55d249285a2879f0e40f550c623b9e9d","004778dab83a0114c9f1c6499d54fb7e","ef1bb37f00d372052aa5f9b8ddea0abc","decdbfe491d395a2aa9f1b373d28fc13","b200990353a8e22504719688a8eb46ea","ecd242ca7057412fc886317220ef861e","b022fdf313778f83c7df590726332831","28bae8642b00c41eeec334a4b2b02e3a","190cb862f755d9c6d4238c86241103ed","c3dc6e0a465ba6c3d05b733f98cf1d6a","d0780c5df75a777eef82d90b2bcb89a1","533aa6e80f7420660c94f280a3d77505","23c26887d5d288411cb883ece292f6cf","c6812d0e9b6c8761c6a15309e3f0458c","970cb89956d3f9176b1ea2828eedcd68","2d83e4780207e42a42078812ef0b169b","c9a68934aae95dc647363ee9618030fc","6f0c7ecd08bff95581638e4ae058c249","ae1c3e833b334a2f2e67db6d92ab1805","5629d9fc29d6ac05d58e497ff8cad671","9c6462fab13d293bcb61472d8aec06ae","e33c1fbbb112390046fdc9d589e09d06","3853fa4dcd3cf8979bbfa28914151424","efe8a38fc4c818b2c90dc2fe2bac9f83","ca79eab7041ee2b8427d3377a45fc0b5","1b7bd0565ecc25c5d1f03c4223b5c9a4","b2e91d2b2ecc4a641383a5789a3feee1","7e93a178724a6c85e823804b80630b27","5261d6aecec160751f21ba0982e913a9","5ec8a6cbec495743bf4c9704dbfc58dc","c0b9c9cd67d26e9a95f3be56aa1125c1","890a55a11e9849fb1be219918f64979f","24390882acc9564b0d8198e850c1cacc","3c367ca9dab774499638b30e546b96d7","1a6f7a05d30ba9563a92b4956395b4e8","e164050f1adf9695d56306f31c4f47ea","a44effcded754fac80f6ae454cce1b1b","3cfdeccc5172a048f89f4ab21d4d4f8c","0393057620437b5cb31e15161d3cd248","0720fc5b52c025d82b76f7f0409019e8","aaced1afa811520f5c02ce099838d5df","f8a2f8c1637cdfeaaa72264fd4f39ce4","e255474aa052cb3375c07e54e88d0387","d472e643caff7870c8a52b144b0e15f7","7a3babce62dbd2ec2064adad5ac82784","a5065e5c8c7de7b53cb7ccdb35a916f0","caa1deb544b9d22776680f0de82127d4","14ccd3de284e32bafdc1fb9fdc7a6e8b","25bb377e92c4c9d00472c4c968326973","8756bd0c6ea9890524a027ca3be8dfc7","b2f6864e111ad2446d61d035dd51de1e","335adb3857609ed1f120acc0cd407511","8d47fc4ef5756e7713e4c85887c7022c","e3a78c0a63956e9e04fc8ddf3fb41f37","0ae146ddf15f117146d0062bbc646494","263055c24f1563a2cc68b49b80f7c8fe","f54f71c9294dee361e27a8b335f23ade","b9a9cf6e5cafb488e36cace931fbf7a4","cba368acfa875d2e69097a37053e9e1b","a0504956b80a5179671f311a53ed8e09","0caf122b8194256ab3f3ef0ef0e640ff","850c598abf24f37622da099b071200e1","1aee3518d5ca29b9d8077f18facf0732","b5a2ed5ab01851ec573b7c499a0b2c49","32511da0fe5cd852abe79d8e4d31e5a4","d5f29d7adbd464c844c6fe0e26b8cf7f","b47e199477b86c96a8e8c99de62e428f","78562fbc12ce700be855ae86e5faf40b","4d38615c02e9290c36f59fd03c4a86dc","8d99e73f3ecc31f65814a0e882a30fb2","9cf738e57c570cd05d119c97b23e0d71","b29ffa640357238df6eccd8770a9f79f","d077818ba8a64e4cef6622fa7f0c066f","e53585fdd96321eef9397de0e4c275d0","ffd6749b9b0d6f665d6e37ff49cc522e","1de1f39cfa0075b8f21a99b8cf2008bf","0b260242961fa1cc8f064eaafa472a3c","e3dd6f450f67e71178375a186e3375e2","47695a79671553653e3d3786c36545c0","0e50e4d9da354c54d1c3e1adb4dd77ed","78567cf5cd19b4f07ad9ca64ee9e0d12","777b5c18b1668677414e4c5939e7de51","ffc60b2ad343d758483b4b020f22474a","544cb5f7b85df625b66c287b8d732809","f93b3429a49b315552dae3eb18fc7ef9","8d8e39721de74da6304ff9408dd7d038","6517954821287c5ab2a0fb7d9b72a279","219b60f8ae27ab1ad73877e295692aac","93eab4bc7261d8872d0541463db2f427","181bff85ca70be5432618c54aa74cfbb","7fc78d10efcdfcbe15e40dfde3c78f00","3a03167b537f12ca3d841d6677d82221","e125ea084cf7fd6fafd51f96a6fbfbfe","7d45318a1e4fcb64b45d6a2a6812f1b9","ef7752dd3ceddfc455d17c68b1bd471b","6fc54b2d270990ef128c3d4ae1f6172a","27a963e33506ad773601ffcd73bac060","8de7e17075532e3e83e83ed4d5315fd0","9179936b32aa381ba12194e4bd998045","69095764d182a92db51a60787fe57d41","ac719448ac6ff6cf7d00d1248f22bbcf","5f9d971636cc5fd23dcc2796078219af","cd188744346f05ea9e8b86629f694b89","747e20aa3484e90b311dc340b3d36543","6ea0e796cb510bad51d7786a367b469a","e9eb2cb86a5368f247c5592d83e3df74","678f2ec9992b5ff4a90683ef206c2170","77cc9a5cd9593bcdcfbe306cee925451","102801c8995ddc4e287f4d86ff1cb020","c68b19383a314676bbda6b55bbc4eaab","372b77b767fed8b36d2a10a0be2d400e","e22d4cbeb85048476f9f0f3300f3a699","879ab6d8a1216ce39ee48abbc13234d4","fb0f347e614bbf8338522372bda930c3","09db531a9ac7afe04523a07503e32d26","f5a40792395e409c5d6fe478783efd2a","39b27fe20a0b6146187be28be3ed440a","d41d8cd98f00b204e9800998ecf8427e","5e0bd6d9626c36ce58a11f5c84cb568d","d8cdd34f979c4764cd7e27a7917eeeb1","8552bbc0f4baef343c6e639deba5da36","9bd414d689f626c8cbb956550bb78360","7bd1626c79b9ef93c49a94b9556143e2","2e2d8212efabed5a6c4bf06d0ad559f6","e2d8866cae2b816a3c43520187145053","610e713fb20db057ed6b5350b53537f3","af422ca3f7e6f1ad71f83e35c762afbc","62a6382d7498f9f5a28569285af5775c","60905bf6b846fb90161aa02d5305b674","167eda3bc334684b2b1e6eff4db52a07","62e7c3104e73d59882b4bfb14a34bff0","90d5de50c21b42fc64d7eb89801a8d31","de6996d912f07e564b9084ebe6d9e58f","3c503f8cf2dae044b4ac681465080619","7aca831962e9fc04ecdc9352b5f1121b","c1f0a21e7915fad7b96791421bd88a5e","ccc065c4d8b42391f5fecdcac97773b8","e0a33414d8e861d7fe7d9453de71f4dc","d452d67636899dafe2556e91a2bc57e7","b6a5aa281fd5ab50a4eecc46ac48512b","a8305d43571ffd388299004a6f4328b7","4690e7711f79aca045d4c3a6eba65dd3","1c1d5239466c309f4b2c9093f727f89d","c825de4c16cac168ce3635ab52ad6c34","08b0fec8801474536db5a2530e766e11","ae34cbf289261b6df8b7ce3dbf7f1532","eac9f98c03fd97c9aebec2698d99796f","b2a4aee2666cf8adfdbd90ce8a7d672d","7613955f3b2e88d97036f6aa3e9441d7","23b99c797b5c5ce2b0b7107c6251db90","3d81c37a118f851357839c5d6bbee725","940476378fc8b54390fb51c53018d9e6","de18b134807911231507e243971d5b51","57f8661596429266974ab892f3b1b031","c1ad3051355e199c61f69c431a84f828","160f4c2d24192b1f3088c46f98fa773b","16e7b9c663e07d3551ee2d1ac9f65c5a","51c62f3882ccd0bcb55ff6c658d59756","bf06937ed1bb2144f2bc9701ed505a9a","a9b89c4bdbbd6f820f09d38bf689b341","2e41eeedab154a9df2bce6bc8d8921af","5da29a96600f9314aeb948d84f1dee8d","7e5e6225623cfbfdcec0aacdd82afe1c","d41d8cd98f00b204e9800998ecf8427e","69d13d45516417c09eb84801681a97f7","cdaf200fb1b651200081c4fcd029f7ec","74a43da83acc31c43c58b483fb530bee","552ba355d8300e3df6387c613c1f5ee6","899084c73d6233c03a1d1ea532fe6c80","928b2e0c7906dcdbc1489ee5096a98f9","718f08b7696706d9ee30490b6a977cf8","5c54e3ed5cb7aa8bc1c493a5e7dc038e","2ba4b45399f81fbc96c9c7787bd847f1","28616943d18d1511bfe969e7df924b6d","4468424e44351f3d6f4a6ee290395600","1e720409a1ea2029a21f8ccfee7b49ce","8a477d47b0dbcfbe49f3f75c902201bf","e7882f5f0bfb39541de8fdea054f8d99","d05231c85e43d66bdd6c1f5e42f0f86a","e9d345fd1990ce891cb8e335381a7ce3","480d547d62cf143df3b78fee99f29510","e500217faa79c7203151b2d51f16038e","2f7b3137b9883c3b0083b3d86f543a9c","ab413f5dc1ec21772a625ec2a6b8f3a4","23cf8daa5aa04245ea2a165fe62f077a","2f5ac2c14ce9c3572ebd842b03772d0f","84805ebad2e0e55f98237bbf832bef73","28ad71083916e7ebe04ca3fec64a8a0e","d98df62d97b361e3d3087f207e0633b9","edbabcbd634967d1bb73dd8908fa99fb","40982248bc372cacb1642693d8802095","4193f3a3fc91fff88deafbbc6d9dfb5c","efe991e6a9071ebb8eb828e9220d944d","35560020f0c23dc8eca36c9e283f43a6","21a7d54882c8e3c27b6cb77f4c051e7f","aaa11f660772bed769614ae605b81506","ac0078640093fea6a073ce269b15a6a2","0441f2d8e3c8477584e6c3eb34b950ea","7b79c5048099a6c22ad94b450ee902ef","98702a24c0d9a6027fe96da9a22768d0","38658d61bc5de8f32460ac4a1e637842","22883d96ab8546b2fd8afa2aa47cf34b","d0afbd2aff50538f71c24a77f7eb9501","95b6c7a83cd4230677137eaa62499d94","a9118da14052e43ad79c6fddcfd0b470","e816bc76313592ea2ab351d45923e59b","0fdf1d819a554d3902ae6f0eb372e277","9ccdd5f74c918994d0412e1e718cd4cd","1f98a61be2d644323d750b8efa501542","3ef281b986103e88d075507cb1be61f4","e090123a1b51ad8a6f08a531bba032f5","981853030de38c94ecd82c892e3cc286","4efa7e51e4794c77df6b1fb1fbac4e0f","3d9d4554835133b316cd117bfda3bc23","71b674a366f722c2f32fde49c9e4af9d","944a622529e8e903be9561c7913272a9","e11a3d5cc57a0af2467f9d72b9392d97","2e8185c605110d85b4faca37397fbd1d","0d6bce3237e1e334ad16be38105d7519","81984c16213db8fd10f59b4b25499e98","99eef2ab93a17e50d9c05e2ebe38c9fa","bc492af55db9f4d56745b4f3f0b36a09","977074d74df11ee8b5340dcfc0b7c49b","4f991263e5874942467e9c4659f3284e","82fd19f0e7a83d4341fc46a8c18afa21","454c0361cfd7e554f7a2d8c7a6c641db","2a39b04ac34569fa89ae473e90d613a3","0b852be768e094ab2191cc175c9961e1","6754e1e249fc303a6d291e0651448888","bf30a0a33e92ae80e90066f6843bc2da","8df551a0d2f0e01486ff5ef7407cd725","31e4ee09d5c6f3949d31febe2434b0a2","1457bb3ff1ca4a2f3f0402d55a3cda1a","0e968c8cb413595c9a9e46f870deccda","07e39a883ca1879b0aa62a8dc69b6952","16fc922974e8b1643672f1c031ca78cb","8d287f9453a0277afca3744bd42d44ed","00ce3f8f377dc815870b69dc10fc82e3","c90245ebfe352a6426db34d0f4a6d348","6dd3ca87fb0a33fc08bc1586add94d2a","d826a2e67134f9a72319af7951fe4310","b3c2ea7a5ebd7f09d1bb86ccc5260b56","434be71434a0e3ad6b49bd7631cf8ae2","1f68abc003c47272a8f69b80061675de","be33ae5994ab98dc2de566a9e3d188da","09bb1187faa648dcfa306bc0ee93d6f7","cbe34ed5543f28ac145c4f422a7d94c1","66ff34699e14597d668406ce8099f332","a7c397c4ac5ecec5fddae0ee5cf52950","ae3fb9d03f7737181f96a1aec17b5e3e","4afc523656c42a37cc68104728c08027","4f02ff477e4ea384afbda35e19625239","ad5192a0d49dceffb08b59835354e549","633dcc1b70437e1174a40e9ac46f6811","678e7b050e9a350724fa686f1fdaa16c","81304a00b135c2aacc2818457cd0d48b","0e13388646010fc056898e0560a28a05","06cb868e16dd5922f05689deef28c17e","b9c5d658f3a5f5444010a07d2a78934c","41c3266d8f06d4e81969a581696fe267","0bc0bace93f5cb16b7de5e473c4dca23","557033449b2cae7848c17b9482e4ffbc","b019c46d5d21051cc75d5b74e192b5a9","36e275b44ded6ab28bb8f929a8dc159e","afaf2d51c8e538a28c62b809b080ce5e","1852203c46cd0b616d0f4d542f26a5af","f209578af474da694b1bcc011b8b520c","2153fe17bb638d38b3b60bd95d244e3c","72276aac31425d1b4857dc36f483fa6e","e8e8f7b970bbc560b57f792884fb8154","0f55ed89167d0cdef8f8841935dd002d","d69279f9a3c6aebcd83fe4602b7eac9c","cf239cddec135c6577a7532f09f16792","f87d20a753a5363b962b6ceaa048c4ee","8bde56c8b64b79e8eeb41e8805ce387b","d1c4846a85053a25ffd2ce9113802bc8","7bdfcb729856ac4261b1025a73e19a71","9d83b1dfa0567395ed742d00368d668e","4f6c99a1ecaa40cecd1e5a09fac2a918","647a8140936791f30d84181550c0ccd1","56418a1adf37ce38200807373bd14ed0","9df2e65cc7385fbd87c0a061c5faca52","9923c3f02147c7210d0326777898c034","d2fc65e6bf9b9ed5b626dd6a0e1888f6","5ce1d168991aa05f4b01f6b0df03c6fb","edae2b03d3df200171528d2e8149d25e","2ea2b41cc25d6e972ea481b8cebcc8ee","785d05c77d245df83933cafc7e98ea5b","a920f3edd9832757e9165a1f93d7ecea","71846d36d52785f16f708650e4a52bab","016dda0f045c5960cf2d0b48c4880ca5","06f2b79f44f7b7b854c4e1ffc46937ab","0ca323e58a1a491e6827023e6b260ccc","4962ea5ef46ff5d5e462715c046287c4","9121bdae016c08f627cbf2ca37911731","7f21dbb95509d81bee0513d01de39cb8","b7320c5422f5f15423631cb642b1839e","efd1138a3e237c25fc237708f25723dc","d41d8cd98f00b204e9800998ecf8427e","f1a6d247b564d6196d2f96384a19aa16","21fc6825f3b885474f067e2c30009e1f","7682da4fcbf2edaae4fd4ef70bc5f08d","d2f36f968cd7589d0d575a8d2cb72784","0ec6bdbc6f059b5e53bdf8918bc0363e","b69b6645c2408e3e6d2751a5c20cdfc2","bdcc9b475bc76be38ded0a78121df2e2","be5c3898f13721251aa1997faea80f6d","3cc2a9e1a28d9662b430d884969bad12","291c9c5d5652446e20aa2cc59b62ce88","cd6612622fb7890db3320a1de0533826","486c5a1c506be022b7716cdf269c0338","bb1c8e17e99163b7f97d946d1b1c4e2f","055b2c27bb688da28c36e8b349797349","c28401c4b51a6298393bf23f9d534679","81dd49477aa280c6df122d5cd081eb33","0be9b8e78ad89e87cfb313b903323579","b1fcb0bd5c610b6cdb9c9bb34c83794c","fdddc5191897f3db287b61981f88c25e","d74238fe776ecd529548fabde22dd72a","6c7854f91735578ed2a62b5850780232","fc60816f458d38c3dad0c2fc738a37ed","bfff2f1f07a9453607b73943a642c52a","214ef4bf4cddaa4211bb8d67f07c53a6","5690951e86e12f5f76299e0dca8f4795","db2389da90ae8833affc5e8656ab3794","c4f2482512e3d1f00c2ecfbee1834b13","a6fe5d5cacf27ff84d47a19fa55f49e5","cca76dcb2b8fe201b622af797c04af4d","26b82c816ef1aef8d24acd6e036d8d0f","0dbb81c11abb0e04c3663c73c2e9dd28","5e775bffa13c4989c439d49c6fdac1b0","03bfed3337d3d71f67b451812e4b152a","373285a51513075ef97bcd9de3336206","ce54495fc95e622a1c32781044cacff1","6a10f39df1a4d3036480293ecf745d22","ae58d8f944db04d7590e349d5b5f5aba","2af946001dd6823d128a3d10373be83a","79e49627a6c842f2d6823222f625f8f6","c9f24324ee9f3fec8823f681cc6cbd41","dd601aa0c4a5f9a1b5af3b5c446a3b45","d8ebbbf795f78b4de84f103fd9acde49","6fba0e198e411ca774859f3b4a8d9ec2","e42b74956f9d194a5ecadbd9bf336aac","794ef5a4a25df0a66a670d206a8a0d74"] \ No newline at end of file diff --git a/site/song/list.php b/site/song/list.php new file mode 100644 index 0000000..180f6a2 --- /dev/null +++ b/site/song/list.php @@ -0,0 +1,135 @@ + + + + + + + 黑/白名单 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/site/song/myRecord.php b/site/song/myRecord.php new file mode 100644 index 0000000..4721099 --- /dev/null +++ b/site/song/myRecord.php @@ -0,0 +1,107 @@ + + + + + + + 我的已点 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/site/song/process.php b/site/song/process.php new file mode 100644 index 0000000..52c6e6f --- /dev/null +++ b/site/song/process.php @@ -0,0 +1,220 @@ +=604800){ + return true; + }else{ + if($refresh==6){ + $refresh=date("Y-m-d",strtotime(getDay($refresh))-604800); + if(strtotime($refresh)>=strtotime($last) && $limit!=0){ + return true; + }else{ + if(($limit-$used)>0){ + return true; + }else{ + return false; + } + } + }else{ + $refresh=getDay($refresh); + if(strtotime($refresh)<=strtotime($last) && $limit!=0){ + return true; + }else{ + if(($limit-$used)>0){ + return true; + }else{ + return false; + } + } + } + } +} +function getDay($var){ + $ts=time(); + $var2=date("w",$ts); + if($var2=="6"){ + $var3=$ts+(84600*(abs(0-$var)+1)); + return date("Y-m-d",$var3); + }else if($var2>=$var){ + return false; + }else{ + $var3=$ts+(84600*abs($var2-$var)); + return date("Y-m-d",$var3); + } +} +$domain=explode("/",preg_replace("/https:\/\/|http:\/\//","",$_SERVER["HTTP_REFERER"]))[0]; + +function duringTime($start,$end){ + $Day = date('Y-m-d ',time()); + $timeBegin = strtotime($Day.$start); + $timeEnd = strtotime($Day.$end); + $curr_time = time(); + if($curr_time >= $timeBegin && $curr_time <= $timeEnd){ + return true; + }else{ + return false; + } +} +if($domain=="radio.fmhs.club" || true){ + if(@$_GET['pid']!="" && @$_GET['id']!="" && @$_GET['date']!=""){ + $token=false; + if($_GET["id"]!="1"){ + $tokenClass=new token; + $token=$tokenClass->getTokenApp($global_id,$global_key); + if($token!=false){ + $data=array("token"=>$token,"pid"=>$_GET['pid'],"sid"=>$_GET['id']); + $result=sendPost("https://apiv1.radio.fmhs.club/new/",$data); + //var_dump($result); + } + } + if($_COOKIE["token"]==""){ + exit(json_encode(array("status"=>"failed"))); + }else{ + if($sdk->checkToken($_COOKIE["token"])){ + $uid=$_COOKIE["uid"]; + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT `status` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$uid); + $sql->execute(); + $sql->bind_result($status); + while($sql->fetch()){ + $rStatus=$status; + } + if($rStatus=="passed"){ + $sql=$conn->prepare("SELECT `switcher`,`ignoreTime`,`timeInterval`,`refreshDay` FROM `system` WHERE `systemKey`=1"); + $sql->execute(); + $sql->bind_result($switcher,$ignoreTime,$timeInterval,$refreshDay); + while($sql->fetch()){ + $rSwitcher=$switcher; + $rIgnoreTime=$ignoreTime; + $rTimeInterval=$timeInterval; + $rRefreshDay=$refreshDay; + } + $json=json_decode($rTimeInterval); + if($rIgnoreTime=="true"){ + $igTime=true; + }else{ + $igTime=false; + } + if($rSwitcher=="true"){ + $switcher=true; + }else{ + $switcher=false; + } + $timeSwitcher=false; + foreach ($json as $key => $value){ + if($value[0]==date("w") && duringTime($value[1],$value[2])){ + $timeSwitcher=true; + } + } + if($timeSwitcher || $igTime){ + $sql=$conn->prepare("SELECT `songNumsLimit`,`songTimeUsed`,`songLastTime` FROM `users` WHERE `uid`=?"); + $sql->bind_param("i",$uid); + $sql->execute(); + $sql->bind_result($songNumsLimit,$songTimeUsed,$songLastTime); + while($sql->fetch()){ + $rSongNumsLimit=$songNumsLimit; + $rSongTimeUsed=$songTimeUsed; + $rSongLastTime=$songLastTime; + } + if(songBalace($rSongNumsLimit,$rSongTimeUsed,$rSongLastTime,$rRefreshDay)){ + if($switcher){ + if($_GET["pid"]=="1"){ + $cacheId=intval($_GET["id"]); + }else if($_GET["pid"]=="2"){ + $data=array("token"=>$token,"pid"=>$_GET['pid'],"sid"=>$_GET['id']); + $result=sendPost("https://apiv1.radio.fmhs.club/new/",$data); + //var_dump($result); + $result=json_decode($result); + $cacheId=$result->result->id; + } + //获取黑名单 + $sql=$conn->prepare("SELECT `id` FROM `blacklist` WHERE `id`=?"); + $sql->bind_param("i",$cacheId); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + if($rId==null){ + $songStatus=null; + //获取白名单 + $sql=$conn->prepare("SELECT `id` FROM `whitelist` WHERE `id`=?"); + $sql->bind_param("i",$cacheId); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + if($rId!=null){ + $songStatus="passed"; + } + $pid=1; + $mts=intval($mts*1000); + $sql=$conn->prepare("INSERT INTO `record`(`date`, `pid`, `id`, `uid`, `time`, `status`) VALUES (?,?,?,?,?,?)"); + $sql->bind_param("sisiis",$_GET['date'],$pid,$cacheId,$uid,$mts,$songStatus); + $sql->execute(); + if((time()-strtotime($rSongLastTime))>=604800){ + $used=1; + }else{ + if($rRefreshDay==6){ + $refresh=date("Y-m-d",strtotime(getDay($rRefreshDay))-604800); + if(strtotime($refresh)>=strtotime($rSongLastTime) && $rSongNumsLimit!=0){ + $used=1; + }else{ + $used=$rSongTimeUsed+1; + } + }else{ + $refresh=getDay($rRefreshDay); + if(strtotime($refresh)<=strtotime($rSongLastTime) && $rSongNumsLimit!=0){ + $used=1; + }else{ + $used=$rSongTimeUsed+1; + } + } + } + $sql=$conn->prepare("UPDATE `users` SET `songTimeUsed`=?,`songLastTime`=? WHERE `uid`=?"); + $today=date("Y-m-d",$ts); + $sql->bind_param("isi",$used,$today,$uid); + $sql->execute(); + $conn->close(); + exit("点歌成功!"); + }else{ + $conn->close(); + exit("您点播的歌曲为黑名单歌曲!"); + } + }else{ + $conn->close(); + exit("点歌通道已经关闭!"); + } + }else{ + $conn->close(); + exit("您的本周点歌余额不足!"); + } + }else{ + $conn->close(); + exit("当前非点歌时间段!"); + } + }else{ + $conn->close(); + exit("请先实名!"); + } + }else{ + exit("请先登录!"); + } + } + }else{ + exit("参数无效!"); + } +}else{ + exit("非法访问!"); +} \ No newline at end of file diff --git a/site/song/record.php b/site/song/record.php new file mode 100644 index 0000000..642e4ab --- /dev/null +++ b/site/song/record.php @@ -0,0 +1,101 @@ + + + + + + + 点歌记录 - 凤鸣高级中学广播站 + + + + +
+
+
+
+

在线点歌系统

+
+ +
+
+
+
+
+
+
+

加载中

+
+
客官请稍后,结果马上来...
+
+
+
(仅显示通过审核的曲目)
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/site/song/search.php b/site/song/search.php new file mode 100644 index 0000000..6523b0f --- /dev/null +++ b/site/song/search.php @@ -0,0 +1,110 @@ + array( + 'verify_peer' => false, + ), + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type:application/x-www-form-urlencoded', + 'content' => $postdata, + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + $result=file_get_contents($url,false,$context); + return $result; +} +function sendGet($url, $get_data) { + $result="?"; + $options=array( + 'ssl' => array( + 'verify_peer' => false, + ), + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type:application/x-www-form-urlencoded', + 'content' => $postdata, + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + foreach ($get_data as $key => $value){ + if($key==end($get_data)){ + $result=$result.$key."=".urlencode($value); + }else{ + $result=$result.$key."=".urlencode($value)."&"; + } + } + return file_get_contents($url.$result,false,$context); +} + +$cookie=file_get_contents("cookie.conf"); +header("Content-type: application/json"); + +if(@$_GET["keyword"]!=""){ + + if(@$_GET["page"]!=""){ + $page=intval($_GET["page"])-1; + }else{ + $page=0; + } + + $result=array(); + + //极科音乐 + //构建查询数据 + $getData=array( + "limit"=>2, + "keyword"=>$_GET["keyword"] + ); + $data=sendGet("https://apiv1.radio.fmhs.club/search/",$getData); + $ghink=json_decode($data); + $ghinkFormat=array(); + foreach ($ghink->result as $value){ + $artists=array(); + foreach ($value->ar as $artist){ + $artist=json_decode(json_encode($artist),true); + unset($artist["alias"]); + unset($artist["pic"]); + array_push($artists,$artist); + } + array_push($ghinkFormat,array("name"=>$value->name,"id"=>$value->id,"ar"=>$artists,"url"=>$value->url)); + } + array_push($result,array("platform"=>"ghink","result"=>$ghinkFormat)); + + //网易云 + //构建查询数据 + $postData=array( + "limit"=>2, + "offset"=>2*$page, + "keywords"=>$_GET["keyword"], + "cookie"=>$cookie + ); + $data=sendGet("http://cloud-music.pl-fe.cn/cloudsearch",$postData); + $netease=json_decode($data); + $neteaseFormat=array(); + if($netease->result->songCount!=0){ + foreach ($netease->result->songs as $value){ + $artists=array(); + foreach ($value->ar as $artist){ + $artist=json_decode(json_encode($artist),true); + unset($artist["alias"]); + unset($artist["alia"]); + unset($artist["tns"]); + array_push($artists,$artist); + } + $data=json_decode(file_get_contents("http://cloud-music.pl-fe.cn/song/url?id=".$value->id."&cookie=".urlencode($cookie))); + $url=$data->data[0]->url; + array_push($neteaseFormat,array("name"=>$value->name,"id"=>$value->id,"ar"=>$artists,"url"=>str_replace("http://","https://",$url))); + } + array_push($result,array("platform"=>"netease","result"=>$neteaseFormat)); + } + + exit(json_encode($result)); + +}else{ + exit(json_encode(array("status"=>"failed","message"=>"wrong keywords"))); +} \ No newline at end of file diff --git a/site/song/template/confirm.html b/site/song/template/confirm.html new file mode 100644 index 0000000..b1217f7 --- /dev/null +++ b/site/song/template/confirm.html @@ -0,0 +1,159 @@ + + + + + + + 点歌确认-凤鸣高级中学广播站 + + + +
+
+
+
+

点歌确认

+
您选择的歌为:{{name}}
+
+ +

+
+
+

取消

+
+
+

确定

+
+
+

确认后将无法修改,并消耗您本周的点歌次数,请三思而后行!

+

第一次被人点播的歌曲需要等待服务器缓存,可能会暂时没有响应,请耐心等候!

+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/user_center/fmhs_radio_song.sql b/user_center/fmhs_radio_song.sql new file mode 100644 index 0000000..c23cdbf --- /dev/null +++ b/user_center/fmhs_radio_song.sql @@ -0,0 +1,151 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- 数据库: `fmhs_radio_song` +-- + +-- -------------------------------------------------------- + +-- +-- 表的结构 `blacklist` +-- + +CREATE TABLE `blacklist` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `history` +-- + +CREATE TABLE `history` ( + `date` date NOT NULL, + `list` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `record` +-- + +CREATE TABLE `record` ( + `recId` int(11) NOT NULL, + `date` date NOT NULL, + `pid` int(11) NOT NULL, + `id` text NOT NULL, + `uid` int(11) NOT NULL, + `time` bigint(20) NOT NULL, + `status` text +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `system` +-- + +CREATE TABLE `system` ( + `notice` longtext NOT NULL, + `timeInterval` text NOT NULL, + `openWeek` text NOT NULL, + `refreshDay` tinyint(4) NOT NULL, + `switcher` tinytext NOT NULL, + `ignoreTime` tinytext NOT NULL, + `systemKey` tinyint(4) NOT NULL DEFAULT '1' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `users` +-- + +CREATE TABLE `users` ( + `uid` int(11) NOT NULL, + `type` text NOT NULL, + `nickname` text NOT NULL, + `songNumsLimit` int(11) NOT NULL DEFAULT '1000', + `songTimeUsed` int(11) NOT NULL DEFAULT '0', + `songLastTime` date NOT NULL DEFAULT '1970-01-01', + `name` text, + `status` tinytext, + `ban` tinytext, + `message` longtext, + `auth` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- 表的结构 `whitelist` +-- + +CREATE TABLE `whitelist` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- 转储表的索引 +-- + +-- +-- 表的索引 `blacklist` +-- +ALTER TABLE `blacklist` + ADD PRIMARY KEY (`id`); + +-- +-- 表的索引 `history` +-- +ALTER TABLE `history` + ADD PRIMARY KEY (`date`); + +-- +-- 表的索引 `record` +-- +ALTER TABLE `record` + ADD PRIMARY KEY (`recId`); + +-- +-- 表的索引 `system` +-- +ALTER TABLE `system` + ADD PRIMARY KEY (`systemKey`); + +-- +-- 表的索引 `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`uid`); + +-- +-- 表的索引 `whitelist` +-- +ALTER TABLE `whitelist` + ADD PRIMARY KEY (`id`); + +-- +-- 在导出的表使用AUTO_INCREMENT +-- + +-- +-- 使用表AUTO_INCREMENT `record` +-- +ALTER TABLE `record` + MODIFY `recId` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/user_center/interface/api.php b/user_center/interface/api.php new file mode 100644 index 0000000..8c372ce --- /dev/null +++ b/user_center/interface/api.php @@ -0,0 +1,222 @@ +getReal(); +//解析信息 +$stream_opts = [ + "ssl" => [ + "verify_peer"=>false, + "verify_peer_name"=>false, + ] +]; +$ipInfo=json_decode(file_get_contents("https://api.ghink.net/ip/?ip=".$ip,false,stream_context_create($stream_opts)),true); +//获取IP信息分区 +$area=$ipInfo["city"]; +//获取来路信息 +$domain=explode("/",preg_replace("/https:\/\/|http:\/\//","",$_SERVER["HTTP_REFERER"]))[0]; +switch($_GET['type']){ + //申请APP Token + case "appToken": + if($_POST['sid']!="" && $_POST['skey']!=""){ + $app=new app; + $result=$app->giveToken($_POST['sid'],$_POST['skey']); + if($result==false){ + exit(json_encode(array("status"=>"failed"))); + }else{ + exit(json_encode(array("status"=>"success","token"=>$result))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + //申请Auth任务 + case "authTask": + if($_POST["token"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $task=new task; + $result=$task->create("oauthCreate","","","","","",$_POST["token"]); + if($result==false){ + exit(json_encode(array("status"=>"failed"))); + }else{ + exit(json_encode(array("status"=>"success","tid"=>$result))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + //取回Auth任务结果(用户Token) + case "authBack": + if($_POST["token"]!="" && $_POST["tid"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $task=new task; + $result=$task->getbackOauth($_POST["tid"]); + if($result==false){ + exit(json_encode(array("status"=>"failed"))); + }else{ + exit(json_encode(array("status"=>"success","token"=>$result))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + //获取用户UID + case "getUid": + if($_POST["tokenUsr"]!="" && $_POST["tokenApp"]!=""){ + $app=new app; + if($app->checkToken($_POST["tokenApp"])){ + $user=new user; + if($user->checkToken($_POST["tokenUsr"])){ + $result=$user->getIdToken($_POST["tokenUsr"]); + if($result!=false){ + $result=$user->getUidId($result); + if($result!=false){ + exit(json_encode(array("status"=>"success","uid"=>$result))); + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + //检查用户Token是否有效 + case "checkToken": + if($_POST["tokenUsr"]!="" && $_POST["tokenApp"]!=""){ + $app=new app; + if($app->checkToken($_POST["tokenApp"])){ + $user=new user; + if($user->checkToken($_POST["tokenUsr"])){ + exit(json_encode(array("status"=>"success"))); + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + //取回用户昵称 + case "getName": + if($_POST['token']!="" && $_POST["uid"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $user=new user; + $result=$user->getNameUid($_POST["uid"]); + exit(json_encode(array("status"=>"success","name"=>$result))); + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + //检测是否已经实名 + case "checkAuth": + if($_POST['token']!="" && $_POST["uid"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $auth=new realNameAuth; + if($auth->check($uid)){ + exit(json_encode(array("status"=>"success","auth"=>true))); + }else{ + exit(json_encode(array("status"=>"success","auth"=>false))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + //取回实名信息 + case "getAuthInfo": + if($_POST['token']!="" && $_POST["uid"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $aid=$app->getAidToken($_POST["token"]); + $level=$app->checkLevel($aid); + if($level=="official"){ + $auth=new realNameAuth; + exit(json_encode(array("status"=>"success","result"=>$auth->readData($_POST["uid"])))); + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + case "checkAppLevel": + if($_POST['token']!="" && $_POST["tokenCheck"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $aid=$app->getAidToken($_POST["token"]); + $level=$app->checkLevel($aid); + if($level=="enterprise" || $level=="official"){ + if($app->checkToken($_POST["tokenCheck"])){ + $aidCheck=$app->getAidToken($_POST["tokenCheck"]); + $levelCheck=$app->checkLevel($aidCheck); + exit(json_encode(array("status"=>"success","result"=>$levelCheck))); + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + case "checkAppToken": + if($_POST['token']!="" && $_POST["tokenCheck"]!=""){ + $app=new app; + if($app->checkToken($_POST["token"])){ + $aid=$app->getAidToken($_POST["token"]); + $level=$app->checkLevel($aid); + if($level=="enterprise" || $level=="official"){ + if($app->checkToken($_POST["tokenCheck"])){ + exit(json_encode(array("status"=>"success","result"=>true))); + }else{ + exit(json_encode(array("status"=>"success","result"=>false))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + }else{ + exit(json_encode(array("status"=>"failed"))); + } + exit(); + default: + exit(json_encode(array("status"=>"success"))); +} \ No newline at end of file diff --git a/user_center/interface/oauth.php b/user_center/interface/oauth.php new file mode 100644 index 0000000..ad963c4 --- /dev/null +++ b/user_center/interface/oauth.php @@ -0,0 +1,281 @@ +getReal(); +//解析信息 +$stream_opts = [ + "ssl" => [ + "verify_peer"=>false, + "verify_peer_name"=>false, + ] +]; +$ipInfo=json_decode(file_get_contents("https://api.ghink.net/ip/?ip=".$ip,false,stream_context_create($stream_opts)),true); +//获取IP信息分区 +$area=$ipInfo["city"]; +//获取来路信息 +$domain=explode("/",preg_replace("/https:\/\/|http:\/\//","",$_SERVER["HTTP_REFERER"]))[0]; +switch($_GET["type"]){ + //退出登陆模块 + case "exit": + setcookie("ghinkToken","",-1,"/"); + header("location: oauth.php?type=log"); + exit(); + //实名认证模块 + case "auth": + $user=new user; + if(!$user->checkToken($_COOKIE["ghinkToken"])){ + $token=""; + $url="Need Login"; + echo str_replace("{{url}}",$url,str_replace("{{token}}",$token,file_get_contents(setting::root."template/authentication/authentication.html"))); + }else{ + $token=$_COOKIE["ghinkToken"]; + //检查是否为中国大陆用户 + $auth=new realNameAuth; + $id=$user->getIdToken($token); + $uid=$user->getUidId($id); + $url=$auth->create($uid); + if($user->getAreaUid($uid)=="global" || $auth->check($uid)){ + header("location: oauth.php?type=panel"); + }else{ + echo str_replace("{{url}}",$url,str_replace("{{token}}",$token,file_get_contents(setting::root."template/authentication/authentication.html"))); + } + } + exit(); + //实名认证回调模块 + case "authBack": + if($_GET['tid']==""){ + exit(file_get_contents(setting::root."template/403.html")); + }else{ + $realNameAuth=new realNameAuth; + if($realNameAuth->getResult($_GET['tid'])){ + echo file_get_contents(setting::root."template/authentication/success.html"); + }else{ + echo file_get_contents(setting::root."template/authentication/failed.html"); + } + } + exit(); + //实名失败模块 + case "authFailed": + echo file_get_contents(setting::root."template/authentication/failed.html"); + exit(); + //找回密码模块 + case "find": + echo "暂未开放 Not Open"; + exit(); + //面板模块 + case "panel": + $user=new user; + if(!$user->checkToken($_COOKIE["ghinkToken"])){ + header("location: oauth.php?type=log"); + }else{ + echo "暂未开放 Not Open
"; + echo '点我进行实名认证
'; + echo '您的UID为:'.$user->getUidId($user->getIdToken($_COOKIE["ghinkToken"])).'
'; + echo '您的昵称为:'.$user->getNameUid($user->getUidId($user->getIdToken($_COOKIE["ghinkToken"]))).'
'; + echo '退出登录
'; + } + exit(); + //OAUTH模块核验 + case "oauthCheck": + //判断来路信息 + if($domain==setting::domain){ + if($_POST['tid']!=""){ + $task=new task; + if($task->checkOauth($_POST['tid'])){ + if($_POST["email"]=="" || $_POST["pass"]==""){ + //判断并输出信息 + if($area==""){ + echo json_encode(array("","Log in failed! ")); + }else{ + echo json_encode(array("","登陆失败!")); + } + }else{ + $user=new user; + $task=new task; + $aid=$task->getAidTid($_POST['tid']); + $result=$user->login($_POST["email"],$_POST["pass"],$ip,$aid); + if($result==false){ + //判断并输出信息 + if($area==""){ + echo json_encode(array("","Log in failed! ")); + }else{ + echo json_encode(array("","登陆失败!")); + } + }else{ + //设置cookie + setcookie("ghinkToken",$result,$ts+604800,"/"); + $task->recordOauth($_POST['tid'],$result); + //判断并输出信息 + if($area==""){ + echo json_encode(array($result,"Log in success! ")); + }else{ + echo json_encode(array($result,"登陆成功!")); + } + } + } + } + }else{ + //非法访问403 + exit(file_get_contents(setting::root."template/403.html")); + } + }else{ + //非法访问403 + exit(file_get_contents(setting::root."template/403.html")); + } + exit(); + //OAUTH模块 + case "oauth": + if($_GET['tid']!="" && $_GET['location']!=""){ + //判断并输出模板 + if($area==""){ + echo str_replace("{{LOCATION}}",$_GET['location'],str_replace("{{TID}}",$_GET['tid'],file_get_contents(setting::root."template/oauth/en_US.html"))); + }else{ + echo str_replace("{{LOCATION}}",$_GET['location'],str_replace("{{TID}}",$_GET['tid'],file_get_contents(setting::root."template/oauth/zh_CN.html"))); + } + }else{ + exit(file_get_contents(setting::root."template/403.html")); + } + exit(); + //登录模块 + case "log": + $user=new user; + if($_COOKIE['ghinkToken']!="" && $user->checkToken($_COOKIE['ghinkToken'])){ + header("location: oauth.php?type=panel"); + exit(); + } + //判断并输出模板 + if($area==""){ + echo file_get_contents(setting::root."template/log/en_US.html"); + }else{ + echo file_get_contents(setting::root."template/log/zh_CN.html"); + } + exit(); + //登录核验模块 + case "logCheck": + if($domain==setting::domain){ + if($_POST["email"]=="" || $_POST["pass"]==""){ + //判断并输出信息 + if($area==""){ + echo json_encode(array("","Log in failed! ")); + }else{ + echo json_encode(array("","登陆失败!")); + } + }else{ + $user=new user; + $result=$user->login($_POST["email"],$_POST["pass"],$ip); + if($result==false){ + //判断并输出信息 + if($area==""){ + echo json_encode(array("","Log in failed! ")); + }else{ + echo json_encode(array("","登陆失败!")); + } + }else{ + //设置cookie + setcookie("ghinkToken",$result,$ts+604800,"/"); + //判断并输出信息 + if($area==""){ + echo json_encode(array($result,"Log in success! ")); + }else{ + echo json_encode(array($result,"登陆成功!")); + } + } + } + }else{ + //非法访问403 + exit(file_get_contents(setting::root."template/403.html")); + } + exit(); + //注册模块 + case "reg": + $user=new user; + //判断并输出模板 + if($area==""){ + echo file_get_contents(setting::root."template/reg/en_US.html"); + }else{ + echo file_get_contents(setting::root."template/reg/zh_CN.html"); + } + exit(); + //注册邮件发送模块 + case "regMail": + if($domain==setting::domain){ + if($area==""){ + //非空判断 + if($_POST["email"]=="" || $_POST["pass"]=="" || $_POST["name"]==""){ + exit("Auth mail send failed!"); + }else{ + //处理邮件请求 + $user=new user; + $result=$user->reg($_POST["name"],$_POST["pass"],$_POST["email"],$ip); + if($result==false){ + exit("Auth mail send failed! Maybe the user has already exist!"); + }else{ + echo "Auth mail has sent to your email! Please Check."; + } + } + }else{ + //非空判断 + if($_POST["email"]=="" || $_POST["pass"]=="" || $_POST["name"]==""){ + exit("验证邮件发送失败!"); + }else{ + //处理邮件请求 + $user=new user; + $result=$user->reg($_POST["name"],$_POST["pass"],$_POST["email"],$ip); + if($result==false){ + exit("验证邮件发送失败!可能是用户已经存在!"); + }else{ + echo "验证邮件发送成功!请查收。"; + } + } + } + }else{ + //非法访问403 + exit(file_get_contents(setting::root."template/403.html")); + } + exit(); + //注册邮件验证模块 + case "regMailCheck": + //非空判断 + if($_GET["email"]=="" || $_GET["tid"]=="" || $_GET["code"]==""){ + exit(file_get_contents(setting::root."template/403.html")); + }else{ + //处理核验请求 + $mail=new mail; + $result=$mail->checkReg($_GET["email"],$_GET["tid"],$_GET["code"]); + if($result){ + //判断并输出模板 + if($area==""){ + echo file_get_contents(setting::root."template/regMailCheck/success_en_US.html"); + }else{ + echo file_get_contents(setting::root."template/regMailCheck/success_zh_CN.html"); + } + }else{ + //判断并输出模板 + if($area==""){ + echo file_get_contents(setting::root."template/regMailCheck/failed_en_US.html"); + }else{ + echo file_get_contents(setting::root."template/regMailCheck/failed_zh_CN.html"); + } + } + } + exit(); + //协议模块 + case "agreement": + //输出协议页 + echo file_get_contents(setting::root."template/agreement.html"); + exit(); + //非法访问 + default: + //非法访问403 + exit(file_get_contents(setting::root."template/403.html")); +} \ No newline at end of file diff --git a/user_center/libraries/app.php b/user_center/libraries/app.php new file mode 100644 index 0000000..4784ce4 --- /dev/null +++ b/user_center/libraries/app.php @@ -0,0 +1,408 @@ +prepare("SELECT level FROM `developers` WHERE `did`=?"); + $sql->bind_param('i',$did); + $sql->execute(); + $sql->bind_result($level); + while($sql->fetch()){ + $rLevel=$level; + } + loger($conn,"developer-checkLevel","success",$ts,"info",json_encode(array("did"=>$did))); + $conn->close(); + return $rLevel; + } + //新增开发者 + function create($uid,$level="personal"){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if(!$this->checkExist($uid)){ + $user=new user; + $id=$user->getIdUid($uid); + $area=$user->getAreaId($uid); + $sql=$conn->prepare("INSERT INTO developers ( + did,uid,area,level) VALUES( + NULL,?,?,?)"); + $sql->bind_param('iss',$uid,$area,$level); + $sql->execute(); + //取回开发者id + $did=mysqli_insert_id($conn); + //更新全局开发者数 + $sql=$conn->prepare("SELECT deveNum FROM `system` WHERE 1"); + $sql->execute(); + $sql->bind_result($deveNum); + while($sql->fetch()){ + $rDdeveNum=$deveNum; + } + $sql=$conn->prepare("UPDATE `system` SET `deveNum`=? WHERE 1"); + $rDdeveNum=$rDdeveNum+1; + $sql->bind_param('i',$rDdeveNum); + $sql->execute(); + loger($conn,"developer-create","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $did; + }else{ + loger($conn,"developer-create","failed",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return false; + } + } + function quit($uid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if($this->checkExist($uid)){ + //移除开发者所有APP + $app=new app; + $app->removeForDeve($did); + loger($conn,"developer-quit","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $did; + }else{ + loger($conn,"developer-quit","failed",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return false; + } + } + function checkExist($uid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT uid FROM `developers` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($uid); + while($sql->fetch()){ + $rUid=$uid; + } + loger($conn,"developer-checkExist","success",$ts,"info",json_encode(array("uid"=>$uid))); + if($rUid==""){ + $conn->close(); + return false; + }else{ + $conn->close(); + return true; + } + } +} +class app{ + //新增APP + function create($did,$name){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if(!$this->checkExist($name)){ + //获取已使用的全局id数 + $sql=$conn->prepare("SELECT idUsed FROM `system` WHERE 1"); + $sql->execute(); + $sql->bind_result($idUsed); + while($sql->fetch()){ + $rIdUsed=$idUsed; + } + $id=$rIdUsed+1; + //更新全局id数 + $sql=$conn->prepare("UPDATE `system` SET `idUsed`=? WHERE 1"); + $sql->bind_param('i',$id); + $sql->execute(); + //新增APP + $sql=$conn->prepare("INSERT INTO apps ( + id,aid,name,sid,skey,ban,lastIP,addTime,lastTime,ownerId,users) VALUES( + ?,NULL,?,?,?,?,?,?,?,?,?)"); + $users=json_encode(array()); + $ban="false"; + $lastIP="0.0.0.0"; + //创建sId与sKey + $hash=new hash; + $sIdKey=$hash->generateSIdKey($name); + $sql->bind_param('isssssiiis',$id,$name,$sIdKey[0],$sIdKey[1],$ban,$lastIP,$ts,$ts,$did,$users); + $sql->execute(); + //取回APPiD + $aid=mysqli_insert_id($conn); + loger($conn,"app-create","success",$ts,"info",json_encode(array("did"=>$did))); + $conn->close(); + return array($aid,$sIdKey[0],$sIdKey[1]); + }else{ + loger($conn,"app-create","failed",$ts,"info",json_encode(array("did"=>$did))); + $conn->close(); + return false; + } + } + //移除APP + function remove($aid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //判断是否存在 + if($this->checkExistAid($aid)){ + //删除APP + $sql=$conn->prepare("DELETE FROM `apps` WHERE `aid`=?"); + $sql->bind_param('i',$aid); + $sql->execute(); + loger($conn,"app-remove","success",$ts,"info",json_encode(array("did"=>$rDid))); + $conn->close(); + return true; + }else{ + loger($conn,"app-remove","failed",$ts,"info",json_encode(array("did"=>$rDid))); + $conn->close(); + return false; + } + } + function giveToken($sId,$sKey){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if($this->checkRight($sId,$sKey)){ + //获取APP的全局ID + $id=$this->getIdSId($sId); + //检测Token是否已经存在 + $sql=$conn->prepare("SELECT `value`,`createTime`,`renewal` FROM `tokens` WHERE `id`=?"); + $sql->bind_param('i',$id); + $sql->execute(); + $sql->bind_result($value,$createTime,$renewal); + while($sql->fetch()){ + $rValue=$value; + $rCreateTime=$createTime; + $rRenewal=$renewal; + } + if($rValue=="" || (($ts-$rCreateTime)>604800 && $rRenewal=="") || (($ts-$rCreateTime)>1209600 && $rRenewal=="true")){ + $hash=new hash; + //计算Token + $token=$hash->generateToken($sId+$sKey); + $sql=$conn->prepare("INSERT INTO `tokens`(`tid`, `type`, `createTime`, `renewal`, `id`, `value`) + VALUES (NULL,'app',?,NULL,?,?)"); + $sql->bind_param('iis',$ts,$id,$token); + $sql->execute(); + loger($conn,"app-giveToken","success",$ts,"info",json_encode(array("sid"=>$sId))); + $conn->close(); + return $token; + }else{ + loger($conn,"app-giveToken","failed",$ts,"info",json_encode(array("sid"=>$sId))); + $conn->close(); + return $rValue; + } + }else{ + loger($conn,"app-giveToken","failed",$ts,"info",json_encode(array("email"=>$email))); + return false; + } + } + //销毁Token + function destroyToken($token){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if($this->checkToken($token)){ + $sql=$conn->prepare("UPDATE `tokens` SET `destroy`=\"true\" WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + loger($conn,"app-destroyToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return true; + }else{ + loger($conn,"app-destroyToken","failed",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + } + } + //检测Token是否有效 + function checkToken($token){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取Token + $sql=$conn->prepare("SELECT createTime,renewal,destroy FROM `tokens` WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + $sql->bind_result($createTime,$renewal,$destroy); + while($sql->fetch()){ + $rCreateTime=$createTime; + $rRenewal=$renewal; + $rDestroy=$destroy; + } + //判断Token时效 + if((($ts-$rCreateTime)>604800 && $rRenewal=="") || (($ts-$rCreateTime)>1209600 && $rRenewal=="true") || ($rDestroy=="true")){ + loger($conn,"app-checkToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + }else{ + loger($conn,"app-checkToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return true; + } + } + //移除开发者所有APP + function removeForDeve($did){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //删除APP + $sql=$conn->prepare("DELETE FROM `apps` WHERE `did`=?"); + $sql->bind_param('i',$did); + $sql->execute(); + loger($conn,"app-removeForDeve","success",$ts,"info",json_encode(array("did"=>$did))); + $conn->close(); + return true; + } + //使用Token获取Aid + function getAidToken($token){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //检测Token是否已经存在 + if($this->checkToken($token)){ + $sql=$conn->prepare("SELECT `id` FROM `tokens` WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + $aid=$this->getAidId($rId); + return $aid; + }else{ + return false; + } + } + //使用全局ID获取APP的Aid + function getAidId($id){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT aid FROM `apps` WHERE `id`=?"); + $sql->bind_param('i',$id); + $sql->execute(); + $sql->bind_result($aid); + while($sql->fetch()){ + $rAid=$aid; + } + loger($conn,"app-getIdAid","success",$ts,"info",json_encode(array("id"=>$id))); + $conn->close(); + return $rAid; + } + //使用sId获取APP的全局ID + function getIdSId($sId){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT id FROM `apps` WHERE `sid`=?"); + $sql->bind_param('i',$sId); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + loger($conn,"app-getIdSId","success",$ts,"info",json_encode(array("sid"=>$sId))); + $conn->close(); + return $rId; + } + //使用APP ID检查APP是否存在 + function checkExistAid($aid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT name FROM `apps` WHERE `aid`=?"); + $sql->bind_param('i',$aid); + $sql->execute(); + $sql->bind_result($name); + while($sql->fetch()){ + $rName=$name; + } + loger($conn,"app-checkExistAid","success",$ts,"info",json_encode(array("aid"=>$aid))); + if($rName==""){ + $conn->close(); + return false; + }else{ + $conn->close(); + return true; + } + } + //检查APP是否已经存在或者重名 + function checkExist($name){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT aid FROM `apps` WHERE `name`=?"); + $sql->bind_param('s',$name); + $sql->execute(); + $sql->bind_result($aid); + while($sql->fetch()){ + $rAid=$aid; + } + loger($conn,"app-checkExist","success",$ts,"info",json_encode(array("name"=>$name))); + if($rAid==""){ + $conn->close(); + return false; + }else{ + $conn->close(); + return true; + } + } + //检查APP信息是否正确 + function checkRight($sId,$sKey){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT skey FROM `apps` WHERE `sid`=?"); + $sql->bind_param('s',$sId); + $sql->execute(); + $sql->bind_result($sKey); + while($sql->fetch()){ + $rSKey=$sKey; + } + loger($conn,"app-checkRight","success",$ts,"info",json_encode(array("sid"=>$sId))); + if($sKey==$rSKey){ + $conn->close(); + return true; + }else{ + $conn->close(); + return false; + } + } + //检查应用权限级别 + function checkLevel($aid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT ownerId FROM `apps` WHERE `aid`=?"); + $sql->bind_param('i',$aid); + $sql->execute(); + $sql->bind_result($ownerId); + while($sql->fetch()){ + $rOwnerId=$ownerId; + } + $deve=new developer; + loger($conn,"app-checkLevel","success",$ts,"info",json_encode(array("aid"=>$aid))); + $conn->close(); + return $deve->checkLevel($rOwnerId); + } +} \ No newline at end of file diff --git a/user_center/libraries/auth.php b/user_center/libraries/auth.php new file mode 100644 index 0000000..9a2301a --- /dev/null +++ b/user_center/libraries/auth.php @@ -0,0 +1,314 @@ +getToken(); + } + //请求TOKEN + function getToken(){ + $jsonData=array("grant_type"=>"client_credentials", + "client_id"=>setting::baiduCloud[0], + "client_secret"=>setting::baiduCloud[1]); + $this->token=json_decode(sendPost("https://aip.baidubce.com/oauth/2.0/token",$jsonData),true)["access_token"]; + } + //生成验证TOKEN + function getVeriToken(){ + $options=array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type:application/json', + 'content' => '{"plan_id":"'.setting::baiduAuthPlanId.'"}', + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + $result=file_get_contents("https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/verifyToken/generate?access_token=".$this->token,false,$context); + $result=json_decode($result,true); + if($result["success"]){ + return $result["result"]["verify_token"]; + }else{ + return false; + } + } + //取回验证结果 + function getBack($veriToken){ + $options=array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type:application/json', + 'content' => '{"verify_token":"'.$veriToken.'"}', + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + $result=file_get_contents("https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/result/detail?access_token=".$this->token,false,$context); + $result=json_decode($result,true); + if($result["success"]){ + return $result["result"]; + }else{ + return false; + } + } +} +//实名认证接口 +class realNameAuth{ + //创建实名认证任务 + function create($uid){ + $brain=new baiduBrain; + $task=new task; + $veriToken=$brain->getVeriToken(); + if($veriToken==false){ + return false; + }else{ + $tid=$task->createAuth($veriToken,$uid); + if($tid==false){ + return false; + }else{ + $result=$this->makeUrl($veriToken,$tid); + return $result; + } + } + } + //构造实名认证URL + function makeUrl($veriToken,$tid){ + $url="https://brain.baidu.com/face/print/?token=".urlencode($veriToken)."&successUrl=".urlencode("https://center.ghink.net/v1/interface/oauth.php?type=authBack&tid=".$tid)."&failedUrl=https://center.ghink.net/v1/interface/oauth.php?type=authFailed"; + return $url; + } + //取回实名认证结果 + function getResult($tid){ + //记录时间戳 + $ts=time(); + $task=new task; + $brain=new baiduBrain; + $result=$task->getBackAuth($tid); + if($result==false){ + return false; + }else{ + $veriToken=$result[1]; + $uid=$result[0]; + $result=$brain->getBack($veriToken); + $result=json_encode($result); + //记录数据库 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + loger($conn,"realNameAuth-getResult","success",$ts,"info",json_encode(array("tid"=>$tid))); + //录入数据库 + $sql=$conn->prepare("UPDATE `userInfoCN` SET `idCradInfo`=? WHERE `uid`=?"); + $sql->bind_param('si',$result,$uid); + $sql->execute(); + $json=json_decode($result); + $name=$json->idcard_confirm->name; + $brithday=date('Ymd',strtotime($json->idcard_ocr_result->birthday)); + $sex=$json->idcard_ocr_result->gender; + $sql=$conn->prepare("UPDATE `userInfoCN` SET `name`=?,`brithday`=?,`sex`=? WHERE `uid`=?"); + $sql->bind_param('sssi',$name,$brithday,$sex,$uid); + $sql->execute(); + $conn->close(); + return true; + } + } + //检查某个用户是否已经实名 + function check($uid){ + //记录时间戳 + $ts=time(); + //数据库链接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT idCradInfo FROM `userInfoCN` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($idCardInfo); + while($sql->fetch()){ + $rIdCradInfo=$idCardInfo; + } + if($rIdCradInfo!=""){ + $json=json_decode($rIdCradInfo,true); + $expire=strtotime($json["idcard_ocr_result"]["expire_time"]); + $issue=strtotime($json["idcard_ocr_result"]["issue_time"]); + if($ts<$expire && $ts>$issue){ + return true; + }else{ + return false; + } + }else{ + return false; + } + } + //读取实名认证数据 + function readData($uid){ + //记录时间戳 + $ts=time(); + //数据库链接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT idCradInfo FROM `userInfoCN` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($idCardInfo); + while($sql->fetch()){ + $rIdCradInfo=$idCardInfo; + } + if($rIdCradInfo!=""){ + return $rIdCradInfo; + }else{ + return false; + } + } +} +//邮件验证 +class mail{ + //登陆地区警告函数 + function sendWarn($email,$area,$lastArea){ + $user=new user; + $name=$user->getName($email); + $uArea=$user->getArea($email); + if($uArea=="china"){ + $title="极科通行证异地登录告警"; + $body=str_replace("{{lastArea}}",$lastArea,file_get_contents(setting::root."template/logWarn/zh_CN.html")); + $body=str_replace("{{area}}",$area,$body); + $body=str_replace("{{name}}",$name,$body); + }else{ + $title="Ghink Passport Different places Log Warn"; + $body=str_replace("{{lastArea}}",$lastArea,file_get_contents(setting::root."template/logWarn/en_US.html")); + $body=str_replace("{{area}}",$area,$body); + $body=str_replace("{{name}}",$name,$body); + } + $this->send($email,$title,$body); + } + //注册邮件核验函数 + function checkReg($email,$tid,$code){ + //获取时间戳 + $ts=time(); + //数据库链接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //请求核验信息 + $sql=$conn->prepare("SELECT content FROM `tasks` WHERE `tid`=?"); + $sql->bind_param('s',$tid); + $sql->execute(); + $sql->bind_result($content); + while($sql->fetch()){ + $rContent=$content; + } + //判断是否存在 + if($rContent==""){ + loger($conn,"check-reg","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return false; + } + //json解码 + $content=json_decode($rContent); + //合法性判断 + if($content[0]==$code && $content[1]==$email){ + //获取已使用的全局id数 + $sql=$conn->prepare("SELECT idUsed FROM `system` WHERE 1"); + $sql->execute(); + $sql->bind_result($idUsed); + while($sql->fetch()){ + $rIdUsed=$idUsed; + } + $id=$rIdUsed+1; + //更新全局id数 + $sql=$conn->prepare("UPDATE `system` SET `idUsed`=? WHERE 1"); + $sql->bind_param('i',$id); + $sql->execute(); + //核销处理记录 + $sql=$conn->prepare("UPDATE `tasks` SET `content`=\"done\" WHERE `tid`=?"); + $sql->bind_param('i',$tid); + $sql->execute(); + //记录用户信息 + $sql=$conn->prepare( + "INSERT INTO users(id,uid,name,pass,email,ban,area,regTime,logTime,regIP,logIP) + VALUES(?,NULL,?,?,?,'false',?,?,?,?,?)"); + $sql->bind_param('issssiiss',$id,$content[2],$content[3],$email,$content[4],$ts,$ts,$content[5],$content[5]); + $sql->execute(); + $uid=mysqli_insert_id($conn); + if($content[4]=="china"){ + $sql=$conn->prepare( + "INSERT INTO `userInfoCN`(`uid`) + VALUES (?)"); + $sql->bind_param('i',$uid); + $sql->execute(); + }else{ + $sql=$conn->prepare( + "INSERT INTO `userInfoGL`(`uid`) + VALUES (?)"); + $sql->bind_param('i',$uid); + $sql->execute(); + } + loger($conn,"check-reg","success",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return true; + } + loger($conn,"check-reg","failed",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return false; + } + //注册邮件发送函数 + function sendReg($email,$name,$pass,$area,$ip){ + //获取时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //检查是否已经存在 + $sql=$conn->prepare("SELECT content FROM `tasks` WHERE `content` REGEXP ?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($content); + while($sql->fetch()){ + $rContent=$content; + } + loger($conn,"mail-sendReg","success",$ts,"info",json_encode(array("email"=>$email))); + if($rContent==""){ + //实例化对象 + $tsk=new task; + $hash=new hash; + $pass=$hash->generatePass($pass); + $result=$tsk->create("reg",$email,$name,$pass,$area,$ip); + //URL拼接 + $url=setting::url."/v1/interface/oauth.php?type=regMailCheck&tid=".$result[0]."&email=".$email."&code=".$result[1]; + //区域判断与邮件发送 + if($area=="china"){ + $title="极科通行证注册验证邮件"; + $body=str_replace("{{link}}",$url,file_get_contents(setting::root."template/regMail/zh_CN.html")); + }else{ + $title="Reg Ghink Passport"; + $body=str_replace("{{link}}",$url,file_get_contents(setting::root."template/regMail/zh_CN.html")); + } + $this->send($email,$title,$body); + $conn->close(); + return true; + }else{ + $conn->close(); + return false; + } + } + //邮件发送便利化函数 + function send($mailto, $mailsub, $mailbd){ + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $smtpserver="smtp.exmail.qq.com"; + $smtpserverport=25; + $smtpusermail="system@ghink.net"; + $smtpemailto=$mailto; + $smtpuser="system@ghink.net"; + $smtppass="GkNet2014"; + $mailsubject=$mailsub; + $mailsubject="=?UTF-8?B?".base64_encode($mailsubject)."?="; + $mailbody=$mailbd; + //$mailbody="=?UTF-8?B?".base64_encode($mailbody)."?="; + $mailtype="HTML"; + $smtp=new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); + $smtp->debug=false; + $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype); + if($smtp->log_file==""){ + loger($conn,"mail-send","success",$ts,"info",json_encode(array("mailto"=>$mailto))); + }else{ + loger($conn,"mail-send","failed",$ts,"error",json_encode(array("mailto"=>$mailto,"smtpLog"=>$smtp->log_file))); + } + $conn->close(); + } +} \ No newline at end of file diff --git a/user_center/libraries/database.php b/user_center/libraries/database.php new file mode 100644 index 0000000..73a0e9b --- /dev/null +++ b/user_center/libraries/database.php @@ -0,0 +1,17 @@ +cryptMD5($pass); + } + return $pass; + } + //Token生成算法,时效性 + function generateToken($value){ + $time=time(); + for ($i=0;$i<=strlen($value);$i++){ + $result=$result+$this->cryptMd5($value)+$time; + } + return $this->cryptMd5($result); + } + //sId与sKey生成算法,唯一性 + function generateSIdKey($name){ + $time=time(); + for ($i=0;$i<=strlen($name);$i++){ + @$result=$result+$name+$this->cryptMd5($name)+$time; + } + $sId=$this->cryptMd5($result); + for ($i=0;$i<=strlen($name);$i++){ + @$result=$result+$time+$this->cryptMd5($name)+$name; + } + $sKey=$this->cryptMd5($result); + return array($sId,$sKey); + } +} \ No newline at end of file diff --git a/user_center/libraries/ip.php b/user_center/libraries/ip.php new file mode 100644 index 0000000..086ab40 --- /dev/null +++ b/user_center/libraries/ip.php @@ -0,0 +1,62 @@ +prepare("SELECT logIP FROM `users` WHERE `id`=?"); + $sql->bind_param('s',$id); + $sql->execute(); + $sql->bind_result($logIP); + while($sql->fetch()){ + $rLogIP=$logIP; + } + //非用户 + if($rLogIP==""){ + $sql=$conn->prepare("SELECT lastIP FROM `apps` WHERE `id`=?"); + $sql->bind_param('s',$id); + $sql->execute(); + $sql->bind_result($lastIP); + while($sql->fetch()){ + $rLastIP=$lastIP; + } + if($rLastIP==""){ + loger($conn,"user-getLast","success",$ts,"info",$id); + $conn->close(); + return false; + }else{ + loger($conn,"user-getLast","success",$ts,"info",$id); + $conn->close(); + return $rLastIP; + } + }else{ + loger($conn,"user-getLast","success",$ts,"info",$id); + $conn->close(); + return $logIP; + } + } +} \ No newline at end of file diff --git a/user_center/libraries/log.php b/user_center/libraries/log.php new file mode 100644 index 0000000..9d37d16 --- /dev/null +++ b/user_center/libraries/log.php @@ -0,0 +1,15 @@ +prepare("INSERT INTO `logs` VALUES (NULL,?,?,?,0,?,?)"); + $sql->bind_param('ssiss',$name,$status,$ts,$type,$info); + $sql->execute(); +} \ No newline at end of file diff --git a/user_center/libraries/mail.php b/user_center/libraries/mail.php new file mode 100644 index 0000000..8a190a5 --- /dev/null +++ b/user_center/libraries/mail.php @@ -0,0 +1,261 @@ +debug=FALSE; + $this->smtp_port=$smtp_port; + $this->relay_host=$relay_host; + $this->time_out=30; + $this->auth=$auth; + $this->user=$user; + $this->pass=$pass; + $this->host_name="localhost"; + $this->log_file=""; + $this->sock=FALSE; + } + function sendmail($to, $from, $subject="", $body="", $mailtype, $cc="", $bcc="", $additional_headers=""){ + $header=""; + $mail_from=$this->get_address($this->strip_comment($from)); + $body=mb_ereg_replace("(^|(\r\n))(\\.)", "\\1.\\3", $body); + $header .="MIME-Version:1.0\r\n"; + if ($mailtype=="HTML") { + $header .='Content-type: text/html; charset=utf-8'."\r\n"; + } + $header .="To: ".$to."\r\n"; + if ($cc !="") { + $header .="Cc: ".$cc."\r\n"; + } + $header .="From: ".$from."\r\n"; + $header .="Subject: ".$subject."\r\n"; + $header .=$additional_headers; + $header .="Date: ".date("r")."\r\n"; + $header .="X-Mailer:By (PHP/".phpversion().")\r\n"; + list($msec, $sec)=explode(" ", microtime()); + $header .="Message-ID: <".date("YmdHis", $sec).".".($msec * 1000000).".".$mail_from.">\r\n"; + $TO=explode(",", $this->strip_comment($to)); + if ($cc !="") { + $TO=array_merge($TO, explode(",", $this->strip_comment($cc))); + } + if ($bcc !="") { + $TO=array_merge($TO, explode(",", $this->strip_comment($bcc))); + } + $sent=TRUE; + foreach ($TO as $rcpt_to) { + $rcpt_to=$this->get_address($rcpt_to); + if (!$this->smtp_sockopen($rcpt_to)) { + $this->log_write("Error: Cannot send email to ".$rcpt_to."\n"); + $sent=FALSE; + continue; + } + if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) { + $this->log_write("E-mail has been sent to <".$rcpt_to.">\n"); + }else{ + $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n"); + $sent=FALSE; + } + fclose($this->sock); + $this->log_write("Disconnected from remote host\n"); + } + echo "
"; + return $sent; + } + function smtp_send($helo, $from, $to, $header, $body=""){ + if (!$this->smtp_putcmd("HELO", $helo)) { + return $this->smtp_error("sending HELO command"); + } + if ($this->auth) { + if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) { + return $this->smtp_error("sending HELO command"); + } + if (!$this->smtp_putcmd("", base64_encode($this->pass))) { + return $this->smtp_error("sending HELO command"); + } + } + # + if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) { + return $this->smtp_error("sending MAIL FROM command"); + } + if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) { + return $this->smtp_error("sending RCPT TO command"); + } + if (!$this->smtp_putcmd("DATA")) { + return $this->smtp_error("sending DATA command"); + } + if (!$this->smtp_message($header, $body)) { + return $this->smtp_error("sending message"); + } + if (!$this->smtp_eom()) { + return $this->smtp_error("sending . [EOM]"); + } + if (!$this->smtp_putcmd("QUIT")) { + return $this->smtp_error("sending QUIT command"); + } + return TRUE; + } + function smtp_sockopen($address){ + if ($this->relay_host=="") { + return $this->smtp_sockopen_mx($address); + }else{ + return $this->smtp_sockopen_relay(); + } + } + function smtp_sockopen_relay(){ + $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n"); + $this->sock=@fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out); + if (!($this->sock && $this->smtp_ok())) { + $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n"); + $this->log_write("Error: ".$errstr." (".$errno.")\n"); + return FALSE; + } + $this->log_write("Connected to relay host ".$this->relay_host."\n"); + return TRUE; + ; + } + function smtp_sockopen_mx($address){ + $domain=ereg_replace("^.+@([^@]+)$", "\\1", $address); + if (!@getmxrr($domain, $MXHOSTS)) { + $this->log_write("Error: Cannot resolve MX \"".$domain."\"\n"); + return FALSE; + } + foreach ($MXHOSTS as $host) { + $this->log_write("Trying to ".$host.":".$this->smtp_port."\n"); + $this->sock=@fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out); + if (!($this->sock && $this->smtp_ok())) { + $this->log_write("Warning: Cannot connect to mx host ".$host."\n"); + $this->log_write("Error: ".$errstr." (".$errno.")\n"); + continue; + } + $this->log_write("Connected to mx host ".$host."\n"); + return TRUE; + } + $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n"); + return FALSE; + } + function smtp_message($header, $body){ + fputs($this->sock, $header."\r\n".$body); + $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> ")); + return TRUE; + } + function smtp_eom(){ + fputs($this->sock, "\r\n.\r\n"); + $this->smtp_debug(". [EOM]\n"); + return $this->smtp_ok(); + } + function smtp_ok(){ + $response=str_replace("\r\n", "", fgets($this->sock, 512)); + $this->smtp_debug($response."\n"); + if (!mb_ereg("^[23]", $response)) { + fputs($this->sock, "QUIT\r\n"); + fgets($this->sock, 512); + $this->log_write("Error: Remote host returned \"".$response."\"\n"); + return FALSE; + } + return TRUE; + } + function smtp_putcmd($cmd, $arg=""){ + if ($arg !="") { + if ($cmd=="") + $cmd=$arg; + else + $cmd=$cmd." ".$arg; + } + fputs($this->sock, $cmd."\r\n"); + $this->smtp_debug("> ".$cmd."\n"); + return $this->smtp_ok(); + } + function smtp_error($string){ + $this->log_write("Error: Error occurred while ".$string.".\n"); + return FALSE; + } + function log_write($message){ + $this->smtp_debug($message); + if ($this->log_file=="") { + return TRUE; + } + $message=date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message; + if (!@file_exists($this->log_file) || !($fp=@fopen($this->log_file, "a"))) { + $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n"); + return FALSE; + } + flock($fp, LOCK_EX); + fputs($fp, $message); + fclose($fp); + return TRUE; + } + function strip_comment($address){ + $comment="\\([^()]*\\)"; + while (mb_ereg($comment, $address)) { + $address=mb_ereg_replace($comment, "", $address); + } + return $address; + } + function get_address($address){ + $address=mb_ereg_replace("([ \t\r\n])+", "", $address); + $address=mb_ereg_replace("^.*<(.+)>.*$", "\\1", $address); + return $address; + } + function smtp_debug($message){ + if ($this->debug) { + echo $message."
"; + } + } + function get_attach_type($image_tag){ + $filedata=array(); + $img_file_con=fopen($image_tag, "r"); + unset($image_data); + while ($tem_buffer=AddSlashes(fread($img_file_con, filesize($image_tag)))) + $image_data .=$tem_buffer; + fclose($img_file_con); + $filedata['context']=$image_data; + $filedata['filename']=basename($image_tag); + $extension=substr($image_tag, strrpos($image_tag, "."), strlen($image_tag) - strrpos($image_tag, ".")); + switch ($extension) { + case ".gif": + $filedata['type']="image/gif"; + break; + case ".gz": + $filedata['type']="application/x-gzip"; + break; + case ".htm": + $filedata['type']="text/html"; + break; + case ".html": + $filedata['type']="text/html"; + break; + case ".jpg": + $filedata['type']="image/jpeg"; + break; + case ".tar": + $filedata['type']="application/x-tar"; + break; + case ".txt": + $filedata['type']="text/plain"; + break; + case ".zip": + $filedata['type']="application/zip"; + break; + default: + $filedata['type']="application/octet-stream"; + break; + } + return $filedata; + } + } \ No newline at end of file diff --git a/user_center/libraries/post.php b/user_center/libraries/post.php new file mode 100644 index 0000000..ec4e47d --- /dev/null +++ b/user_center/libraries/post.php @@ -0,0 +1,24 @@ + array( + 'method' => 'POST', + 'header' => 'Content-type:application/x-www-form-urlencoded', + 'content' => $postdata, + 'timeout' => 15*60 + ) + ); + $context=stream_context_create($options); + $result=file_get_contents($url,false,$context); + return $result; +} \ No newline at end of file diff --git a/user_center/libraries/setting.php b/user_center/libraries/setting.php new file mode 100644 index 0000000..adfb777 --- /dev/null +++ b/user_center/libraries/setting.php @@ -0,0 +1,25 @@ +reset(); + $dev=new developer; + $did=$dev->create(1,"official"); + $app=new app; + $app->create($did,"Ghink Application"); + } +} \ No newline at end of file diff --git a/user_center/libraries/task.php b/user_center/libraries/task.php new file mode 100644 index 0000000..f4f57df --- /dev/null +++ b/user_center/libraries/task.php @@ -0,0 +1,199 @@ +prepare("INSERT INTO tasks + (tid,type,createTime,invalidTime,aid,status,content) VALUES + (NULL,?,?,?,?,\"open\",?)"); + switch($type){ + //创造注册邮件验证任务 + case "reg": + $validTime=$ts+10800;//三个小时 + $aid=0; + //生成验证码 + $code=rand(100000,999999); + //编码json,信息无关性储存 + $content=json_encode(array($code,$email,$name,$pass,$area,$ip)); + $sql->bind_param("siiis",$type,$ts,$validTime,$aid,$content);//10800s=3h + $sql->execute(); + //取回任务id + $tid=mysqli_insert_id($conn); + loger($conn,"task-create","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return array($tid,$code); + case "oauthCreate": + $validTime=$ts+3600;//一个小时 + $app=new app; + if($app->checkToken($token)){ + $aid=$app->getAidToken($token); + $content="oauth"; + $sql->bind_param("siiis",$type,$ts,$validTime,$aid,$content);//10800s=3h + $sql->execute(); + //取回任务id + $tid=mysqli_insert_id($conn); + loger($conn,"task-create","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return $tid; + }else{ + loger($conn,"task-create","failed",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + } + } + } + //创建实名认证任务 + function createAuth($veriToken,$uid){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("INSERT INTO tasks + (tid,type,createTime,invalidTime,aid,status,content) VALUES + (NULL,?,?,?,?,\"open\",?)"); + $validTime=$ts+7200;//两个小时 + $app=new app; + $aid=0; + $type="auth"; + $content=json_encode(array($uid,$veriToken)); + $sql->bind_param("siiis",$type,$ts,$validTime,$aid,$content);//10800s=3h + $sql->execute(); + //取回任务id + $tid=mysqli_insert_id($conn); + loger($conn,"task-createAuth","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $tid; + } + //从tid获取任务发起的应用aid + function getAidTid($tid){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT aid FROM `tasks` WHERE `tid`=?"); + $sql->bind_param('i',$tid); + $sql->execute(); + $sql->bind_result($aid); + while($sql->fetch()){ + $rAid=$aid; + } + if($rAid!=""){ + loger($conn,"task-getAidTid","success",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return $aid; + }else{ + loger($conn,"task-getAidTid","failed",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return false; + } + } + //取回Auth任务详情 + function getBackAuth($tid){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT status,content FROM `tasks` WHERE `tid`=?"); + $sql->bind_param('i',$tid); + $sql->execute(); + $sql->bind_result($status,$content); + while($sql->fetch()){ + $rStatus=$status; + $rContent=$content; + } + if($rStatus!=""){ + //核销Task + $sql=$conn->prepare("UPDATE `tasks` SET `status`=\"close\" WHERE `tid`=?"); + $sql->bind_param("i",$tid); + $sql->execute(); + if($rStatus!="open"){ + loger($conn,"task-getBackAuth","failed",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return false; + }else{ + loger($conn,"task-getBackAuth","success",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + $result=json_decode($rContent,true); + return $result; + } + }else{ + loger($conn,"task-getBackAuth","failed",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + return false; + } + } + //取回oauth结果(用户Token) + function getbackOauth($tid){ + if($this->checkOauth($tid)){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //取回Token + $sql=$conn->prepare("SELECT content FROM `tasks` WHERE `tid`=?"); + $sql->bind_param('i',$tid); + $sql->execute(); + $sql->bind_result($content); + while($sql->fetch()){ + $rContent=$content; + } + //核销Task + $sql=$conn->prepare("UPDATE `tasks` SET `status`=\"close\" WHERE `tid`=?"); + $sql->bind_param("i",$tid); + $sql->execute(); + return $rContent; + }else{ + return false; + } + } + //oauth登陆任务记录 + function recordOauth($tid,$token){ + if($this->checkOauth($tid)){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //记录Token + $sql=$conn->prepare("UPDATE `tasks` SET `content`=? WHERE `tid`=?"); + $sql->bind_param("si",$token,$tid); + $sql->execute(); + $conn->close(); + return true; + }else{ + return false; + } + } + //检测oauth登录任务是否有效 + function checkOauth($tid){ + //记录时间戳 + $ts=time(); + //数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $sql=$conn->prepare("SELECT status FROM `tasks` WHERE `tid`=?"); + $sql->bind_param('i',$tid); + $sql->execute(); + $sql->bind_result($status); + while($sql->fetch()){ + $rStatus=$status; + } + loger($conn,"task-checkOauth","success",$ts,"info",json_encode(array("tid"=>$tid))); + $conn->close(); + if($rStatus!="open"){ + return false; + }else{ + return true; + } + } +} \ No newline at end of file diff --git a/user_center/libraries/user.php b/user_center/libraries/user.php new file mode 100644 index 0000000..3b328c1 --- /dev/null +++ b/user_center/libraries/user.php @@ -0,0 +1,383 @@ +checkExist($email)){ + //用户分区检查 + $area=json_decode(file_get_contents("https://api.ghink.net/ip/?ip=".$ip),true)["city"]; + if($area==""){ + $area="global"; + $mail=new mail; + //发送验证邮件 + $result=$mail->sendReg($email,$name,$pass,$area,$ip); + return $result; + }else{ + $area="china"; + $mail=new mail; + //发送验证邮件 + $result=$mail->sendReg($email,$name,$pass,$area,$ip); + return $result; + } + }else{ + return false; + } + } + function login($email,$pass,$ip,$aid=0){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if($this->checkRight($email,$pass)){ + $ipaddr=new ip; + $id=$this->getId($email); + $lastIP=$ipaddr->getLast($id); + $ipInfo=json_decode(file_get_contents("https://api.ghink.net/ip/?ip=".$ip),true); + $ipInfoLast=json_decode(file_get_contents("https://api.ghink.net/ip/?ip=".$lastIP),true); + if($ipInfo["city"]!=$ipInfoLast["city"]){ + $mail=new mail; + $mail->sendWarn($email,$ipInfo["city"],$ipInfoLast["city"]); + } + //更新最后登录时间 + $sql=$conn->prepare("UPDATE `users` SET `logTime`=?,`logIP`=? WHERE `email`=?"); + $sql->bind_param('iss',$ts,$ip,$email); + $sql->execute(); + $token=$this->giveToken($email); + //记录登录信息 + $sql=$conn->prepare("INSERT INTO logHistory (id, ip, time, token, aid, status) + VALUES(?,?,?,?,?,?)"); + $status="success"; + $sql->bind_param('isisis',$id,$ip,$ts,$token,$aid,$status); + $sql->execute(); + $conn->close(); + return $token; + }else{ + //记录登陆信息 + $sql=$conn->prepare("INSERT INTO logHistory (id, ip, time, token, aid, status) + VALUES(?,?,?,NULL,NULL,?)"); + $status="failed"; + $sql->bind_param('isis',$id,$ip,$ts,$status); + $sql->execute(); + $conn->close(); + return false; + } + } + //生成用户Token + function giveToken($email){ + //记录时间戳 + $ts=time(); + //实例化对象与数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + $id=$this->getId($email); + //检测Token是否已经存在 + $sql=$conn->prepare("SELECT `value`,`createTime`,`renewal` FROM `tokens` WHERE `id`=?"); + $sql->bind_param('i',$id); + $sql->execute(); + $sql->bind_result($value,$createTime,$renewal); + while($sql->fetch()){ + $rValue=$value; + $rCreateTime=$createTime; + $rRenewal=$renewal; + } + if($rValue=="" || (($ts-$rCreateTime)>604800 && $rRenewal=="") || (($ts-$rCreateTime)>1209600 && $rRenewal=="true")){ + $hash=new hash; + //计算Token + $token=$hash->generateToken($email); + $sql=$conn->prepare("INSERT INTO `tokens`(`tid`, `type`, `createTime`, `renewal`, `id`, `value`) + VALUES (NULL,'user',?,NULL,?,?)"); + $sql->bind_param('iis',$ts,$id,$token); + $sql->execute(); + loger($conn,"user-giveToken","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return $token; + }else{ + loger($conn,"user-giveToken","failed",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return $rValue; + } + } + //从Token获取用户ID + function getIdToken($token){ + //记录时间戳 + $ts=time(); + if($this->checkToken($token)){ + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取Token + $sql=$conn->prepare("SELECT id FROM `tokens` WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + if($rId!=""){ + loger($conn,"user-getIdToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return $rId; + }else{ + loger($conn,"user-getIdToken","failed",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + } + }else{ + return false; + } + } + //销毁Token + function destroyToken($token){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + if($this->checkToken($token)){ + $sql=$conn->prepare("UPDATE `tokens` SET `destroy`=\"true\" WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + loger($conn,"user-destroyToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return true; + }else{ + loger($conn,"user-destroyToken","failed",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + } + } + //检查用户Token是否有效 + function checkToken($token){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取Token + $sql=$conn->prepare("SELECT createTime,renewal,destroy FROM `tokens` WHERE `value`=?"); + $sql->bind_param('s',$token); + $sql->execute(); + $sql->bind_result($createTime,$renewal,$destroy); + while($sql->fetch()){ + $rCreateTime=$createTime; + $rRenewal=$renewal; + $rDestroy=$destroy; + } + //判断Token时效 + if((($ts-$rCreateTime)>604800 && $rRenewal=="") || (($ts-$rCreateTime)>1209600 && $rRenewal=="true") || $rDestroy=="true"){ + loger($conn,"user-checkToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return false; + }else{ + loger($conn,"user-checkToken","success",$ts,"info",json_encode(array("token"=>$token))); + $conn->close(); + return true; + } + } + //Token续期函数 + function renewalToken($uToken,$aToken){ + //Log Rec + //Check token of application + //Database operate + } + function ban(){ + } + //获取用户所属区域 + function getArea($email){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT area FROM `users` WHERE `email`=?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($area); + while($sql->fetch()){ + $rArea=$area; + } + loger($conn,"user-getArea","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return $rArea; + } + //使用UID获取用户所属区域 + function getAreaUid($uid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT area FROM `users` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($area); + while($sql->fetch()){ + $rArea=$area; + } + loger($conn,"user-getAreaUid","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $rArea; + } + //获取用户地区 + function getAreaId($id){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT area FROM `users` WHERE `id`=?"); + $sql->bind_param('i',$id); + $sql->execute(); + $sql->bind_result($area); + while($sql->fetch()){ + $rArea=$area; + } + loger($conn,"user-getAreaId","success",$ts,"info",json_encode(array("id"=>$id))); + $conn->close(); + return $rArea; + } + //从id获取用户uid + function getUidId($id){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT uid FROM `users` WHERE `id`=?"); + $sql->bind_param('i',$id); + $sql->execute(); + $sql->bind_result($uid); + while($sql->fetch()){ + $rUid=$uid; + } + loger($conn,"user-getUidId","success",$ts,"info",json_encode(array("id"=>$id))); + $conn->close(); + return $rUid; + } + //从uid获取用户id + function getIdUid($uid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT id FROM `users` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + loger($conn,"user-getIdUid","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $rId; + } + //从uid获取用户昵称 + function getNameUid($uid){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT name FROM `users` WHERE `uid`=?"); + $sql->bind_param('i',$uid); + $sql->execute(); + $sql->bind_result($name); + while($sql->fetch()){ + $rName=$name; + } + loger($conn,"user-getNameUid","success",$ts,"info",json_encode(array("uid"=>$uid))); + $conn->close(); + return $rName; + } + //获取用户全局id + function getId($email){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT id FROM `users` WHERE `email`=?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($id); + while($sql->fetch()){ + $rId=$id; + } + loger($conn,"user-getId","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return $rId; + } + //获取用户昵称 + function getName($email){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT name FROM `users` WHERE `email`=?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($name); + while($sql->fetch()){ + $rName=$name; + } + loger($conn,"user-getName","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + return $rName; + } + //用户存在性检测 + function checkExist($email){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取数据库返回值 + $sql=$conn->prepare("SELECT pass FROM `users` WHERE `email`=?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($pass); + while($sql->fetch()){ + $rPass=$pass; + } + loger($conn,"user-checkRight","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + if($rPass!=""){ + return true; + }else{ + return false; + } + } + //用户信息是否正确检测 + function checkRight($email,$passwd){ + //记录时间戳 + $ts=time(); + //创建数据库连接 + $conn=new mysqli(database::addr,database::user,database::pass,database::name); + //获取用户基础信息 + $sql=$conn->prepare("SELECT pass FROM `users` WHERE `email`=?"); + $sql->bind_param('s',$email); + $sql->execute(); + $sql->bind_result($pass); + while($sql->fetch()){ + $rPass=$pass; + } + loger($conn,"user-checkRight","success",$ts,"info",json_encode(array("email"=>$email))); + $conn->close(); + $hash=new hash(); + $input=$hash->generatePass($passwd); + //加密密码并比对 + if($rPass==$input){ + return true; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/user_center/template/403.html b/user_center/template/403.html new file mode 100644 index 0000000..b0d9ecb --- /dev/null +++ b/user_center/template/403.html @@ -0,0 +1,57 @@ + + + + + + + 403 + + + +
+ +
+ + \ No newline at end of file diff --git a/user_center/template/agreement.html b/user_center/template/agreement.html new file mode 100644 index 0000000..fa5b0a4 --- /dev/null +++ b/user_center/template/agreement.html @@ -0,0 +1,45 @@ + + + + + + + Agreement协议 + + + +
+

Agreement 协议

+

中文:

+
    +
  • 正在编写中
  • +
+

English:

+
    +
  • There is no English version for the time being, sorry.
  • +
+ +
+ + \ No newline at end of file diff --git a/user_center/template/authentication/authentication.html b/user_center/template/authentication/authentication.html new file mode 100644 index 0000000..b76d4c0 --- /dev/null +++ b/user_center/template/authentication/authentication.html @@ -0,0 +1,92 @@ + + + + + + + + + 实名认证系统 - 极科网络工作室 + + + + + +
+
+
+
+

实名认证

+
+ +
+
+
+
+
+
+
通过后将无法修改!请确认为您本人的身份信息。
+ + +
+
+ +
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/user_center/template/authentication/failed.html b/user_center/template/authentication/failed.html new file mode 100644 index 0000000..fa93783 --- /dev/null +++ b/user_center/template/authentication/failed.html @@ -0,0 +1,38 @@ + + + + + + + + + + 实名认证系统 - 极科网络工作室 + + + +
+
+
+
+

认证失败!

+
5秒后将回到认证系统
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+ + + + + \ No newline at end of file diff --git a/user_center/template/authentication/success.html b/user_center/template/authentication/success.html new file mode 100644 index 0000000..898940f --- /dev/null +++ b/user_center/template/authentication/success.html @@ -0,0 +1,38 @@ + + + + + + + + + + 实名认证系统 - 极科网络工作室 + + + +
+
+
+
+

认证成功!

+
5秒后将回到用户中心!
+
+
+
+
+
+
+
+
+
+

Copyright © Ghink Network Studio 2014. All rights reserved.

+
+
+
+
+ + + + + \ No newline at end of file diff --git a/user_center/template/log/en_US.html b/user_center/template/log/en_US.html new file mode 100644 index 0000000..30a4474 --- /dev/null +++ b/user_center/template/log/en_US.html @@ -0,0 +1,334 @@ + + + + + + + + + + + + + Log in for the Ghink Network Passport + + + + + + + + +
+
+
+
+
+
+
+
+

Checking...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/log/zh_CN.html b/user_center/template/log/zh_CN.html new file mode 100644 index 0000000..0ad06e9 --- /dev/null +++ b/user_center/template/log/zh_CN.html @@ -0,0 +1,332 @@ + + + + + + + + + + + + + 极科通行证登录 + + + + + + + + +
+
+
+
+
+
+
+
+

认证中...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/logWarn/en_US.html b/user_center/template/logWarn/en_US.html new file mode 100644 index 0000000..d6e96bb --- /dev/null +++ b/user_center/template/logWarn/en_US.html @@ -0,0 +1,42 @@ + + + + + + + +
+
+

Ghink Network Passport

+

Log Warn Mail

+
    +

    Dear {{name}}

    +

    Your Ghink Network Passport is loging in {{area}}

    +

    But your last login place is {{lastArea}}

    +

    If it is not your own operation, your password may have been leaked. Please modify it immediately

    +

    Copyright © Ghink Network Studio

    +
+
+
+ + \ No newline at end of file diff --git a/user_center/template/logWarn/zh_CN.html b/user_center/template/logWarn/zh_CN.html new file mode 100644 index 0000000..7538213 --- /dev/null +++ b/user_center/template/logWarn/zh_CN.html @@ -0,0 +1,42 @@ + + + + + + + +
+
+

极科网络通行证

+

登录告警邮件

+
    +

    尊敬的{{name}}

    +

    您的极科网络通行证正在{{area}}登录

    +

    而您上次的登录地区为{{lastArea}}

    +

    如非您本人操作,您的密码可能已经泄露,请马上修改

    +

    版权所有 © 极科网络工作室

    +
+
+
+ + \ No newline at end of file diff --git a/user_center/template/oauth/en_US.html b/user_center/template/oauth/en_US.html new file mode 100644 index 0000000..5a7c8a6 --- /dev/null +++ b/user_center/template/oauth/en_US.html @@ -0,0 +1,336 @@ + + + + + + + + + + + + + Log in for the Ghink Network Passport + + + + + + + + +
+
+
+
+
+
+
+
+

Checking...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/oauth/zh_CN.html b/user_center/template/oauth/zh_CN.html new file mode 100644 index 0000000..bc155d7 --- /dev/null +++ b/user_center/template/oauth/zh_CN.html @@ -0,0 +1,335 @@ + + + + + + + + + + + + + 极科通行证登录 + + + + + + + + +
+
+
+
+
+
+
+
+

认证中...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/reg/en_US.html b/user_center/template/reg/en_US.html new file mode 100644 index 0000000..ec8e5dd --- /dev/null +++ b/user_center/template/reg/en_US.html @@ -0,0 +1,359 @@ + + + + + + + + + + + + + Reg for the Ghink Network Passport + + + + + + + +
+
+ Reg the Ghink Passport +
+
+ +
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ Sorry, your web browser do not support canvas +
+
+
+
Reg stand for agree with the Agreement
+
+
+ +
+
+
+
+
+

Already have account? Go log in

+

Copyright © Ghink Network Studio

+
+
+
+
+
+
+
+
+
+
+

Checking...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/reg/zh_CN.html b/user_center/template/reg/zh_CN.html new file mode 100644 index 0000000..82784ed --- /dev/null +++ b/user_center/template/reg/zh_CN.html @@ -0,0 +1,359 @@ + + + + + + + + + + + + + 极科通行证注册 + + + + + + + +
+
+ 注册极科通行证 +
+
+ +
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ 对不起,您的浏览器不支持canvas +
+
+
+
注册即代表同意 相关协议
+
+
+ +
+
+
+
+
+

已经有账号了? 去登陆

+

版权所有 © 极科网络工作室

+
+
+
+
+
+
+
+
+
+
+

认证中...

+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user_center/template/regMail/en_US.html b/user_center/template/regMail/en_US.html new file mode 100644 index 0000000..e5e9973 --- /dev/null +++ b/user_center/template/regMail/en_US.html @@ -0,0 +1,43 @@ + + + + + + + +
+
+

Ghink Network Passport

+

Reg Auth Mail

+
    +

    Thanks for reg the Ghink Network Passport

    +

    Click the link to auth: {{link}}

    +

    Valid for 3 hours

    +

    If you cannot click the link please copy the link to open it in browser

    +

    If you didn't reg the Ghink Network Passport, please ignore the mail

    +

    Copyright © Ghink Network Studio

    +
+
+
+ + \ No newline at end of file diff --git a/user_center/template/regMail/zh_CN.html b/user_center/template/regMail/zh_CN.html new file mode 100644 index 0000000..8217d2f --- /dev/null +++ b/user_center/template/regMail/zh_CN.html @@ -0,0 +1,43 @@ + + + + + + + +
+
+

极科网络通行证

+

注册验证邮件

+
    +

    感谢您注册极科网络通行证!这是您的验证邮件

    +

    点击链接进行验证:{{link}}

    +

    有效期三小时

    +

    如果链接无法点击,请复制到浏览器打开

    +

    如果您没有注册极科网络通行证,请忽略本邮件

    +

    版权所有 © 极科网络工作室

    +
+
+
+ + \ No newline at end of file diff --git a/user_center/template/regMailCheck/failed_en_US.html b/user_center/template/regMailCheck/failed_en_US.html new file mode 100644 index 0000000..6181c90 --- /dev/null +++ b/user_center/template/regMailCheck/failed_en_US.html @@ -0,0 +1,45 @@ + + + + + + + Reg Ghink Network Passport + + + +
+ +
+ + \ No newline at end of file diff --git a/user_center/template/regMailCheck/failed_zh_CN.html b/user_center/template/regMailCheck/failed_zh_CN.html new file mode 100644 index 0000000..514f3d1 --- /dev/null +++ b/user_center/template/regMailCheck/failed_zh_CN.html @@ -0,0 +1,43 @@ + + + + + + + 注册极科网络通行证 + + + +
+
+

极科网络通行证

+

注册邮件验证

+
    +

    您的注册申请失败了

    +

    请检查您是否已经验证过,或链接错误

    +

    版权所有 © 极科网络工作室

    +
+
+
+ + \ No newline at end of file diff --git a/user_center/template/regMailCheck/success_en_US.html b/user_center/template/regMailCheck/success_en_US.html new file mode 100644 index 0000000..1dc2e5d --- /dev/null +++ b/user_center/template/regMailCheck/success_en_US.html @@ -0,0 +1,45 @@ + + + + + + + Reg Ghink Network Passport + + + +
+ +
+ + \ No newline at end of file diff --git a/user_center/template/regMailCheck/success_zh_CN.html b/user_center/template/regMailCheck/success_zh_CN.html new file mode 100644 index 0000000..dbfe7a0 --- /dev/null +++ b/user_center/template/regMailCheck/success_zh_CN.html @@ -0,0 +1,43 @@ + + + + + + + 注册极科网络通行证 + + + +
+
+

极科网络通行证

+

注册邮件验证

+
    +

    您的注册申请已经成功

    +

    您现在可以登录您的帐号了

    +

    版权所有 © 极科网络工作室

    +
+
+
+ + \ No newline at end of file