月萌 https://blog.yuemoe.cn/ zh-CN 没有想念过什么,不曾期待着什么 Sat, 06 Jun 2020 22:20:00 +0800 Sat, 06 Jun 2020 22:20:00 +0800 QQ协议深度解析(一) https://134.122.130.49/512.html https://134.122.130.49/512.html Sat, 06 Jun 2020 22:20:00 +0800 乔千 介绍

本篇文章主要讲述PC QQ协议的入门和腾讯的迷惑操作
Warning:如果没有一定协议基础看此类文章会觉得很魔幻

注意:PC协议

UDP or TCP

QQ协议是分为UDP和TCP的,一般情况下我们以UDP为标准,因为官方也是大部分使用的UDP。

为什么会大部分使用UDP?UDP传输不是不可靠吗,那么我的消息不是会出现丢包,然后看似发出然后实际丢掉的情况?又或者因为非阻塞导致消息顺序异常?

噗,实际上腾讯也是不会这么傻的,于是在协议中整了点魔法,非常有意思的是原理类似的还有未来技术Http3(Quic) 颇有此番风味

魔法

那么刚刚说到的魔法是什么呢?
传统所谓的可靠性传输是基于网络传输协议层面
当然我们可以在应用协议层整点加个包序加个验证的hash或者返回一个包确认
噗 如果你没彻底了解tcp和udp 你可能会问 这种有什么用呢 感觉更麻烦了
实际上UDP不需要服务端握手 直接一次性完成 而且还是暴力型 不排队那种 完全不清楚谁先发出
然后我们的TCP就比较文明了 需要敲敲门 握几次手 还要排队进去 这样发出顺序很清楚
然后我们按照腾讯的方案是怎么样的
就是给UDP的包加个序号 然后让他们发出
这样包序就不会有问题了
关于不可靠性 仅需一个返回包或者一个hash校验就行。

正片开始

选择UDP 然后我们来理理腾讯的过程
xxxx包是指腾讯给每个命令一个特殊的标记 长度2字节
未指定服务器 解析腾讯域名 获取IP
0825包 发现 Say Hello
0826包 验证账号

0825包 一切的开始 均衡负载

点击登录的一瞬间会给服务器发一个0825包链接服务器
发这个包就问候服务器 Say Hello
问他能不能让我进去
如果不能,就告诉QQ 我不行了 人太多了 你去下家服务器 我告诉你那服务器 IP
okok 经过几次服务器的交接 我们找到一位能行的的服务器 接下来就发送账号和密码了(发送0826包)

提示

以下包为转载的 由于太忙
分析QQ请用工具抓包后hex(16进制)下分析
QQ和IP转16进制算法可自行百度
腾讯包以tea魔改算法加解密
版本号早已不同
包内有些固定的东西

0825 发送包

02 //包头 腾讯所有发送的数据包都是以这个开头

2F 35 //版本号 QQ版本不同。这个东西也会变

08 25 // 命令 首次跟服务器接触发送滴。。

4B B1 //序号 这个东东是随机的 。。。 随机生成这个就可以了。

39 80 8C 2C // QQ号的HEX 转换过来就是 964725804

03 00 00 00 01 01 01 00 00 65 A6 00 00 00 00 //这个是固定的。。具体啥么东西,不清楚

3E 59 4A DF 55 04 B1 AD 22 33 9F B3 E1 C3 CC D7 //这个是随机的tea key 软件里随机生成就可以
-------------------------------------------------------------------------------以下就是经过 tea key加密后的数据了

39 16 78 35 92 0F 3D 37 95 4C 7C C8 8E 26 5C E6
D4 D9 47 C0 EE 30 08 94 BE 08 AC 8C 14 C8 CD 1A
90 CF 7F 01 AE 8D 55 75 51 56 D9 A7 92 6B A0 C6
79 00 BF 99 47 06 8F 5C D9 2C 6B 97 C9 D4 AE 79
C1 31 1B AC A6 0E 5F 9C

----------------------------------------------------------------------------- 以下是经过tea key解密后的数据

00 18 00 16 00 01 //token1 固定的6的长度 这些后续的发包里需要用到。所以要记下来,好方便后面组合

00 00 04 11 00 00 00 01 00 00 12 91 //token2 固定的 12的长度

39 80 8C 2C //这个是QQ号

00 00 00 00 01 14 00 19 01 01 //固定的数据

