Electron应用环境示例

1.安装nodejs

2.安装npm(新版nodejs已集成)

编辑npm配置npm config edit

在打开的文件中可以修改或添加镜像

registry=https://mirrors.huaweicloud.com/repository/npm/
electron-builder-binaries_mirror=https://mirrors.huaweicloud.com/electron-builder-binaries/
chromedriver_cdnurl=https://mirrors.huaweicloud.com/chromedriver/
electron_mirror=https://mirrors.huaweicloud.com/electron/

3.确定node和npm版本

node -v

npm -v

全局安装 electron,electron-packager ,electron-builder

npm install electron@22.3.9 -g

npm install electron -g

npm install electron-packager -g

npm install electron-builder -g

说明:electron-packager直接打包成可执行文件 ,electron-builder可打包成安装文件。

4.创建应用存储目录

mkdir demo01

5.初始化应用目录

cd demo01

npm init

初始化之后会生成 package.json文件,文件内容如下

{
"name": "demo01",
"version": "0.0.1",
"description": "demo01",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"author": "",
"license": "ISC",
"devDependencies": {
"electron": "^22.3.9"
}
}

6.npm安装electron

先刷新npm缓存

npm cache clean --force

再安装

npm install --save-dev electron@22.3.9

@后面的为electron版本号

7.创建应用文件

main.js

index.html

preload.js

项目目录

demo01 
| -- node_modules 
| -- main.js 
| -- index.html 
| -- preload.js 
| -- package.json

8.运行应用

DOS中cd到你的项目目录,或者在你的项目目录下空白的地方 shift+鼠标右键,然后点击在此处打开命令窗口。

npm start

 

9.项目打包

npm install electron-packager -g

打包项目命令参考:

electron-packager . app --win --out presenterTool --arch=x64 --app-version 1.4.14 --overwrite --ignore=node_modules

electron-packager . 可执行文件的文件名 --win --out 打包成的文件夹名 --arch=x64位还是32位 --app-version版本号 --overwrite --ignore=node_modules

 

WIN7支持的Electron版本

Electron将在22.x.y版本之后结束对Windows 7/8/8.1的支持,这是Chromium计划结束支持的结果。

Electron v22.3.9

