diff --git a/.gitignore b/.gitignore index 83d7ac2..363e416 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,2 @@ secret.conf go.sum -config.yaml - -### Go ### -# If you prefer the allow list template instead of the deny list, see community template: -# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore -# -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file -go.work - -# End of https://www.toptal.com/developers/gitignore/api/go diff --git a/config.example.yaml b/config.example.yaml deleted file mode 100644 index 3b02854..0000000 --- a/config.example.yaml +++ /dev/null @@ -1,2 +0,0 @@ -instance: https://pleroma.catgirls.asia -rss_url: https://4pda.to/feed \ No newline at end of file diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..81b3139 --- /dev/null +++ b/config.yaml @@ -0,0 +1,2 @@ +instance: pleroma.catgirls.asia +rss_url: https://pleroma.catgirls.asia/users/SiberiaBread/feed.atom \ No newline at end of file diff --git a/go.mod b/go.mod index 4c8a8ee..36ff9f2 100644 --- a/go.mod +++ b/go.mod @@ -1,27 +1,25 @@ module kiki -go 1.23.0 - -toolchain go1.24.2 +go 1.21 require ( github.com/go-yaml/yaml v2.1.0+incompatible github.com/mattn/go-mastodon v0.0.9 github.com/mmcdole/gofeed v1.3.0 - github.com/urfave/cli/v3 v3.1.1 - golang.org/x/net v0.39.0 + github.com/urfave/cli/v3 v3.0.0-beta1 ) require ( - github.com/PuerkitoBio/goquery v1.10.2 // indirect - github.com/andybalholm/cascadia v1.3.3 // indirect - github.com/gorilla/websocket v1.5.3 // indirect + github.com/PuerkitoBio/goquery v1.8.0 // indirect + github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mmcdole/goxpp v1.1.1 // indirect + github.com/mmcdole/goxpp v1.1.1-0.20240225020742-a0c311522b23 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/text v0.15.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/main.go b/main.go index 6b00be9..a94dbb1 100644 --- a/main.go +++ b/main.go @@ -3,20 +3,16 @@ package main import ( "context" "fmt" - "io" "log" - "net/http" "net/url" "os" "path/filepath" - "strings" "time" "github.com/go-yaml/yaml" "github.com/mattn/go-mastodon" "github.com/mmcdole/gofeed" "github.com/urfave/cli/v3" - "golang.org/x/net/html" ) type MastodonClientData struct { @@ -31,19 +27,16 @@ type KikiSettings struct { RSSUri string `yaml:"rss_url,omitempty"` } -func getSecrets(path string) *mastodon.Config { +func getDataFromConfig(path string) *mastodon.Config { var clientData MastodonClientData - secretConfig, err := os.ReadFile(path) if err != nil { log.Println(err) } - err = yaml.Unmarshal(secretConfig, &clientData) if err != nil { log.Println(err) } - config := &mastodon.Config{ Server: clientData.Instance, ClientID: clientData.ClientID, @@ -56,21 +49,18 @@ func getSecrets(path string) *mastodon.Config { func getKikiConfig(path string) KikiSettings { var kikiSettings KikiSettings - kikiConfigFile, err := os.ReadFile(path) if err != nil { log.Println(err) } - err = yaml.Unmarshal(kikiConfigFile, &kikiSettings) if err != nil { log.Println(err) } - return kikiSettings } -func clientConfiguration(Instance string) { +func ClientConfiguration(Instance string) { appConfig := &mastodon.AppConfig{ Server: Instance, ClientName: "Kiki", @@ -78,7 +68,6 @@ func clientConfiguration(Instance string) { Website: "catgirls.asia", RedirectURIs: "urn:ietf:wg:oauth:2.0:oob", } - app, err := mastodon.RegisterApp(context.Background(), appConfig) if err != nil { log.Println(err) @@ -116,14 +105,11 @@ func clientConfiguration(Instance string) { if err != nil { log.Println(err) } - - log.Println(string(marshaledYaml)) - secretConfig, err := os.OpenFile("secret.conf", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o644) + secretConfig, err := os.OpenFile("secret.conf", os.O_CREATE, 0o644) if err != nil { log.Println(err) } - secretConfig.Write(marshaledYaml) - defer secretConfig.Close() + secretConfig.WriteString(string(marshaledYaml)) } func newsText(url string) []*gofeed.Item { @@ -136,90 +122,22 @@ func newsText(url string) []*gofeed.Item { return feed.Items } -func createPost(mastoClient mastodon.Client, toot mastodon.Toot) { +func createPost(statusText string) { + config := getDataFromConfig("secret.conf") + + mastoClient := mastodon.NewClient(config) + + toot := mastodon.Toot{ + Status: statusText, + Visibility: "unlisted", + } + _, err := mastoClient.PostStatus(context.Background(), &toot) if err != nil { log.Println(err) } } -func picBytesArray(picturesArray []string) [][]byte { - var picturesBytes [][]byte - for _, picture := range picturesArray { - resp, err := http.Get(picture) - if err != nil { - log.Println(err) - return picturesBytes - } - defer resp.Body.Close() - picBytes, err := io.ReadAll(resp.Body) - if err != nil { - log.Println(err) - return picturesBytes - } - picturesBytes = append(picturesBytes, picBytes) - } - return picturesBytes -} - -func uploadPictures(mastoClient mastodon.Client, filesBytes [][]byte) []*mastodon.Attachment { - var attachments []*mastodon.Attachment - - for _, file := range filesBytes { - att, err := mastoClient.UploadMediaFromBytes(context.Background(), file) - - if err != nil { - log.Println(err) - return attachments - } - - attachments = append(attachments, att) - } - - return attachments -} - -func createToot(mastoClient mastodon.Client, newsDesc string) (mastodon.Toot, error) { - var tootText string - var imgArray []string - var attachments []*mastodon.Attachment - - toot := mastodon.Toot{ - Visibility: "unlisted", - Sensitive: true, - } - - uString := html.UnescapeString(newsDesc) - pHtml, err := html.Parse(strings.NewReader(uString)) - if err != nil { - return mastodon.Toot{}, err - } - - for n := range pHtml.Descendants() { - if n.Type != html.ElementNode { - tootText += (n.Data + "\n") - } - if n.Type == html.ElementNode && n.Data == "img" { - for _, attr := range n.Attr { - if attr.Key == "src" { - imgArray = append(imgArray, attr.Val) - } - } - } - } - - if len(imgArray) != 0 { - attachments = uploadPictures(mastoClient, picBytesArray(imgArray)) - } - - toot.Status = tootText - for _, attach := range attachments { - toot.MediaIDs = append(toot.MediaIDs, attach.ID) - } - - return toot, nil -} - func main() { cmd := &cli.Command{ Name: "kiki", @@ -230,20 +148,16 @@ func main() { Usage: "Инициализировать клиента", Action: func(ctx context.Context, cmd *cli.Command) error { confFile, err := filepath.Abs("config.yaml") - kikiConfig := getKikiConfig(confFile) - if err != nil { log.Println(err) } - + kikiConfig := getKikiConfig(confFile) instanceUrlParser, err := url.Parse(kikiConfig.Instance) if err != nil { log.Println(err) } instanceUrlParser.Scheme = "https" - - clientConfiguration(instanceUrlParser.String()) - + ClientConfiguration(instanceUrlParser.String()) return nil }, }, @@ -252,29 +166,28 @@ func main() { Usage: "Запуск транслятора", Action: func(ctx context.Context, cmd *cli.Command) error { var lastGUID string - mastoClient := mastodon.NewClient(getSecrets("secret.conf")) - confFile, err := filepath.Abs("config.yaml") if err != nil { log.Println(err) } kikiConfig := getKikiConfig(confFile) - ticker := time.NewTicker(1 * time.Minute) defer ticker.Stop() for range ticker.C { news := newsText(kikiConfig.RSSUri) if news[0].GUID != lastGUID { - log.Println(news[0].Description) - - toot, err := createToot(*mastoClient, news[0].Description) - if err != nil { - log.Println(err) - } - - createPost(*mastoClient, toot) + createPost(news[0].Description) lastGUID = news[0].GUID + log.Println("Пост отправлен") } + /*for _, item := range newsText(kikiConfig.RSSUri) { + if item.GUID == lastGUID { + break + } + createPost(item.Description) + lastGUID = item.GUID + log.Println("Пост отправлен") + }*/ } return nil },