00 15 //这个呢。下面数据大小 16进制的15 换成10进制就是21 下面刚刚好是21的长度

03 2A 37 9C 8E 0B 74 A2 F1 E5 47 56 0B 02 CE 2C D0 0A 83 9E D2 //这21的长度是随机的。随便生成


03 //包尾 腾讯所有发送的数据包都是以这个结尾

0825 返回包分析

02
2F 35
08 25
4B B1
39 80 8C 2C //前面的和上面的意思一样。这个是QQ的返回包

00 00 00 //用固定的 00 00 00隔开了

--------------------------------------------------------------------------------以下是加密数据,用发送的那个tea key解密

30 10 39 3F 8B 13 9F 79 36 24 8A 07 78 25 94 C7 2C 50
D1 2A 3D B1 54 5E 19 8C 93 EA 10 4E 5E 99 80 96
C0 D0 39 39 6C 14 D2 53 D9 35 C4 95 4A 3B 60 94
80 9C F8 B5 D9 8B DC 65 D6 3F C1 6C DA 10 4A A3
9A CC BA FB 98 44 6B B2 91 53 7F A8 94 A0 11 38
BB EA 8B 89 22 1B 51 94 87 1B 77 22 00 EE EB 43
EE E1 7B 9F 4F E0 F8 10 20 66 DC 97 E6 A5 EA D4
F4 DD 02 A5 3C CA
-------------------------------------解密出来的数据

FE // 服务器IP需要中转..。。。其实根据接收的数据包大小就可以知道。需要中转的话 接收的数据包是135的长度,不需要的话是111的长度

01 12 // 固定
00 38 //0038的token 38的10进制是56,下面56的长度后就可以是下一个命令了,这些数据在 0826包都需要

D8 62 09 42 21 5C FE 51 C6 E6 07 C6 0A 3A 2A 7F 7B 50 E0 86 A3 0F 7E 10 FB A4 04 E6 DA 6E 9B BF 19 CA 64 52 2E 27 FB B0 9C 68 A0 4F BA 6A EC 9B 24 F4 F3 14 BF A1 D8 5F

00 17 00 0E 00 01 //固定了

50 F2 C9 3F //这个是连接的时间 2013-01-13 22:48:31

7B B6 90 44 //偶的本机IP 123.182.144.68

BD 0B 00 00 00 0C 00 16 00 02 00 00 00 00 00 09 00 00 00 00

70 5A 54 65 //中转的服务器IP 112.90.84.101 这里把解密出来的IP地址直接放到socket的IP设置那里就可以了,

00 00 00 00 00 00
!---------------------------------------------------------
03 //包尾

0836包

那就下篇文章啦

]]>
2 https://134.122.130.49/512.html#comments https://134.122.130.49/feed/512.html
让动画更优雅–缓动算法 https://134.122.130.49/508.html https://134.122.130.49/508.html Sun, 24 May 2020 13:47:00 +0800 乔千 起因

有些人是那种又菜又爱玩的,比如说我,最近想写个主题,主题动画细节也是一个非常重要的地方,但是动画算法我太懒了,想直接抄过来,jq是有算法插件的,可是这带个jq,更自由的我,选择隔壁大佬推荐的Tween.js

Tween.js

Tween.js是一个包含各种动画算法的JS库,本来想自己写个的,但是不是说,既然有轮子何必重复造,实际上是自己太懒(我以前cpp还是写过类似的算法的 )。

动画效果


Linear:线性匀速运动效果;

Quadratic:二次方的缓动(t^2);

Cubic:三次方的缓动(t^3);

Quartic:四次方的缓动(t^4);

Quintic:五次方的缓动(t^5);

Sinusoidal:正弦曲线的缓动(sin(t));

Exponential:指数曲线的缓动(2^t);

Circular:圆形曲线的缓动(sqrt(1-t^2));

Elastic:指数衰减的正弦曲线缓动;

Back:超过范围的三次方缓动((s+1)t^3 – st^2);

Bounce:指数衰减的反弹缓动。

缓动方式

easeIn:从0开始加速的缓动,也就是先慢后快;
easeOut:减速到0的缓动,也就是先快后慢;
easeInOut:前半段从0开始加速,后半段减速到0的缓动。

如何使用

