Browse Source

add a lot

master v0.0.30
realxlfd 2 months ago
parent
commit
0e84911583
  1. 43
      README.MD
  2. 44
      cli/logger/index.go
  3. 76
      net/apis/ym/utils.go
  4. 13
      net/app/reverse_proxy/logger.go
  5. 20
      net/apps/reverse_proxy/logger.go
  6. 17
      net/apps/reverse_proxy/server.go
  7. 15
      utils/str/index.go

43
README.MD

@ -1,4 +1,4 @@
# RealXLFD的Go工具库(自用)
# RealXLFD Go 工具库(自用)
## 优势
@ -8,32 +8,33 @@
- `cli` 命令行工具
- `git.realxlfd.cc/RealXLFD/cli/ui` 一些通用配置
- `git.realxlfd.cc/RealXLFD/cli/spinner` spinner,兼容cui
- `git.realxlfd.cc/RealXLFD/cli/spinner` spinner,兼容 cui
- `git.realxlfd.cc/RealXLFD/cli/logger` 日志
- `cliapps` 命令行应用的Go绑定
- `git.realxlfd.cc/RealXLFD/ffmpeg` ffmpeg cli的Go绑定
- `git.realxlfd.cc/RealXLFD/vips` vips cli的Go绑定
- `cliapps` 命令行应用的 Go 绑定
- `git.realxlfd.cc/RealXLFD/ffmpeg` ffmpeg cli Go 绑定
- `git.realxlfd.cc/RealXLFD/vips` vips cli Go 绑定
- `net` 网络工具
- `apis` 一些网络应用程序API的Go绑定
- `git.realxlfd.cc/RealXLFD/net/apis/tmdb` The Movie Database
API的Go绑定,内置了Web爬虫
- `git.realxlfd.cc/RealXLFD/net/apis/` 云码API的Go绑定
- `git.realxlfd.cc/RealXLFD/net/apis/openai` OpenAI API的Go绑定
- `git.realxlfd.cc/RealXLFD/net/apis/skysnow` 天雪站爬虫 (开发中)
- `apis` 一些网络应用程序 API 的 Go 绑定
- `git.realxlfd.cc/RealXLFD/net/apis/tmdb` The Movie Database API 的 Go 绑定,内置了 Web 爬虫
- `git.realxlfd.cc/RealXLFD/net/apis/openai` OpenAI API 的 Go 绑定
- `git.realxlfd.cc/RealXLFD/net/apis/skysnow` 天雪站爬虫 (开发中)
- `utils` 网络通用工具
- `git.realxlfd.cc/RealXLFD/net/utils/cookie`
用于反序列化Set-Cookie标头或者序列化Cookie
- `git.realxlfd.cc/RealXLFD/net/utils/crawler`
基于ChromeWebDriver和Selenium的自动化工具
- `git.realxlfd.cc/RealXLFD/net/utils/urlbuilder` URL构建器
- `git.realxlfd.cc/RealXLFD/net/utils/cookie` 用于反序列化 Set-Cookie 标头或者序列化 Cookie
- `git.realxlfd.cc/RealXLFD/net/utils/crawler` 基于 ChromeWebDriver 和 Selenium 的自动化工具
- `git.realxlfd.cc/RealXLFD/net/utils/urlbuilder` URL 构建器
- `apps`
- `git.realxlfd.cc/RealXLFD/net/apps/multithread_downloader` 多线程下载器
- `git.realxlfd.cc/RealXLFD/net/apps/reverse_proxy` 反向代理
- `utils` 一般通用工具
- `git.realxlfd.cc/RealXLFD/utils/file/str` 高级字符串序列处理
- `file` 文件操作
- `git.realxlfd.cc/RealXLFD/utils/file/dcom`
解压缩工具,支持密码爆破、分卷解压(开发中)
- `git.realxlfd.cc/RealXLFD/utils/file/gozip` zip压缩
- `git.realxlfd.cc/RealXLFD/utils/file/dcom` 多密码解压缩工具
- `git.realxlfd.cc/RealXLFD/utils/file/gozip` zip 压缩
- `git.realxlfd.cc/RealXLFD/utils/file/fscan` 文件扫描器
- `git.realxlfd.cc/RealXLFD/utils/file/fos` 文件操作
- `git.realxlfd.cc/RealXLFD/utils/file/str` 高级字符串序列处理
- `git.realxlfd.cc/RealXLFD/utils/file/fos` 文件操作 (移动、拷贝、删除空文件夹...)
- `proc` 处理流
- `git.realxlfd.cc/RealXLFD/utils/threadpool` 线程池

