分类 PHP 下的文章

PHP 获取 QQ群 bkn 参数

由于项目需求,需要获得 QQ 群成员的信息,所以便使用 Google 找到了这个开源项目:

GitHub 项目地址:https://github.com/nasaplayer/getCurrentQQGroupList

由于我只需要 bkn 的计算代码,所以我就提取出来了

这个计算方法的位置在:https://github.com/nasaplayer/getCurrentQQGroupList/blob/master/v3/getCurrentQQ.class.php
第 177 行
<?php

$skey = '@ziDp00luu';//这个 skey 总知道获取吧,不再累述
echo getBkn($skey);//正常的话,输出的是:500891986

//计算 bkn
function getBkn($skey) {
    $hash = 5381;
    for ($i = 0, $len = strlen($skey); $i < $len; ++$i){
        $hash +=($hash << 5) + charCodeAt($skey, $i);

    }
    return $hash & 2147483647;
}

function charCodeAt($str, $index){
    $char = mb_substr($str, $index, 1, 'UTF-8');
    $value = null;
    if (mb_check_encoding($char, 'UTF-8')){
        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
        $value = hexdec(bin2hex($ret));
    }
    return $value;
}

PHP 中文域名转码/编码 | 将 Unicode 域名转换为 IDNA ASCII 兼容格式

首先需要安装 Intl 扩展

  1. 如果你服务器装了宝塔面板,相应的 PHP 版本中,安装扩展(不会的自己百度
  2. 如果不是,请自己 Google、Bing、Bing 吧

使用

  1. 对域名编码 | 将 Unicode 域名转换为 IDNA ASCII 兼容格式

    <?php
    //如果你的 PHP版本 大于等于 7.2,必须用这个
    //因为我懒得在 PHP版本 小于 7.2 测试,所以不知道可不可行,行的话用这个
    echo idn_to_ascii('人民网.中国',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46);
    //输出结果:xn--gmq282eogn.xn--fiqs8s
    
    //如果你的 PHP版本 小于 7.1 用这个
    //PHP 大于等于 7.2 不要用这个!详情看:https://nowtime.cc/php/505.html
    echo idn_to_ascii('人民网.中国');
    //输出结果:xn--gmq282eogn.xn--fiqs8s
  2. 对域名解码 | 将 IDNA ASCII 兼容格式域名 转换为 Unicode 格式域名

    <?php
    //如果你的 PHP版本 大于等于 7.2,必须用这个
    //因为我懒得在 PHP版本 小于 7.2 测试,所以不知道可不可行,行的话用这个
    echo idn_to_utf8('xn--gmq282eogn.xn--fiqs8s',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46);
    //输出结果:人民网.中国
    
    //如果你的 PHP版本 小于 7.1 用这个
    //PHP 大于等于 7.2 不要用这个!详情看:https://nowtime.cc/php/505.html
    echo idn_to_utf8('xn--gmq282eogn.xn--fiqs8s');
    //输出结果:人民网.中国

PHP 报错:idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated

由于项目的需要,需要对中文域名转码(将 Unicode 域名转换为 IDNA ASCII 兼容格式),Google 查到使用 idn_to_ascii 函数可对中文域名(Unicode 域名)转换为 IDNA ASCII 兼容格式

我在 PHP 7.2.1 下运行 echo idn_to_ascii('人民网.中国'); 出现了一下错误

[root@izwz9a76txemslg5q0e3zaz ~]# php -v
PHP 7.2.11 (cli) (built: Nov  2 2018 09:15:43) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologie

[root@izwz9a76txemslg5q0e3zaz ~]# php -r "echo idn_to_ascii('人民网.中国');"
PHP Deprecated:  idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in Command line code on line 1

Deprecated: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in Command line code on line 1

- 阅读剩余部分 -

PHP 判断是否为域名|判断是否为正确格式的域名

PHP 判断是否为域名|判断是否为正确格式的域名

!!!注意这代码判断的是域名,不是 URL!!!

因为项目有需求,首先想到去 Google 搜,翻了几页,未找到能满足自己需求的代码,所以自己动手造了个轮子

要想判断一个域名格式是否正确,得先知道域名是由哪些字符串组成的

Google 查阅了一些资料,得出一下要求

PS:在下述中,“域名” 所指的是,如 nowtime.cc 中的 nowtime

  1. “域名” 只能由 大小写字母数字- 组成
  2. “域名” 不能以 - 开头或结尾
  3. “域名” 每段长度最小 1 位,最长 63 位(不包含 “域名后缀”,以 . 分段)
  4. “域名总长度” 不能超过 255 位(不包含域名后缀;不包含 .

知道要求后,就可以开始造轮子了,然后就有了以下代码:(注意这代码判断的是域名,不是 URL)

- 阅读剩余部分 -

PHP 获取真实用户 IP 地址

PHP 获取用户(客户端)真实 IP(IPv4)

1.当使用了 CDN负载均衡 ...后,导致使用 $_SERVER['REMOTE_ADDR'] 获取不到用户的真实 IP

2. 当用户使用了“匿名代理”,$_SERVER['REMOTE_ADDR'] 将显示代理服务器的IP

因为业务的需要,我们就需要获取用户的真实 IP 进行业务上的操作

<?php
//获取用户真实IP
function getIp() {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else
        if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else
            if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
                $ip = getenv("REMOTE_ADDR");
            else
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
                    $ip = $_SERVER['REMOTE_ADDR'];
                else
                    $ip = "unknown";
    return ($ip);
}

echo getIp();//输出真实 IP