为了简单我讲解一下简单使用方法(二次封装后的使用)

  
   Math.animation(from, to, duration, easing, callback);

   from和to参数表示动画起始数值和结束数值
  
   duration为动画持续时间,默认300,默认单位是毫秒,建议使用数值,例如600,也支持带单位,例如600ms或者0.6s;

    easing为缓动的类型,字符串类型,源自Tween.js。例如:'Linear','Quad.easeIn','Bounce.easeInOut'等等,需要注意大小写。 其中,默认值是'Linear';

     callback为回调函数,支持2个参数(value, isEnding),其中value表示实时变化的计算值,isEnding是布尔值,表示动画是否完全停止。

比如我要使用缓动0-100 Bounce.easeInOut类型缓动

  Math.animation(0, 100, function (value) {
//value为缓动当前值
 ball.style.transform = 'translateX(' + value + 'px)';
  }, 'Bounce.easeInOut', 600);    

贴上作者博客

优点

不依赖任何jQuery, Zepto之类的JS(天生精简 干练小巧)

代码可读性性高(代码也是很简单的,难度极低 适合学习)

补习时间

 function(t, b, c, d) { 
 return c*t/d + b; 
  }

通常字母代表

  t: current time(当前时间)
  b: beginning value(初始值)
  c: change in value(变化量)
  d: duration(持续时间)

举个例子说我们要从位置0的地方运动到100,时间是10秒

b, c, d三个参数就已经确认了,b初始值就是0,变化值c就是100-0就是100,最终的时间就是10,此时,只要给一个小于最终时间10的值

Tween.Linear就会返回当前时间应该的坐标,例如,假设此时动画进行到第5秒,也就是t为5

这其实就是一个函数,用t和一些常量求出位置坐标的函数(如果你在初中数学学了一点点 那么这些都是很简单的)

又到了快乐的学习时间了

Download .End

TweenDown

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3btu62mvs06co

]]>
2 https://134.122.130.49/508.html#comments https://134.122.130.49/feed/508.html
数据库底层实现-B+树 https://134.122.130.49/475.html https://134.122.130.49/475.html Mon, 04 May 2020 22:15:00 +0800 乔千 B+树是一种应用广泛的树型数据结构,通常用于数据库(例如Mysql 但是k-v模型非关系库数据库是基于哈希表 比如redis memcached)和操作系统的文件系统中。
非常简单来的谈一下,或许听着很强,但是并不难。

核心算法

B+树查找

查找以典型的方式进行,类似于二叉查找树。
在节点内部典型的使用是二分查找来确定这个位置。

补充:二叉查找

二叉查找又名折半查找,顾名思义,就是分成两半比较。
也许这样你不能理解,这时候举个栗子就很有必要了。
我们来玩这个游戏
比如说有一个1-100的数字,我随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了,对了。

假设你第一次从1开始猜,小了

第二次:2 小了

第三次:3 小了

第五十九次:59 小了

第六十次:60 对了

这是参考思路之一,顺序遍历出答案。
这是简单的查找,每次猜测只能排除一个数字,如果我想的数字是100,那么你可能需要从1猜到100了!
那么有没有更好的查找方式呢?
答案很明显使用下面的操作

第一次:50 小了

你把100折成50

就可以判断这个数字在0-50 还是 50-100

第二次:75 大了

将剩下的继续折半

你可以

依次1/2分割结果可以得出答案,效率也是非常可观的,第一种需要猜测60次才能猜出正确答案,而使用第二种方式,只需要七次就能猜出正确答案,ohhhh,很强对不对。

果然程序员都是懒人 所以发明都这么懒

B+树插入

一颗 m 阶的 B+树
有 n 棵子树的结点中含有 n 个关键字;
在 B+树中每个结点中关键字个数 n 的取值范围为:⌈m/2⌉≤n≤m。

三阶B+树

例如这个就是三阶b+树
1、 若被插入关键字所在的结点,其含有关键字数目小于阶数 M,则直接插入结束;
例如,在上图 中插入关键字13,其结果下图 所示:

2、 若被插入关键字所在的结点,其含有关键字数目等于阶数 M,则需要将该结点分裂为两个结点,一个结点包含⌊M/2⌋,另一个结点包含⌈M/2⌉。同时,将⌈M/2⌉的关键字上移至其双亲结点。假设其双亲结点中包含的关键字个数小于 M,则插入操作完成。

例如,在刚刚三阶的基础上插入关键字 95,其插入后的 B+树下图所示:

