存档

‘PHP’ 分类的存档

基于WebQQ3.0协议写一个QQ机器人

2013年4月21日 12 条评论

一个偶然的机会,在某群看到一个类似QQ机器人的玩意在骚动,问那哥们回答说是JAVA写的,原来QQ还能这样玩儿。于是乎,我也就开始骚动了。Let’s go

1.WEBQQ3.0登陆协议

进入WEBQQ, http://web.qq.com/
通过工具分析,可以知道,用户在输入密码之前(也就是输入[……]

Read more

分类: PHP 标签: , ,

PHP检查模块是否存在以及显示版本相关信息

2013年4月19日 没有评论

如果你需要检查给定的PHP模块/扩展是否存在,下面一行代码就能派上用场,不需要使用phpinfo()。
检查现有的模块:

$ php -m | grep xdebug | wc -l
1

检查不存在的模块:

$ php -m | grep mongo | wc -l
0

[……]

Read more

分类: PHP 标签: ,

PHP获取函数的所在模块

2013年4月18日 没有评论

查看PHP函数的源代码时非常有用

#!/usr/bin/php
<?php
if (empty($argv[1])) exit("Must be defined in PHP function\n");
$function_name = $argv[1];
$extensions = get_loaded_extensions();
 
foreach ($extensions as $m)
{
	$func = get_extension_funcs($m);
	if( ! is_array($func)) continue;
	if (in_array($name, $func))
	{
		printf("%s was defined in Module: %s\n", $name, $m);
		exit;
	}
}
echo "This function is not found.\n";
 
/* End of file get_function.php */

用法:./get_function.php function_name

分类: PHP 标签: ,

PHP pcntl_fork 多进程下载网页图片

2013年4月17日 没有评论

pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。

e66ade0bc009877230462c72c2fff360012[……]

Read more

分类: PHP 标签: , ,

PHP获取各大视频网站页面中的Flash播放地址

2013年3月24日 5 条评论

目前已支持新浪播客、优酷网、土豆网、酷6网、搜狐视频、56网、奇艺网、凤凰网等视频网站的视频播放页链接。
PHP API调用实例:http://fengdingbo.com/tools/web_video.php?url=视频页面地址[……]

Read more

分类: PHP 标签: ,

PHP flock文件锁定 独占操作测试

2013年3月15日 没有评论

flock – 轻便的咨询文件锁定

flock()函数原型

bool flock ( int handle, int operation [, int &wouldblock] )

PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部[……]

Read more

分类: PHP 标签: ,

PHP CURL模拟登录163邮箱抓取好友列表

2013年3月9日 1 条评论
<?php
$username	="username@163.com";
$password	="password";
$robot = new web_robot();
// 获取163联系人
$address_list = $robot->get_address_list($username, $password);
print_r($address_list);
 
/**
 * 模拟登录163邮箱抓取好友列表
 * @copyright (c) 2013
 * @author qiufeng <fengdingbo@gmail.com>
 * @link	http://www.fengdingbo.com
 * @version 1.0
 */
class web_robot{
 
	/**
	 * 存放cookie信息的临时文件名 
	 * @var string
	 */
	public $cookie_tmp_file;
 
	public function __construct()
	{
		$this->cookie_tmp_file = tempnam( ini_get( "upload_tmp_dir" ), "cookie" );
	}
 
	public function __destruct()
	{
		// 删除临时COOKIE
		unlink($this->cookie_tmp_file);
	}
 
	/**
	 * 获取联系人列表
	 * || ============================
	 * || 返回值说明:
	 * || ----------------------------
	 * || int data type:
	 * || 201:用户名或密码不正确.
	 * || 202:服务器异常,请稍后再试.
	 * || 203:没有找到邮箱联系人.
	 * || 
	 * || array data type:
	 * || 获取联系人列表成功.
	 * || ============================
	 * @param string $username
	 * @param string $password
	 * @return mixed
	 */
	public function get_address_list($username, $password)
	{
		if ( ! $this->login($username, $password))
		{
			return 201;
		}
 
		$header = $this->_getheader($username);
 
		if ( ! $header['sid'])
		{
			return 202;
		}
 
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, "http://" . $header['host'] . "/js4/s?sid=" . $header['sid'] . "&func=global:sequential");
		curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_tmp_file);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Language: zh-cn', 'Connection: Keep-Alive', 'Content-Type: application/xml; charset=UTF-8'));
		$str = "<?xml version=\"1.0\"?><object><array name=\"items\"><object><string name=\"func\">pab:searchContacts</string>" .
				"<object name=\"var\"><array name=\"order\"><object><string name=\"field\">FN</string><boolean name=\"ignoreCase\">true</boolean></object>" .
				"</array></object></object><object><string name=\"func\">user:getSignatures</string></object>" .
				"<object><string name=\"func\">pab:getAllGroups</string></object></array></object>";
 
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $str);
		curl_setopt($ch, CURLOPT_TIMEOUT, 60);
		ob_start();
		curl_exec($ch);
		$data = ob_get_clean();
 
		// 把字符转转化为SimpleXMLElement Object
		$XML = (array)simplexml_load_string($data)->array->object[0]->array;
		if (array_key_exists('object', $XML))
		{
			foreach($XML['object'] as $v)
			{
				$array_format = (array)$v;
				$list[] = $array_format['string'];
			}
 
			return $list;
		}
 
		return 203; }
 
	/**
	 * 登陆163邮箱
	 * @param string $username
	 * @param string $password
	 * @return boolean
	 */
	private function login($username, $password)
	{
		// 登陆163,保存cookie
		$cookies = array();
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
		curl_setopt($ch, CURLOPT_URL, "http://reg.163.com/logins.jsp");
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, "username=".$username."&password=".$password."&type=1");
 
		curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_tmp_file);
		curl_setopt($ch,CURLOPT_HEADER,1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //文件流形式返回
		$str = curl_exec($ch);
		curl_close($ch);
 
		preg_match('/(window.location.replace\(\"(.*)\"\))/i', $str,$content);
 
		if (isset($content) && is_array($content) && array_key_exists(2, $content))
		{
			ob_start();
			$ch = curl_init($content[2]);
			curl_setopt($ch, CURLOPT_TIMEOUT, 30);
			curl_setopt($ch,CURLOPT_COOKIEFILE, $this->cookie_tmp_file);
			$str2 = curl_exec($ch);
			curl_close($ch);
			$content = ob_get_clean();
 
			// 校验是否登陆成功
			if (strpos($content, "安全退出") && strpos($content, $username))
			{
				return TRUE;
			}
		}
 
		return FALSE;
	}
 
	/**
	 * 获取头部信息
	 * @param string $username
	 * @return array
	 */
	private function _getheader($username)
	{
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, "http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=" . $username);
		curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_tmp_file);  //当前使用的cookie
		curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_tmp_file);   //服务器返回的新cookie
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HEADER, true);
		curl_setopt($ch, CURLOPT_NOBODY, true);
		$content = curl_exec($ch);
		curl_close($ch);
 
		preg_match_all('/Location:\s*(.*?)\r\n/i', $content, $regs);
		$refer = $regs[1][0];
		preg_match_all('/http\:\/\/(.*?)\//i', $refer, $regs);
		$host = $regs[1][0];
		preg_match_all("/sid=(.*)/i", $refer, $regs);
		$sid = $regs[1][0];
 
		return array('sid' => $sid, 'refer' => $refer, 'host' => $host);
	}
}
?>
分类: PHP 标签: ,

