首页
友人帐
留言板
关于
Search
1
IDE Eval Resetter:JetBrains 全家桶无限试用插件
378 阅读
2
影视资源采集站收录大全
302 阅读
3
linux安装或升级protoc
223 阅读
4
VFM 3.7.5 源码 - 一个极简的 PHP 私人云盘!
161 阅读
5
批量采集美女写真等图片做图片站
149 阅读
谈天说地
程序源码
技术教程
成品源码
登录
Search
标签搜索
PHP
linux
源码
go
windows
centos
原创
mysql
微信
激活
采集
宝塔
绿色版
API
解析
SDK
图片
破解
域名
html
云青
累计撰写
150
篇文章
累计收到
78
条评论
首页
栏目
谈天说地
程序源码
技术教程
成品源码
页面
友人帐
留言板
关于
搜索到
11
篇与
的结果
2022-10-26
golang中time.RFC3339时间格式化
在开发过程中,我们有时会遇到这样的问题,将 2022-10-22T08:18:46+08:00 转成 2022-10-22 08:18:46,怎么解决这个问题?解决这个问题,最好不要用字符串截取,或者说字符串截取是最笨的方法,这应该是时间格式化的问题。我们先看一下 golang time 包中支持的 format 格式:const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = "Monday, 02-Jan-06 15:04:05 MST" RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST" RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone RFC3339 = "2006-01-02T15:04:05Z07:00" RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" Kitchen = "3:04PM" // Handy time stamps. Stamp = "Jan _2 15:04:05" StampMilli = "Jan _2 15:04:05.000" StampMicro = "Jan _2 15:04:05.000000" StampNano = "Jan _2 15:04:05.000000000" )我们找到了 RFC3339 ,那就很简单了,我们封装一个方法 RFC3339ToDateTime,见下面代码package lib import "time" var _ Time = (*timer)(nil) const cstLayout = "2006-01-02 15:04:05" type Time interface { RFC3339ToDateTime(value string) (string, error) } type timer struct { Cst *time.Location } func NewTime() Time { cst, _ := time.LoadLocation("Asia/Shanghai") return &timer{ Cst: cst, } } func (con *timer) RFC3339ToDateTime(value string) (string, error) { ts, err := time.Parse(time.RFC3339, value) if err != nil { return "", err } return ts.In(con.Cst).Format(cstLayout), nil } 运行一下v, err := lib.NewTime().RFC3339ToDateTime("2022-10-22T08:18:46+08:00") if err != nil { fmt.Println(err) } fmt.Println(v) 输出: 2020-11-08 08:18:46小结同理,若遇到 RFC3339Nano、RFC822、RFC1123 等格式,也可以使用类似的方法,只需要在 time.Parse() 中指定时间格式即可。
2022年10月26日
12 阅读
0 评论
0 点赞
2022-06-10
golang使用宝塔API快速建站
由于某些原因,需要用一行命令来创建宝塔以及数据库,此函数基于官方的API注意:宝塔创建网站需要使用php 以下代码使用php80下面代码用到了第三方库github.com/spf13/vipermd5的计算就不贴了很简单BtServer主文件/* * @Author anderyly * @email admin@aaayun.cc * @link http://blog.aaayun.cc/ * @copyright Copyright (c) 2022 */ package ay import ( "encoding/json" "fmt" "io/ioutil" "net/http" "runtime" "strconv" "strings" "time" ) type BtServer struct { } // GetSign 获取签名 func (con BtServer) GetSign() map[string]string { res := make(map[string]string, 2) res["request_time"] = strconv.FormatInt(time.Now().Unix(), 10) res["request_token"] = MD5(res["request_time"] + MD5(Yaml.GetString("bt.code"))) return res } // GetSiteId 获取网站id func (con BtServer) GetSiteId() { type r struct { Where string `json:"where"` Page string `json:"page"` Data []struct { Id int `json:"id"` Name string `json:"name"` Path string `json:"path"` Status string `json:"status"` Ps string `json:"ps"` Addtime string `json:"addtime"` Edate string `json:"edate"` Type string `json:"type"` TypeVersion string `json:"type_version"` BackupCount int `json:"backup_count"` Domain int `json:"domain"` Ssl int `json:"ssl"` } `json:"data"` } url := Yaml.GetString("bt.panel") + "/data?action=getData&table=sites" data := con.GetSign() data["limit"] = "1" data["search"] = Yaml.GetString("bt.site") res := con.Http(url, data) var rj r json.Unmarshal([]byte(res), &rj) siteId := 0 if len(rj.Data) == 1 { for _, v := range rj.Data { siteId = v.Id } } Yaml.Set("bt.site_id", siteId) Yaml.WriteConfig() } func (con BtServer) Http(url string, data map[string]string) string { str := "" for k, v := range data { str += k + "=" + v + "&" } resp, err := http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(strings.TrimRight(str, "&"))) if err != nil { fmt.Println(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error } return string(body) } // Create 创建网站 func (con BtServer) Create() (bool, string) { type r struct { SiteStatus bool `json:"siteStatus"` SiteId int `json:"siteId"` FtpStatus bool `json:"ftpStatus"` DatabaseStatus bool `json:"databaseStatus"` Status bool `json:"status"` Msg string `json:"msg"` } url := Yaml.GetString("bt.panel") + "/site?action=AddSite" data := con.GetSign() pass := MD5(strconv.FormatInt(time.Time{}.Unix(), 10))[:10] Yaml.Set("mysql.user", "shop") Yaml.Set("mysql.database", "shop") Yaml.Set("mysql.password", pass) Yaml.Set("mysql.localhost", "127.0.0.1") Yaml.Set("mysql.port", "3306") if runtime.GOOS == "linux" { data["path"] = "/www/wwwroot/shop" } else { data["path"] = "D:/wwwroot/shop" } data["webname"] = `{"domain":"` + Yaml.GetString("bt.site") + `","domainlist":[],"count":0}` data["type_id"] = "0" data["type"] = "PHP" data["version"] = "80" data["port"] = "80" data["ps"] = "微营销" data["ftp"] = "false" data["sql"] = "true" data["codeing"] = "utf8mb4" data["datauser"] = "shop" data["datapassword"] = pass res := con.Http(url, data) var rj r json.Unmarshal([]byte(res), &rj) Yaml.Set("bt.site_id", rj.SiteId) if rj.SiteStatus && rj.DatabaseStatus { Yaml.WriteConfig() return true, "success" } else { return false, rj.Msg } } // GetDomain 获取域名 func (con BtServer) GetDomain() []map[string]string { type r struct { Id int `json:"id"` Pid int `json:"pid"` Name string `json:"name"` Port int `json:"port"` Addtime string `json:"addtime"` } url := Yaml.GetString("bt.panel") + "/data?action=getData&table=domain" data := con.GetSign() data["search"] = Yaml.GetString("bt.site_id") data["list"] = "true" res := con.Http(url, data) var rj []r json.Unmarshal([]byte(res), &rj) var s []map[string]string for _, v := range rj { s = append(s, map[string]string{ "id": strconv.Itoa(v.Id), "name": v.Name, "port": strconv.Itoa(v.Port), }) } return s } // DelDomain 删除域名 func (con BtServer) DelDomain(domain, port string) (bool, string) { type r struct { Status bool `json:"status"` Msg string `json:"msg"` } url := Yaml.GetString("bt.panel") + "/site?action=DelDomain" data := con.GetSign() data["id"] = Yaml.GetString("bt.site_id") data["webname"] = Yaml.GetString("bt.site") data["domain"] = domain data["port"] = port res := con.Http(url, data) var rj r json.Unmarshal([]byte(res), &rj) return rj.Status, rj.Msg } // SetDomain 设置域名 func (con BtServer) SetDomain(domain string) (bool, string) { type r struct { Status bool `json:"status"` Msg string `json:"msg"` } url := Yaml.GetString("bt.panel") + "/site?action=AddDomain" data := con.GetSign() data["id"] = Yaml.GetString("bt.site_id") data["webname"] = Yaml.GetString("bt.site") data["domain"] = domain res := con.Http(url, data) var rj r json.Unmarshal([]byte(res), &rj) return rj.Status, rj.Msg } // UpdateDomain 更新网站域名 func (con BtServer) UpdateDomain(str string) (bool, string) { domainArr := strings.Split(str, "=") btDomain := con.GetDomain() for _, v := range domainArr { domainS := 0 for _, v1 := range btDomain { if v == v1["name"] { domainS = 1 break } } if domainS != 1 { con.SetDomain(v) } } return true, "success" }yaml文件bt: code: QGg5Ct3BlSKlvZmvVk537vuVToJ8j8ci panel: http://127.0.0.1:8888 site: baidu1.com site_id: 1 domain: http://127.0.0.1:8082 mysql: database: shop localhost: 127.0.0.1 password: root port: 3306 user: root
2022年06月10日
17 阅读
0 评论
0 点赞
2021-11-18
飞尔国际源码
非资金盘系统,项目可长期运营预览程序说明源码采用php+golang+uniapp编写,可八端打包使用(安卓 iOS 小程序等)静态奖励存fil赚fil,2个fil起投,静态每天0.5%到3%收益,三倍出局动态奖励1.直推10%2.节点服务费奖励V1 业绩累积10fil享受名下会员每日静态收益1%节点服务费V2 业绩累积30fil 享受名下会员每日静态收益2%节点服务费V3业绩累积100fil享受名下会员每日静态收益3%节点服务费V4业绩累积200fil享受名下会员每日静态收益4%节点服务费V5业绩累计500fil享受名下会员每日静态收益5%节点服务费V6业绩累计1000fil享受名下会员每日静态收益7%节点服务费V7业绩累计2000fil享受名下会员每日静态收益10%节点服务费v8业绩累计数3000fil享受名下会员每日静态收益14%节点服务费v9业绩累积6000fil享受名下会员每日静态收益18%节点服务费v10业绩累积10000fil享受名下会员每日静态收益20%节点服务费 直推一人拿一代,直推两人拿两代,以此类推。3.平级奖当名下会员与你平级时,可获取直接推荐者每日动静态收益的10%
2021年11月18日
17 阅读
0 评论
0 点赞
2021-10-11
批量采集美女写真等图片做图片站
批量采集美女写真等图片做图片站批量采集美女写真等图片到typecho上,图片可选择本地化,内含多种数据源,程序采用golang开发,可进行多线程采集,经测试很稳定,目前可采集到2400篇文章,2w多图片。可自行编译,也有打包好的? http://www.52rm.cc编译 git clone https://github.com/Anderyly/beautyPictureCollection.git warm cd warm go mod init && go mod tidy go build数据库在typecho_contents表增加link字段 vachar 255即可 用于存储采集来源页运行请配置set.ini内容 chomd +x warm ./warmgithub
2021年10月11日
149 阅读
9 评论
0 点赞
2021-07-10
golang cron v3 定时任务实现
最近需要在 golang 中使用定时任务功能,用到了一个 cron 库,当前是 v3 版本,网上挺多都是 v2 的教程,记录一下使用方法。在旧版本的库中默认的 cron 表达式不是标准格式,第一个位是秒级的定义。现在 v3 版本直接用标准 cron 表示式即可,主要看 godoc 文档部分cron 表示式推荐使用在线工具来看自己写的 cron 对不对,简单的表达式直接写一般问题不大。这里推荐 crontab.guru,可以通过可视化的方式来查看你编写的定时规则。以下内容摘自 维基百科-Cron文件格式說明┌──分鐘(0 - 59) │ ┌──小時(0 - 23) │ │ ┌──日(1 - 31) │ │ │ ┌─月(1 - 12) │ │ │ │ ┌─星期(0 - 6,表示从周日到周六) │ │ │ │ │ * * * * * 被執行的命令注:在某些系统里,星期日也可以为 7不很直观的用法:如果日期和星期同时被设定,那么其中的一个条件被满足时,指令便会被执行。请参考下例。前 5 个域称之分时日月周,可方便个人记忆。从第六个域起,指明要执行的命令。安装现在都是用的 Go module 进行模块的管理,直接在 goland 中使用 alt + 回车即可同步对应的包 “github.com/robfig/cron/v3”使用 go get 安装方式如下go get github.com/robfig/cron/v3创建配置建议使用标准的 cron 表达式// 使用默认的配置 c := cron.New() // 可以配置如果当前任务正在进行,那么跳过 c := cron.New(cron.WithChain(cron.SkipIfStillRunning(logger))) // 官方也提供了旧版本的秒级的定义,这个注意你需要传入的 cron 表达式不再是标准 cron 表达式 c := cron.New(cron.WithSeconds()) 在上面的代码中出现了一个 logger,我使用的是 logrus,在源码中可以看到 cron 需要的 logger 的定义 // Logger is the interface used in this package for logging, so that any backend // can be plugged in. It is a subset of the github.com/go-logr/logr interface. type Logger interface { // Info logs routine messages about cron's operation. Info(msg string, keysAndValues ...interface{}) // Error logs an error condition. Error(err error, msg string, keysAndValues ...interface{}) } 那么我们定义了一个 Clog 结构体,实现对应的接口就行了 import ( "github.com/robfig/cron/v3" log "github.com/sirupsen/logrus" ) type CLog struct { clog *log.Logger } func (l *CLog) Info(msg string, keysAndValues ...interface{}) { l.clog.WithFields(log.Fields{ "data": keysAndValues, }).Info(msg) } func (l *CLog) Error(err error, msg string, keysAndValues ...interface{}) { l.clog.WithFields(log.Fields{ "msg": msg, "data": keysAndValues, }).Warn(msg) } 添加任务 启动定时任务有两种方法,分别是传入函数和传入任务。 传入函数 我们看到文档中给出的范例,可以看到任务的添加是通过 c.AddFunc() 这个函数来进行的,直接传入一个函数即可,可以看到定义是 func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error)。 # Runs at 6am in time.Local cron.New().AddFunc("0 6 * * ?", ...) # Runs at 6am in America/New_York nyc, _ := time.LoadLocation("America/New_York") c := cron.New(cron.WithLocation(nyc)) c.AddFunc("0 6 * * ?", ...) // AddFunc adds a func to the Cron to be run on the given schedule. // The spec is parsed using the time zone of this Cron instance as the default. // An opaque ID is returned that can be used to later remove it. func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) { return c.AddJob(spec, FuncJob(cmd)) }举个例子,如果你传入的任务仅仅就是一个简单函数进行执行,使用 AddFunc() 就行了,同时也可以通过闭包来引用函数外面的变量,下面是一个完整的例子。package main import ( "fmt" "github.com/robfig/cron/v3" "time" ) func TestCron() { c := cron.New() i := 1 c.AddFunc("*/1 * * * *", func() { fmt.Println("每分钟执行一次", i) i++ }) c.Start() time.Sleep(time.Minute * 5) } func main() { TestCron() } /* output 每分钟执行一次 1 每分钟执行一次 2 每分钟执行一次 3 每分钟执行一次 4 每分钟执行一次 5 */ 传入任务 但是如果我们定义的任务里面还需要留存其他信息呢,可以使用 AddJob() 这个函数,追溯一下源码定义。 // AddJob adds a Job to the Cron to be run on the given schedule. // The spec is parsed using the time zone of this Cron instance as the default. // An opaque ID is returned that can be used to later remove it. func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error) { schedule, err := c.parser.Parse(spec) if err != nil { return 0, err } return c.Schedule(schedule, cmd), nil } // 可以看到需要传入两个参数,`spec` 就是 cron 表达式,Job 类型我们好像还没见过,点进去看 // Job is an interface for submitted cron jobs. type Job interface { Run() } 现在知道我们的定时任务只需要实现 Run() 这个函数就行了,所以我们可以给出自己的 Job 定义 type Job struct { A int `json:"a"` B int `json:"b"` C string `json:"c"` Shut chan int `json:"shut"` } // implement Run() interface to start rsync job func (this Job) Run() { this.A++ fmt.Printf("A: %d\n", this.A) *this.B++ fmt.Printf("B: %d\n", *this.B) *this.C += "str" fmt.Printf("C: %s\n", *this.C) }代码例子给出一个完整代码的示例,我封装了一个 StartJob 函数,方便自己的管理,当然在 c.AddJob() 处可添加多个任务,都会 cron 的要求执行package main import ( "fmt" "github.com/robfig/cron/v3" log "github.com/sirupsen/logrus" "time" ) // 定时任务计划 /* - spec,传入 cron 时间设置 - job,对应执行的任务 */ func StartJob(spec string, job Job) { logger := &CLog{clog: log.New()} logger.clog.SetFormatter(&log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2006-01-02 15:04:05", }) c := cron.New(cron.WithChain(cron.SkipIfStillRunning(logger))) c.AddJob(spec, &job) // 启动执行任务 c.Start() // 退出时关闭计划任务 defer c.Stop() // 如果使用 select{} 那么就一直会循环 select { case <-job.Shut: return } } func StopJob(shut chan int) { shut <- 0 } type CLog struct { clog *log.Logger } func (l *CLog) Info(msg string, keysAndValues ...interface{}) { l.clog.WithFields(log.Fields{ "data": keysAndValues, }).Info(msg) } func (l *CLog) Error(err error, msg string, keysAndValues ...interface{}) { l.clog.WithFields(log.Fields{ "msg": msg, "data": keysAndValues, }).Warn(msg) } type Job struct { A int `json:"a"` B int `json:"b"` C string `json:"c"` Shut chan int `json:"shut"` } // implement Run() interface to start job func (j *Job) Run() { j.A++ fmt.Printf("A: %d\n", j.A) j.B++ fmt.Printf("B: %d\n", j.B) j.C += "str" fmt.Printf("C: %s\n", j.C) } func main() { job1 := Job{ A: 0, B: 1, C: "", Shut: make(chan int, 1), } // 每分钟执行一次 go StartJob("*/1 * * * *", job1) time.Sleep(time.Minute * 3) } /* output A: 1 B: 2 C: str A: 2 B: 3 C: strstr A: 3 B: 4 C: strstrstr */总结这个 cron 库的 v3 版本直接使用标准 cron 表达式即可启动 cron 任务有传入函数和传入任务两种方法,如果需要管理建议实现自己的 Job 类参考资料robfig/crongodoc-croncrontab.guru
2021年07月10日
17 阅读
0 评论
0 点赞
1
2
3