3、在第 2 情况中,如果上移操作导致其双亲结点中关键字个数大于 M,则应继续分裂其双亲结点。
例如,在刚刚的三列树B+树中插入关键字 40,则插入后的 B+树下图所示:

注意:如果插入的关键字比当前结点中的最大值还大,破坏了B+树中从根结点到当前结点的所有索引值,此时需要及时修正后,再做其他操作。例如,在图 1 的 B+树种插入关键字 100,由于其值比 97 还大,插入之后,从根结点到该结点经过的所有结点中的所有值都要由 97 改为 100。改完之后再做分裂操作。
//脑子不太够用搬运大佬的

B+树删除

//待补充

后盐

有兴趣推荐一个网站,可视化学习算法,以前推荐过啦,今天翻出啦,热热还能吃

算法可视化

]]>
2 https://134.122.130.49/475.html#comments https://134.122.130.49/feed/475.html
未来滴画画大佬 https://134.122.130.49/473.html https://134.122.130.49/473.html Mon, 04 May 2020 08:52:00 +0800 乔千 五一假期的倒数第二天,翻到自己的画作,突然觉得还不错,感觉我又又又行了,突然又想画一篇,结果自己太菜,画砸了,以后分享吧,现在分享以前的。

后言

虽然画的不怎么样,但是我感觉能看了,感觉还是很不错的,虽然被隔壁朋友笑了半天,留在博客作为记录吧。

]]>
5 https://134.122.130.49/473.html#comments https://134.122.130.49/feed/473.html
一次都像刚刚开始那样 https://134.122.130.49/458.html https://134.122.130.49/458.html Sat, 02 May 2020 15:35:00 +0800 乔千 博客在本次将会进行彻底的升级啦
Handsome Miracle 固然不错 但也许换一种尝试也是不错,就像bootstrap确实漂亮,可久了就
觉得美腻了,就像美和好看并不一样。
再次寻找着那些以前所向往却又丢下的东西。

站点描述更新

没有想念过什么,不曾期待着什么。
描述的变更意味着意义的变更,我尝试从刚开始毫无意义的水文抽出 而记录更有意义的东西,记录不同的东西

站点图片优化

全站图片使用webp
图片压缩30%(对苹果浏览器进行了放弃支持)
来源 cdn.mumuli.cn
服务提供来自Mumuli Jsdelivr Github
苹果系列产品并不能很好支持该格式(但是本站已经全站webp处理)

全新的代码高亮

这个也是Miracle主题的一大问题,代码高亮属实着急,Shiyi来自hexo移植的单栏主题,并且对代码高亮支持了5种啦
解决了曾经我一直讨厌的问题

全新的翻页

Miracle 在曾经还存在着一个问题,翻页困难,一次一页,这或许有些低效,shiyi并不令人失望给我们整上了船新翻页

内容变化

除了技术的博文,以后将不单单写这些,博客记录的是自己,学习记录或者新鲜发现,又或者分享感情,安利文章 技术文章 生活文章 以后都会有

typecho底层修改

图片地址简化

图片地址简化

对PHP7.4的支持

我对PHP7.4进行了些许适配,使用了较为规范的代码,简写了部分代码 规范了一些报错

氪金

本次博客服务器组提升到了4台,采用了一主多从,数据同步并不需要(附件通过github提供支持)
服务器位于HK延迟比较好看,(隔壁嫖了2台15元 2c2h3m 然后用了自己几台机器)

后盐

就如刚刚开始那样 我希望能像那时候的自己,
本次进行了微调,速度上反而可能下降(我加了一堆组件) 不过总体来说肯定是不错的啦,做到了不杂不乱
我以后大概是1–3周1更啦

]]>
7 https://134.122.130.49/458.html#comments https://134.122.130.49/feed/458.html
PHP渗透基础入门其一 https://134.122.130.49/437.html https://134.122.130.49/437.html Thu, 30 Apr 2020 20:22:00 +0800 乔千 利用一些方法使某些不应该返回的数据返回或者执行某种不该执行的命令,这个过程就叫注入,这里有个很简单的事例

提示:了解Mysql和php可能更容易理解
那我们来举个例子:
这个语句拼接方式如下

 $sql='select * from users where userName='$userName' and password='$password'; 

逻辑来源

代码逻辑(建议阅读)来自: https://blog.csdn.net/qq_39630587/article/details/79768838

假如我们想登录username为1的用户
我们应该怎么构建的sql语句???
如下例子

 select * from users where userName=1 and password=正确密码 

   select * from users where userName=1

