分类目录:php

以下是分类 php 下的所有文章

国外开源论坛MyBB和phpBB, 抛弃国内商业开源论坛

MyBB

MyBB的全称是MyBBoard,MyBB是国外十分流行的论坛程序之一,简单、便捷的管理后台和强大的插件系统是最大的特色;MyBB通过扩展支持可以作为门户、博客、百科、下载等类型建站软件,论坛基础功能也十分完善,甚至包含了即时聊天功能。

phpBB

phpBB是一个论坛软件,使用PHP语言开发并开放源始码,可以搭配MySQL,MS-SQL,PostgreSQL, 和Access/ODBC等数据库系统使用。是模块化设计,具专业性、安全性高、支持多国语系、支持多种数据库和自定义的版面设计等优越性能,而且功能强大。可以轻松地在数分钟内建立起您的论坛。

自2000年发布以来, phpBB已经成为世界上应用最广泛的开源论坛软件。phpBB拥有易于使用的管理面板和友好的用户安装界面,众多先进特性并且相容于多种接口,在MySQL数据库上用PHP后端语言写的UBB风格的讨论板,它支持邮寄/回复/编辑信息,可设置个人信息、个人论坛、用户和匿名邮件、讨论主题等,通过提交或其它的特殊的顺序排队用户,可定义管理,排队等功能。它具有很高的可配置性,能够完全定制出相当个性化的论坛。

 

2个系统均有中文包.

自用备份(curl可模拟http/https登陆 及模拟登陆邮箱什么的 采集用到)

function curlGet($url, $method = ”, $post = ”)
{
$ran = rand(1, 255);
$ran1 = rand(1, 255);
$ran2 = rand(1, 255);
$ran3 = rand(60, 255);
$ran3 = str_replace(array(‘192’, ‘172’, ‘127’), ”, $ran3);
$ip = “$ran3.$ran2.$ran1.$ran”;
$headerArr = array(“CLIENT-IP:$ip”, “X-FORWARDED-FOR:$ip”);
$cookieJar = tempnam(XZ_ROOT . ‘./cookie’, ‘cookie.txt’);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_HTTPHEADER , $headerArr); //构造IP
//curl_setopt ($curl, CURLOPT_REFERER, “http://www.baidu.com/”); //构造来路
curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8”);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($curl,CURLOPT_TIMEOUT,3); //设定最大访问耗时
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieJar);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieJar);
if ($method == ‘post’) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
}
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$str = curl_exec($curl);
$str = iconv(“GBK”, “UTF-8//IGNORE”, $str);
curl_close($curl);
unset($curl);
return $str;
}

模拟浏览器登陆应用开发,最关键的地方是突破登陆验证。CURL技术不只支持http,还支持https。区别就在多了一层SSL加密传输。如果是要登陆https网站,php记得要支持openssl。还是先拿一个例子来分析。

//用户名

$login = ‘username’;

//密码

$password = ‘password’;

//163的用户登陆地址

$url = “https://reg.163.com/logins.jsp”;

//post 要提交的数据

$fields = “verifycookie=1&style=16∏uct=mail163&username=”.$login.”&password=”.$password.”&selType=jy&remUser=&secure=on&%B5%C7%C2%BC%D3%CA%CF%E4=%B5%C7%C2%BC%D3%CA%CF%E4″;

//用来存放cookie的文件

$cookie_file = dirname(__FILE__).”/cookie.txt”;

//启动一个CURL会话

$ch = curl_init();

// 要访问的地址

curl_setopt($ch, CURLOPT_URL, $url);

// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

// 从证书中检查SSL加密算法是否存在

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

//模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。

curl_setopt($ch, CURLOPT_USERAGENT, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”);

//发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

curl_setopt($ch, CURLOPT_POST, 1);

//要传送的所有数据,如果要传送一个文件,需要一个@开头的文件名

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

//连接关闭以后,存放cookie信息的文件名称

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

// 包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

// 设置curl允许执行的最长秒数

//curl_setopt($ch, CURLOPT_TIMEOUT, 6);

// 获取的信息以文件流的形式返回,而不是直接输出。

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

