Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[修改] 【100行代码Hack】让门户文章发布时自动采集外站图片,自动上传为附件并设置封面

[复制链接]
yobbozhu 发表于 2013-8-18 23:39:21 | 显示全部楼层 |阅读模式
本帖最后由 yobbozhu 于 2013-8-19 10:59 编辑

本Hack修改实现的强大功能有:
1、门户发布文章时,自动采集外站图片
2、采集后的外站图片转为本地保存,并支持多图自动采集
3、若图片宽度太大,自动缩略图为650px宽度,替换原文章中的大图,并自动加上大图的A链接已查看大图
4、若图片原来还有A标签到外站某处链接,自动替换成大图片的本站查看链接
5、文章内的图片均作为文章附件保存(视为上传的图片附件),并将第一副图片设置为文章封面

修改操作步骤如下:本修改需要hack原文件,请谨慎操作!
1、在/source/include/portalcp/portalcp_article.php中查找以下代码
  1. $content = getstr($_POST['content'], 0, 0, 0, 0, 1);
复制代码
替换为
  1. require_once("./source/gaoshangkeji/gaoshangkeji_functions.php");
  2. $content = replaceContentsRemoteImages(getstr($_POST['content'], 0, 0, 0, 0, 1), $aid);
复制代码
2、在DiscuzX的根目录下,进入source目录,新建目录gaoshangnkeji,再在此目录下,新建php文件gaoshangkeji_functions.php,该程序文件代码内容如下:
  1. <?php
  2. /**
  3. * 1、门户发布文章时,自动采集外站图片
  4. * 2、采集后的外站图片转为本地保存,并支持多图自动采集
  5. * 3、若图片宽度太大,自动缩略图为650px宽度,替换原文章中的大图,并自动加上大图的A链接已查看大图
  6. * 4、若图片原来还有A标签到外站某处链接,自动替换成大图片的本站查看链接
  7. * 5、文章内的图片均作为文章附件保存(视为上传的图片附件),并将第一副图片设置为文章封面
  8. * Author : 大宇
  9. * QQ:366377779
  10. * Email: 366377779@qq.com
  11. * Siteurl: http://www.gaoshangkeji.com/Pid/42/
  12. * Datetime: 2013-08-18
  13. */
  14. function replaceContentsRemoteImages($content, $aid){
  15.     //error_reporting(5);
  16.     global $_G;

  17.     require_once("./source/dayu/Snoopy.class.php");
  18.     $snoopy = new Snoopy();

  19.     //本地url中的域名
  20.     $host_domain = $_G['siteurl'];
  21.    
  22.     preg_match_all("@<img(.*)src=['|"](.*)['|"](.*)>@imsU", $content, $match);

  23.     //封面图片
  24.     $pic_cover = '';

  25.     $imagesHrefArr = $match[2];
  26.     foreach($imagesHrefArr as $key => $imageurl) {
  27.         $res = $snoopy->fetch($imageurl);
  28.         if($res) {
  29.             $results = $snoopy->results;

  30.             //后缀名
  31.             $upload = new discuz_upload();
  32.             $ext = $upload->fileext($imageurl);

  33.             //保存路径+文件名
  34.             $dirname = "./data/attachment/portal/".date("Ym/d/");
  35.             @mkdir($dirname, 0777, true);
  36.             $filename = $dirname.random(22);
  37.             $savename = $filename.".".$ext;

  38.             //将第一个图片记录为封面图片
  39.             if(empty($pic_cover)) {
  40.                 $pic_cover = $savename;
  41.             }
  42.             
  43.             //保存大图
  44.             $res = file_put_contents($savename, $results);

  45.             //缩略图名
  46.             require_once libfile('class/image');
  47.             $image = new image();
  48.             $thumbimgwidth = 300;
  49.             $thumbimgheight = 300;
  50.             $thumb = $image->Thumb($savename, '', $thumbimgwidth, $thumbimgheight, 2);
  51.             $thumbname = $image->target;

  52.             //判断当前图片外,有无a标签
  53.             $pattern = "@<a [^>]*>[\s]*". preg_quote($match[0][$key])."[\s]*</a>@imsU";
  54.             $r = preg_match($pattern, $content, $match2);


  55.             //替换远程图片为本地图
  56.             $maxWidth = 650;
  57.             //若图片大小超过一定尺寸,替换为缩略图
  58.             if($image->imginfo['width'] > $maxWidth) {
  59.                 //缩略图肯定会有a链接,查看原图
  60.                 $content = str_replace($match[0][$key], "<a href='{$savename}' target='_blank'><img src='{$thumbname}' /></a>", $content);
  61.                 $is_thumb = 1;
  62.             }else{
  63.                 //若不需要缩略图,则根据原img标签外是否有a标签,再判断是否需要加a标签
  64.                 if($r > 0) {
  65.                     $content = str_replace($match[0][$key], "<a href='{$savename}' target='_blank'><img src='{$savename}' /></a>", $content);
  66.                 }else{
  67.                     $content = str_replace($match[0][$key], "<img src='{$savename}' />", $content);
  68.                 }
  69.                 $is_thumb = 0;
  70.             }

  71.             //将图片设为该文章的附件
  72.             $setarr = array(
  73.                 'uid' => $_G['uid'],
  74.                 'filename' => '',
  75.                 'attachment' => str_replace("./data/attachment/portal/", "", $savename),
  76.                 'filesize' => filesize($savename),
  77.                 'isimage' => 1,
  78.                 'thumb' => $is_thumb,
  79.                 'remote' => 0,
  80.                 'filetype' => array_pop(explode(".", $savename)),
  81.                 'dateline' => $_G['timestamp'],
  82.                 'aid' => $aid
  83.             );
  84.             $r = C::t('portal_attachment')->insert($setarr, true);
  85.         }
  86.     }

  87.     //将第一个图片设为封面(若有的话)
  88.     if($pic_cover){
  89.         $setarr = array(
  90.             'pic' => str_replace('./data/attachment/', '', $pic_cover),
  91.             'thumb' => 1,
  92.         );
  93.         $r = C::t('portal_article_title')->update($aid, $setarr);
  94.     }

  95.     //return
  96.     return $content;
  97. }
复制代码
3、注意:本函数内使用了第三方网络通信类Snoopy,需要的请自行搜索下载,并放入/source/gaoshangkeji/目录下!
来自群组: Discuz!
1314学习网 发表于 2013-8-19 10:22:35 | 显示全部楼层
支持下分享。。。
回复

使用道具 举报

Bacysoft.cn 发表于 2013-8-20 12:36:57 | 显示全部楼层
作为教程分享不错!
回复

使用道具 举报

799936508 发表于 2013-8-25 17:16:56 | 显示全部楼层
学习了哦,感谢分享哦!!
回复

使用道具 举报

右手老茧 发表于 2013-9-6 13:34:20 | 显示全部楼层
非常不错顶贴留名
回复

使用道具 举报

悠悠野云 发表于 2013-11-14 23:43:27 | 显示全部楼层
采集后的外站图片转为本地保存,并支持多图自动采集

楼主呀,可不可以只采集第一幅图片并设置为文章封面呀,其他图片就不采集了,节约空间和流量。如果可以的话能不能把改过的代码贴出来呀?万分感谢!!!
回复

使用道具 举报

月白花凋 发表于 2014-4-11 18:05:04 | 显示全部楼层
有人亲身测试过吗。不敢用。你说的那架势。。我还是先收藏再观望吧。额们都是新手。不敢乱动源程序
回复

使用道具 举报

太和生活网 发表于 2014-4-12 09:45:55 | 显示全部楼层
这样也行,服了,
回复

使用道具 举报

不知道有没有 发表于 2014-9-9 01:37:30 | 显示全部楼层
不行啊。一发表就空白了。
回复

使用道具 举报

ss777 发表于 2015-9-27 21:51:36 | 显示全部楼层
真牛逼,谢了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-16 18:33 , Processed in 0.027726 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表