首页
壁纸
统计
友联
留言
Search
1
飞牛NAS社区自动打卡签到
31 阅读
2
飞牛NAS部署宝塔面板
19 阅读
3
Deepin V25安装 1Panel启动失败的问题修复办法
16 阅读
4
Debain终端语言报错问题解决办法
13 阅读
5
123云盘资源分享链接
13 阅读
飞牛Nas
青龙面板
编程开发
Python
Java
Go
PHP
JavaScript
Typecho
系统问题
Linux
Windows
Debain
Deepin
资源分享
登录
/
注册
Search
标签搜索
飞牛NAS
Python
宝塔面板
PHP
函数
Linux
Docker
青龙面板
JavaScript
Typecho
伪静态
Nginx
Debain
123云盘
123Pan
资源
Deepin
1Panel
Windows
Xbox Game Bar
AiWeiYi
累计撰写
14
篇文章
累计收到
1
条评论
首页
栏目
飞牛Nas
青龙面板
编程开发
Python
Java
Go
PHP
JavaScript
Typecho
系统问题
Linux
Windows
Debain
Deepin
资源分享
页面
壁纸
统计
友联
留言
搜索到
14
篇与
的结果
2025-03-27
我的一些常用的PHP函数
<?php // 应用公共文件,内置主要的数据处理方法 use Jenssegers\Agent\Agent; use think\facade\Cache; use think\facade\Config; use think\facade\Db; use think\facade\Request; function error_page_data() { return array( 'site_title' => get_system_config('site_title'), 'site_keywords' => get_system_config('site_keywords'), 'site_description' => get_system_config('site_description'), 'site_mail' => get_system_config('site_mail'), 'site_qq' => get_system_config('site_qq'), 'site_beian' => get_system_config('site_beian'), 'site_copyright' => get_system_config('site_copyright'), 'title' => "页面错误" ); } /* * 随机生成订单号 */ function get_orderid() { return date('YmdHis') . rand(10000000, 99999999); } /* * 随机字符串,默认长度10 * $num 长度 */ function get_string($num = 10) { $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'; $salt = substr(str_shuffle($str), 10, $num); return $salt; } /* * 判断访客是否是蜘蛛 */ function is_robot($except = '') { $ua = strtolower($_SERVER ['HTTP_USER_AGENT']); $botchar = "/(baidu|google|spider|soso|yahoo|sohu-search|yodao|robozilla|AhrefsBot)/i"; $except ? $botchar = str_replace($except . '|', '', $botchar) : ''; if (preg_match($botchar, $ua)) { return true; } return false; } /* * 判断是否是手机浏览器 */ function is_mobile() { if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) { return true; } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) { return true; } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { return true; } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) { return true; } else { return false; } } /** * @param $email * @return bool */ function is_email($email) { $chars = "/^([a-z0-9+_]|-|\\.)+@(([a-z0-9_]|-)+\\.)+[a-z]{2,6}\$/i"; if (strpos($email, '@') !== false && strpos($email, '.') !== false) { if (preg_match($chars, $email)) { return true; } else { return false; } } else { return false; } } /** * @param $phone * @return bool */ function is_phone($phone) { $chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$|17[0-9]{1}[0-9]{8}$/"; if (preg_match($chars, $phone)) { return true; } return false; } /** * @param $ip * @return false|mixed|string * 获取IP的详细地址 */ function get_ip_city($ip) { /* http://opendata.baidu.com/api.php?query=116.179.32.80&co=&resource_id=6006&oe=utf8 https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=116.179.32.80&co=&resource_id=6006&oe=utf8 */ $url = 'https://whois.pconline.com.cn/ipJson.jsp?json=true&ip='; $city = get_curl($url . $ip); $city = mb_convert_encoding($city, "UTF-8", "GB2312"); $city = json_decode($city, true); $location = $city['city'] ? $city['pro'] . $city['city'] : $city['pro']; return $location ?: $city['addr']; } //设置缓存 function set_cache($key, $value, $date = 86400) { Cache::set($key, $value, $date); } //读取缓存 function get_cache($key) { return Cache::get($key); } function clear_cache($key) { Cache::clear($key); } function get_system_config($name) { $content = ''; $type = Db::name('config')->where('name', $name)->value('type'); if ($type) { // 如果存在缓存则优先读取缓存 if (get_cache('system_config_' . $type)) { $array = get_cache('system_config_' . $type); } else { $array = Db::name('config')->field('name,content')->where('type', $type)->order('id asc')->select()->toArray(); set_cache('system_config_' . $type, $array); } foreach ($array as $value) { if ($value['name'] == $name) { $content = $value['content']; break; } } if ($content) { return $content; } else { return ''; } } else { return ''; } } //生成一个不会重复的字符串 function make_token($type = 1) { $str = md5(uniqid(md5(microtime(true)), true)); $str = sha1($str); //加密 if ($type == 1) { $str = strtoupper($str); } return $str; } /** * 将字符部分加密并输出 * @param unknown $str * @param unknown $start 从第几个位置开始加密(从1开始) * @param unknown $length 连续加密多少位 * @return string */ function encrypt_show($str, $start, $length) { $end = $start - 1 + $length; $array = str_split($str); foreach ($array as $k => $v) { if ($k >= $start - 1 && $k < $end) { $array[$k] = '*'; } } return implode('', $array); } /** * 加密函数 * @param string $txt 需要加密的字符串 * @param string $key 密钥 * @return string 返回加密结果 */ function ds_encrypt($txt, $key = '') { if (empty($txt)) return $txt; if (empty($key)) $key = md5(config('ds_config.setup_date')); $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_."; $ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm"; $nh1 = rand(0, 64); $nh2 = rand(0, 64); $nh3 = rand(0, 64); $ch1 = $chars{$nh1}; $ch2 = $chars{$nh2}; $ch3 = $chars{$nh3}; $nhnum = $nh1 + $nh2 + $nh3; $knum = 0; $i = 0; while (isset($key{$i})) $knum += ord($key{$i++}); $mdKey = substr(md5(md5(md5($key . $ch1) . $ch2 . $ikey) . $ch3), $nhnum % 8, $knum % 8 + 16); $txt = base64_encode(TIMESTAMP . '_' . $txt); $txt = str_replace(array('+', '/', '='), array('-', '_', '.'), $txt); $tmp = ''; $j = 0; $k = 0; $tlen = strlen($txt); $klen = strlen($mdKey); for ($i = 0; $i < $tlen; $i++) { $k = $k == $klen ? 0 : $k; $j = ($nhnum + strpos($chars, $txt{$i}) + ord($mdKey{$k++})) % 64; $tmp .= $chars{$j}; } $tmplen = strlen($tmp); $tmp = substr_replace($tmp, $ch3, $nh2 % ++$tmplen, 0); $tmp = substr_replace($tmp, $ch2, $nh1 % ++$tmplen, 0); $tmp = substr_replace($tmp, $ch1, $knum % ++$tmplen, 0); return $tmp; } /** * 解密函数 * @param string $txt 需要解密的字符串 * @param string $key 密匙 * @return string 字符串类型的返回结果 */ function ds_decrypt($txt, $key = '', $ttl = 0) { if (empty($txt)) return $txt; if (empty($key)) $key = md5(config('ds_config.setup_date')); $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_."; $ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm"; $knum = 0; $i = 0; $tlen = @strlen($txt); while (isset($key{$i})) $knum += ord($key{$i++}); $ch1 = @$txt{$knum % $tlen}; $nh1 = strpos($chars, $ch1); $txt = @substr_replace($txt, '', $knum % $tlen--, 1); $ch2 = @$txt{$nh1 % $tlen}; $nh2 = @strpos($chars, $ch2); $txt = @substr_replace($txt, '', $nh1 % $tlen--, 1); $ch3 = @$txt{$nh2 % $tlen}; $nh3 = @strpos($chars, $ch3); $txt = @substr_replace($txt, '', $nh2 % $tlen--, 1); $nhnum = $nh1 + $nh2 + $nh3; $mdKey = substr(md5(md5(md5($key . $ch1) . $ch2 . $ikey) . $ch3), $nhnum % 8, $knum % 8 + 16); $tmp = ''; $j = 0; $k = 0; $tlen = @strlen($txt); $klen = @strlen($mdKey); for ($i = 0; $i < $tlen; $i++) { $k = $k == $klen ? 0 : $k; $j = strpos($chars, $txt{$i}) - $nhnum - ord($mdKey{$k++}); while ($j < 0) $j += 64; $tmp .= $chars{$j}; } $tmp = str_replace(array('-', '_', '.'), array('+', '/', '='), $tmp); $tmp = trim(base64_decode($tmp)); if (preg_match("/\d{10}_/s", substr($tmp, 0, 11))) { if ($ttl > 0 && (TIMESTAMP - (int)substr($tmp, 0, 11) > $ttl)) { $tmp = null; } else { $tmp = substr($tmp, 11); } } return $tmp; } /** * 生成密码hash值 * @param string $password * @return string */ function encryption_hash(string $password): string { return password_hash($password, PASSWORD_DEFAULT); } /** * 获取runtime根目录路径 * @return string */ function runtime_root_path(): string { return dirname(runtime_path()) . DIRECTORY_SEPARATOR; } /** * 写入日志 (使用tp自带驱动记录到runtime目录中) * @param mixed $value * @param string $type */ function log_record($value, string $type = 'info') { $content = is_string($value) ? $value : print_r($value, true); Log::record($content, $type); } /** * 隐藏手机号中间四位 13012345678 -> 130****5678 * @param string $mobile 手机号 * @return string */ function hide_mobile(string $mobile): string { return substr_replace($mobile, '****', 3, 4); } /** * 获取当前系统版本号 * @return string * @throws BaseException */ function get_version(): string { return Auth_Version; } //读取文件配置 function get_config($key) { return Config::get($key); } function get_ip() { return request()->ip(); } /** * 获取当前请求的变量,并进行安全过滤,防止xss注入攻击 * @param string $key * @return mixed */ function get_params(string $key = "", $default = '', $filter = 'htmlspecialchars') { return Request::param($key, $default, $filter); } /** * 转义经过安全过滤后的值 * @param $content * @return string */ function safe_decode($content): string { return htmlspecialchars_decode($content); } //判断程序是否完成安装 function is_installed() { static $isInstalled; if (empty($isInstalled)) { $isInstalled = file_exists(Auth_Root . 'app/install/install.lock'); } return $isInstalled; } /** * @param int $type 1获取时间,2获取时间戳 * @return false|int|string */ function get_date(int $type = 1) { if ($type == 1) { $res = date('Y-m-d H:i:s'); } elseif ($type == 2) { $res = time(); } return $res; } function get_agent($type = '') { $agent = new Agent(); $data = array( // 获取操作系统。(Ubuntu,Windows,OS X等) 'browser' => $agent->browser(), // 获取设备名称(如果是移动设备)。(iPhone,Nexus,华硕平板电脑等) 'device' => $agent->device(), // 获取操作系统。(Ubuntu,Windows,OS X等) 'platform' => $agent->platform(), // 获取浏览器的接受语言 'languages' => $agent->languages() ); if ($type) { return $data[$type]; } else { return $data; } } /** * @return int */ function get_code(): int { return rand(111111, 999999); } function Ping($Url, $length = 4): string { $start = microtime(true); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $Url); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_NOBODY, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl); $end = microtime(true); if (!empty($result)) { return round(number_format($end - $start, 10, '.', ''), $length) . '秒'; } return '域名[ ' . $Url . ' ]无法访问'; } /* * Action 网页请求操作 * $url 需要请求的地址 * $post 需要POST提交的数据 * $referer 在HTTP请求头中"Referer: "的内容 * $cookie 需要附带的cookie * $header 将头文件的信息作为数据流输出 * $ua 在HTTP请求中包含一个"User-Agent: "头的字符串 * $nobody 启用时将不对HTML中的BODY部分进行输出 * $addheader 设置HTTP头字段的数组 */ function get_curl($url, $post = 0, $referer = 0, $cookie = 0, $header = 0, $ua = 0, $nobaody = 0, $addheader = 0) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $httpheader[] = "Accept: */*"; $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; $httpheader[] = "Connection: close"; if ($addheader) { $httpheader = array_merge($httpheader, $addheader); } curl_setopt($ch, CURLOPT_TIMEOUT, 30); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); if ($header) { curl_setopt($ch, CURLOPT_HEADER, TRUE); } if ($cookie) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); } if ($referer) { if ($referer == 1) { curl_setopt($ch, CURLOPT_REFERER, 'http://m.qzone.com/infocenter?g_f='); } else { curl_setopt($ch, CURLOPT_REFERER, $referer); } } if ($ua) { curl_setopt($ch, CURLOPT_USERAGENT, $ua); } else { curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'); } if ($nobaody) { curl_setopt($ch, CURLOPT_NOBODY, 1); } curl_setopt($ch, CURLOPT_ENCODING, "gzip"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $ret = curl_exec($ch); curl_close($ch); return $ret; } /* * $to 收件人邮箱 * $subject 邮件标题 * $content 邮件内容 * 发送邮件函数 */ function send_email($to, $subject = '', $content = '') { $mail = new PHPMailer\PHPMailer\PHPMailer(); try { //设定邮件编码 $mail->CharSet = "UTF-8"; // 调试模式输出 $mail->SMTPDebug = 0; // 使用SMTP $mail->isSMTP(); // SMTP服务器 $mail->Host = get_system_config('mail_smtp'); // 允许 SMTP 认证 $mail->SMTPAuth = true; // SMTP 用户名 即邮箱的用户名 $mail->Username = get_system_config('mail_user'); // SMTP 密码 部分邮箱是授权码(例如163邮箱) $mail->Password = get_system_config('mail_pass'); // 允许 TLS 或者 ssl协议 if (get_system_config('mail_encrypt')) { $mail->SMTPSecure = get_system_config('mail_encrypt'); } //端口 - likely to be 25, 465 or 587,具体要看邮箱服务器支持 $mail->Port = get_system_config('mail_port'); //发件人 $mail->setFrom(get_system_config('mail_user'), get_system_config('mail_name')); //接收邮件方 if (is_array($to)) { foreach ($to as $v) { $mail->addAddress($v); } } else { $mail->addAddress($to); } //回复的时候回复给哪个邮箱 建议和发件人一致 //$mail->addReplyTo(get_system_config('mail_user')); //抄送 //$mail->addCC('cc@example.com'); //密送 //$mail->addBCC('bcc@example.com'); // 添加附件 //$mail->addAttachment('../../'.$mail_file); // 发送附件并且重命名 // $mail->addAttachment('../thumb-1.jpg', 'new.jpg'); // 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容 $mail->isHTML(true); // 邮件标题 $mail->Subject = get_system_config('site_title') . ' - ' . $subject; // 邮件HTML内容 $mail->Body = mail_view($content); // 邮件纯文本内容 $mail->AltBody = $content; // 发送 $mail->send(); return true; } catch (Exception $e) { return $mail->ErrorInfo; } } /* * $content 邮件内容 * 邮件模板 */ function mail_view($content) { $image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIUAAABXCAMAAAAd8nYqAAADAFBMVEUAAADW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1taqJyaLAAAA/3RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1O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'; $template = ' <style> .box_one{ position: relative; color:#555; font:12px/1.5 Microsoft YaHei,Tahoma,Helvetica,Arial,sans-serif; max-width:600px; margin:50px auto; border-radius: 5px; box-shadow:0 5px 10px#aaaaaa; background: 0 0 repeat-x#FFF; background-image: -webkit-repeating-linear-gradient(135deg, #4882CE,#4882CE 20px, #FFF 20px, #FFF 35px, #EB1B2E 35px,#EB1B2E 55px, #FFF 55px, #FFF 70px); background-image:repeating-linear-gradient(-45deg, #4882CE, #4882CE 20px, #FFF 20px, #FFF 35px, #EB1B2E 35px, #EB1B2E 55px, #FFF 55px, #FFF 70px); background-size: 100% 10px; } .box_two{ position: absolute; right: 15px; top: 20px; width:133px; height: 87px; } </style> <div class="box_one"> <img class="box_two" src="' . $image . '"/> <div style="padding: 0 15px 15px;"> <h2 style="border-bottom:1px solid #e9e9e9;font-size:18px;font-weight:normal;padding:20px 0 10px;"> ' . get_system_config('mail_name') . ' </h2> <p><span style="color: #007bfc;">' . $content . '</span></p> </div> <div style="color:#888;padding:10px;border-top:1px solid #e9e9e9;background:#f5f5f5;border-radius: 0 0 5px 5px;"> <p style="margin: 0;padding: 0;text-align: center;"> Copyright © <a href="' . request()->domain() . '" target="_blank">' . get_system_config('site_copyright') . '</a> All Rights Reserved.</p> <p style="color: red;margin: 0;padding: 0;text-align: center;">本邮件由系统发送,请勿回复</p> </div> </div> '; return $template; } function url_status($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); $res = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200 curl_close($ch); return $res; }
2025年03月27日
3 阅读
0 评论
0 点赞
2025-03-27
飞牛NAS社区自动打卡签到
一、浏览器打开飞牛社区并登录,复制cookie运行以下代码自动获取import re import json # 输入的cookie字符串 cookie_string = """ """ # 使用正则表达式提取pvRK_2132_saltkey和pvRK_2132_auth saltkey_pattern = r"pvRK_2132_saltkey=([a-zA-Z0-9]+)" auth_pattern = r"pvRK_2132_auth=([a-zA-Z0-9%/]+)" saltkey_match = re.search(saltkey_pattern, cookie_string) auth_match = re.search(auth_pattern, cookie_string) # 提取并输出结果 if saltkey_match and auth_match: cookies = { 'pvRK_2132_saltkey': saltkey_match.group(1), 'pvRK_2132_auth': auth_match.group(1) } print("cookies =", json.dumps(cookies, indent=4)) else: print("没有找到匹配的值!")二、青龙面板Python脚本import requests from bs4 import BeautifulSoup import smtplib from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr # 填写对应的 Cookie 值 cookies = { "pvRK_2132_saltkey": "xxx", "pvRK_2132_auth": "xxx" } # SMTP 邮件服务配置 push_config = { 'SMTP_SERVER': 'smtp.qq.com:465', # SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465 'SMTP_SSL': 'true', # SMTP 发送邮件服务器是否使用 SSL,填写 true 或 false 'SMTP_EMAIL': 'xxx@qq.com', # SMTP 发件邮箱 'SMTP_PASSWORD': 'xxxxx', # SMTP 登录密码,也可能为特殊口令,视具体邮件服务商说明而定 'SMTP_NAME': '青龙面板 - 飞牛社区自动打卡', # SMTP 收发件人姓名,可随意填写 'SMTP_TO': 'xxx@qq.com', # SMTP 接收邮件邮箱 } def sign_in(): try: # 签到请求链接右键打卡按钮直接复制替换 response = requests.get('签到请求链接右键打卡按钮直接复制替换', cookies=cookies) if '恭喜您,打卡成功!' in response.text: print('签到详情(打卡成功):\n') get_sign_in_info() elif '您今天已经打过卡了,请勿重复操作!' in response.text: print('签到详情(已经打过卡了):\n') get_sign_in_info() else: print('打卡失败, cookies可能已经过期或站点更新.') smtp(title='飞牛社区自动签到(打卡失败)', content='cookies可能已经过期或站点更新.') # 发送邮件 except Exception as error: print('签到请求失败:', error) smtp(title='飞牛社区自动签到(请求失败)', content=str(error)) # 发送邮件 def get_sign_in_info(): try: response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign&sign=f5da4016', cookies=cookies) soup = BeautifulSoup(response.text, 'html.parser') content = [] # 定义需要查找的模式和选择器 patterns = [ {'name': '最近打卡', 'selector': 'li:-soup-contains("最近打卡")'}, {'name': '本月打卡', 'selector': 'li:-soup-contains("本月打卡")'}, {'name': '连续打卡', 'selector': 'li:-soup-contains("连续打卡")'}, {'name': '累计打卡', 'selector': 'li:-soup-contains("累计打卡")'}, {'name': '累计奖励', 'selector': 'li:-soup-contains("累计奖励")'}, {'name': '最近奖励', 'selector': 'li:-soup-contains("最近奖励")'}, {'name': '当前打卡等级', 'selector': 'li:-soup-contains("当前打卡等级")'} ] for pattern in patterns: element = soup.select_one(pattern['selector']) if element: # 提取文本并清洗 text = element.get_text() content.append(f"{pattern['name']}: {text.split(':')[-1].strip()}") content_text = '\n'.join(content) print(content_text + '\n') smtp(title='飞牛社区自动签到(成功)', content=str(content_text)) # 发送邮件 except Exception as error: print('获取打卡信息失败:', error) smtp(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error)) # 发送邮件 def smtp(title: str, content: str): """ 使用 SMTP 邮件 推送消息。 """ if ( not push_config.get("SMTP_SERVER") or not push_config.get("SMTP_SSL") or not push_config.get("SMTP_EMAIL") or not push_config.get("SMTP_PASSWORD") or not push_config.get("SMTP_NAME") ): print("SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!\n取消推送") return print("SMTP 邮件 服务启动") message = MIMEText(content, "plain", "utf-8") message["From"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_EMAIL"), ) ) message["To"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_TO"), ) ) message["Subject"] = Header(title, "utf-8") try: smtp_server = ( smtplib.SMTP_SSL(push_config.get("SMTP_SERVER")) if push_config.get("SMTP_SSL") == "true" else smtplib.SMTP(push_config.get("SMTP_SERVER")) ) smtp_server.login( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_PASSWORD") ) smtp_server.sendmail( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_EMAIL"), message.as_bytes(), ) smtp_server.close() print("SMTP 邮件 推送成功!") except Exception as e: print(f"SMTP 邮件 推送失败!{e}") if __name__ == '__main__': sign_in()
2025年03月27日
31 阅读
0 评论
0 点赞
2025-03-27
飞牛NAS通过Docker方式部署宝塔面板
一、应用中心直接部署二、使用docker-compose部署services: btpanel: image: docker.cnb.cool/btpanel/btpanel:latest # 宝塔面板官方镜像(国内源),也可直接使用dockerhub镜像 btpanel/baota:latest deploy: resources: limits: cpus: "2.0" # 最大CPU核心限制,根据实际情况调整 memory: "1024M" # 最大内存限制,根据实际情况调整 restart_policy: condition: always ports: - "38888:8888" # 宝塔面板对外访问端口,默认38888 - "8080:80" # Web服务端口,默认8080 - "8443:443" # HTTPS服务端口,默认8443 - "33306:3306" # MySQL服务端口,默认33306,不需要暴露到容器外可删除 - "22022:22" # SSH服务端口,默认22022,不需要暴露到容器外可删除 - "32888:888" # PHPMyAdmin服务端口,默认32888,不需要暴露到容器外可删除 volumes: - "/www/wwwroot:/www/wwwroot" # 持久化存储宝塔面板网站数据,默认/www/wwwroot,可根据实际情况调整目录 - "/www/data:/www/server/data" # 持久化存储MySQL数据,默认/www/data,可根据实际情况调整目录 - "/www/vhost:/www/server/panel/vhost" # 持久化存储MySQL数据,默认/www/data,可根据实际情况调整目录 labels: createdBy: "bt_apps"{mtitle title="如果面板需要使用Docker"/}参考格式 本地docker环境挂载进面板docker使用"/usr/bin/docker:/usr/bin/docker" "/run/docker.sock:/run/docker.sock"limits: cpus 为最大CPU核心限制,memory 为最大内存限制,根据实际情况调整,不要超过系统资源。不需要限制CPU和内存可以删除resources部分。如果需要使用80/443端口,请先前往系统设置-安全性-端口设置-高级设置-取消勾选重定向80/443端口-保存,并将上方配置文件的8080和8443分别修改为80/443默认用户:btpanel默认密码:btpaneldocker
2025年03月27日
11 阅读
0 评论
0 点赞
2025-03-27
飞牛NAS部署宝塔面板
一、开启飞牛NAS的SSH功能{mtitle title="开启方法:设置 -> SSH -> SSH功能"/}二、使用SSH连接工具{mtitle title="用户名为飞牛NAS初始化时的用户名,密码也是"/}{mtitle title="连接上后的界面是这样的"/}{mtitle title="输入下面的代码切换到root账户,输入后需要输入您刚才的账号密码"/}sudo -i{mtitle title="执行以下命令解决编译python报错"/}apt-get update apt-get upgrade -y apt install -y libc6 --allow-change-held-packages apt install -y libc6-dev --allow-change-held-packages apt install -y gcc g++ build-essential三、运行宝塔安装脚本{mtitle title="飞牛基于Debain12,所以使用Debain安装脚本"/}wget -O install.sh https://download.bt.cn/install/install_lts.sh && bash install.sh ed8484bec宝塔服务器面板,一键全能部署及管理 四、安装后可能出现的问题及解决方法问:飞牛NAS后台无法进入答:进入宝塔后台防火墙设置放行飞牛端口5666,5667,或者直接关闭防火墙问:无法安装Nginx等答:飞牛后台设置->安全性->端口设置->高级设置->重定向80,443端口取消掉,释放80,443端口
2025年03月27日
19 阅读
0 评论
0 点赞
1
2
3