// 执行操作

$result = curl_exec($ch);

if ($result == NULL) {

echo “Error:
“;

echo curl_errno($ch) . ” – ” . curl_error($ch) . ”
“;

}

// 关闭CURL会话

curl_close($ch);上 面这个例子相对简单,因为用户名和密码可以明文传输,而且登陆也不需要验证码。qq.com的模拟登陆相对就麻烦多了,首先要突破验证码这关,然后由于 QQ密码是经过javascript加密后传输的,登陆界面也要模拟出来,下一篇文章再继续深入谈谈QQ的模拟登陆。

参考资料:

CURL详解 http://www.21andy.com/blog/20080507/1095.html

Tags: curl,模拟登陆wuzuquan 2008/07/18 09:40您好,我现在在做一个模拟yahoo登陆的php程序,因为yahoo的密码是经过javascript加密的,而且在加密过程中引用了一个网页随机生成的字符串challenge,这个字符串在每次访问网页的时候都不一样。

如果我采用curl来模拟登陆,过程如下:

先curl_init()初始化一个curl连接,设置相关选项后,curl_exec();然后利用采集功能得到challenge的值,经过加密计算出加密后的密码。再来一次curl_exec,将用户名,加密密码等post出去。

可是这样做采集到的challenge永远都是过时的,这该怎么解决呢?

思路:

采集程序的思路很简单大体可以分为以下几个步骤:

1.获取远程文件源代码(file_get_contents或用fopen).

2.分析代码得到自己想要的内容(这里用正规匹配,一般是得到分页)。

3.跟根得到的内容进行下载入库等操作。

在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。

代码:

记的以前发部过部分的代码今天我在这里在简单的发部一下

复制PHP内容到剪贴板

PHP代码:

@$nl=file_get_contents($rs[‘url’]);//抓取远程内容
preg_match_all(“/var url = “gameswf/(.*?).swf”;/is”,$nl,$connect);//进行正规匹配取得自己要的内容
mysql_query(“insert ……插入数据库部分”);

上面的代码就是所有采集要用到的代码了,当然大家也可以用fope来作,我个人喜欢用file_get_contents。

下面在共享一下我的下载图片flash到本地的办法,太简单了两行代码

复制PHP内容到剪贴板

PHP代码:

if(@copy($url,$newurl)){
echo ‘ok’;
}

在论坛上以前还发过一个图片下载函数这会也放上来给大家

复制PHP内容到剪贴板

PHP代码:

/*本存图片函数*/
function getimg($url,$filename){
/*判断图片的url是否为空,如果为空停止函数*/
if($url==””){
return false;
}
/*取得图片的扩展名,存入变量$ext中*/
$ext=strrchr($url,”.”);

/*strrchr(string,char) 查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。*/
/*判断是否是合法的图片文件*/
if($ext!=”.gif” && $ext!=”.jpg”){
return false;
}
/*读取图片*/
$img=file_get_contents($url);

/*此函数见http://hi.baidu.com/lixing880/blog/item/3c1786ec95077edb2e2e2161.html */
/*打开指定的文件*/
[email protected]($filename.$ext,”a”);
/*写入图片到指点的文件*/
fwrite($fp,$img);
/*关闭文件*/
fclose($fp);
/*返回图片的新文件名*/
return $filename.$ext;
}

共享一下个人的采集心德:

1.不采那些作防盗链了的站,其实可以作假来路但是这样的站采集成本太高

2.采集尽量快的站,最好在本地进行采集

3.采集时有很多时候可以先把一部分数据存入数据库,等以后进行下一步的处理。

4.采集的时候一定要作好出错处理,我一般都是如果采集三次没有成功就跳过。以前经常就因为一条内容不能采就卡在那里一直的采。

5.入库前一定要作好判断,检查内容的合法,过滤不必要的字符串。

PHP 小偷程序应用的几个函数

PHP 小偷程序应用的几个函数

所谓小偷程序,就是读取其它网站的数据到本地,然后对获得的数据进行代码过虑、替换等操作后显示出来,整个过程就像在模仿网页浏览器。