俩种代码等效

当然我们不知道正确密码我们可以试试第二种怎么实现。
那么我们又不是去提交sql给后端 那么参数会被处理
我们看看后端代码

    <?php include_once("function/database.php"); 
   // $userName = $_POST['userName']; 
 // $password = $_POST['password'];       $userName = addslashes($_POST['userName']); 
  $password = addslashes($_POST['password']); getConnect(); 
 $loginSQL = "select * from users where userName='$userName' and password='$password'"; ..... 

(省略 )我们提交的账户就是变量 userName 密码就是变量 password
但是这里使用addslashes函数(函数过滤了 单引号(’)双引号(")反斜杠())
呵???那么我们可以名正言顺的屏蔽 and password=xxx
注释我们可以使用/**/ 这样可以绕过过滤
username填写 1/*
password */
然后就成功啦

加强方案

1.替换参数各种敏感字符(# ’ or and 等) 仅仅用addslashes函数是不安全的 保证参数的安全

2.使用pdo分两次发生sql语句 99.9%的安全 其中不安全原因来自于配置问题进行编码边缘操作
提示

现在程序的php sql注入几率很小,加上如果使用pdo 就基本不可能了

]]>
5 https://134.122.130.49/437.html#comments https://134.122.130.49/feed/437.html
typecho设置cdn实现全站加速 https://134.122.130.49/413.html https://134.122.130.49/413.html Mon, 13 Apr 2020 20:05:00 +0800 乔千 使用普通的CDN来进行白嫖实在不够刺激,很多对象储存都有免费额度,我们使用回源机制,把这个当成CDN来给网站加速,效果还是很不错的

如何设置静态资源加速cdn

一、开启CDN

如果你是typecho你可以使用本站gitstatic插件,也可以使用cos/oss等等实现静态资源加速
但是一定得开启回源(如果不懂什么是回源可以看下 腾讯云cos回源)

二、具体步骤

1.新增定义

打开typecho根目录下的config.inc.php,(看清楚不是主题目录,是网站的主目录),在首行的<?php后添加以下代码:

  /* 定义插件cdn目录(相对路径) */    define('__TYPECHO_CDN_DIR__', '你的cdn绑定域名/'); 

2.修改相关代码

接着打开var/Widget/Options.php,大概第160行左右,找到以下代码:

   protected function ___themeUrl() { 
   return defined('__TYPECHO_THEME_URL__') ? __TYPECHO_THEME_URL__ : Typecho_Common::url(__TYPECHO_THEME_DIR__ . '/' . $this->theme, $this->siteUrl); } 
    /** * 获取插件路径 * * @access protected * @return string */ 
     protected function ___pluginUrl() {
     return defined('__TYPECHO_PLUGIN_URL__') ? __TYPECHO_PLUGIN_URL__ : Typecho_Common::url(__TYPECHO_PLUGIN_DIR__, $this->siteUrl); } 

替换成:

    protected function ___themeUrl() { 
   return       defined('__TYPECHO_THEME_URL__') ?   __TYPECHO_THEME_URL__ : Typecho_Common::url(__TYPECHO_THEME_DIR__ . '/' . $this->theme,__TYPECHO_CDN_DIR__); } 
      /** * 获取插件路径 * * @access protected * @return string */ 
    protected function ___pluginUrl() {
    return defined('__TYPECHO_PLUGIN_URL__') ? __TYPECHO_PLUGIN_URL__ : Typecho_Common::url(__TYPECHO_PLUGIN_DIR__,__TYPECHO_CDN_DIR__); } 

3.大功告成
由于缓存原因,多刷新一下下,然后检查js/css就会变成cdn的URL了

后言

由于本站高亮代码排版有问题 可以参照原文
参考文档

]]>
9 https://134.122.130.49/413.html#comments https://134.122.130.49/feed/413.html
对(易语言)中文编程的看法 https://134.122.130.49/408.html https://134.122.130.49/408.html Mon, 13 Apr 2020 18:40:00 +0800 乔千 一直不温不火的中文编程,一直要的自主化究竟是怎么样呢?偶然在知乎看到问题,于是我把回答复制到了博客。

前言

为什么大多数人吧鄙视中文编程–最近看到知乎的一篇问题,拿出来在这里吧。

讨论

