您正在查看: 标签 php 下的文章

Laravel 图床与颜值检测结晶

前要

本人曾经发过这样两个帖子

检测颜值包,基于微软小冰 以及 用 Laravel 写了一个图床网站

项目

HanSon/faceHanSon/img

如今终于两个项目结合在一起了 体验传送门

效果图

穿衣风格效果图(会在新窗口弹出,记得在浏览器允许):

file

file

file

file

file

小结

因为微软小冰曾经做过一次升级,导致 SDK 暂时不可用,今天也花了点时间修复并且结合在图床中,图床代码大家看看就好,没有过多的优化。

图床有很多不足,只是一个 demo 级别的项目,例如图片大小都没有控制,仅仅娱乐,大家不要玩坏了。

微信机器人 Vbot 2.0

Github: https://github.com/HanSon/vbot
文档: http://create.hanc.cc/vbot (为了保护大家的眼睛,还故意去做了个看似高大上的官网)

Vbot 是什么?

Vbot 是一个基于 web 的 php 7 微信机器人。你还可以通过开启 Swoole 去搭建自己的微信网页端。

Vbot 能做什么?

具体的例子可参考以前的帖子: https://laravel-china.org/articles/4146/personal-micro-signal-group-control-robot

2.0 的亮点

  • 稳定执行(对 API 异常进行捕捉忽略)

  • 通过 Swoole 支持 Web API

  • 丰富的监听器,能够在程序各个阶段做好各自的自定义处理

  • 代码重构,结构更加优雅

Vbot Vs Other

大家选择 Vbot 最主要的原因是 Vbot 基于 PHP 开发,这让以前写微信机器人的 PHPer 不用再去接触 Python 的版本。对比其他版本的微信机器人来说,Vbot 无疑是最全面的微信机器人,从杂乱无章的 XML 中帮大家分好了多种消息类型。也加了多种监听器方便去实现自定义的功能。
file

感谢大家

在版本 1 发布截至至今已经 5 个月了,期间 Vbot 得到大家的大力支持, 1k 多 star 以及 1k 多的打赏金额,以及 优帆远扬 和 鸟哥的特殊支持。

file

说在最后

很高兴 Vbot 能够成为我的成名作,始于 Vbot,不终于 Vbot,世界那么大,我要继续撸。我还会继续去撸更加多的开源项目,希望大家多多支持。

历史贴:
PHP7 版本的微信机器人来了!
个人微信号群管理机器人

检测颜值包,基于微软小冰

最近的对比发现微软小冰的颜值检测比较科学,而且还真能识别到一些名人,感觉不错,便做成了一个包

项目地址:https://github.com/HanSon/face

抓包地址:http://kan.msxiaobing.com

例如其中一个效果

file

这个包提供了5个检测的方式

  • 颜值

  • 最受欢迎

  • 买单

  • 穿衣风格

  • 关系

由于原链接有一些是通过 JS 生成的一些标签,所以要显示到图片上还是有点难度,不排除以后实现或不实现。

BTW, 之后会把这个颜值检测加到我的图床上面去 http://img.hanc.cc

用 Laravel 写了一个图床网站

file

项目地址: https://github.com/HanSon/img

体验地址: http://img.hanc.cc/

抽了一天时间写了这个基于 https://sm.ms/ 的图床小站,尽管说是用 laravel ,但是后端几乎没有什么工作量,大概也就20行的后端代码,几乎都是前端的工作为主。

前端主要了解了 drag & drop 以及 clipboard 这个库。

纯粹闲的蛋疼

file

给你的网站加上公众号消息模板异常提醒吧

Laravel 拥有非常好的异常处理机制,所有的异常都会经过 App\Exceptions\Handlerreport 方法进行处理( 查看详情 )。

然而我所见过大部分公司或者组织,都没有很好的查看日志习惯,以至于有可能有一堆错误日志或者影响用户体验的地方却没有发现。

你可以选择邮件通知你的网站异常

public function report(Exception $exception)
{
    // 你也可以选择短信通知,土豪随意
    Sms::send($phone, [$exception]);
    // 比较传统的通知方式
    Mail::to($request->user())->send(new ExceptionNotify($exception));
    return parent::report($exception);
}

- 阅读剩余部分 -

Speedy - 简洁灵活的 Laravel 管理后台

Speedy是基于 vue2 + bootstrap 的 laravel 管理后台,能够快速开发好一个权限后台,而且能够非常方便的生成一级或者二级菜单。

项目地址: https://github.com/HanSon/speedy

欢迎前来 star 以及提 issue !

file

安装

composer require hanson/speedy

- 阅读剩余部分 -

laravel5.3的bug 无法在一个项目中使用多个同一数据库驱动

最近做项目掉进一个深坑,以至于一个小问题烦恼我两天以至于怀疑人生。

新项目需要连接两个mysql数据库,然而却出现无论如何也查询不了第二个数据库的情况。