本文将说明,使用fsockopen()函数实现GET和POST请求,以及字符串操作的几个函数。建议你了解一下HTTP请求的过程,这样可以让你更容易理解本文内容。

一,获得网站数据–fsockopen()函数的使用

我们需要用到fsockopen()函数,此函数的作用是建立一个socket链接。

我们举个例子,将fsockopen()看作是你的浏览器。当你想要进入某网站时,首先要在地址栏里输入网址,回车后浏览器会与这个网站建立一个链接,这时浏览器会发送请求信息头,服务器收到请求信息头后,开始返回相应的数据,这些数据就是我们看到的网页的原型(HTML、CSS、JAVASCRIPT、文本等数据)。

以上就是一个简单的HTTP请求过程,为了进一步说明这个函数的作用,我们动手个例子。

1.GET请求,获得网易的主页数据,代码如下:
//URL
$url=’www.163.com’;
$data = LinkURL($url);
print $data;
function LinkURL($url)
{
//80是指端口,30是指超时时间
$fp = @fsockopen($url, 80, $errno, $errstr, 30);
if ($fp)
{
//想一想浏览器的例子,我们必须得发送请求信息头,否则服务器不会返回数据,这里是一个GET请求。
fputs($fp, “GET / HTTP/1.1rn”);
fputs($fp, “Host: $urlrn”);
fputs($fp, “Accept: */*rn”);
fputs($fp, “Referer: http://$url/rn”);
fputs($fp, “User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)rn”);
fputs($fp, “Connection: Closernrn”);
}
while ($str = fread($fp, 4096))
$data .= $str;
fclose($fp);
return $data;
}
?>

主页数据及服务器返回的信息被保存在$data变量中:
HTTP/1.0 200 OK
Date: Sat, 20 Oct 2007 15:11:52 GMT
Server: Apache/2.2.4 (Unix)
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Length: 129070
Content-Type: text/html; charset=gb2312
Age: 21
X-Cache: HIT from www.163.com
Connection: close

2.实现POST请求,有很多种方式,这里列举几种。

其一:使用stream_context_create()函数:

$data=MovieSearch(‘1′,’s’,’1′);
print $data;

function MovieSearch($key,$value,$isdel)
{
//例子网站有IP地址限制,最好自己找个网站测试。
$url=’http://www.veryab.com/Movie/search/Search.jsp’;
//POST数据
$post_data[‘key’] = $key;
$post_data[‘value’] = $value;
$post_data[‘isdel’] = $isdel;
//解析URL地址
$URL_Info=parse_url($url);
//对数据进行URL编码转换
foreach($post_data as $key=>$value)
$values[]=”$key=”.urlencode($value);
$data_string=implode(“&”,$values);
//请求信息头
$header.=”Host: “.$URL_Info[“host”].”n”;
$header.=”Referer: $urln”;
$header.=”User-Agent: Mozilla 4.0rn”;
$header.=”Content-type: application/x-www-form-urlencodedn”;
$header.=”Content-length: “.strlen($data_string).”n”;
$header.=”Connection: close”;

//stream_context_create()提交请求信息。
$opts[‘http’][‘method’] = ‘POST’;
$opts[‘http’][‘header’] = $header;
$opts[‘http’][‘content’] = $data_string;
$context = stream_context_create($opts);
$content = file($url, false, $context);
$data = implode(”, $content);
return $data;
}

其二:使用fsockopen()函数:

$data=MovieSearch(‘1′,’s’,’1′);
print $data;

function MovieSearch($key,$value,$isdel)
{
$url=’http://www.veryab.com/Movie/search/Search.jsp’;
$post_data[‘key’] = $key;
$post_data[‘value’] = $value;
$post_data[‘isdel’] = $isdel;
$URL_Info=parse_url($url);
if(!isset($URL_Info[“port”]))
$URL_Info[“port”]=80;
foreach($post_data as $key=>$value)
$values[]=”$key=”.urlencode($value);
//POST数据
$data_string=implode(“&”,$values);
//请求信息头
$header.=”POST “.$URL_Info[“path”].” HTTP/1.1n”;
$header.=”Host: “.$URL_Info[“host”].”n”;
$header.=”Referer: $referrern”;
$header.=”Content-type: application/x-www-form-urlencodedn”;
$header.=”Content-length: “.strlen($data_string).”n”;
$header.=”Connection: closen”;
$header.=”n”;
$header.=$data_string.”n”;
//建立链接
$fp = fsockopen($URL_Info[“host”],$URL_Info[“port”],$errorno,$errorstr,30);
//发送请信息头
fputs($fp, $header);
//获得数据
while ($str = @fread($fp, 4096))
$data .= $str;
fclose($fp);
return $data;
}

二.整理数据函数。

1.explode()函数,分割字符串。
我们获得的网页数据,会有一大部分是不需要的,为了减少操作,我们需要对其进行裁减,把我们需要的部分留下,然后再使用其它函数进行处理。这里有一个“掐头去尾留中间”的函数:
//要被裁减的数据
$pizza = “piece1 piece2 piece3 piece4 piece5 piece6″;
//调用 cut()函数
$data = cut($pizza,”piece2″,”piece5″);
//输出:piece3 piece4
print $data;

function cut($file,$from,$end)
{
//以”piece2″为分隔点对$pizza进行裁减。
//处理后:$data[0]=piece1
// $data[1]=piece3 piece4 piece5 piece6
$data=explode($from,$file);

//再对$data[1]进行裁减,以piece5为分隔点。
//处理后:$data[0]=piece3 piece4
// $data[1]=piece6
$data=explode($end,$data[1]);
return $data[0];
}
?>
执行后输出:piece3 piece4,返回piece2和piece5二者之间的所有数据,非常方便。

2.str_replace(),替换数据内容。
由于版面的原因,我举一个简单的例子来说明,相信你一看就会明白:
$data=”a b c d e f g”;
//将$data中的’a’,替换成’b’
$data=str_replace(“a”,”b”,$data);
print $data;
?>
程序输出结果:b b c d e f g

3.strip_tags(),过虑HTML代码。
同样,我们举个简单例子:
$text = ‘
Test paragraph.

Other text’;
//过虑所有html标签
echo strip_tags($text);
echo ‘
‘;
//不过虑
and 标签
echo strip_tags($text, ‘

‘);
?>
程序执行结果:
Test paragraph. Other text

Test paragraph.

Other text

回想一下刚才的几个函数,功能很强大,又非常简单,这也是PHP程序的特点,下一步我们利用这几个函数写个小偷程序!

修正后的 post2qzone

使用 Gmail的方式失败。

选用了 SSl连接的方式,虽然有点慢,但是已经可以用了,也算不错的啦。

增加部分 post2qzone.php

$mail->SMTPSecure = “ssl”;
$mail->Port = 587;

全代码
< ?php
/*
Plugin Name: post2Qzone
Plugin URI: http://liguoliang.com/2010/wordpress-post-to-qzone/
Description: post2Qzone是一款将新Post同步发表到Qzone的小插件. 可将新文章同步发布到Qzone的制定目录(无对应目录会自动创建), 支持使用Windows Live Writer发布, 并可同时抄送到指定邮箱.
Version: 1.2.0
Author: Liguoliang.com
Author URI: http://liguoliang.com/
*/
//TODO : 修改sendmail方法, 以便在post中get opt, 直接传递到sendmail中. 同时增加BCC opt.

require_once ‘inc-post2email-utils.php’;

$debug = false; // 仅在需要Debug时设置为True
static $POST_LINK_RP = ‘%%LINK%%’;

//Options
$OPT_PREFIX = ‘post2QZone_’;
$OPT_QQ_NO = $OPT_PREFIX.’qq’;
$OPT_QQ_PW = $OPT_PREFIX.’pw’;
$OPT_QQ_BCC = $OPT_PREFIX.’bcc’;

$OPT_POST_CATS_RULES = $OPT_PREFIX.’catsRules’;

$OPT_TITLE_PREFIX = $OPT_PREFIX.’title_prefix’;
$OPT_CONTENT_PLAIN = $OPT_PREFIX.’plain’;
$OPT_CONTENT_LENGTH = $OPT_PREFIX.’length’;
$OPT_CONTENT_PREFIX = $OPT_PREFIX.’content_prefix’;
$OPT_CONTENT_SUFFIX = $OPT_PREFIX.’content_suffix’;

register_activation_hook(__FILE__,’post2QZone_activate’);
register_deactivation_hook(__FILE__,’post2QZone_deactivate’);

function post2QZone_activate() {
//Options
$OPT_PREFIX = ‘post2QZone_’;
$OPT_QQ_NO = $OPT_PREFIX.’qq’;
$OPT_QQ_PW = $OPT_PREFIX.’pw’;
$OPT_QQ_BCC = $OPT_PREFIX.’bcc’;

$OPT_POST_CATS_RULES = $OPT_PREFIX.’catsRules’;

$OPT_TITLE_PREFIX = $OPT_PREFIX.’title_prefix’;
$OPT_CONTENT_PLAIN = $OPT_PREFIX.’plain’;
$OPT_CONTENT_LENGTH = $OPT_PREFIX.’length’;
$OPT_CONTENT_PREFIX = $OPT_PREFIX.’content_prefix’;
$OPT_CONTENT_SUFFIX = $OPT_PREFIX.’content_suffix’;

add_option($OPT_QQ_NO, ”, ”);
add_option($OPT_QQ_PW, ”, ”);
add_option($OPT_QQ_BCC, ”, ”);

add_option($OPT_POST_CATS_RULES, ”, ”);

add_option($OPT_TITLE_PREFIX, ‘blog’, ”);
add_option($OPT_CONTENT_PLAIN, ‘0’, ”);
add_option($OPT_CONTENT_LENGTH, ‘0’, ”);
add_option($OPT_CONTENT_PREFIX, ‘本文自动转发自我的博客: %%LINK%%’, ”);
add_option($OPT_CONTENT_SUFFIX, ‘
——————–
查看原文: %%LINK%%’, ”);

}

/** Deactivate 时响应. */
function post2QZone_deactivate() {
global $OPT_QQ_NO, $OPT_QQ_PW, $OPT_QQ_BCC, $OPT_POST_CATS_RULES, $OPT_TITLE_PREFIX, $OPT_CONTENT_PLAIN, $OPT_CONTENT_LENGTH, $OPT_CONTENT_PREFIX, $OPT_CONTENT_SUFFIX;

// delete_option($OPT_QQ_NO);
// delete_option($OPT_QQ_PW);
//
// delete_option($OPT_TITLE_PREFIX);
// delete_option($OPT_CONTENT_PREFIX);
// delete_option($OPT_CONTENT_SUFFIX);
}

// 注册init响应
add_action(‘init’, ‘Post2Qzone_init’);

function Post2Qzone_init() {
add_action(‘admin_menu’, ‘Post2Qzone_config’);
}

// 增加配置菜单
function Post2Qzone_config() {
if (function_exists(‘add_options_page’)) {
add_options_page(‘Post2QZone Options’, ‘Post2Qzone’, ‘manage_options’, ‘post2Qzone-config’, ‘post2Qzone_options’);
// add_submenu_page(‘plugins.php’, ‘Post2QZone Options’, ‘配置Post2QZone’, ‘manage_options’, ‘wp2qzone-config’, ‘wp2qzone_config_page’);
}
}

function post2Qzone_options() {
global $OPT_QQ_NO, $OPT_QQ_PW, $OPT_QQ_BCC, $OPT_POST_CATS_RULES, $OPT_TITLE_PREFIX, $OPT_CONTENT_PLAIN, $OPT_CONTENT_LENGTH, $OPT_CONTENT_PREFIX, $OPT_CONTENT_SUFFIX;

if (!current_user_can(‘manage_options’)) {
wp_die( __(‘You do not have sufficient permissions to access this page.
您无权限进入此配置页面.’) );
}

if (!empty($_POST[‘submit’])) {
update_option($OPT_QQ_NO, $_POST[$OPT_QQ_NO]);
update_option($OPT_QQ_PW, $_POST[$OPT_QQ_PW]);
update_option($OPT_QQ_BCC, $_POST[$OPT_QQ_BCC]);

update_option($OPT_POST_CATS_RULES, $_POST[$OPT_POST_CATS_RULES]);

update_option($OPT_TITLE_PREFIX, $_POST[$OPT_TITLE_PREFIX]);
update_option($OPT_CONTENT_PLAIN, trim($_POST[$OPT_CONTENT_PLAIN]));
update_option($OPT_CONTENT_LENGTH, trim($_POST[$OPT_CONTENT_LENGTH]));
update_option($OPT_CONTENT_PREFIX, str_replace(‘\’, ”, $_POST[$OPT_CONTENT_PREFIX]));
update_option($OPT_CONTENT_SUFFIX, str_replace(‘\’, ”, $_POST[$OPT_CONTENT_SUFFIX]));

$save_msg = “选项已保存成功!”;
}
?>

Post2Qzone设置
< ?php
if(!empty($save_msg)) {
?>

< ?php echo $save_msg ?>

< ?php } ?>

1.登陆设置

QQ号码:

邮箱密码: QQ邮箱密码(默认为QQ密码)

请开通QQ邮箱的SMTP服务, 具体可登陆邮箱后进入 设置/账户 配置 页面开启POP3/SMTP服务;

2.发布范围限制

参与同步目录: 设置参与同步的目录, 留空表示全部同步, 否则请填入目录ID, 多个ID已逗号隔开, 如: “1,2,3”;

3.发布内容设置

剔除格式: 0表示发布为HTML格式, 1表示发布为纯文本格式(将剔除HTML标签)

发布字数: 0表示发布全文, 输入具体字数表示无摘要时截断字数(建议不小于200).

目标目录: 8个英文或4个汉字以内

内容前缀: < ?php echo get_option($OPT_CONTENT_PREFIX); ?> 内容前缀, 支持HTML代码, 使用%%LINK%%插入博文地址

内容后缀: < ?php echo get_option($OPT_CONTENT_SUFFIX); ?> 内容后缀, 支持HTML代码, 使用%%LINK%%插入博文地址

4.其他设置

抄送地址: 抄送邮件地址, 请填写Email(选填)

< ?php echo $save_msg; ?>


最近工作比较忙, 没时间优化后台配置界面, 请各位多多包涵, 如有不清楚的地方或建议, 请:

访问插件主页查找更多信息或直接联系: [email protected],

如果大家觉得插件用着还好, 请推荐给身边的其他博友, 谢谢!

1.1.0 更新说明: 如发现同步出现问题, 请确定参与目录填写是否正确.

    • 1. 增加了同步长度 – 如果需要输出全文, 请将长度设置为0.

 

  • 2. 增加了参与同步的目录, 请填入参与同步的目录ID, 多个ID请以半角逗号分隔. 如果要全站文章参与同步, 请留空.

 

 

< ?php }

// 注册日志发布后的响应函数
add_action(‘publish_post’, ‘postToQzone’, 0);

/**
* 新POST发布后响应函数
* @param $post_ID PostID
* @return unknown_type
*/
function postToQzone($post_ID){
global $debug, $POST_LINK_RP, $OPT_PREFIX, $OPT_QQ_NO, $OPT_QQ_PW, $OPT_QQ_BCC, $OPT_POST_CATS_RULES, $OPT_TITLE_PREFIX, $OPT_CONTENT_PLAIN, $OPT_CONTENT_LENGTH, $OPT_CONTENT_PREFIX, $OPT_CONTENT_SUFFIX;

if (!current_user_can(‘publish_posts’)) {
wp_die( __(‘You do not have sufficient permissions to access this function.
您无权限使用本方法.’) );
}

$qzone = get_post_meta($post_ID, ‘postToQzone’, true); // 获得Metadata
if($qzone) {
return;
}

// get options
$qq = get_option($OPT_QQ_NO);
$qqpw = get_option($OPT_QQ_PW);
$bcc = get_option($OPT_QQ_BCC);

$catRules = get_option($OPT_POST_CATS_RULES);

$title_prefix = get_option($OPT_TITLE_PREFIX);
$isPlainText = get_option($OPT_CONTENT_PLAIN);
$length = get_option($OPT_CONTENT_LENGTH);
$prefix = get_option($OPT_CONTENT_PREFIX);
$suffix = get_option($OPT_CONTENT_SUFFIX);

$post_pending_send = get_post($post_ID); // 获得Post

// 检查当前Post是否符合发布目录规则要求.
if(Post2EmailUtils::isPostInCatList($post_pending_send, $catRules)) {
$post_title = $post_pending_send->post_title; // Post标题
$post_content = Post2EmailUtils::getContents($post_pending_send, $length, $isPlainText); //$post_pending_send->post_content; // Post内容
$post_link = get_permalink($post_ID); // Post地址

// 处理标题及内容
$post_link = ”.get_permalink($post_ID).”; // 获得博客原文链接
$prefix = str_ireplace($POST_LINK_RP, $post_link, $prefix); // 替换通配符
$suffix = str_ireplace($POST_LINK_RP, $post_link, $suffix);

if(!empty($post_title)) {
$post_title = ‘[‘.$title_prefix.’]’.$post_title;
}
$post_content = $prefix.’
‘.$post_content.’
‘.$suffix;

sendPostByPhpMailer($qq, $qqpw, $bcc, $post_title, $post_content); // 发送邮件 TODO: 尝试在这里遍历所有邮件目标, 进行发送.
add_post_meta($post_ID, ‘postToQzone’, ‘true’, true); // 加入MetaData
}else {
if($debug) {
echo ”
该文章不在发布范围之内, 跳过处理.”;
exit();
}
}
}

/**
* 使用PHPMailer发送邮件 – SMTP方式
* PHPMailer使用指南: http://deepakssn.blogspot.com/2006/06/gmail-php-send-email-using-php-with.html
* @param $subject 邮件标题. 将作为日志标题.
* @param $body 邮件内容. 将作为日志内容
* @return null
*/
function sendPostByPhpMailer($qq, $qqpw, $bcc, $title, $body){
global $debug;
if ( !class_exists(‘PHPMailer’) ) {
require_once ABSPATH . WPINC . ‘/class-phpmailer.php’;
require_once ABSPATH . WPINC . ‘/class-smtp.php’;
}
$mail = new PHPMailer();
$mail->SMTPDebug = $debug;

$mail->IsSMTP();
$mail->Mailer = “smtp”;
$mail->CharSet = ‘utf-8’;
$mail->Encoding = ‘base64’;
$mail->IsHTML(true);
$mail->SMTPAuth = true;
$mail->SMTPSecure = “ssl”;
$mail->Port = 587;
$mail->Host = “smtp.qq.com”;
$mail->Username = $qq.”@qq.com”;
$mail->Password = $qqpw;
$mail->From = $qq.”@qq.com”;
$mail->FromName = $qq;

// $mail->AddAddress($qq.”@qzone.qq.com”);
// if(!empty($bcc)) {
// $mail->AddAddress($bcc);
// }

$recipients = array();
$recipients[] = $qq.”@qzone.qq.com”;
$recipients[] = $bcc;

foreach ($recipients as $recipient) {
if(!empty($recipient)) {
$mail->ClearAllRecipients(); // remove previously set addresses.
$mail->ClearReplyTos();
$mail->AddAddress($recipient);
$mail->Subject = $title;
$mail->Body = $body;

if($debug) {
echo “标题: [“.$title.”]
“;
echo “内容: [“.$body;
echo ”
]——————-
使用账号:
“;
echo $qq.”抄送到:”.$bcc.”
“;
echo ”
发送结果:
“.$mail->Send();
echo ”
———————-
Debug结束, 请检查内容是否发布到QQ或指定抄送邮箱”;
exit();
}else {
$mail->Send();
}
}
}
}

?>

 

Blitz templates 和 Smarty 测试通过

Blitz templates 号称最快的PHP 模板引擎
在MAC上 搞了半天 编译失败
win32 直接copy个 DLL.

Smarty PHP官方的模板引擎
在MAC上 由于权限问题,搞了半天,还是不行
Win32.直接用用了事…
PS: 换成MAMP后 可以咯

Mac 啊….无语了

PHP列出数据库退回内容 2种方式

1.
< ?
$list = $db->get_all(“SELECT *FROM `admin`WHERE 1”);//使用了 数据库封装
foreach($list as $row):
?>

< ?=$row[‘username’]?> < ?=$row[‘password’]?>
< ? endforeach; ?>
2.
< ?
[email protected]_connect(“host”,”root”,”password”) or die(“error”);//链接
mysql_select_db(“dbname”,$conn);
mysql_query(“set names utf8;”)//设置编码
$sql=”SELECT *FROM `admin`WHERE 1″//sql语句
$get_all=mysql_query($sql,$conn);//获得数据
while($row=musql_fetch_array($get_all))//写入数组
{?>

< ?=$row[‘username’]?> < ?=$row[‘password’]?>
< ?
}
?>

教你如何成为PHP高手?

PHP是一门高效的网络编程语言,由于它具有编写灵活、运行快速等优点,迅速成为Web程序员的首选语言。那么怎样才能成为一个优秀的PHP开发者呢?

要成为一名PHP编程高手并不容易,并不像很多人想象的那样,只要能够飞快地编写几条简单的代码去解决一个复杂的问题就是PHP编程高手了,真正的PHP高手还需要考虑更多的其它问题。以下三条准则是一名成熟的PHP程序员在编程中应该首先遵循的准则。

◆懒惰是金

◆编写漂亮的代码

◆追求程序的速度,而不是编程的速度

懒惰是金

做一个懒惰的程序员吗?这个想法太奇怪了!因为这个世界上最忙碌的人可能就是计算机程序员了。但正是因为程序员太忙了,所以才应该在编程时学会偷懒。对于一个程序员来说,懒惰的方法有两种:

其一,大胆使用现成的别人的程序代码,把这些代码融入到你自己的程序或者项目中去。其二是编写一些有用的代码建立一个函数库,在将来编写程序时可以顺手拈来,省去了许多重复的劳动,自然就可以懒惰一点了。这两种偷懒的方法都非常适合PHP程序员了。

首先,PHP是在自由开放的环境中诞生和成长的一门语言。在世界各地,有成千上万的程序员,他们一直在为PHP的完美而不断奋斗,他们也愿意和别人分享自己的聪明才智和自己编写的代码。你每天都可以从一些PHP网站、邮件列表、新闻组发现大量的优秀的程序代码。

这样说,我并不是鼓励你整天等着让别人为你编写代码,但是你可以“站在伟人的肩膀上”,充分发扬“拿来主义”,聪明地应用别人的程序代码可以节省你大量时间。其次,在PHP中,你可以方便地建立自己的函数库,这样可以在你以后编写程序时省去很多麻烦。

下面笔者为大家介绍几个通用的函数,这些函数有的来自网上的一些开放源代码的项目,有的精选自邮件列表。如果你能把它们加入到你自己的函数库中,迟早你将会发现自己受益无穷。

1.通用数据库处理函数

和其它的CGI函数相比,PHP的优点之一是具有很强大的数据库处理能力。但是,在PHP中,对于不同的数据库都使用一些特定的函数来专门处理,缺少通用的数据库处理函数。这大大降低了程序代码的可移植性,这也为初学编程的朋友带来了很多不便。

在网上,许多程序员都通过封装类解决了这个问题。他们编写了统一的函数用来处理任何流行的数据库——不管是在Linux世界深受欢迎的Mysql还是在Windows平台上广泛流行的SqlServer。

就笔者个人来说,非常喜欢使用这些函数,因为可以直接使用一些简单的诸如”query”、”next_record”之类的函数,而不需要考虑数据库的连接、数据库句柄这些复杂的东西,更不需要考虑使用的是何种数据库。如果你需要这些函数,你可以通过访问以下的几个网址而得到:

◆http://phplib.netuse.de/

◆http://phpclasses.UpperDesign.com/browse.html/package/20

◆http://phpdb.linuxbox.com/