LOGO = Helper::options()->plugin('AMP')->LOGO;//同时为默认图片
$this->db = Typecho_Db::get();
$this->tablename = $this->db->getPrefix() . 'PageCache';
$this->baseurl = Helper::options()->index;
$this->baseurl = str_replace("https://", "//", $this->baseurl);
$this->baseurl = str_replace("http://", "//", $this->baseurl);
}
/**
* @throws Typecho_Exception
* @throws Typecho_Plugin_Exception
* author:Holmesian
* date: 2020/3/13 11:45
* 添加头部信息
*/
public static function headlink()
{
$widget = Typecho_Widget::widget('Widget_Archive');
$headurl = '';//初始化输出内容
if ($widget->is('index') and !isset($widget->request->page)) {//输出AMP首页
if (Helper::options()->plugin('AMP')->ampIndex == 1) {
$fullURL = Typecho_Common::url("ampindex", Helper::options()->index);
$headurl = "\n\n";
}
}
if ($widget->is('post')) {//文章页
$targetTemp = Typecho_Widget::widget('AMP_Action')->getUrlRule();//静态函数调用动态函数
if (isset($widget->request->cid)) {
$cid = $widget->request->cid;
$target = str_replace('[cid:digital]', $cid, $targetTemp);
}
if (isset($widget->request->slug)) {
$slug = $widget->request->slug;
$target = str_replace('[slug]', $slug, $targetTemp);
}
if (isset($target)) {//输出文章页对应的AMP/MIP页面
$ampurl = Typecho_Common::url("amp/{$target}", Helper::options()->index);
$mipurl = Typecho_Common::url("mip/{$target}", Helper::options()->index);
$headurl = "\n\n";
$headurl .= "\n";
}
}
echo $headurl;
}
/**
* @throws Typecho_Plugin_Exception
* @throws Typecho_Widget_Exception
* author:Holmesian
* date: 2020/3/13 11:45
* 生成 AMP sitemap
*/
public function AMPsitemap()
{
if (Helper::options()->plugin('AMP')->AMPsitemap == 0) {
throw new Typecho_Widget_Exception('未开启AMPsitemap功能!');
}
$this->MakeSiteMap('amp');
}
/**
* @throws Typecho_Plugin_Exception
* @throws Typecho_Widget_Exception
* author:Holmesian
* date: 2020/3/13 11:45
* 生成 MIP sitemap
*/
public function MIPsitemap()
{
if (Helper::options()->plugin('AMP')->MIPsitemap == 0) {
throw new Typecho_Widget_Exception('未开启MIPsitemap功能!');
}
$this->MakeSiteMap('mip');
}
/**
* @throws Typecho_Plugin_Exception
* @throws Typecho_Widget_Exception
* author:Holmesian
* date: 2020/3/13 11:45
* 渲染MIP页面
*/
public function MIPpage()
{
$requestHash = $this->request->getPathinfo();
$context = $this->get($requestHash); //查找是否已经缓存
$this->article = $this->getArticle($this->request->target);
if (isset($this->article['isblank'])) {
throw new Typecho_Widget_Exception("不存在或已删除。返回首页");
}
if (Helper::options()->plugin('AMP')->OnlyForSpiders == 1) {//判断是否是对应的爬虫来访
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$spider = strtolower('Baiduspider');
if (strpos($userAgent, $spider) == false) {//不是百度的蜘蛛
header("Location: {$this->article['permalink']}");
}
}
if (!is_null($context)) {//有缓存的情况直接输出
print($context);
} else {//没缓存的生成页面再进行缓存
$MIPpage = array(
'title' => $this->article['title'],
'permalink' => $this->article['permalink'],
'mipurl' => $this->article['mipurl'],
'modified' => date('Y-m-d\TH:i:s', $this->article['modified']),
'date' => $this->article['date']->format('Y-m-d\TH:i:s'),
'isMarkdown' => $this->article['isMarkdown'],
'imgData' => $this->GetPostImg(),//MIP页面的结果化数据可以没有图片
'APPID' => Helper::options()->plugin('AMP')->baiduAPPID,//熊掌号的APPID
'mip_stats_token' => trim(Helper::options()->plugin('AMP')->mip_stats_token),
'desc' => self::cleanUp($this->article['text']),
'publisher' => Helper::options()->title,
'MIPtext' => $this->MIPInit($this->article['text']),
'version' => $this->version
);
ob_start();
require_once('templates/MIPpage.php');
$cache = ob_get_contents();
$this->set($requestHash, $cache);
}
}
/**
* @throws Typecho_Plugin_Exception
* @throws Typecho_Widget_Exception
* author:Holmesian
* date: 2020/3/13 11:44
* 返回AMP需要的JSON信息
*/
public function AMPlist()
{
if (Helper::options()->plugin('AMP')->ampIndex == 0) {
throw new Typecho_Widget_Exception('未开启AMP版首页!');
}
$currentPage = $this->request->list_id;
$articles = $this->MakeArticleList('amp', $currentPage, 5);
$article_data = array(
'pageCount' => ceil($this->_total / 5),
'currentPage' => $currentPage,
);
$article_data['article'] = array();
foreach ($articles as $article) {
if (isset($article['text'])) {
$article['isMarkdown'] = (0 === strpos($article['text'], ''));
if ($article['isMarkdown']) {
$article['text'] = substr($article['text'], 15);
}
}
if ($article['isMarkdown']) {
$article['text'] = $html = Markdown::convert($article['text']);
}
$article_data['article'][] = array(
'title' => $article['title'],
'url' => $article['permalink'],
'content' => $this->substrFormat(strip_tags($article['text']), 200),
);
}
$arr = array('items' => $article_data);
header("Access-Control-Allow-Origin: *");
print(json_encode($arr));
}
public function AMPindex()
{
if (Helper::options()->plugin('AMP')->ampIndex == 0) {
header("Location: {$this->baseurl}");
}
require_once('templates/AMPindex.php');
}
/**
* @throws Typecho_Plugin_Exception
* @throws Typecho_Widget_Exception
* author:Holmesian
* date: 2020/3/13 11:44
* 渲染AMP页面
*/
public function AMPpage()
{
$requestHash = $this->request->getPathinfo();
$context = $this->get($requestHash); //查找是否已经缓存
$this->article = $this->getArticle($this->request->target);
if (isset($this->article['isblank'])) {
throw new Typecho_Widget_Exception('不存在或已删除');
}
if (Helper::options()->plugin('AMP')->OnlyForSpiders == 1) {//判断是否是对应的爬虫来访
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$spider = strtolower('Googlebot');
$spider2 = strtolower('google-amphtml');
if (strpos($userAgent, $spider) == false or strpos($userAgent, $spider2) == false) {//不是Google的蜘蛛
header("Location: {$this->article['permalink']}");
}
}
if (!is_null($context)) {//有缓存的情况直接输出
print($context);
} else {
$AMPpage = array(
'title' => $this->article['title'],
'permalink' => $this->article['permalink'],
'mipurl' => $this->article['mipurl'],
'modified' => date('F j, Y', $this->article['modified']),
'date' => $this->article['date']->format('F j, Y'),
'author' => $this->article['author'],
'LOGO' => $this->LOGO,
'isMarkdown' => $this->article['isMarkdown'],
'imgData' => $this->GetPostImg(),
'desc' => self::cleanUp($this->article['text']),
'publisher' => Helper::options()->title,
'AMPtext' => $this->AMPInit($this->article['text']),
'version' => $this->version
);
//AMP页面的结果化数据必须有图片
if (!is_array($AMPpage['imgData'])) {
$AMPpage['imgData'] = self::getSizeArr($AMPpage['LOGO'], '1200', '1200');//如果找不到图片就用LOGO
}
ob_start();
require_once('templates/AMPpage.php');
$cache = ob_get_contents();
$this->set($requestHash, $cache);
}
}
/**
* @throws Typecho_Exception
* author:Holmesian
* date: 2020/3/13 11:44
* 清理缓存
*/
public function cleancache()
{
$user = Typecho_Widget::widget('Widget_User');
if (!$user->pass('administrator')) {
die('未登录用户!');
}
$this->del('*');
print('Clean all cache!');
}
/**
* @param $contents
* @param $class
* @throws Typecho_Exception
* @throws Typecho_Plugin_Exception
* author:Holmesian
* date: 2020/3/13 11:43
* 实时推送文章
*/
public static function sendRealtime($contents, $class)
{
//获取系统配置
$options = Helper::options();
//如果文章属性为 隐藏 或 定时发布 或 非首次发布(编辑) 发布则不推送
if ('publish' != $contents['visibility'] || $contents['created'] > time() || !is_null($contents['created'])) {
return;
}
//如果没有开启自动提交功能 则不推送
$mipAutoSubmit = $options->plugin('AMP')->mipAutoSubmit;
if ($mipAutoSubmit == 0) {
return;
}
//判断是否配置相关信息
// if (is_null($options->plugin('AMP')->baiduAPPID) or is_null($options->plugin('AMP')->baiduTOKEN)) {
if (is_null($options->plugin('AMP')->baiduAPI)) {
throw new Typecho_Plugin_Exception(_t('未配置 快速收录接口地址,自动提交失败'));
} else {
// $appid = trim($options->plugin('AMP')->baiduAPPID);//过滤空格
// $token = trim($options->plugin('AMP')->baiduTOKEN);//过滤空格
//熊掌号下线后,修改未快速收录接口 2020.06.07
$api = trim($options->plugin('AMP')->baiduAPI);//默认填写的是快速收录地址
if ($mipAutoSubmit == 2) {//如果选择了普通收录地址,则进行替换
$api = preg_replace("/&type=[a-z]+/", "", $api);//将快速收录接口换成普通收录接口
}
}
$article = Typecho_Widget::widget('AMP_Action')->getArticleByCid($class->cid);//根据cid获取文章内容
if ((int)$article['created'] + 86400 < (int)$article['modified']) {//之前判断忽略了自动保存草稿的问题
return;//草稿在一天之内的文章推送,否则不推送。
}
//获取文章链接
$url = $article['mipurl'];
$hash = array(//发布之前清除对应的MIP/AMP缓存
'mip' => str_replace(Helper::options()->index, "", $article['mipurl']),
'amp' => str_replace(Helper::options()->index, "", $article['ampurl'])
);
Typecho_Widget::widget('AMP_Action')->del($hash);
//发送自动提交
try {
$http = Typecho_Http_Client::get();
$http->setData($url);//改为Post发送模式
$http->setHeader('Content-Type', 'text/plain');
$result = $http->send($api);
$json = json_decode($result);
if (isset($json->error)) {//提交出错时返回错误信息
throw new Typecho_Plugin_Exception(_t("错误代码:" . $json->error . "
出错原因:" . $json->message), $json->error);
}
} catch (Exception $e) {
throw new Typecho_Plugin_Exception(_t('抱歉,自动提交失败。
请关闭自动提交功能!