经历了多次断点调试,google无止境搜索,询问印度阿三无果的情况下,也只能查看源码解决问题了。

最终发现在laravel的ConnectionFactory类的createConnection方法中有这么一段

protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
    if ($this->container->bound($key = "db.connection.{$driver}")) {
        return $this->container->make($key, [$connection, $database, $prefix, $config]);
    }

    switch ($driver) {
        case 'mysql':
            return new MySqlConnection($connection, $database, $prefix, $config);
        case 'pgsql':
            return new PostgresConnection($connection, $database, $prefix, $config);
        case 'sqlite':
            return new SQLiteConnection($connection, $database, $prefix, $config);
        case 'sqlsrv':
            return new SqlServerConnection($connection, $database, $prefix, $config);
    }

    throw new InvalidArgumentException("Unsupported driver [$driver]");
}

$this->container->bound($key = "db.connection.{$driver}") 通过driver去跟容器做了绑定,也就是当你有第二个一样driver的数据库时,调用 $this->container->make()方法也会同样返回第一个绑定的 connection,这样无论如何也只能查询第一个了。

修改后

if ($this->container->bound($key = "db.connection.{$driver}.{$config['name']}")) {
    return $this->container->make($key, [$connection, $database, $prefix, $config]);
}

通过传入connection自定义的名称,能够避免重复

只可惜我提PR时对方表示5.3不作bug修复,很诧异。。。

PR在此
issue在此

微信一键自动拜年脚本

项目链接 https://github.com/HanSon/vbot

git clone https://github.com/HanSon/vbot.git
cd vbot
composer install
php example/bainian.php

此脚本可以对有设置备注名称的联系人进行发送,适用于备注名为真实姓名的联系人,同时可以设置白名单或者黑名单或者其他情况进行发送。

use Hanson\Vbot\Foundation\Vbot;
use Hanson\Vbot\Message\Entity\Text;

$robot = new Vbot([
    'tmp' => __DIR__ . '/./../tmp/',
    'debug' => true
]);

$robot->server->setCustomerHandler(function () {
    $whiteList = ['some remark name...', 'some remark name...'];
    $blackList = ['some remark name...', 'some remark name...'];
    contact()->each(function($item, $username) use ($whiteList, $blackList){
        // 发送白名单
        if($item['RemarkName'] && in_array($item['RemarkName'], $whiteList)){
            Text::send($username, $item['RemarkName'] . ' 新年快乐');
        }
        // 黑名单不发送
//        if($item['RemarkName'] && !in_array($item['RemarkName'], $blackList)){
//            Text::send($username, $item['RemarkName'] . ' 新年快乐');
//        }
        // 全部人发送
//        if($item['RemarkName']){
//            Text::send($username, $item['RemarkName'] . ' 新年快乐');
//        }
    });
    exit;
});

$robot->server->run();

当然,这只是一种娱乐方式,别过于执着,不喜勿喷

Vbot微信机器人,全自定义的灵活机器人

Vbot是基于微信web API实现的机器人,通过实现匿名函数能够实现多种自定义的效果

例如:

  • 消息转发

  • 红包提醒(有点鸡肋)

  • 留言统计

  • 自定义回复

  • 防撤回

  • 特殊关键词触发事件

等等,这里就不一一列举,可以参考 详细例子

安装

composer require hanson/vbot

使用

require_once __DIR__ . './../vendor/autoload.php';

use Hanson\Vbot\Foundation\Vbot;

function reply($reply){
    return http()->post('http://www.tuling123.com/openapi/api', [
        'key' => 'your tuling api key',
        'info' => $reply
    ], true)['text'];
}

$robot->server->setMessageHandler(function ($message) {
    // 文字信息
    if ($message instanceof Text) {
        // 联系人自动回复
        if ($message->fromType === 'Contact') {

            return reply($message->content);
            // 群组@我回复
        } elseif ($message->fromType === 'Group' && $message->isAt) {
            
            return reply($message->content);
        }
    }
});

$robot->server->run();

项目地址:https://github.com/hanson/vbot

文档地址:https://github.com/HanSon/vbot/wiki

欢迎大家提交issue和PR让vbot更加完善

也可以加我刚新建的QQ群进行交流:492548647

laravel 中 Facades的原理以及代码剖析

Facades

原理

In the context of a Laravel application, a facade is a class that provides access to an object from the container. The machinery that makes this work is in the Facade class. Laravel's facades, and any custom facades you create, will extend the base Illuminate\Support\Facades\Facade class.

A facade class only needs to implement a single method: getFacadeAccessor. It's the getFacadeAccessor method's job to define what to resolve from the container. The Facade base class makes use of the __callStatic() magic-method to defer calls from your facade to the resolved object.

简单来说,门面是通过一个魔术方法__callStatic()把静态方法映射到真正的方法上。

本文我们用Route来举例,

Route::get('/', function(){
    # 
}

- 阅读剩余部分 -