自动更新 Smarthosts 到本地 hosts

SmartHosts 是一个托管在 googlecode 上的项目,定期更新 hosts 文件,你懂的。为了方便自动更新,不用每次都打开网站,于是尝试用 c# 实现了一下。

实现原理

从 https://smarthosts.googlecode.com/svn/trunk/hosts 抓取数据,写入本地 hosts。

实现步骤

1.抓取数据

2.判断本地是否有 hosts 文件。没有则直接建立,并写入抓取下来的数据;有则读取
<!--more-->

3.比较两个数据的更新时间。时间一样则不更新;不一样则写入新数据替换旧数据

详细逻辑代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace AutoUpdateSmartHosts
{
class Program
{
static void Main(string[] args)
{
string smartPath = "https://smarthosts.googlecode.com/svn/trunk/hosts";
//http://sxlf.org/smarthosts.php
string smartHosts;
string smartTime;
string localPath = Environment.SystemDirectory + @"\drivers\etc\hosts";
string localHosts;
string localTime;
string time = @"#UPDATE(.*)";
using (WebClient client = new WebClient())
{
Console.WriteLine("下载smarthosts...");
byte[] bytes = client.DownloadData(smartPath);
smartHosts = Encoding.GetEncoding("utf-8").GetString(bytes);
Console.WriteLine("下载成功,和本地文件对比...");
Regex reg = new Regex(time);
Match m = reg.Match(smartHosts);
smartTime = m.Value;
}
if (!File.Exists(localPath))
{
File.WriteAllText(localPath, smartHosts);
}
else
{
using (StreamReader sr = new StreamReader(localPath))
{
localHosts = sr.ReadToEnd();
}
Regex reg = new Regex(time);
Match m = reg.Match(localHosts);
localTime = m.Value;
if (localTime == smartTime)
{
Console.WriteLine("你的smarthosts已经是最新的了" + localTime);
Console.Read();
}
else
{
FileInfo fi = new FileInfo(localPath);
if (fi.IsReadOnly)
fi.Attributes = FileAttributes.Normal;
Console.WriteLine("备份文件到hosts.bak");
File.Delete(localPath + @".bak");
fi.MoveTo(Environment.SystemDirectory + @"\drivers\etc\hosts.bak");
Console.WriteLine("正在更新...");
reg = new Regex(f);
localHosts = reg.Replace(localHosts, smartHosts);
}
try
{
File.WriteAllText(localPath, localHosts);
Console.WriteLine("更新成功!");
Console.Read();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.Read();
}
}
}
}
}

但是 googlecode 本身就在墙外,为了能够正常的获取数据,我把 SmartHosts 抓取到了我自己的网站上

<?php
$content = file_get_contents("https://smarthosts.googlecode.com/svn/trunk/hosts");
header('Content-Type: text/plain');
echo $content;
?>

opera 扩展:目录结构

基本规则:

扩展必须有 config.xml 文件;

扩展必须有一个在后台执行操作的文件(通常是一个 index.html 文件);

注入脚本必须放到 includes 文件夹下;

所有文件必须打包进一个 zip 压缩包中,并将压缩包后缀名更改为 .oex
<!--more-->

extension-structure

config.xml

我们需要一个 config.xml 来描述扩展的名字、描述信息和作者信息。这个文件采用 W3C 标准饰件的格式。如果没有这个文件,那这个扩展啥都做不成。

<?xml version="1.0" encoding="utf-8">
<widget xmlns="http://www.w3.org/ns/widgets"&gt;
<name&gt;Slashdotty</name&gt;
<description&gt;隐藏 Slashdot 的侧边栏模块。</description&gt;
<author href="http://people.opera.com/danield/"&gt;Daniel Davis (@ourmaninjapan)</author&gt;
</widget&gt;

includes 文件夹

includes 文件夹里包含的 js 被叫做注入脚本,也就是最后会应用到网页里的脚本。和 opera 的 userjs 一,样可以设置脚本的适用范围。

// @include http://slashdot.org/*
// @include http://*.slashdot.org/*

index.html

每个 Opera 扩展都需要一个 index.html,作为扩展的入口,也是后台操作的容器。例如构建扩展本身的ui,例如创建工具栏按钮、创建右键菜单等。下面的代码创建了一个工具栏项目,包含了一系列属性,如一个 18×18 的图标、消息提示、以及一个弹窗和弹窗的弹出属性。

