• 最新文章
  • linux
  • php
  • sql
  • 服务端
  • tool
  • cocos

宝塔面板创建FTP帐号连接失败的解决方法 服务器发回了不可路由的地址。使用服务器地址代替

在宝塔面板中创建了FTP帐号后,使用FileZilla、CuteFtp等FTP软件无法连接,出现类似“服务器回应不可路由的地址。使用服务器地址代替。”,或者 “错误: 读取目录列表失败” 的错误信息,可以参考本文的解决方法,来排查处理。 【1】排查宝塔面板中的FTP服务是否启动 在宝塔面板的【软件商店】切换至 【已安装】软件列表,找到其中的 Pure-FTPd,点开右侧对应的 设置 项,检查该服务器软件的FTP服务器软件的当前状态是否为 开启 状态。 【2】检查服务器(防火墙)端口设置 服务器(防火墙)端口是否放行,配置是否正确,直接关系到FTP是否可以连接至服务器的重要因素。 首先,在宝塔面板的【安全】中的 系统防火墙,检查是否添加了21端口(FTP协议默认端口),如果使用 sftp,则还需要添加22端口; 另外,FTP被动模式端口范围(39000-40000)是否添加,如下图所示: 如果使用的是腾讯云 \ 阿里云的云服务器,还需要检查对应服务器端的安全组中的端口是否也进行了相应的放行设置。 【3】检查FTP用户名和密码 确保您使用正确的 FTP用户名 和 密码 进行连接。可以在宝塔面板的 FTP 管理页面查看当前FTP账户的用户名和密码,并确保输入的信息无误。 【4】检查被动模式(PASV)设置 FTP服务器默认处于主动模式,但有时FTP客户端可能需要切换为被动模式。在您的FTP客户端中,找到被动模式(PASV)设置选项,并确保其已启用。 在 FileZilla 的 站点管理器 中切换至 传输设置,把里面的 传输模式 设置为 被动。 其实,使用FTP软件连接服务器出现类似“服务器回应不可路由的地址。使用服务器地址代替。”,或者 “错误: 读取目录列表失败” 的错误信息,主要就是端口是否放行,建议主要排查宝塔面板和服务器端防火墙的端口设置。

golang jwt 签署令牌Authentication token