Electron 22 将是最后一个支持 Windows 7/8/8.1 的 Electron 主要版本。 Electron 遵循计划中的 Chromium 弃用政策,该政策将 [在 Chromium 109 中弃用 Windows 7/8/8.1 支持。

Electron 23 及以后的主要版本将不支持 Windows 7/8/8.1。

网站内容图片高度移除js方法

 

网站内容图片高度移除js方法。

<div id="delheight">

<img style="width:100%;height:99px;" src="/yourimage.png" />

</div>

<script type="text/javascript"> 
window.onload =function() 
{ 
var e=document.getElementById("delheight"); 
var str1 = e.innerHTML; 
str1 = str1.replace(/(\bheight\s*=\s*(?:'[^']*'|"[^"]*"))/ig, "");
str1 = str1.replace(/[ \t]*height[ \t]*=[ \t]*(?:'[^']*'|"[^"]*")/ig, "");
e.innerHTML = str1; 
} 
</script>

 

 

阿里云邮件推送SMTP服务地址

来源:https://help.aliyun.com/zh/direct-mail/smtp-endpoints

不同站点的SMTP服务地址。

华东 1(杭州): smtpdm.aliyun.com
新加坡(新):smtpdm-ap-southeast-1.aliyuncs.com
美国(新):smtpdm-us-east-1.aliyuncs.com
德国:smtpdm-eu-central-1.aliyuncs.com
SMTP端口号:25,80,465(SSL加密)
注意:ECS 基于安全考虑,目前已禁用 25 端口。如果您的发送程序部署在阿里云 ECS 上,建议您不勾选 SSL 时,使用 80 端口;勾选 SSL 时,使用 465 端口。云虚拟主机服务器同上。此外,我们支持通过smtp命令“STARTTLS”在端口25或80上开启显式SSL/TLS功能。
请根据控制台选择的服务区域选择对应的服务器地址

如何选择发信区域

1.前提:不同的地域决定了数据落地的地域。如果涉及境外客户,请先咨询您公司的法务,确定数据在哪个区域才合规。
2.如果您的发信程序部署在境内,建议您选择华东1区域。
3.如果您的发信程序部署在境外,且收信地址主要在境外,建议您使用新加坡、美国等集群。
4.如果您的发信程序部署在境外,且收信地址境内居多:
a)如果您的发信程序使用SMTP发信,且部署在美国或者新加坡,建议您使用华东1区域,会自动通过美国或者新加坡加速节点路由到华东1节点。
b)其他情况,建议您使用新加坡区域。
 

wordpress文章内容生成图片的方法

请自行下载字体AlibabaPuHuiTi-3-45-Light.otf放在主题根目录下。

在主题函数文件functions.php中添加

function ii_get_content2image($imgwidth,$fontsize,$type = '0'){
ini_set('memory_limit', '512M');
$tid = get_the_ID();
$text = get_post_field('post_content', $tid); // 获取文章内容

// 设置文字内容
$textContent = preg_replace("/(<br\s*\/?>)/i", "\n", strip_tags($text,'<p> <br> <img>'));
$textContent = preg_replace('/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{1F1E0}-\x{1F1FF}\x{1F900}-\x{1F9FF}\x{1FA00}-\x{1FA6F}\x{1FA70}-\x{1FAFF}\x{1FBC0}-\x{1FBCF}\x{1FBD0}-\x{1FBD0}\x{1FBE0}-\x{1FBE0}\x{1FBF0}-\x{1FBF0}\x{1FC00}-\x{1FC00}\x{1FC70}-\x{1FC70}\x{1FD00}-\x{1FD3E}\x{1FD40}-\x{1FD40}\x{1FD50}-\x{1FD8F}\x{1FD92}-\x{1FD95}\x{1FD97}-\x{1FD97}\x{1FD99}-\x{1FDBF}\x{1FDC0}-\x{1FDCF}\x{1FDD0}-\x{1FDDF}\x{1FDE0}-\x{1FDFD}\x{1FDFE}-\x{1FDFE}\x{1FE00}-\x{1FE0F}\x{1FE10}-\x{1FE1F}\x{1FE20}-\x{1FE2F}\x{1FE30}-\x{1FE4F}\x{1FE50}-\x{1FE50}\x{1FE70}-\x{1FEFF}\x{1FF00}-\x{1FF00}\x{1FF01}-\x{1FF02}\x{1FF03}-\x{1FF03}\x{1FF04}-\x{1FF04}\x{1FF05}-\x{1FF05}\x{1FF06}-\x{1FF06}\x{1FF07}-\x{1FF07}\x{1FF08}-\x{1FF0A}\x{1FF0B}-\x{1FF0B}\x{1FF0C}-\x{1FF0E}\x{1FF0F}-\x{1FF0F}\x{1FF10}-\x{1FF10}\x{1FF11}-\x{1FF11}\x{1FF12}-\x{1FF12}\x{1FF13}-\x{1FF13}\x{1FF14}-\x{1FF14}\x{1FF15}-\x{1FF15}\x{1FF16}-\x{1FF16}\x{1FF17}-\x{1FF17}\x{1FF18}-\x{1FF18}\x{1FF19}-\x{1FF19}\x{1FF1A}-\x{1FF20}\x{1FF21}-\x{1FF21}\x{1FF22}-\x{1FF22}\x{1FF23}-\x{1FF23}\x{1FF24}-\x{1FF24}\x{1FF25}-\x{1FF25}\x{1FF26}-\x{1FF26}\x{1FF27}-\x{1FF27}\x{1FF28}-\x{1FF28}\x{1FF29}-\x{1FF29}\x{1FF2A}-\x{1FF2A}\x{1FF2B}-\x{1FF2B}\x{1FF2C}-\x{1FF2C}\x{1FF2D}-\x{1FF2D}\x{1FF2E}-\x{1FF2F}\x{1FF30}-\x{1FF30}\x{1FF31}-\x{1FF31}\x{1FF32}-\x{1FF32}\x{1FF33}-\x{1FF33}\x{1FF34}-\x{1FF34}\x{1FF35}-\x{1FF35}\x{1FF36}-\x{1FF36}\x{1FF37}-\x{1FF37}\x{1FF38}-\x{1FF38}\x{1FF39}-\x{1FF39}\x{1FF3A}-\x{1FF3A}\x{1FF3B}-\x{1FF3B}\x{1FF3C}-\x{1FF3C}\x{1FF3D}-\x{1FF3D}\x{1FF3E}-\x{1FF3E}\x{1FF3F}-\x{1FF3F}\x{1FF40}-\x{1FF40}\x{1FF41}-\x{1FF41}\x{1FF42}-\x{1FF42}\x{1FF43}-\x{1FF43}\x{1FF44}-\x{1FF44}\x{1FF45}-\x{1FF45}\x{1FF46}-\x{1FF46}\x{1FF47}-\x{1FF47}\x{1FF48}-\x{1FF48}\x{1FF49}-\x{1FF49}\x{1FF4A}-\x{1FF4A}\x{1FF4B}-\x{1FF4B}\x{1FF4C}-\x{1FF4C}\x{1FF4D}-\x{1FF4D}\x{1FF4E}-\x{1FF4F}\x{1FF50}-\x{1FF50}\x{1FF51}-\x{1FF51}\x{1FF52}-\x{1FF52}\x{1FF53}-\x{1FF53}\x{1FF54}-\x{1FF54}\x{1FF55}-\x{1FF55}\x{1FF56}-\x{1FF56}\x{1FF57}-\x{1FF57}\x{1FF58}-\x{1FF58}\x{1FF59}-\x{1FF59}\x{1FF5A}-\x{1FF5A}\x{1FF5B}-\x{1FF5B}\x{1FF5C}-\x{1FF5C}\x{1FF5D}-\x{1FF5D}\x{1FF5E}-\x{1FF5E}\x{1FF5F}-\x{1FF5F}\x{1FF60}-\x{1FF60}\x{1FF61}-\x{1FF61}]/u', '', $textContent);
$textContent = preg_replace('/<p(.*?)>(.*?)<\/p>/s', "$2\n", $textContent);
$textContent = preg_replace("/\s*[\r\n]+|\s*<br\s*\/?>\s*/i", "\n", $textContent);//多个换行替换成1个换行
$text = html_entity_decode($textContent);
// 设置字体文件路径
$font_file = get_template_directory() . '/AlibabaPuHuiTi-3-45-Light.otf'; // 确保这个路径是正确的
$max_width = $imgwidth; // 图片的最大宽度
$font_size = $fontsize; // 文字大小
$image_height = 10; // 初始化图片高度
$line_height = $font_size*2; // 行间距,这里简单加了一些额外空间
$outimg = ABSPATH . 'conimg/';
if (!(is_dir($outimg))) @mkdir($outimg, 0775);
if(!empty($tid)) $outimg .= md5($tid.'_'.$imgwidth.'_'.$fontsize.'_'.$type).'.webp';
else $outimg .= md5(strtotime(time()),1).'.webp';
if(file_exists($outimg)){
$outimg = site_url().'/conimg/'.basename($outimg);
$outimg = str_replace(ABSPATH,site_url(),$outimg);
return $outimg;
}

// 检查字体文件是否存在
if (!file_exists($font_file)) {
die('字体文件不存在');
}
// 创建一个真彩色图像(确保GD库已启用)
$image = imagecreatetruecolor($max_width, $image_height);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $white);
$parts = preg_split('/(<img[^>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
$isText = true; // 标记当前处理的是文本还是图片
// 精确版的文本分割以适应宽度
$lines = [];
$images = []; // 存储图片的服务器路径和尺寸信息
$current_line_width = 0;
$lines[] = '';//添加空行
foreach ($parts as $part) {
if ($isText) {
// 对文本进行必要的处理,计算内容,行数,高度
foreach (explode("\n", wordwrap($part, $max_width, "\n", true)) as $article) {
preg_match_all("/./u", $article, $words);
foreach ($words[0] as $word) {
if(trim($word) == "") continue;
$word_box = imagettfbbox($font_size, 0, $font_file, $word);
$word_width = $word_box[2] - $word_box[0];
if(preg_match('/[\x{3002}\x{ff01}\x{2018}\x{2019}\x{201c}\x{201d}\x{fe50}\x{fe51}\x{fe52}\x{ff08}\x{ff09}\x{ff0c}\x{ff1a}\x{ff1b}\x{ff1f}\x{ff0e}\x{2026}\x{2014}\x{fe41}\x{fe42}\x{fe43}\x{fe44}\x{ff5e}\x{301d}\x{3001}]/u', $word)) $word_width = $word_width*2;
// 如果加上新单词后超过最大宽度,则开始新的一行
if ($current_line_width + $word_width > $max_width) {
$lines[] = implode('', $current_line);
$current_line = [$word];
$current_line_width = $word_width;
} else {
$current_line[] = $word;
$current_line_width += $word_width + ($font_size /4); // 简单添加字间距
}
}
// 添加最后一行
if (!empty($current_line)) {
$lines[] = implode('', $current_line);
}
$current_line = [];
$current_line_width = 0;
$lines[] = '';//添加空行,隔开段落
}
} else {
// 对图片标签进行处理
// 处理图片标签并记录图片信息
preg_match_all('/<img[^>]*src=["\'](.*?)["\']/i', $part, $matches);
foreach ($matches[1] as $imageSrc) {
// 假设$imageSrc已经是服务器相对或绝对路径
if ((strpos($imageSrc, 'http') !== 0 || strpos($imageSrc, 'https') !== 0) && strpos($imageSrc, '//') !== 0) {
$imageSrc = site_url() . '/' .$imageSrc;
}
$imageSrc = str_replace(site_url(),ABSPATH,$imageSrc);
$imageSrc = str_replace('//','/',$imageSrc);
if (!file_exists($imageSrc)) continue;
list($width, $height) = @getimagesize($imageSrc);
if($width >= $max_width){
$newWidth = $max_width * 0.85;
$newHeight = $height * ($newWidth/$width);
}else{
$newWidth = $width;
$newHeight = $height;
}
$images[] = array(
'src' => $imageSrc,
'x' => ($max_width - $newWidth) / 2,
'y' => count($lines) * $line_height,
'w' => $width,
'h' => $height,
'nw' => $newWidth,
'nh' => $newHeight
);
}
if(count($images) > 0){
$imagesH = ceil($newHeight/$line_height);
for($i=0;$i<=$imagesH;$i++){
$lines[] = '';//添加空行
}
}
}
$isText = !$isText; // 切换到处理下一种类型(文本或图片)
}

// 计算总高度并重新创建图像以适应所有文字
$image_height = count($lines) * $line_height;
if($image_height > 10000) {
$image_height = '10000';//图片超高,仅返回图片前1万像素高度
$lines_len = ceil($image_height/$line_height) - 1;
$lines[$lines_len-3] = '';
$lines[$lines_len-2] = '图片超高,仅返回图片前1万像素高度';
$lines[$lines_len-1] = '';
$lines[$lines_len] = '';
$lines = array_slice($lines, 0, $lines_len);
}
$new_image = imagecreatetruecolor($max_width, $image_height);
imagefill($new_image, 0, 0, $white);
imagesavealpha($new_image, true);
$transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
//$backgroundColor = imagecolorallocate($new_image, 255, 255, 255); // 纯白色背景作为示例
imagefill($new_image, 0, 0, $transparent);

// 随机线条参数
$lineCount = 100; // 线条数量
$minLineWidth = 80; // 线条最小宽度
$maxLineWidth = 200; // 线条最大宽度
$minLineColor = 230; // 线条颜色范围下限
$maxLineColor = 255; // 线条颜色范围上限
// 绘制随机线条
for ($i = 0; $i < $lineCount; $i++) {
// 随机选择线条的起点和终点
$startX = rand(-50, $max_width+50);
$startY = rand(-50, $image_height+50);
$endX = rand(-50, $max_width+50);
$endY = rand(-50, $image_height+50);

// 随机选择线条的颜色和宽度
$lineColor = imagecolorallocate($new_image, rand($minLineColor, $maxLineColor), rand($minLineColor, $maxLineColor), rand($minLineColor, $maxLineColor));
$lineWidth = rand($minLineWidth, $maxLineWidth);
// 设置线条宽度
imagesetthickness($new_image, $lineWidth);
// 绘制线条
imageline($new_image, $startX, $startY, $endX, $endY, $lineColor);
}

// 在新图像上绘制文字
foreach ($lines as $i => $line) {
imagettftext($new_image, $font_size, 0, 10, ($i + 1) * $line_height-5, $black, $font_file, $line);
}

// 绘制图片到画布上
if(count($images) > 0){
foreach ($images as $imageInfo) {
// 计算图片在画布上的位置,这里以简单方式为例,实际可能需要更复杂的布局逻辑
$imagePath = $imageInfo['src'];
$imageX = $imageInfo['x'];
$imageY = $imageInfo['y'];
$imageW = $imageInfo['w'];
$imageH = $imageInfo['h'];
$imageNW = $imageInfo['nw'];
$imageNH = $imageInfo['nh'];
// 加载并复制图片到新图像
$imageToDraw = @imagecreatefromstring(file_get_contents($imagePath));
imagecopyresampled($new_image, $imageToDraw, $imageX, $imageY, 0, 0, $imageNW, $imageNH, $imageW, $imageH);
imagedestroy($imageToDraw); // 清理内存
}
}
imagewebp($new_image,$outimg,'80');
imagedestroy($new_image);
$outimg = site_url().'/conimg/'.basename($outimg);
$outimg = str_replace(ABSPATH,site_url(),$outimg);
return $outimg;
}

 

在内容页中添加

<?php if ( is_single() ) { ?>
<img src="<?php echo ii_get_content2image('650','14'); ?>" />
<?php } ?>

<img src="<?php echo ii_get_content2image('650','14'); ?>" />

 

 

 

 

 

Winodws 7/8与Server 2008/2012等系统frp服务无法启动的原因

谷歌Go语言发布1.21更新:放弃了对Winodws 7/8与Server 2008/2012,以及macOS 10.13和10.14的支持。

v0.51.3 开始支持 go 1.21
v0.55.0 支持的最低Go版本已更新为 1.22

新版frp不支持win7,建议win10及以上系统。

win7可以考虑下载v0.51.2版本及之前的版本。

报错信息示例:

Exception 0xc0000005 0x8 0x0 0x0
PC=0x0

runtime.asmstdcall(0x22fcf8)
runtime/sys_windows_amd64.s:75 +0x7a fp=0x22fc80 sp=0x22fc60 pc=0x47a37a

rax 0x0
rbx 0x11e2e78
rcx 0x126afe8
rdx 0x20
rdi 0x7fffffde000
rsi 0x22fe78
rbp 0x22fdc0
rsp 0x22fc58
r8 0x0
r9 0x22fee8
r10 0x13da2e8
r11 0xc000004000
r12 0x22fec8
r13 0x0
r14 0x11e1ec0
r15 0x3
rip 0x0
rflags 0x10293
cs 0x33
fs 0x53
gs 0x2b

解决steam注册问题

steam注册一直要求验证是真人。无限验证,不能通过。提示:

“您对 CAPTCHA 的响应似乎无效,请在下方重新验证您不是机器人”

有同学想了一下,用VPN,然后又提示:

请停用VPN再重新注册。

最后通过测试,得出一个方法:

0.使用网页注册

1.切换语言为英语

2.切换地区为Taiwan

然后顺利通过注册,进邮箱激活一下即可。

 

 

 

 

frp服务端配置文件frps.toml参考

提示:新版frp不支持win7,建议win10及以上系统。win7可以考虑下载0.49.0版尝试。

frp服务端配置文件frps.toml参考

bindAddr = "10.1.5.1"
bindPort = 7000
kcpBindPort = 7000
vhostHTTPPort = 8080
vhostHTTPSPort = 8081
subDomainHost = "xxxx.net"
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "user"
webServer.password = "xxxx"
transport.maxPoolCount = 50
auth.token = "xxxx"
custom404Page = "/frps/404.html"

frps.service文件及路径

/etc/systemd/system/frps.service

[Unit]
Description = Frp Server Service
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
User=root
Group=root
Restart = on-failure
RestartSec = 5s
ExecStart = /frps/frps -c /frps/frps.toml
LimitNOFILE = 1048576

[Install]
WantedBy = multi-user.target

 

frp客户端配置文件frpc.toml参考

提示:新版frp不支持win7,建议win10及以上系统。win7可以考虑下载0.49.0版尝试。

frp客户端配置文件frpc.toml参考

serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "xxxx"
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "xxxx"
webServer.password = "xxxx"
transport.tls.enable = true
transport.tls.disableCustomTLSFirstByte = true

[[proxies]]
name = "RDP"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = xx89
transport.useEncryption = true
transport.useCompression = true

[[proxies]]
name = "webdav"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9999
remotePort = xx99
transport.useEncryption = true
transport.useCompression = true

[[proxies]]
name = "frpc"
type = "http"
localIP = "127.0.0.1"
localPort = 7400
subdomain = "frpc"
transport.useEncryption = true
transport.useCompression = true

{{- range $_, $v := parseNumberRangePair "20,21,xx01-x03" "xx1,xx1,xx01-xx03" }}
[[proxies]]
name = "ftp-{{ $v.First }}"
type = "tcp"
localIP = "127.0.0.1"
localPort = {{ $v.First }}
remotePort = {{ $v.Second }}
transport.useEncryption = true
transport.useCompression = true
{{- end }}

本例子中含:常用的远程服务RDP,文件系统webdav以及ftp和网页服务http.