易语言为什么被鄙视?这是正常的,就像用知乎鄙视贴吧一样,当然这些有一定道理也有一定缺陷。

1.10年前的界面

你说这样的界面能对比吗?
1586774331484.webp
1586774333283.webp
易语言高大上什么全无,UI就像vb6.0(微软弃坑了 这算一个被淘汰的概念 可是化编程),虽然外观不能绝对什么,但是也侧面翻译语言的繁荣与否

2.代码可读性和逻辑实际混乱

变量和参数居然是使用表格展示(不同于用文字定义变量 而是类似excel表格 填写定义变量)
等等先查查作者,制表狂魔,好好
变量 文本=xxx 这种格式
不用 用表格???? 好吧好吧 你喜欢就好
(这种会使源码无可读性 无ide环境)

3.开发的东西大部分触及灰色地域

使用它开发软件一般都是灰色(黑产),当然还有写小工具(这个没什么问题)

易语言破解版

为什么横行 本身易语言价格就600多 还与第三方串通卖教程
其实圈里有一群人就是想把小白引入这个坑,出什么教程贵的要命,还教不出什么,这不就是跟虚假培训机构一样,跟速成班没俩样,教程和这些加起来2000起步(吓人吧)
易语言作者本身就是个鸽子,说鸽子是因为易语言官网上的产品是真的多,教育方面也不乏,易语言飞扬 什么游戏引擎 ,都是不温不火,最近又去开发火山移动开发平台了
5.0之后的版本我是没见过实际性更新 (本身根本性问题太多)然而问题堆成山 却毫无改进

4.ide的bug和低效模块支持库

一个好的ide至少不要让我看见日常都要崩溃啊,你一个bug直接一下午写的代码全部丢失
还有可能出现无法修复的错误,源码结构错误

导致有些大佬萌新时候用着易语言,绝定换一个语言,如果修道成功,这不就一脸嫌弃易语言了,又贵又不好用 环境还差。

易语言有fne fnr后辍的支持库(类似于头文件 主要是这个结构就是个魔改dll)居然在独立编译后还要携带,我的天,这不就爆炸了吗,我用其它语言写一个好用他不香

5.不能协同开发和安全软件报毒

这个腾讯和易语言的事建议百度(腾讯tp会针对易语言环境破坏 原因:易语言大多灰产 对腾讯游戏破坏平衡 所以俩对干)
易语言本身源码封闭 封闭到什么程度 源代码离开易语言环境 啥都看不懂 一堆二进制(源码格式为二进制 刚刚给大家说了表格原因 和 一些其它原因) github丢上去 根本无法进行版本迭代

6.大量现代特性不支持

具体是
不支持 fastcall
不支持x64
甚至连Unicode都不支持
你在易语言内普通方式是无法显示韩文之类的Unicode
(这个不支持x64你这个语言就太...)
类也是鸡类(肋) 完全比不上真正的现代编程语言
链接器都是c的(悄悄逼逼 但是编译器是自己的)

7.魔鬼语法
赋值和判断居然都是= 这不就是大坑
你之后学其它语言后 你会情不自禁的把==打成=
这就那啥了

8.优点

优点还是有的 适合国人逻辑 开发周期短 易于理解逻辑 但是谨慎入坑 其它易上手的也是不错的

如果真心想学编程入坑后可以迅速学习主流语言
我身边也有友人在用,ide不是重要的,语言也是,重要的编程思维和逻辑,如果这些你懂,那么脱离易语言拥抱主流你会感受到utf8和无数轮子的舒适感

]]>
3 https://134.122.130.49/408.html#comments https://134.122.130.49/feed/408.html
腾讯官方可编程机器人 (该怎么折腾呢) https://134.122.130.49/403.html https://134.122.130.49/403.html Mon, 13 Apr 2020 17:45:00 +0800 乔千 腾讯推出了内测的webhook机器人,这件事其实预见性就知道了,只是最近没想到出来了,钉钉和一些就支持webhook实现机器人,腾讯跟进还是比较有意思的

find robots

在手机QQ内打开
1.打开链接

https://web.qun.qq.com/qunrobot/data.html?robot_uin=2854196399&_wwv=128&_wv=3
2.添加QQ
机器人:2854196399
//这是腾讯官方的机器人

api key在开启消息推送后可以获取

操作