1.要安装 jwt 包,首先需要 安装Go,然后可以使用下面的命令将其添加jwt-go为 Go 程序中的依赖项。 go get -u github.com/golang-jwt/jwt/v5 2.将其导入到您的代码中: import "github.com/golang-jwt/jwt/v5" 3.demo func Test(t *testing.T) { //商户 subject := "01H" // 密钥 secretBase64 := "AwFj+OTCI=" secret, err := base64.StdEncoding.DecodeString(secretBase64) if err != nil { log.Fatalf("Error decoding base64 secret: %v", err) } // 过期秒数 expirseIn := 60 * time.Second // 创建jwt token token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "sub": subject, "exp": time.Now().Add(expirseIn).Unix(), }) // 使用密钥签名 tokenString, err := token.SignedString(secret) if err != nil { log.Fatalf("Error signing token: %v", err) } fmt.Println("tokenString=", tokenString) m := make(mapinterface m = "www" m = "qqq" // 将数据转为JSON格式 jsonData, err := json.Marshal(m) if err != nil { log.Fatalf("Error marshalling JSON: %v", err) } client := &http.Client{} url := "https://demo.com" method := "POST" req, err := http.NewRequest(method, url, bytes.NewBuffer(jsonData)) if err != nil { log.Fatalf("Error creating request: %v", err) } req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", tokenString)) req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, err := client.Do(req) if err != nil { log.Fatalf("Error sending request: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("Error reading response body: %v", err) } log.Printf("Response body: %s", string(body)) } log.Printf("Response StatusCode: %d,%d", resp.StatusCode,http.StatusOK) info := TestRespone{} err = ffjson.Unmarshal(body, &info) if err != nil { log.Printf("body

gin获取请求体(json格式)参数

gin 框架里 c.PostForm() 函数只能从表单中获取参数,不能从 body 中解析表单参数,也就是说你如果用 c.PostForm() 来解析获取参数,客户端发起请求时,如果参数放在表单(form-data)里,服务端能正常获取到参数,但是如果客户端把参数放在 raw 里,即使 header 里配置了 content-type:multipart/form-data,服务端仍就无法获取到参数。 c.PostForm获取表单数据 package main import ( "bytes" "fmt" "github.com/gin-gonic/gin" "io/ioutil" ) func main() { gin.SetMode(gin.ReleaseMode) r := gin.Default() r.GET("/test", func(c *gin.Context) { data, _ := ioutil.ReadAll(c.Request.Body) fmt.Printf("req.body=%s\n, content-type=%v\n", data, c.ContentType()) // 这点很重要,把字节流重新放回 body 中 c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) // 获取参数 userName := c.PostForm("user_name") age := c.PostForm("age") fmt.Printf("userName=%s, age=%s\n", userName, age) c.JSON(200, "success") }) r.Run(":7000") } 或 func Test(c *gin.Context) error { m := make(mapinterface{}) m = c.Request.PostFormValue("memberid") // 商户ID m = c.Request.PostFormValue("orderid") // 订单号 } 从body中获取参数 package main import ( "bytes" "encoding/json" "fmt" "github.com/gin-gonic/gin" "io" "io/ioutil" ) type User struct { UserName string `json:"user_name"` Age int `json:"age"` } // 关键 func JSONDecode(r io.Reader, obj interface{}) error { if err := json.NewDecoder(r).Decode(obj); err != nil { return err } return nil } func main() { gin.SetMode(gin.ReleaseMode) r := gin.Default() r.POST("/test", func(c *gin.Context) { // 打印出 body //data, _ := ioutil.ReadAll(c.Request.Body) //fmt.Printf("req.body=%s\n, content-type=%v\n", data, c.ContentType()) var json User data, err := c.GetRawData() if err != nil { fmt.Println(err.Error()) } fmt.Println("data:", string(data)) // 把字节流重新放回 body 中 c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) err2 := JSONDecode(c.Request.Body, &json) if err2 != nil { fmt.Println("decode err:", err2) } // 打印body中的参数 fmt.Println("user_name:", json.UserName, "age:", json.Age) c.JSON(200, "success") }) r.Run(":7000")

Cocos Creator插件脚本 在微信小游戏里不生效

上一个文章,在cocos creator中加载解压zip包没问题,但是在输出到微信小游戏后,在小游戏工具中运行后提示找不到这个插件。 折腾了好久,后来算了,不能用插件,我就不插了,直接用 在js文件头加上 const JSZip = require('jszip'); 下面的代码照常使用就行。 我的小游戏希望大家批平指正

Cocos Creator 加载zip文件,解压解析json

jszip的实际项目应用 游戏中有大量配置的情况下,文件会变得非常大,所以有些游戏会采用zip包压缩解压 例如我的这个成语填空游戏,配置文件加一起都有3m了,将游戏配置json文件一起压缩成zip包,加载后进行解压使用 在cocos中使用jszip 首先,在github上下载jszip库 下载地址 将下载的jszip.min.js放在项目assets/libs下,将jszip.js放在项目根目录的libs下。 (jszip.js在dist中) 然后将游戏的配置文件,多个json,压缩成zip包,放在resources/config下 代码中加载zip文件,并解析获取其中的游戏物品配置idiom.json loadZip() { let self = this; let url = cc.url.raw('resources/config/config.zip'); cc.loader.load({ url: url, type: "binary" }, (err, zipData) => { //2.1.3在安卓平台下会出现load不到资源的情况 if (err) { let httpUrl = `资源服务地址${url}`; console.log('loadConfigZip httpUrl: ', httpUrl); let oReq = new XMLHttpRequest(); oReq.open("GET", httpUrl, true); oReq.responseType = "arraybuffer"; oReq.onload = function (oEvent) { let arrayBuffer = oReq.response; // 注意:不是oReq.responseText if (arrayBuffer) { console.log('LoadConfig::unzip 0'); self.unzip(arrayBuffer); } }; oReq.send(null); } else { console.log("unzip unzip"); this.unzip(zipData); } }); }, unzip(zipData) { let self = this; let newZip = new JSZip(); // 因为将jszip导入为插件,所以可以全局直接访问 newZip.loadAsync(zipData).then(zip=>{ // console.log(zip); let fileList = zip.files; for(let filename in fileList){ zip.file(filename).async('string').then(data=>{ let json = JSON.parse(data); // console.log(JSON.stringify(json)); console.log(filename,json); if( filename == "idiom.json" ){ self.idiomDatas = json; self.readyGame(); } }); } }); }, 下面是我的微信小游戏,希望大家批评指正

golang 使用 gomail 发送邮件

安装gomail go get gopkg.in/gomail.v2 package main import ( "crypto/tls" "fmt" "gopkg.in/gomail.v2" ) func main() { test1() } func test1() { message := ` <p> Hello %s,</p> <p style="text-indent:2em">测试测试测试测试.</p> <p style="text-indent:2em">测试11111</p> ` // QQ 邮箱: // SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25) // 163 邮箱: // SMTP 服务器地址:smtp.163.com(端口:25) host := "xxxxx" port := 25 userName := "xxxx" // 有些油箱登入名不是邮箱地址 password := "xxxx" fromemail := "xx@xx.com" m := gomail.NewMessage() m.SetHeader("From", fromemail) // 发件人 // m.SetHeader("From", "alias"+"<"+userName+">") // 增加发件人别名 // 多个收件人形式 // mailTo := string{ // "******@qq.com", // "******@qq.com", // } // m.SetHeader("To", mailTo...) m.SetHeader("To", "xxxxx@qq.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 // 多个同上 // m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个 // m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个 m.SetHeader("Subject", "发送测试11111") // 邮件主题 // text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。 // 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等 m.SetBody("text/html", fmt.Sprintf(message, "测试")) // text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理 // m.SetBody("text/plain", "纯文本") // m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等 // m.Attach("lolcatVideo.mp4") // 视频 // m.Attach("lolcat.jpg") // 照片 d := gomail.NewDialer( host, port, userName, password, ) // 关闭SSL协议认证 d.TLSConfig = &tls.Config{InsecureSkipVerify: true} if err := d.DialAndSend(m); err != nil { panic(err) } } package main import ( "gopkg.in/gomail.v2" "strconv" ) func SendMail(mailTo string,subject string, body string ) error { //定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码 mailConn := mapstring { "user": "zhangqiang@xxxx.com", "pass": "xxxx", "host": "smtp.mxhichina.com", "port": "465", } port, _

unity 从apk包中提取资源

使用本方法来提取资源有个前提就是资源没有被加密,这个问题会在后面进行研究。而且这个方式目前是在Windows平台下使用的。 以青蛙旅行这款游戏为例,先准备好其apk包,然后对其进行解压。这里有两种方式,一种是修改apk包后缀为zip然后解压,不过这样似乎会让xml文件呈现乱码显示,如果希望看到xml文件的就不建议这样了,但是如果只想提取资源的话应该不会受到影响。 另一种是使用apk反编译工具。这种方法可以看下面链接中一位博主的文章https://www.cnblogs.com/chen110xi/p/6612437.html 在之后就是要使用另一个工具了https://github.com/Perfare/UnityStudio/releases 这里是下载地址。 这是其打开的样子。之后点击file按钮选择load folder后会出现下面的图 一般资源都在assets下,选择这个文件夹就可以。之后会看到如下两张图 这两个一个是场景层级视图,一个是资源文件列表。在资源列表中,右边的大框可以预览资源,可以多选或单选然后用上面的export菜单按钮选择导出方式进行导出。整个过程很简单主要是利用工具。

免费批量域名可用性检查和 WHOIS 查询工具-Query.Domains

Query.Domains是什么 Query.Domains是一款在线免费批量域名可用性检查和 WHOIS 查询 工具,工具可以批量 WHOIS 检查工具,可根据 WHOIS 查询检查域名可用性等等。工具可为你的域名查询和批量 WHOIS 检查提供快速、准确且详细的结果,还提供提供批量 WHOIS 检查和域名可用性查询 API。 免费批量域名可用性检查和 WHOIS 查询工具 网站:https://query.domains/

Web3.0入门与实战 一站式掌握4大主流区块链开发 完结

课程信息 Web3.0入门与实战 一站式掌握4大主流区块链开发 完结,从0到1全面掌握Web3.0核心技术,快速切换新赛道,夸克网盘资源下载。 课程介绍 Web3.0迎来爆发式增长,技术人才紧缺,薪资涨幅可观。但Web3.0体系庞杂,很难系统掌握。因此,我们邀请以太坊、IC、Flow及XuperChain社区资深开发者精心打造更适合初学者从0到1系统学习的课程。课程将从编程语言,到四大主流链项目开发,带大家系统全面掌握Web3.0开发技术,帮助大家顺利入行,开拓新的职业机会,增长职业竞争力及副业收入。 课程大纲 第1章 Web3.0入门通识 1 节|38分钟 视频:1-1 开篇:Web3.0 一场已经开启的互联网革命 试看 37:25 第2章 联盟链入门与Xuper Chain 开发实战 12 节|230分钟 视频:2-1 联盟链入门讲解+XuperChain介绍-联盟链及区块链原理 24:08 视频:2-2 联盟链入门讲解+Xuperchain介绍-XuperChain 整体介绍 06:17 视频:2-3 联盟链入门讲解+Xuperchain介绍-XuperChain 核心模块04:53 视频:2-4 联盟链入门讲解+Xuperchain介绍-XuperChain 核心流程06:24 视频:2-5 Xuperchain 技术原理讲解-核心框架和账本模型18:40 视频:2-6 Xuperchain 技术原理讲解-智能合约13:48 视频:2-7 Xuperchain 技术原理讲解-网络与共识及其他08:31 视频:2-8 智能合约详解35:02 视频:2-9 智能合约语言介绍(上)32:49 视频:2-10 智能合约语言介绍(下)11:37 视频:2-11 XuperChain智能合约开发实战39:06 视频:2-12 XuperChain 在Web3中应用案例介绍28:03 第3章 Flow入门与Web应用实战 10 节|301分钟 收起 视频:3-1 认识Flow Cadence 31:11 视频:3-2 Cadence基础语法(上)31:48 视频:3-3 Cadence基础语法(下)25:37 视频:3-4 Cadence核心概念-账户、交易、引用26:52 视频:3-5 Cadence核心概念-Capability、接口、访问控制20:59 视频:3-6 工程化开发配置(上)30:40 视频:3-7 工程化开发配置(下)14:14 视频:3-8 DAPP开发实战-实现登陆&NFT 铸造(上)21:49 视频:3-9 DAPP开发实战-实现登陆&NFT 铸造(下)45:33 视频:3-10 DAPP开发实战-实现NFT售卖、交易51:37 第4章 以太坊入门与众筹项目实战 13 节|247分钟 视频:4-1 区块链的基础-链式结构、证明机制,比特币钱包09:48 视频:4-2 认识以太坊-账户、交易、区块16:16 视频:4-3 Solidity与智能合约开发22:58 视频:4-4 从简单例子入手Solidity43:11 视频:4-5 Solidity初遇-运算符、控制语句19:39 视频:4-6 Solidity初遇-实战操作18:26 视频:4-7 Solidity初遇-修饰符、数据类型15:12 视频:4-8 工程开发利器 Truffle20:05 视频:4-9 合约实战-众筹项目的开发(上)13:35 视频:4-10 合约实战-众筹项目的开发(中)12:38 视频:4-11 合约实战-众筹项目的开发(下)07:53 视频:4-12 合约实战-众筹项目的部署和测试14:45 视频:4-13 以太坊token标准与ERC20Token案例31:42 第5章 IC入门与NFT智能合约实战 7 节|217分钟 视频:5-1 IC(互联网计算机)技术概览24:55 视频:5-2 在IC上搭建简易的网站32:16 视频:5-3 合约开发-MOTOKO语言入门45:25 视频:5-4 Canister 智能合约-跨Canister调用、权限管理、Cycles管理49:40 视频:5-5 实战项目-NFT标准03:10 视频:5-6 实战项目-IC上的NFT智能合约(上)31:39 视频:5-7 实战项目-IC上的NFT智能合约(下) 资源下载 下载地址:留言邮箱后发送地址

一笔签名设计免费版在线艺术字

一笔签名设计免费版在线艺术字是一款免费的艺术签名在线生成器,提供连笔签名设计、一笔签名设计、花鸟艺术签名等等艺术签名在线生成,使用也笔记简单,提供艺术签名效果预览,喜欢哪个直接点击,输入文字即可,而且网站还提供名字写诗生日快乐诗词、谐音梗生成器、火星文转换器和流光字表情包等等功能,免注册使用。 艺术签名在线生成器网站 网站:http://www.yishuzi.com/