<!doctype html&gt;
<html lang="en"&gt;
<head&gt;
<script&gt;
window.addEventListener("load", function(){
var theButton;
var ToolbarUIItemProperties = {
title: "Hello World",
icon: "hello-button.png",
popup: {
href: "popup.html",
width: 110,
height: 30
}
}
theButton = opera.contexts.toolbar.createItem(ToolbarUIItemProperties);
opera.contexts.toolbar.addItem(theButton);
}, false);
</script&gt;
</head&gt;
<body&gt;
</body&gt;
</html&gt;

当然, index.html 里面用到的 helllo-button.png popup.html 也就需要创建在扩展目录下了。

Wordpress 获取分类数据

获取分类数据

根据文章ID获取文章分类数据:get_the_category()

根据分类别名获取分类数据:get_category_by_slug()

<?php $cat = get_the_category($post_id);//返回数组,参数默认为当前文章ID ?>
<?php $cat = get_category_by_slug($slug);//返回数组?>

根据分类ID或分类对象获取分类数据:get_category()

<?php $cat = get_category( $category,$output,$filter);?>
<?php
$cat = get_category_by_slug($slug);//返回数组?>
<?php
$cat_id = $cat->term_id;//获取分类ID
$cat_count = $cat->count;//获取分类文章数
$cat_description = $cat->description;//获取分类描述
$cat_slug = $cat->slug;//获取分类别名
$cat_parent = $cat->parent;//获取分类父级引用
 ?>
 ```
<!--more-->
**获取有文章的分类列表:`get_the_category_list()`**

```php
<?php echo get_the_category_list();//返回字符串,为ul列表 ?>

输出结果

<ul class="post-categories">
    <li>
        <a href="http://seorss.net/category/wordpress" title="View all posts in Business" rel="category tag">wordpress</a>
    </li>
</ul>
<?php get_the_category_list($separator,$parents,$post_id);
//$separator:分类之间的分割符
//$post_id:根据文章ID获取分类列表
?>

根据分类ID获取分类名称:get_cat_name()

<?php $cat_name = get_cat_name( $cat_id );?>

根据分类ID获取分类链接(URL):get_category_link()

<?php $cat_url = get_category_link($category_id);//返回URL字符串 ?>

根据分类名称获取分类ID:get_cat_ID()

<?php $cat_id = get_cat_ID($cat_name);//返回分类ID ?>

Wordpress 获取多篇文章:get_posts()

get_posts() 用于在 WordPress 中提取多篇文章。

调用

<?php $posts = get_posts($args); ?>

参数

<?php
$args = array(
'numberposts' => 5,
'offset' => 0,
'category' => ,
'orderby' => 'post_date',
'order' => 'DESC',
'include' => ,
'exclude' => ,
'meta_key' => ,
'meta_value' => ,
'post_type' => 'post',
'post_mime_type' => ,
'post_parent' => ,
'post_status' => 'publish' );
?>
阅读全文

Wordpress 导航菜单:wp_nav_menu()

调用

在需要调用导航菜单的地方插入<?php wp_nav_menu($args);>

wp_nav_menu($args)函数中,参数$args的默认值

<?php $defaults = array(
'theme_location' => ,
'menu' => ,
'container' => 'div',
'container_class' => 'menu-{menu slug}-container',
'container_id' => ,
'menu_class' => 'menu',
'menu_id' => ,
'echo' => true,
'fallback_cb' => 'wp_page_menu',
'before' => ,
'after' => ,
'link_before' => ,
'link_after' => ,
'items_wrap' => '<ul id=”%1$s” class=”%2$s”>%3$s</ul>',
'depth' => 0,
'walker' => );
?>
阅读全文

如何关闭WordPress自动保存

wp-config.php 文件里添加以下两句:)

define('WP_POST_REVISIONS',false);
define('AUTOSAVE_INTERVAL',false);

WP_POST_REVISIONS是设置是否保存修订版本,设为true,就表示每修改一次文章就会在数据库新保存一条数据;

AUTOSAVE_INTERVAL是设置自动保存文章时间,单位为秒,就表示当编辑文章时每间隔3600秒自动在数据库新保存一条数据。

另外,将 wp-admin\post-new.phpwp-admin\post.php里的 wp_enqueue_script('autosave') 注释掉,但是这样在新建文章未保存前不会自动生成固定链接。