写了PHP类进行推送 使用也非常简单

  
 <?php
  class hook_robot {
public static $robot_key;
function __construct($key) {
    self::$robot_key=$key;
}
public static function send_message($type = 0,$data) {
    self::Http_Request("https://app.qun.qq.com/cgi-bin/api/hookrobot_send?key=".self::$robot_key,array("content"=>array(array("type"=>0,"data"=>$data))));
}
private static function Http_Request($url, $data, $json_transfer = 1) {
    if ($json_transfer == 1) {
        $data = json_encode($data, JSON_UNESCAPED_UNICODE);
    } else if ($json_transfer == 2) {
        $data = urldecode(json_encode($data, JSON_UNESCAPED_UNICODE));
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $status = curl_exec($ch);
    curl_close($ch);
    $res = json_decode($status, true);
    return $res;
}
  }
  new hook_robot("xxxxx");
  hook_robot::send_message(0,"msg test");

play with robots


可以看到能够发送消息了
那么他能做什么呢?
很明显功能只有消息发送 不能接收消息

后言

我们可以进行评论消息推送或者rss订阅
目前webhook还在测试阶段 不知道腾讯何时会放出一个完整版 估计可玩性非常大吧

目前

腾讯已经悄悄下线该机器人

]]>
5 https://134.122.130.49/403.html#comments https://134.122.130.49/feed/403.html
PHP开发小技巧 https://134.122.130.49/398.html https://134.122.130.49/398.html Mon, 13 Apr 2020 16:05:00 +0800 乔千 最近接触了typecho 所以PHP肯定就离不开手了
这里记录一些平常开发的一些小技巧

莫名的用户bug

不要只处理error,而忽略warning和notice,这可能会导致日后的莫名其妙的问题,项目在开发状态下应该是error_reporting( E_ALL  ^  E_NOTICE ),等到发布的外网生产环境时,应关闭所有错误报告display_errors=Off,error_reporting(0)
这样好处有很多 避免输出一堆notice 同时规范了你的语法习惯

echo printf

echo效率比printf高
而且支持多重参数,用逗号进行隔开
例如
echo $d1,$d2;

变量函数

例如一堆函数 进行图片转换 提供的接口是
类似 img_jpgtopng格式的函数
我们只需要
$temp_func="img_".$ex_in."to".$ex_to;
$temp_img=$temp_func();
当然函数是否存在也是需要判断 但是这种方法可以避免大量无用的switch或者if

偷懒和速度操作文件

在可以用file_get(put)_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get(put)_contents,因为它的效率高得多。

引入文件觉得路径

不管是 include还是什么函数引入文件使用绝对路径比使用相对路径引用速度高
因为这样可以减少PHP目录搜寻时间
当然这点速度也许无用 但是在层层引用中导致工作目录变化 相对路径会炸的

引用细节

   function load_class($class_name) { //path to the class file $path = ROOT . '/lib/' . $class_name . '.php'); require_once( $path ); }

如果你一个个引用我觉得有点原始人的操作了 使用函数辅助引用 可以增加代码可读性 害

保留调试代码

在开发环境中, 我们打印的各种调试信息, 而一旦问题解决, 我们注释或删除它们. 然而更好的做法是保留调试代码,设计一个常量保存是否为debug模式 是的话就启用调试代码 这样的好处当然有的 方便后续调试 包括用户上报bug 之类

爱上多元操作

多元操作避免大量成块状的if else代码
这样能够提高代码可读性
例如
isset($img_file)?webp():fopen();
这样能将三行代码简单压缩到一行
利用好运算符有时候能使代码更加精简

利用逻辑运算符和if实际例子

  <?php 
function authorized($username, $page) {
if (!isBlacklisted($username)) {
if (isAdmin($username) ||       isAllowed($username, $page)) {
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}
?> 

这段代码显然鸡肋了 我们只需要

   
    <?php
  function authorized($username, $page) {
  return (!isBlacklisted($username) &&    (isAdmin($username) || isAllowed($username,       $page));
  }
 ?>

是不是一个非常简单,将一个臃肿的函数压缩到只剩return

 完全理解魔术方法

如果你并不能理解魔术方法 使用这种花哨的操作在线上,刀剑上的舞蹈,改天就被rm删库

一些小细节

$row[’id’] 的速度是$row[id]的7倍。

如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time(),这是PHP官方提供的一个全局变量。

总结

逻辑要灵活,高效优质的代码才能写出来

]]>
4 https://134.122.130.49/398.html#comments https://134.122.130.49/feed/398.html