设为首页 收藏本站
查看: 534|回复: 0

[经验分享] PHP备份人人网日志脚本 ver 0.1

[复制链接]

尚未签到

发表于 2017-4-9 13:52:11 | 显示全部楼层 |阅读模式
  今天确实是无聊了,写了一个备份人人网的日志,到本地html的类。
  主要是cURL登录,正则解析页面。
  使用方法,最后那个脚本的最后两行改掉,你知道的。或者重新写一个运行脚本:
  <?phpinclude("renren.php");$test = new renren("你的人人网账号","你的人人网密码");$test->download();?>
  然后开一个cmd,执行(注意,以命令行的方式运行脚本!)
  >php rrBlogBackup.php
  运行时的效果:
DSC0000.gif

  运行后会在运行的目录下,生成一堆日志html和一个index.html算是目录吧。
  完整的脚本如下:
  <?php/*** 人人网个人日志备份* * 版本 0.1* 作者 BookMoth* 日期 2010-04-19**/class renren {private $home_url = "http://www.renren.com";private $blog_url = "http://blog.renren.com/blog/0";private $ch;private $cookie_file;private $username,$password;private $menu;private $download_path = 'blog';//保存的目录private $rt_encode = 'cp936';//系统编码,主要是为了win下cmd输出正常的汉字。public function __construct($username,$password){$this->cookie_file = tempnam('./','xn');$this->username = urlencode($username);$this->password = urlencode($password);if(!is_dir($this->download_path)){mkdir('blog');}}public function download(){//主函数if($this->login()){$total_blogs = $this->getTotalBlog();$this->_echo("[信息] 日志总数 {$total_blogs}/n");if($total_blogs > 0){$this->_echo( "[信息] 获取日志列表/n");$blog_list = $this->getBlogList($total_blogs);if(is_array($blog_list)&&count($blog_list)==$total_blogs){$this->_echo("[信息] 获取日志列表完成/n");foreach ($blog_list as $blog_url) {$this->getBlog($blog_url);}$this->_echo("[信息] 下载日志全部完成/n");$this->makeIndex();$this->_echo("[信息] 创建日志目录完成/n");}elseif (is_array($blog_list)){$blog_list_length = count($blog_list);$this->_echo("[错误] 获取日志列表不完成:{$blog_list_length}/{$total_blogs}/n");}else{$this->_echo( "[错误] 获取日志失败/n");}}else{$this->_echo( "[错误] 没有日志!");}}}public function login(){//登录1 Plogin.do$this->ch = curl_init("http://www.renren.com/PLogin.do");$post_data = "email={$this->username}&password={$this->password}&origURL=http%3A%2F%2Fwww.renren.com%2FHome.do&domain=renren.com";curl_setopt($this->ch,CURLOPT_POSTFIELDS,$post_data);curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_file);$result = curl_exec($this->ch);curl_close($this->ch);preg_match('/"([^"]+)"/',$result,$url);//登录2 callback.do$result = $this->_getUrlContents($url[1]);preg_match('/"([^"]+)"/',$result,$url);//登录3 Home.do$result = $this->_getUrlContents($url[1]);if(preg_match("/最近来访/",$result)){preg_match("/<title>([^<]+)<//title>/",$result,$title);$this->_echo( "[信息] 登录成功 [{$title[1]}]/n");return true;}else{$this->_echo( "[错误] 登录失败 ");return false;}}public function getTotalBlog(){//获取总共多少篇日志$blog_page = $this->_getUrlContents($this->blog_url);preg_match("/<div class=/"blog-home/"><div class=/"pager-top/"><span>当前显示1-10篇//共([0-9]+)篇/",$blog_page,$total_blog);return $total_blog[1];}/*** 获取全部日志的url列表** @param int $total_blog* @return array()*/public function getBlogList($total_blog){$total_pages = (int)($total_blog/10);$blog_list = array();for ($curr_page=0;$curr_page<=$total_pages;$curr_page++){$_url = "http://blog.renren.com/blog/0?curpage={$curr_page}&year=0&month=0&selitem=";$blog_page = $this->_getUrlContents($_url);preg_match_all("/href=/"(http:////blog.renren.com//blog//[0-9]{7,10}//[0-9]{7,10})/">([^<]+)<//a> <//strong>/",$blog_page,$match_result);$blog_list = array_merge($blog_list,$match_result[1]);}return $blog_list;}/*** 获取指定url的日志,保存为html** @param string $blog_url*/public function getBlog($blog_url){$blog_page_html = $this->_getUrlContents($blog_url);$blog_title = trim($this->_getBlogTitle($blog_page_html));$blog_time = $this->_getBlogTime($blog_page_html);$blog_content = $this->_getBlogContent($blog_page_html);$tmp_html  = '<html>';$tmp_html .= '<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head>';$tmp_html .= '<body><h1>'.$blog_title.'</h1>';$tmp_html .= '<br />'.$blog_time.'<br />';$tmp_html .= $blog_content.'</body></html>';$tmp_file_name = str_replace('/','_',substr($blog_url,28)).'.html';$this->menu[$tmp_file_name] = $blog_title;file_put_contents($this->download_path .DIRECTORY_SEPARATOR. $tmp_file_name,$tmp_html);$this->_echo("[信息] 保存日志列表完成[$blog_title] /n");}/*** 解析HTML,获取日志的标题** @param string $blog_html_str* @return string*/private function _getBlogTitle($blog_html_str){preg_match("/<b>(.+)<//strong>?/",$blog_html_str,$match_result);return $match_result[1];}/*** 解析HTML,获取日志的内容** @param string $blog_html_str* @return string*/private function _getBlogContent($blog_html_str){preg_match('/<div/ id=/"blogContent/"/ class=/"text/-article/">.+?<//div>/s',$blog_html_str,$match_result);return $match_result[0];}/*** 解析HTML,获取日志的时间** @param string $blog_html_str* @return string*/private function _getBlogTime($blog_html_str){preg_match('//"timestamp/">(/d{4}/-/d{2}/-/d{2}/ /d{2}:/d{2})/',$blog_html_str,$match_result);return $match_result[1];}/*** 获取指定url的页面全部内容** @param string $url* @return string*/private function _getUrlContents($url){$this->ch = curl_init($url);curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_file);curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie_file);$result = curl_exec($this->ch);curl_close($this->ch);return $result;}/*** 创建目录**/private function makeIndex(){$tmp_index = '<html>';$tmp_index .= '<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head>';$tmp_index .= '<body>';if (is_array($this->menu)) {foreach ($this->menu as $link=>$title) {$tmp_index .= '<a href="'.$link.'" mce_href="'.$link.'" target="_blank">'.$title.'</a><br />';}}$tmp_index .= '</body></html>';file_put_contents($this->download_path .DIRECTORY_SEPARATOR.'index.html',$tmp_index);}/*** 转换msg为指定的编码,echo** @param string $msg*/private function _echo($msg){echo iconv("utf-8",$this->rt_encode,$msg);}public function __destruct(){unlink($this->cookie_file);}}$test = new renren("人人网账号","人人网密码");$test->download();?>
  待完善的内容:
  1、保存日志中的图片。
  2、保存日志中的评论。
  3、将零散的html备份文件,编译成chm,或者其他格式。
  4、保存备份所有的状态。
  不过,我不打算做这些了。
  最后要说:PHP不光做网页,做脚本也非常好用!
  PS:发现什么问题的话,敬请指教。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362478-1-1.html 上篇帖子: Uchome 所用程序通用方法汇总function_common.php 下篇帖子: PHP Big5 Utf-8 GB2312 相互转码解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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