Files
youlegames/codes/agent/game/api/framework/function/communication.func.php
2026-03-15 01:27:05 +08:00

622 lines
16 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
defined('IN_IA') or exit('Access Denied');
// 请求某个网页,并返回网页返回的内容
// 参数1请求地址
// 参数2请求参数
function ihttp_request($url, $post = '', $needUrlEncode = true, $extra = array(), $timeout = 60)
{
$urlset = parse_url($url);
if (empty($urlset['path'])) {
$urlset['path'] = '/';
}
// 解析后的参数
if (!empty($urlset['query'])) {
$urlset['query'] = "?{$urlset['query']}";
}
// 请求端口
if (empty($urlset['port'])) {
$urlset['port'] = $urlset['scheme'] == 'https' ? '443' : '80';
}
// 假如是https请求则判断是否开启了openssl模块没有开启则提示错误
if (strexists($url, 'https://') && !extension_loaded('openssl')) {
if (!extension_loaded("openssl")) {
message('请开启您PHP环境的openssl');
}
}
if (function_exists('curl_init') && function_exists('curl_exec')) {
$ch = curl_init();
// PHP8兼容性修复CURLOPT_SAFE_UPLOAD在PHP8中已被移除安全上传现在是默认行为
if (version_compare(phpversion(), '5.6') >= 0 && version_compare(phpversion(), '8.0') < 0) {
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
}
if (!empty($extra['ip'])) {
$extra['Host'] = $urlset['host'];
$urlset['host'] = $extra['ip'];
unset($extra['ip']);
}
curl_setopt($ch, CURLOPT_URL, $urlset['scheme'] . '://' . $urlset['host'] . ($urlset['port'] == '80' ? '' : ':' . $urlset['port']) . $urlset['path'] . $urlset['query']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
@curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
if ($post) {
if (is_array($post)) {
$filepost = false;
foreach ($post as $name => $value) {
if ((is_string($value) && substr($value, 0, 1) == '@') || (class_exists('CURLFile') && $value instanceof CURLFile)) {
$filepost = true;
break;
}
}
if (!$filepost) {
$post = http_build_query($post);
}
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
if (!empty($GLOBALS['_W']['config']['setting']['proxy'])) {
$urls = parse_url($GLOBALS['_W']['config']['setting']['proxy']['host']);
if (!empty($urls['host'])) {
curl_setopt($ch, CURLOPT_PROXY, "{$urls['host']}:{$urls['port']}");
$proxytype = 'CURLPROXY_' . strtoupper($urls['scheme']);
if (!empty($urls['scheme']) && defined($proxytype)) {
curl_setopt($ch, CURLOPT_PROXYTYPE, constant($proxytype));
} else {
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
}
if (!empty($GLOBALS['_W']['config']['setting']['proxy']['auth'])) {
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $GLOBALS['_W']['config']['setting']['proxy']['auth']);
}
}
}
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
if (defined('CURL_SSLVERSION_TLSv1')) {
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
}
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
if (!empty($extra) && is_array($extra)) {
$headers = array();
foreach ($extra as $opt => $value) {
if (strexists($opt, 'CURLOPT_')) {
curl_setopt($ch, constant($opt), $value);
} elseif (is_numeric($opt)) {
curl_setopt($ch, $opt, $value);
} else {
$headers[] = "{$opt}: {$value}";
}
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
}
$data = curl_exec($ch);
$status = curl_getinfo($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
curl_close($ch);
if ($errno || empty($data)) {
return error(1, $error);
} else {
return ihttp_response_parse($data);
}
}
// 设置http请求方式假如没有post参数则使用get方式否则采用post方式
$method = empty($post) ? 'GET' : 'POST';
$fdata = "{$method} {$urlset['path']}{$urlset['query']} HTTP/1.1\r\n";
$fdata .= "Host: {$urlset['host']}\r\n";
if (function_exists('gzdecode')) {
$fdata .= "Accept-Encoding: gzip, deflate\r\n";
}
$fdata .= "Connection: close\r\n";
if (!empty($extra) && is_array($extra)) {
foreach ($extra as $opt => $value) {
if (!strexists($opt, 'CURLOPT_')) {
$fdata .= "{$opt}: {$value}\r\n";
}
}
}
$body = '';
if ($post) {
if (is_array($post)) {
// 构建http请求参数
$body = http_build_query($post);
} else {
if ($needUrlEncode) {
$body = urlencode($post);
} else {
$body = $post;
}
}
$fdata .= 'Content-Length: ' . strlen($body) . "\r\n\r\n{$body}";
} else {
$fdata .= "\r\n";
}
if ($urlset['scheme'] == 'https') {
$fp = fsockopen('ssl://' . $urlset['host'], $urlset['port'], $errno, $error);
} else {
$fp = fsockopen($urlset['host'], $urlset['port'], $errno, $error);
}
stream_set_blocking($fp, true);
stream_set_timeout($fp, $timeout);
if (!$fp) {
return error(1, $error);
} else {
fwrite($fp, $fdata);
$content = '';
while (!feof($fp)) {
$content .= fgets($fp, 512);
}
fclose($fp);
return ihttp_response_parse($content, true);
}
}
function ihttp_response_parse($data, $chunked = false)
{
$rlt = array();
$headermeta = explode('HTTP/', $data);
if (count($headermeta) > 2) {
$data = 'HTTP/' . array_pop($headermeta);
}
$pos = strpos($data, "\r\n\r\n");
$split1[0] = substr($data, 0, $pos);
$split1[1] = substr($data, $pos + 4, strlen($data));
$split2 = explode("\r\n", $split1[0], 2);
preg_match('/^(\S+) (\S+) (\S+)$/', $split2[0], $matches);
$rlt['code'] = $matches[2];
$rlt['status'] = $matches[3];
$rlt['responseline'] = $split2[0];
$header = explode("\r\n", $split2[1]);
$isgzip = false;
$ischunk = false;
foreach ($header as $v) {
$pos = strpos($v, ':');
$key = substr($v, 0, $pos);
$value = trim(substr($v, $pos + 1));
if (is_array($rlt['headers'][$key])) {
$rlt['headers'][$key][] = $value;
} elseif (!empty($rlt['headers'][$key])) {
$temp = $rlt['headers'][$key];
unset($rlt['headers'][$key]);
$rlt['headers'][$key][] = $temp;
$rlt['headers'][$key][] = $value;
} else {
$rlt['headers'][$key] = $value;
}
if (!$isgzip && strtolower($key) == 'content-encoding' && strtolower($value) == 'gzip') {
$isgzip = true;
}
if (!$ischunk && strtolower($key) == 'transfer-encoding' && strtolower($value) == 'chunked') {
$ischunk = true;
}
}
if ($chunked && $ischunk) {
$rlt['content'] = ihttp_response_parse_unchunk($split1[1]);
} else {
$rlt['content'] = $split1[1];
}
if ($isgzip && function_exists('gzdecode')) {
$rlt['content'] = gzdecode($rlt['content']);
}
$rlt['meta'] = $data;
if ($rlt['code'] == '100') {
return ihttp_response_parse($rlt['content']);
}
return $rlt;
}
function ihttp_response_parse_unchunk($str = null)
{
if (!is_string($str) or strlen($str) < 1) {
return false;
}
$eol = "\r\n";
$add = strlen($eol);
$tmp = $str;
$str = '';
do {
$tmp = ltrim($tmp);
$pos = strpos($tmp, $eol);
if ($pos === false) {
return false;
}
$len = hexdec(substr($tmp, 0, $pos));
if (!is_numeric($len) or $len < 0) {
return false;
}
$str .= substr($tmp, ($pos + $add), $len);
$tmp = substr($tmp, ($len + $pos + $add));
$check = trim($tmp);
} while (!empty($check));
unset($tmp);
return $str;
}
function ihttp_get($url)
{
return ihttp_request($url);
}
function ihttp_post($url, $data)
{
$headers = array('Content-Type' => 'application/x-www-form-urlencoded');
return ihttp_request($url, $data, $headers);
}
// 发送邮件
// $to接收人
// $subject邮件主题
// $body邮件正文
function ihttp_email($to, $subject, $body, $global = false)
{
static $mailer;
set_time_limit(0);
if (empty($mailer)) {
if (!class_exists('PHPMailer')) {
require IA_ROOT . '/framework/library/phpmailer/PHPMailerAutoload.php';
}
$mailer = new PHPMailer();
global $_W;
$config = $GLOBALS['_W']['setting']['mail'];
if (!$global) {
$row = pdo_fetch("SELECT `notify` FROM " . tablename('uni_settings') . " WHERE uniacid = :uniacid", array(':uniacid' => $_W['uniacid']));
$row['notify'] = @iunserializer($row['notify']);
if (!empty($row['notify']) && !empty($row['notify']['mail'])) {
$config = $row['notify']['mail'];
}
}
$config['charset'] = 'utf-8';
if ($config['smtp']['type'] == '163') {
$config['smtp']['server'] = 'smtp.163.com';
$config['smtp']['port'] = 25;
} else {
if (!empty($config['smtp']['authmode'])) {
$config['smtp']['server'] = 'ssl://' . $config['smtp']['server'];
}
}
if (!empty($config['smtp']['authmode'])) {
if (!extension_loaded('openssl')) {
return error(1, '请开启 php_openssl 扩展!');
}
}
$mailer->signature = $config['signature'];
$mailer->isSMTP();
$mailer->CharSet = $config['charset'];
$mailer->Host = $config['smtp']['server'];
$mailer->Port = $config['smtp']['port'];
$mailer->SMTPAuth = true;
$mailer->Username = $config['username'];
$mailer->Password = $config['password'];
!empty($config['smtp']['authmode']) && $mailer->SMTPSecure = 'ssl';
$mailer->From = $config['username'];
$mailer->FromName = $config['sender'];
$mailer->isHTML(true);
}
if (!empty($mailer->signature)) {
$body .= htmlspecialchars_decode($mailer->signature);
}
$mailer->Subject = $subject;
$mailer->Body = $body;
$mailer->addAddress($to);
if ($mailer->send()) {
return true;
} else {
return error(1, $mailer->ErrorInfo);
}
}
// 发送POST请求(模板消息尤其适用)
function do_post_request($url, $data, $optional_headers = null)
{
$params = array(
'http' => array(
'method' => 'POST',
'content' => $data,
),
);
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
// 字符集
define('USEDCHARSET', 'utf-8');
/**
* @note 转换分隔符
* @param string $string
* @return mixed
*/
function ConvertSeparator($string)
{
$result = $string;
while (false !== mb_stripos($result, '\\', 0, USEDCHARSET)) {
$result = str_replace('\\', '/', $result);
}
while (false !== mb_stripos($result, '//', 0, USEDCHARSET)) {
$result = str_replace('//', '/', $result);
}
return $result;
}
/**
* @date 2017-03-04
* @note 获取当前页面的url地址
* @return string
* @auth 应俊
*/
function GetLocaleUrl()
{
if (isset($_SERVER['PHP_SELF'])) {
$objectname = $_SERVER['PHP_SELF'];
} else {
$filename = ConvertSeparator(__FILE__);
$pathname = ConvertSeparator(isset($_SERVER['CONTEXT_DOCUMENT_ROOT']) ? $_SERVER['CONTEXT_DOCUMENT_ROOT'] : '');
$pathlength = mb_strlen($pathname, USEDCHARSET);
$filelength = mb_strlen($filename, USEDCHARSET);
if (false !== stripos($filename, $pathname))
$objectname = mb_substr($filename, $pathlength, $filelength - $pathlength, USEDCHARSET);
else
$objectname = $filename;
}
$https = (isset($_SERVER['REQUEST_SCHEME']) && strcasecmp($_SERVER['REQUEST_SCHEME'], 'https') == 0) ||
(isset($_SERVER['HTTPS']) && (strcasecmp($_SERVER['HTTPS'], 'on') == 0 || strcasecmp($_SERVER['HTTPS'], '1') == 0));
$port = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 0;
$servername = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
if ($https)
$uri = 'https://' . $servername . (443 == $port ? '' : ':' . $port) . $objectname;
else
$uri = 'http://' . $servername . (80 == $port ? '' : ':' . $port) . $objectname;
return $uri;
}
/**
* @date 2017-03-04
* @note 给参数按key的顺序排序。支持递归
* @param mixed $parameter 要排序的参数
* @return array
* @auth 应俊
*/
function SortParam($parameter)
{
$parameter = (array)$parameter;
foreach ($parameter as $k => $v) {
if (is_array($v) || is_object($v)) {
$parameter[$k] = SortParam($v);
}
}
// 调用strcmp函数来排序该函数区分大小写。
uksort($parameter, 'strcmp');
return $parameter;
}
/**
* @date 2017-03-06
* @note 转换参数成字符串形式按key=value的形式用&分隔)。
* @param mixed $parameter 要转换的参数
* @return string
* @auth 应俊
*/
function ConvertParam($parameter)
{
$parameter = (array)$parameter;
$return = '';
foreach ($parameter as $k => $v) {
if (is_array($v) || is_object($v)) {
$return .= sprintf('&%s={%s}', $k, ConvertParam($v));
} else {
$return .= sprintf('&%s=%s', $k, $v);
}
}
$sublen = mb_strlen('&', USEDCHARSET);
$retlen = mb_strlen($return, USEDCHARSET);
$return = mb_substr($return, $sublen, $retlen - $sublen, USEDCHARSET);
return $return;
}
/**
* @date 2017-03-04
* @note 为参数生成签名
* @param mixed $parameter 要签名的参数
* @param string $signkey 签名key
* @return string
* @auth 应俊
*/
function SignParameter($parameter, $signkey = '')
{
// 1先把参数按参数名key从小到大排序
$parameter = SortParam($parameter);
// 2连接参数成一个字符串按key=value的形式用&分隔)。
$return = ConvertParam($parameter);
// 3结尾加上key=签名key
$return .= '&key=' . $signkey;
// 4md5加密这个字符串
return md5($return);
}
/**
* @note 转换数据编码
* @param $data
* @param string $charset
* @return string
* @auther 应俊
*/
function Characet($data, $charset = USEDCHARSET)
{
if (!empty ($data)) {
$encoding = mb_detect_encoding($data, array('ASCII', 'UTF-8', 'GBK', 'GB2312', 'LATIN1', 'BIG5',));
if (0 != strcasecmp($encoding, $charset))
$data = mb_convert_encoding($data, $charset, $encoding);
}
return $data;
}
/**
* @param mixed $data
* @return array|mixed
*/
function ChangePostData($data)
{
switch (gettype($data)) {
case 'array': {
foreach ($data as $key => $value) {
$data[$key] = ChangePostData($value);
}
break;
}
case 'object': {
$array = (array)$data;
foreach ($array as $key => $value) {
$data->$key = ChangePostData($value);
}
break;
}
default: {
$data = preg_replace_callback('/\+/', function ($r) {
return '%2B';
}, $data);
$data = preg_replace_callback('/\&/', function ($r) {
return '%26';
}, $data);
break;
}
}
return $data;
}
/**
* @note 发送post请求
* @param string $url
* @param mixed $data
* @return string
*/
function SendPost($url, $data)
{
$data = http_build_query(ChangePostData($data));
$opts = array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n",
'content' => $data,
),
);
$context = stream_context_create($opts);
$ret = file_get_contents($url, false, $context);
$ret = trim($ret, "\xEF\xBB\xBF");
return $ret;
}
/**
* @note 从参数中过滤不需要的参数
* @param array|null $ignores 要过滤的参数列表(参数名)
* @param array|null $parameters 目标参数列表
* @return array
*/
function GetAttachParameters($ignores = null, $parameters = null)
{
$return = (array)(empty($parameters) ? $_REQUEST : $parameters);
if (!empty($ignores)) {
foreach ($return as $k => $v) {
if (in_array($k, $ignores))
unset($return[$k]);
}
}
return $return;
}
function GetClientAddress()
{
static $_ClientAddress = null;
if ($_ClientAddress !== null)
return $_ClientAddress;
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$List = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
/// 取X-Forwarded-For中第一个非unknown的有效IP字符串
foreach ($List as $Item) {
$Item = trim($Item);
if (strcasecmp($Item, 'unknown') != 0) {
$_ClientAddress = $Item;
break;
}
}
} elseif (isset($_SERVER['HTTP_CLIENT_IP']))
$_ClientAddress = $_SERVER['HTTP_CLIENT_IP'];
else {
if (isset($_SERVER['REMOTE_ADDR']))
$_ClientAddress = $_SERVER['REMOTE_ADDR'];
else
$_ClientAddress = '0.0.0.0';
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR'))
$_ClientAddress = getenv('HTTP_X_FORWARDED_FOR');
elseif (getenv('HTTP_CLIENT_IP'))
$_ClientAddress = getenv('HTTP_CLIENT_IP');
else
$_ClientAddress = getenv('REMOTE_ADDR');
}
preg_match('/[\d\.]{7,15}/', $_ClientAddress, $List);
$_ClientAddress = !empty($List[0]) ? $List[0] : null;
return $_ClientAddress;
}