|
|
<?php |
|
|
/** |
|
|
* 豆瓣清单 |
|
|
* |
|
|
* @package custom |
|
|
*/ |
|
|
?> |
|
|
<?php if (!defined('__TYPECHO_ROOT_DIR__')) { |
|
|
exit; |
|
|
} |
|
|
?> |
|
|
<?php $this->need('component/header.php');?> |
|
|
|
|
|
<!-- aside --> |
|
|
<?php $this->need('component/aside.php');?> |
|
|
<!-- / aside --> |
|
|
|
|
|
<?php |
|
|
require 'libs/ParserDom.php'; |
|
|
|
|
|
//获取书籍清单数据 |
|
|
|
|
|
function getBookData($userID){ |
|
|
$url = "https://api.douban.com/v2/book/user/$userID/collections?count=100"; //最多取100条数据 |
|
|
$res=json_decode(curl_get_contents($url),true); //读取api得到json |
|
|
$res = $res['collections']; |
|
|
if ($res == null || $res ==""){ |
|
|
echo '<script>$(function(){$(".douban_book_tips").text("获取书籍数据失败,可能原因是:1. 豆瓣API发生故障 2. 豆瓣id配置错误")})</script>'; |
|
|
return []; |
|
|
} |
|
|
foreach($res as $v){ |
|
|
//已经读过的书 |
|
|
if($v['status']=="read"){ |
|
|
$book_name=$v['book']['title']; |
|
|
$book_img = $v['book']['images']['medium']; |
|
|
$book_img = str_replace("/view/subject/m/public/","/lpic/",$book_img); |
|
|
$book_url = $v['book']['alt']; |
|
|
$readlist[] = array("name"=>$book_name,"img"=>$book_img,"url"=>$book_url); |
|
|
} |
|
|
} |
|
|
|
|
|
return $readlist; |
|
|
} |
|
|
|
|
|
//获取电影清单数据 |
|
|
function getMovieData($userID){ |
|
|
|
|
|
$movieList = []; |
|
|
$filePath = __DIR__.'/assets/cache/movie.json'; |
|
|
|
|
|
$fp = fopen($filePath, 'r'); |
|
|
if ($fp) { |
|
|
$contents = fread($fp, filesize($filePath)); |
|
|
fclose($fp); |
|
|
$data = json_decode($contents); |
|
|
|
|
|
if (time() - $data->time > 60 * 60 * 72) {//缓存文件过期 |
|
|
$movieList = updateData($userID,$filePath); |
|
|
}else{ |
|
|
$lastUpdateTime = date('Y-m-d', $data->time); //H 24小时制 2017-08-08 23:00:01 |
|
|
if ($data->user!=null && $data->user !== $userID){//用户名有修改 |
|
|
$movieList = updateData($userID,$filePath); |
|
|
}else { |
|
|
if ($data->data == null || $data->data == ""){//缓存文件中的电影数据为空 |
|
|
$movieList = updateData($userID,$filePath); |
|
|
}else{//读取缓存文件中的数据 |
|
|
$movieList = $data->data; |
|
|
echo '<script>$(function(){$(".douban_tips").text("以下数据最后更新于'.$lastUpdateTime.'")})</script>'; |
|
|
} |
|
|
} |
|
|
} |
|
|
} else {//目录下无movie.json,此时需要创建文件,并且更新信息 |
|
|
$movieList = updateData($userID,$filePath); |
|
|
} |
|
|
|
|
|
return $movieList; |
|
|
} |
|
|
|
|
|
function curl_get_contents($url) |
|
|
{ |
|
|
$ch = curl_init($url); |
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); |
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); |
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); |
|
|
$data = curl_exec($ch); |
|
|
curl_close($ch); |
|
|
return $data; |
|
|
} |
|
|
|
|
|
|
|
|
function updateData($doubanID = 'ihewro',$filePath) |
|
|
{ |
|
|
$url = "https://movie.douban.com/people/$doubanID/collect"; //最多取100条数据 |
|
|
$p1 = getHTML($url); |
|
|
$p1 = getMoviesAndNextPage($p1); |
|
|
$movieList = array_merge($p1['data']); |
|
|
$num = 0; |
|
|
while ($p1['next']!=null && $num <= 3) { |
|
|
//echo "下一页地址" . $p1['next']; |
|
|
$p1 = getHTML($p1['next']); |
|
|
$p1 = getMoviesAndNextPage($p1); |
|
|
$movieList = array_merge($movieList, $p1['data']); |
|
|
$num ++; |
|
|
|
|
|
} |
|
|
if ($movieList == null || $movieList == ""){ |
|
|
echo '<script>$(function(){$(".douban_tips").text("获取电影数据失败,可能原因是:1. ip被豆瓣封锁 2. 豆瓣id配置错误 3. 服务器不支持curl扩展")})</script>'; |
|
|
}else{ |
|
|
echo '<script>$(function(){$(".douban_tips").text("添加缓存数据成功,请刷新一次页面查看最新数据(如果一直提示刷新,请勿将全站静态缓存)")})</script>'; |
|
|
} |
|
|
$data = fopen($filePath, "w"); |
|
|
fwrite($data, json_encode(['time' => time(), 'user' => $doubanID , 'data' => $movieList])); |
|
|
fclose($data); |
|
|
return []; |
|
|
} |
|
|
|
|
|
function getMoviesAndNextPage($html = '') |
|
|
{ |
|
|
if ($html != "" && $html != null){ |
|
|
$doc = new \HtmlParser\ParserDom($html); |
|
|
$itemArray = $doc->find("div.item"); |
|
|
foreach ($itemArray as $v) { |
|
|
$t = $v->find("li.title", 0); |
|
|
$movie_name = trimall($t->getPlainText()); |
|
|
$movie_img = $v->find("div.pic a img", 0)->getAttr("src"); |
|
|
$movie_url = $t->find("a", 0)->getAttr("href"); |
|
|
//已经读过的电影 |
|
|
$movieList[] = array("name" => $movie_name, "img" => $movie_img, "url" => $movie_url); |
|
|
} |
|
|
|
|
|
$t = $doc->find("span.next a", 0); |
|
|
if ($t) { |
|
|
$t = "https://movie.douban.com" .$t->getAttr("href"); |
|
|
}else{ |
|
|
$t = null; |
|
|
} |
|
|
return ['data' => $movieList, 'next' => $t]; |
|
|
}else{ |
|
|
return ['data' => [], 'next' => null]; |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
function getHTML($url = '') |
|
|
{ |
|
|
$ch = curl_init(); |
|
|
$cookie= 'bid=gnHfdKIXco; ll="108238"; gr_user_id=3a665fce-2a1c-44c7-8e18-531ea651fe6f; _ga=GA1.2.50077311.1505560162; ap=1; ue="ihewro@qq.com"; push_noty_num=0; push_doumail_num=0; _vwo_uuid_v2=0FFDB41687CE3A48C32CB74C8C415F7C|572ba7f63d2101533eb21c21814fd0f5; __utmv=30149280.13002; viewed="24251326"; __utmc=30149280; __utmc=223695111; ps=y; dbcl2="130023498:EFP11hbTQ+w"; ck=v1u1; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1518071897%2C%22http%3A%2F%2Flocalhost%2Fbuild%2F35.html%22%5D; _pk_ses.100001.4cf6=*; ct=y; __utma=30149280.50077311.1505560162.1518071897.1518074552.44; __utmb=30149280.0.10.1518074552; __utmz=30149280.1518074552.44.24.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utma=223695111.192490176.1505819273.1518071897.1518074552.23; __utmz=223695111.1518074552.23.11.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); _pk_id.100001.4cf6=f4672bae215755ca.1505819273.22.1518074849.1518066090.; __utmb=223695111.4.10.1518074552'; |
|
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
|
|
|
|
curl_setopt($ch, CURLOPT_COOKIE, $cookie); |
|
|
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'); |
|
|
|
|
|
$output = curl_exec($ch); |
|
|
curl_close($ch); |
|
|
return $output; |
|
|
} |
|
|
|
|
|
function trimall($str) |
|
|
{ |
|
|
$qian = array(" ", " ", "\t", "\n", "\r"); |
|
|
$hou = array("", "", "", "", ""); |
|
|
return str_replace($qian, $hou, $str); |
|
|
} |
|
|
|
|
|
?> |
|
|
<!-- <div id="content" class="app-content"> --> |
|
|
<div id="loadingbar" class="butterbar hide"> |
|
|
<span class="bar"></span> |
|
|
</div> |
|
|
<a class="off-screen-toggle hide"></a> |
|
|
<main class="app-content-body" <?php echo Content::returnPageAnimateClass($this); ?>> |
|
|
<div class="hbox hbox-auto-xs hbox-auto-sm"> |
|
|
<!--文章--> |
|
|
<div class="col"> |
|
|
<!--标题下的一排功能信息图标:作者/时间/浏览次数/评论数/分类--> |
|
|
<?php echo Content::exportPostPageHeader($this, $this->user->hasLogin()); ?> |
|
|
<div class="wrapper-md" id="post-panel"> |
|
|
<?php Content::BreadcrumbNavigation($this, $this->options->rootUrl);?> |
|
|
<!--博客文章样式 begin with .blog-post--> |
|
|
<div id="postpage" class="blog-post"> |
|
|
<article class="panel"> |
|
|
<!--文章页面的头图--> |
|
|
<?php echo Content::exportHeaderImg($this); ?> |
|
|
<!--文章内容--> |
|
|
<div id="post-content" class="wrapper-lg"> |
|
|
<div class="entry-content l-h-2x"> |
|
|
<div class="booklist"> |
|
|
|
|
|
<h2>我的书单</h2> |
|
|
<small class="text-muted m-xs letterspacing douban_book_tips"><i class="fontello fontello-clock-o m-xs" aria-hidden="true"></i>以下数据为实时从豆瓣API读取</small> |
|
|
<div class="section"> |
|
|
<div class="row"> |
|
|
<?php |
|
|
$readList = getBookData($this->fields->doubanID); |
|
|
foreach($readList as $v):?> |
|
|
<div class="col-xs-6 col-sm-4 col-md-3"> |
|
|
<div class="panel panel-default box-shadow"> |
|
|
<div class="panel-body no-padder"> |
|
|
<a target="_blank" href="<?php echo $v['url'];?>"> |
|
|
<img class="img-full no-padder m-n douban-list" src="<?php echo $v['img']; ?>"> |
|
|
</a> |
|
|
</div> |
|
|
<div class="panel-footer"> |
|
|
<span class="text-ellipsis"><?php echo $v['name'];?></span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<?php endforeach; ?> |
|
|
</div> |
|
|
|
|
|
|
|
|
<h2>我的观影</h2> |
|
|
<div class="text-muted m-xs"> |
|
|
<i class="fontello fontello-clock-o m-xs" aria-hidden="true"></i> |
|
|
<small class="letterspacing douban_tips"></small> |
|
|
</div> |
|
|
<div class="padding"> |
|
|
<div class="row box-shadow-2"> |
|
|
<div class="col-md-12"> |
|
|
<div class="row row-xs"> |
|
|
|
|
|
<?php |
|
|
$movieList = getMovieData($this->fields->doubanID); |
|
|
foreach ($movieList as $v): ?> |
|
|
|
|
|
<div class="col-xs-6 col-sm-4 col-md-3"> |
|
|
<div class="panel panel-default box-shadow"> |
|
|
<div class="panel-body no-padder"> |
|
|
<a target="_blank" href="<?php echo $v->url; ?>"> |
|
|
<img class="img-full no-padder m-n douban-list" src="<?php echo $v->img; ?>"> |
|
|
</a> |
|
|
</div> |
|
|
<div class="panel-footer"> |
|
|
<span class="text-ellipsis"><?php echo $v->name; ?></span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<?php endforeach;?> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<?php Content::postContent($this, $this->user->hasLogin());?> |
|
|
</div> |
|
|
</div> |
|
|
</article> |
|
|
</div> |
|
|
<!--评论--> |
|
|
<?php $this->need('component/comments.php')?> |
|
|
</div> |
|
|
</div> |
|
|
<!--文章右侧边栏开始--> |
|
|
<?php $this->need('component/sidebar.php');?> |
|
|
<!--文章右侧边栏结束--> |
|
|
</div> |
|
|
</main> |
|
|
<script type="text/javascript"> |
|
|
$(document).ready(function(){ |
|
|
$(".booklist .section ul li .rsp").hide(); |
|
|
$(".booklist .section ul li").hover(function(){ |
|
|
$(this).find(".rsp").stop().fadeTo(500,0.5) |
|
|
$(this).find(".text").stop().animate({left:'0'}, {duration: 500}) |
|
|
}, |
|
|
function(){ |
|
|
$(this).find(".rsp").stop().fadeTo(500,0) |
|
|
$(this).find(".text").stop().animate({left:'30'}, {duration: "fast"}) |
|
|
$(this).find(".text").animate({left:'-300'}, {duration: 0}) |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
|
|
|
<!-- footer --> |
|
|
<?php $this->need('component/footer.php');?> |
|
|
<!-- / footer -->
|