PHP 打印所有常量

2013年2月3日 没有评论

官方给的原型:
array get_defined_constants ([ bool $categorize = false ] )
下边是人类的理解:
get_defined_constants(true)
参数为TRUE时:返回一个多维数组,分类为第一维的键名,常量和它们的值位于第二维。

get_defined_constants() e.g #1:
PHP打印所有常量

get_defined_constants() e.g #2:
PHP打印用户自定义常量:

get_defined_constants() e.g #3:
PHP给定一个常量值,返回常量名称:

get_defined_constants() e.g #4:
如果你想过滤,并按常量的前缀来查询(即你已经有一套常量的命名方案),那么你可以使用这个小巧的功能,进行简单的调试:[……]

Read more

分类: PHP 标签: ,

PHP socket模拟POST请求

2013年1月31日 2 条评论

一听到这个功能需求的时候,立即就蒙了,俺一直以为socket是C/S架构里边的东西,俺错了,俺有罪,俺应该主动蹲墙角去。。。
以前模拟post请求俺都用PHP curl扩展实现来着,没想过PHP socket也可以实现。最近翻了下相关资料才发现原来没有那么高深,只是以前一直没有完全理解post的原[……]

Read more

分类: PHP 标签: ,

PHP扩展Xdebug的安装使用实例

2013年1月29日 没有评论

测试环境:Ubuntu12.04+PHP 5.3.10

# 获取xdebug最新源码包
git clone git://github.com/derickr/xdebug.git
cd xdebug/
# 如果没有安装phpize扩展,请尝试:apt-get install phpize
phpize
./configure --enable-xdebug
make && make install

我这边生成的路径为:/usr/lib/php5/20090626+lfs/xdebug.so
然后更改php.ini文件
自行选择增加这些配置选项[……]

Read more

分类: PHP 标签: ,