2026-01-30 14:32:00


[photos]


[/photos]
[photos]

[/photos]


2026-01-23 16:48:57
少有的大夜班,凌晨的寒风贴脸,一碗胡辣汤暖去身上的寒气。

[photos]

[/photos]
*大雪,有个在湿地公园的定期风景,犹豫了好久要不要回去拍一张,ld说替我去拍,天气太冷,不舍,睡醒后开着小车慢慢的跑回去,顺便在做一些卤鸡蛋。
大雪下了半天,有些冬天的样子,随手拍了几张,便匆匆忙忙的回家,充电,做蛋,味道比上次好,毕竟实践是真理!*
[photos]

[/photos]
[photos]

[/photos]
发财商机,明年估计还会下大雪,提前买一些溜溜车,这玩意敢卖60。

2026-01-22 17:18:00
无聊的功能之一,有需要的可以尝试一下,豆包帮忙写的,登录会触发机器人推送消息。
1、增加注册事件与监听器
路径/app/Providers/EventServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Registered; // 补回原有事件
use Illuminate\Auth\Listeners\SendEmailVerificationNotification; // 补回原有监听器
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use App\Listeners\SendLoginNotification; // 登录提醒监听器
class EventServiceProvider extends ServiceProvider
{
/**
* 应用程序的事件监听器映射
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
// 原有:用户注册事件(补回)
Registered::class => [
SendEmailVerificationNotification::class,
],
// 新增:登录成功提醒(保留)
Login::class => [
SendLoginNotification::class,
],
];
public function boot(): void
{
//
}
public function shouldDiscoverEvents(): bool
{
return false;
}
}
2、增加文件SendLoginNotification.php
编写监听器逻辑
路径/app/Listeners/SendLoginNotification.php
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
class SendLoginNotification
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function handle(Login $event)
{
$user = $event->user;
try {
// 关键修改:将 username 改为 name(适配兰空图床字段)
$username = '未知用户';
if (isset($user->name) && !empty($user->name)) {
$username = $user->name;
}
$email = '未知邮箱';
if (isset($user->email) && !empty($user->email)) {
$email = $user->email;
}
// 已删除 $device 相关定义和赋值
$loginData = array(
'username' => $username, // 这里键名不影响,值已正确获取
'email' => $email,
'ip' => $this->request->ip(),
'ip_location' => $this->getIpLocation($this->request->ip()),
// 已删除 'device' => $device 字段
'time' => Carbon::now()->format('Y-m-d H:i:s'),
);
$this->sendDingTalkNotificationWithSign($loginData);
} catch (\Exception $e) {
$errUser = '未知用户';
if (isset($user->name) && !empty($user->name)) {
$errUser = $user->name;
}
Log::error("钉钉登录提醒执行异常:" . $e->getMessage() . ",用户:" . $errUser);
}
}
/**
* 钉钉加签提醒(兼容所有PHP版本)
*/
private function sendDingTalkNotificationWithSign($loginData)
{
try {
// ========== 替换为你的钉钉信息 ==========
$dingWebhook = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxx';
$dingSecret = 'SECxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// ======================================
// 生成加签参数(兼容写法)
$timestamp = time() * 1000;
$signStr = $timestamp . "\n" . $dingSecret;
$sign = base64_encode(hash_hmac('sha256', $signStr, $dingSecret, true));
$sign = urlencode($sign);
// 拼接链接
$finalDingWebhook = $dingWebhook . "×tamp=" . $timestamp . "&sign=" . $sign;
// 构造钉钉消息(用array而非短数组,兼容低版本)
$dingMessage = array(
'msgtype' => 'text',
'text' => array(
'content' => "【兰空图床登录提醒】\n" .
"——————————————\n" .
"用户名:" . $loginData['username'] . "\n" .
"登录IP:" . $loginData['ip'] . " (" . $loginData['ip_location'] . ")\n" .
// 已删除 登录设备 展示行
"登录时间:" . $loginData['time'] . "\n" .
"——————————————"
)
);
// 发送请求(兼容写法)
$response = Http::withHeaders(array('Content-Type' => 'application/json'))
->post($finalDingWebhook, $dingMessage);
// 验证响应(移除===,用==兼容)
if ($response->successful() && $response->json('errcode') == 0) {
Log::info("钉钉提醒发送成功,用户:" . $loginData['username']);
} else {
Log::error("钉钉提醒失败,响应:" . $response->body());
}
} catch (\Exception $e) {
Log::error("钉钉加签发送异常:" . $e->getMessage());
}
}
/**
* IP归属地查询(兼容所有PHP版本)
*/
private function getIpLocation($ip)
{
if (in_array($ip, array('127.0.0.1', '::1'))) {
return '本地网络';
}
try {
$response = Http::timeout(3)->get("http://ip-api.com/json/" . $ip . "?lang=zh-CN");
$data = $response->json();
if ($data['status'] == 'success') {
return $data['country'] . '-' . $data['regionName'] . '-' . $data['city'];
} else {
return '未知地区';
}
} catch (\Exception $e) {
Log::warning("IP归属地查询失败:" . $e->getMessage());
return '未知地区';
}
}
}
3、创建钉钉机器人获取地址和加签秘钥,配置到代码里面
log记录在/storage/logs里面

2026-01-16 05:17:35





2026-01-03 10:15:00


大水王颁给花非花
最多浏览量
➊ 自建字体分包服务之中文网字计划 (35687)
➋ Typecho机器人提醒插件-RobotPush(34619)
➌ Typecho订阅展示插件-RssFeed(30609)
➍ 乙巳蛇年-正月松声 (30204)
➎ 将监控摄像头对接到视频会议中(28743)
➏ 乙巳蛇年-四月末(28200)
➐ Typecho插件-LinkGo:外链转内链插件融合发布(27895)
➑ 乙巳蛇年-三月半(27867)
➒ 乙巳蛇年-五月半(26873)
➓ 乙巳蛇年-三月末(26140)
最多评论
㊀ 乙巳蛇年-十一月半 (92条评论)
㊁ 乙巳蛇年-十一月末(88条评论)
㊂ 武汉三日行(83条评论)
㊃ 自建字体分包服务之中文网字计划(83条评论)
㊄ 乙巳蛇年-九月末(82条评论)
㊅ 香山天坑和皇家驿站(82条评论)
㊆ 石漫滩二郎山半日游(81条评论)
㊇ 关于“我那不争气的老表”(81条评论)
㊈ 乙巳蛇年-四月末(77条评论)
㊉ 将监控摄像头对接到视频会议中(77条评论)
活跃评论者
⓵ 花非花 (55条评论)
⓶ 似水流年 (51条评论)
⓷ 刘郎 (43条评论)
⓸ ACEVS(42条评论)
⓹ 满心 (39条评论)
⓺ S(38条评论)
⓻ obaby (38条评论)
⓼ Teacher Du (33条评论)
⓽ 耳朵的主人 (33条评论)
⓾ 皇家元林 (32条评论)


目标不定了,写点有概率完成的计划
2026-01-01 07:19:00

[photos]

[/photos]
[photos]

[/photos]
[photos]

[/photos]
[photos]

[/photos]