44
cli/logger/index.go

@ -9,8 +9,9 @@ import (
)
type Logger struct {
Level Level
HideTime bool
Level Level // 日志级别
HideTime bool // 是否隐藏时间戳
LengthLimit int // 设置logger消息长度限制
}
type Level int
@ -41,48 +42,63 @@ var (
Timer = func() string {
return time.Now().Format(time.Kitchen)
}
OutputFunc = func(log string) {
fmt.Println(log)
}
)
func (l Logger) Info(msg ...interface{}) {
func (l *Logger) Info(msg string) {
if l.Level < LevelInfo {
return
}
timeStamp := ""
if !l.HideTime {
timeStamp = str.Join(Timer(), " ")
timeStamp = str.Join(gray(Timer()), " ")
}
if l.LengthLimit > 0 && len([]rune(msg)) > l.LengthLimit {
msg = str.TrimEnd(msg, l.LengthLimit)
}
fmt.Println(str.Join(timeStamp, argInfo), msg)
OutputFunc(fmt.Sprint(str.Join(timeStamp, argInfo, " "), msg))
}
func (l Logger) Debug(msg ...interface{}) {
func (l *Logger) Debug(msg string) {
if l.Level < LevelDebug {
return
}
timeStamp := ""
if !l.HideTime {
timeStamp = str.Join(Timer(), " ")
timeStamp = str.Join(gray(Timer()), " ")
}
if l.LengthLimit > 0 && len([]rune(msg)) > l.LengthLimit {
msg = str.TrimEnd(msg, l.LengthLimit)
}
fmt.Println(str.Join(timeStamp, argDebug), msg)
OutputFunc(fmt.Sprint(str.Join(timeStamp, argDebug, " "), msg))
}
func (l Logger) Warn(msg ...interface{}) {
func (l *Logger) Warn(msg string) {
if l.Level < LevelWarn {
return
}
timeStamp := ""
if !l.HideTime {
timeStamp = str.Join(Timer(), " ")
timeStamp = str.Join(gray(Timer()), " ")
}
fmt.Println(str.Join(timeStamp, argWarn), msg)
if l.LengthLimit > 0 && len([]rune(msg)) > l.LengthLimit {
msg = str.TrimEnd(msg, l.LengthLimit)
}
OutputFunc(fmt.Sprint(str.Join(timeStamp, argWarn, " "), msg))
}
func (l Logger) Error(msg ...interface{}) {
func (l *Logger) Error(msg string) {
if l.Level < LevelError {
return
}
timeStamp := ""
if !l.HideTime {
timeStamp = str.Join(Timer(), " ")
timeStamp = str.Join(gray(Timer()), " ")
}
if l.LengthLimit > 0 && len([]rune(msg)) > l.LengthLimit {
msg = str.TrimEnd(msg, l.LengthLimit)
}
fmt.Println(str.Join(timeStamp, argError), msg)
OutputFunc(fmt.Sprint(str.Join(timeStamp, argError, " "), msg))
}

76
net/apis/ym/utils.go

@ -1,76 +0,0 @@
package ym
import (
"encoding/json"
"errors"
"fmt"
"github.com/parnurzeal/gorequest"
"net/http"
"net/url"
)
var (
Token = ``
BaseURL = &url.URL{
Host: `api.jfbym.com`,
Scheme: `http`,
Path: `/api/YmServer/customApi`,
}
Proxy = &url.URL{
Host: `127.0.0.1:7890`,
Scheme: `http`,
}
)
type RespCommonVerify struct {
Msg string `json:"msg"`
Code int `json:"code"`
Data struct {
Code int `json:"code"`
Data string `json:"data"`
Time float64 `json:"time"`
Externel int `json:"externel"`
UniqueCode string `json:"unique_code"`
FilePath string `json:"file_path"`
} `json:"data"`
}
func CommonVerify(imgBase64 string, method int) (result string, errs []error) {
if Token == `` {
return ``, []error{errors.New(`token is empty`)}
}
content := fmt.Sprintf(
`image=%s&type=%d&token=%s`, imgBase64,
method, Token,
)
target := BaseURL.String()
req := gorequest.New().Post(target).Send(content).Set(
`Content-Type`, `application/x-www-form-urlencoded`,
)
if Proxy != nil {
req.Proxy(Proxy.String())
}
var resp *http.Response
var body string
resp, body, errs = req.End()
if errs != nil {
return result, errs
}
if resp.StatusCode != 200 {
return result, []error{
fmt.Errorf(
`server error: status code %d`, resp.StatusCode,
),
}
}
v := &RespCommonVerify{}
err := json.Unmarshal([]byte(body), v)
if err != nil {
return result, []error{fmt.Errorf(`can not parse data: %s`, body)}
}
if v.Code != 10000 {
return result, []error{fmt.Errorf(`server error: %s`, v.Msg)}
}
result = v.Data.Data
return result, nil
}

13
net/app/reverse_proxy/logger.go

@ -1,13 +0,0 @@
package rproxy
import (
"git.realxlfd.cc/RealXLFD/golib/cli/logger"
)
var (
l = &logger.Logger{}
)
func SetLogLevel(level logger.Level) {
l.Level = level
}

20
net/apps/reverse_proxy/logger.go

@ -0,0 +1,20 @@
package rproxy
import (
"log"
"git.realxlfd.cc/RealXLFD/golib/cli/logger"
)
var (
Logger = &logger.Logger{}
)
func SetLogLevel(level logger.Level) {
Logger.Level = level
}
func init() {
log.SetFlags(0)
log.SetOutput(Logger.ToErrorWriter())
}

17
net/app/reverse_proxy/server.go → net/apps/reverse_proxy/server.go

@ -7,6 +7,7 @@ import (
"net/http"
"net/http/httputil"
"net/url"
"strings"
"time"
"git.realxlfd.cc/RealXLFD/golib/utils/str"
@ -69,7 +70,7 @@ func (s *Server) Run() *Server {
go func() {
err := s.runner()()
if err != nil {
logger.Error(fmt.Sprintf("server failed: %s", err.Error()))
Logger.Error(fmt.Sprintf("server failed: %s", err.Error()))
}
}()
return s
@ -94,6 +95,12 @@ func (s *Server) runner() func() error {
Addr: fmt.Sprintf(":%d", s.config.Port),
Handler: mux,
}
Logger.Info(
fmt.Sprintf(
"Server is listening on port: %d",
s.config.Port,
),
)
return httpServer.ListenAndServe()
}
}
@ -120,15 +127,15 @@ func (s *Server) requestHandler() func(
if s.config.ProxyURL != nil {
proxyInfo = fmt.Sprintf(" -> [%s]", s.config.ProxyURL.Host)
}
logger.Info(
Logger.Info(
fmt.Sprintf(
"%s -> [:%d]%s -> %s",
r.RemoteAddr,
r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")],
s.config.Port,
proxyInfo,
str.Trim(
str.TrimMiddle(
str.Join(s.config.TargetURL.Host, r.RequestURI),
20,
35,
),
),
)

15
utils/str/index.go

@ -5,18 +5,25 @@ import (
"strings"
)
func Trim(str string, maxLength int) string {
func TrimMiddle(str string, maxLength int) string {
var head, tail string
runeSlice := []rune(str)
strLength := len(runeSlice)
if len(runeSlice) > maxLength {
head = string(runeSlice[:maxLength/2-2])
head = string(runeSlice[:maxLength/2-1])
tail = string(runeSlice[strLength-(maxLength/2+2):])
return fmt.Sprintf("%s...%s", head, tail)
}
return str
}
func TrimEnd(str string, maxLength int) string {
runeSlice := []rune(str)
if len(runeSlice) > maxLength {
return Join(string(runeSlice[:maxLength-3]), "...")
}
return str
}
func Join(ss ...string) string {
builder := strings.Builder{}
for _, s := range ss {
@ -25,7 +32,9 @@ func Join(ss ...string) string {
return builder.String()
}
func Each(ss []string, f func(index int, s string) (string, bool)) []string {
func Each(
ss []string, f func(index int, s string) (string, bool),
) []string {
var result []string
for index, s := range ss {
if s, ok := f(index, s); ok {

Loading…
Cancel
Save