Commit 9b85088665
Unsigned
Layout: unified · split
comments.go +9 −12
| @@ -13,24 +13,21 @@ type comments struct { | |||
| 13 | 13 | ||
| 14 | Total int | 14 | Total int |
| 15 | Thread []struct { | 15 | Thread []struct { |
| 16 | CommentId, ParentId, Replies, Likes int | 16 | Replies, Likes int |
| 17 | Posted time | 17 | ID int `json:"commentId"` |
| 18 | IsAuthorHighlited bool | 18 | Parent int `json:"ParrentId"` |
| 19 | 19 | ||
| 20 | Desctiption string | 20 | Posted time |
| 21 | Author bool `json:"isAuthorHighlited"` | ||
| 21 | 22 | ||
| 22 | // упрощение структуры с комментами | 23 | Desctiption string |
| 23 | Comment string | 24 | Comment string |
| 24 | 25 | ||
| 25 | TextContent struct { | 26 | TextContent text |
| 26 | Html struct { | ||
| 27 | Markup string | ||
| 28 | } | ||
| 29 | } | ||
| 30 | 27 | ||
| 31 | User struct { | 28 | User struct { |
| 32 | Username string | 29 | Username string |
| 33 | IsBanned bool | 30 | Banned bool `json:"isBanned"` |
| 34 | } | 31 | } |
| 35 | } | 32 | } |
| 36 | } | 33 | } |
deviantion.go +12 −7
| @@ -21,10 +21,14 @@ func (t *time) UnmarshalJSON(b []byte) (err error) { | |||
| 21 | 21 | ||
| 22 | // самая главная структура для поста | 22 | // самая главная структура для поста |
| 23 | type deviantion struct { | 23 | type deviantion struct { |
| 24 | Title, Url, License string | 24 | Title, Url, License string |
| 25 | PublishedTime time | 25 | PublishedTime time |
| 26 | IsMature, IsAiGenerated, IsDailyDeviation bool | 26 | |
| 27 | Author struct { | 27 | NSFW bool `json:"isMature"` |
| 28 | AI bool `json:"isAiGenerated"` | ||
| 29 | DD bool `json:"isDailyDeviation"` | ||
| 30 | |||
| 31 | Author struct { | ||
| 28 | Username string | 32 | Username string |
| 29 | } | 33 | } |
| 30 | Stats struct { | 34 | Stats struct { |
| @@ -54,11 +58,13 @@ type media struct { | |||
| 54 | } | 58 | } |
| 55 | 59 | ||
| 56 | type text struct { | 60 | type text struct { |
| 57 | Html struct { | 61 | Excerpt string |
| 62 | Html struct { | ||
| 58 | Markup, Type string | 63 | Markup, Type string |
| 59 | } | 64 | } |
| 60 | } | 65 | } |
| 61 | 66 | ||
| 67 | // структура поста | ||
| 62 | type Deviantion struct { | 68 | type Deviantion struct { |
| 63 | Deviation deviantion | 69 | Deviation deviantion |
| 64 | Comments struct { | 70 | Comments struct { |
| @@ -73,7 +79,6 @@ type Deviantion struct { | |||
| 73 | } | 79 | } |
| 74 | 80 | ||
| 75 | IMG, Desctiption string | 81 | IMG, Desctiption string |
| 76 | Recomendations []deviantion | ||
| 77 | } | 82 | } |
| 78 | 83 | ||
| 79 | // для работы функции нужно ID поста и имя пользователя. | 84 | // для работы функции нужно ID поста и имя пользователя. |
| @@ -98,7 +103,7 @@ func Deviation(id string, user string) Deviantion { | |||
| 98 | 103 | ||
| 99 | // базовая обработка описания | 104 | // базовая обработка описания |
| 100 | txt := st.Deviation.TextContent.Html.Markup | 105 | txt := st.Deviation.TextContent.Html.Markup |
| 101 | if len(txt) > 0 && txt[0:1] == "{" { | 106 | if len(txt) > 0 && txt[1] == 125 { |
| 102 | var description struct { | 107 | var description struct { |
| 103 | Blocks []struct { | 108 | Blocks []struct { |
| 104 | Text string | 109 | Text string |
examples/post.go deleted −25
| @@ -1,25 +0,0 @@ | |||
| 1 | package main | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "git.macaw.me/skunky/devianter" | ||
| 5 | ) | ||
| 6 | |||
| 7 | func main() { | ||
| 8 | id := "973578309" | ||
| 9 | d := devianter.Deviation(id, "Thrumyeye") | ||
| 10 | |||
| 11 | println("Post Name:", d.Deviation.Title, "\nIMG url:", d.IMG) | ||
| 12 | |||
| 13 | c := devianter.Comments(id, "", 0, 1) | ||
| 14 | println("\n\nPost Comments:", c.Total) | ||
| 15 | |||
| 16 | for _, a := range c.Thread { | ||
| 17 | if a.User.IsBanned { | ||
| 18 | a.User.Username += " [v bane]" | ||
| 19 | } | ||
| 20 | println(a.User.Username+":", a.Comment) | ||
| 21 | } | ||
| 22 | |||
| 23 | search := devianter.Search("skunk", "2", 'a') | ||
| 24 | println(search.Total, search.Pages) | ||
| 25 | } | ||
implementation.md +2
| @@ -2,3 +2,5 @@ | |||
| 2 | - emojis | 2 | - emojis |
| 3 | - deviantions | 3 | - deviantions |
| 4 | - comments | 4 | - comments |
| 5 | - search (including gallery search) | ||
| 6 | - users (with gallery) | ||
misc.go +35 −14
| @@ -3,11 +3,11 @@ package devianter | |||
| 3 | import ( | 3 | import ( |
| 4 | "encoding/json" | 4 | "encoding/json" |
| 5 | "errors" | 5 | "errors" |
| 6 | "fmt" | ||
| 7 | "io" | 6 | "io" |
| 8 | "log" | 7 | "log" |
| 9 | "math" | 8 | "math" |
| 10 | "net/http" | 9 | "net/http" |
| 10 | "strconv" | ||
| 11 | "strings" | 11 | "strings" |
| 12 | ) | 12 | ) |
| 13 | 13 | ||
| @@ -117,27 +117,44 @@ func AEmedia(name string, t rune) (string, error) { | |||
| 117 | 117 | ||
| 118 | /* SEARCH */ | 118 | /* SEARCH */ |
| 119 | type search struct { | 119 | type search struct { |
| 120 | Total int `json:"estTotal"` | 120 | Total int `json:"estTotal"` |
| 121 | Pages int // only for 'a' scope. | 121 | Pages int // only for 'a' and 'g' scope. |
| 122 | Deviations []deviantion | 122 | Results []deviantion `json:"deviations,results"` |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | func Search(query, page string, scope rune) (ss search) { | 125 | func Search(query string, page int, scope rune, user ...string) (ss search, e error) { |
| 126 | var url strings.Builder | 126 | var url strings.Builder |
| 127 | e = nil | ||
| 127 | 128 | ||
| 128 | // о5 построение ссылок. | 129 | // о5 построение ссылок. |
| 129 | switch scope { | 130 | switch scope { |
| 130 | case 'a': | 131 | case 'a': // поиск артов по названию |
| 131 | url.WriteString("dabrowse/search/all?q=") | 132 | url.WriteString("dabrowse/search/all?q=") |
| 132 | case 't': | 133 | case 't': // поиск артов по тегам |
| 133 | url.WriteString("dabrowse/networkbar/tag/deviations?tag=") | 134 | url.WriteString("dabrowse/networkbar/tag/deviations?tag=") |
| 135 | case 'g': // поиск артов пользователя или группы | ||
| 136 | if user != nil { | ||
| 137 | url.WriteString("dashared/gallection/search?username=") | ||
| 138 | for _, a := range user { | ||
| 139 | url.WriteString(a) | ||
| 140 | } | ||
| 141 | url.WriteString("&type=gallery&order=most-recent&init=true&limit=50&q=") | ||
| 142 | } else { | ||
| 143 | e = errors.New("Missing username (last argument)") | ||
| 144 | return | ||
| 145 | } | ||
| 134 | default: | 146 | default: |
| 135 | log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag.") | 147 | log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag;\n- 'g' - gallery.") |
| 136 | } | 148 | } |
| 137 | 149 | ||
| 138 | url.WriteString(query) | 150 | url.WriteString(query) |
| 139 | url.WriteString("&page=") | 151 | if scope != 'g' { // если область поиска не равна поиску по группам, то активируется этот код |
| 140 | url.WriteString(page) | 152 | url.WriteString("&page=") |
| 153 | } else { // иначе вместо страницы будет оффсет и страница умножится на 50 | ||
| 154 | url.WriteString("&offset=") | ||
| 155 | page = 50 * page | ||
| 156 | } | ||
| 157 | url.WriteString(strconv.Itoa(page)) | ||
| 141 | 158 | ||
| 142 | ujson(url.String(), &ss) | 159 | ujson(url.String(), &ss) |
| 143 | 160 | ||
| @@ -184,10 +201,14 @@ func puppy(data string) (string, error) { | |||
| 184 | } | 201 | } |
| 185 | } | 202 | } |
| 186 | 203 | ||
| 187 | body := request( | 204 | var url strings.Builder |
| 188 | fmt.Sprintf("https://www.deviantart.com/_puppy/%s&csrf_token=%s&da_minor_version=20230710", data, token), | 205 | url.WriteString("https://www.deviantart.com/_puppy/") |
| 189 | cookie, | 206 | url.WriteString(data) |
| 190 | ) | 207 | url.WriteString("&csrf_token=") |
| 208 | url.WriteString(token) | ||
| 209 | url.WriteString("&da_minor_version=20230710") | ||
| 210 | |||
| 211 | body := request(url.String(), cookie) | ||
| 191 | 212 | ||
| 192 | // если код ответа не 200, возвращается ошибка | 213 | // если код ответа не 200, возвращается ошибка |
| 193 | if body.Status != 200 { | 214 | if body.Status != 200 { |
todo.md +2 −3
| @@ -1,3 +1,2 @@ | |||
| 1 | - ~~users~~ | 1 | - groups |
| 2 | - ~~groups~~ | 2 | - images in comments\ No newline at end of file |
| 3 | - ~~images in comments~~\ No newline at end of file | ||
user-group.go added +92
| @@ -0,0 +1,92 @@ | |||
| 1 | package devianter | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "strconv" | ||
| 5 | "strings" | ||
| 6 | ) | ||
| 7 | |||
| 8 | // структура группы или пользователя | ||
| 9 | type Group struct { | ||
| 10 | ErrorDescription string | ||
| 11 | Owner struct { | ||
| 12 | Group bool `json:"isGroup"` | ||
| 13 | Username string | ||
| 14 | } | ||
| 15 | Gruser struct { | ||
| 16 | ID int `json:"gruserId"` | ||
| 17 | Page struct { | ||
| 18 | Modules []struct { | ||
| 19 | Name string | ||
| 20 | ModuleData struct { | ||
| 21 | About struct { | ||
| 22 | Country, Website, WebsiteLabel, Gender, Tagline string | ||
| 23 | DeviantFor int64 | ||
| 24 | SocialLinks []struct { | ||
| 25 | Value string | ||
| 26 | } | ||
| 27 | TextContent text | ||
| 28 | Interests []struct { | ||
| 29 | Label, Value string | ||
| 30 | } | ||
| 31 | } | ||
| 32 | CoverDeviation struct { | ||
| 33 | Deviation deviantion `json:"coverDeviation"` | ||
| 34 | } | ||
| 35 | |||
| 36 | // группы | ||
| 37 | GroupAbout struct { | ||
| 38 | Tagline string | ||
| 39 | CreatinDate time `json:"foundationTs"` | ||
| 40 | Description text | ||
| 41 | } | ||
| 42 | GroupAdmins struct { | ||
| 43 | Results []struct { | ||
| 44 | Username string | ||
| 45 | } | ||
| 46 | } | ||
| 47 | Folders struct { | ||
| 48 | Results []struct { | ||
| 49 | FolderId int | ||
| 50 | Name string | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | // галерея | ||
| 55 | ModuleData struct { | ||
| 56 | Folder struct { | ||
| 57 | Username string | ||
| 58 | Pages int `json:"totalPageCount"` | ||
| 59 | Deviations []deviantion | ||
| 60 | } `json:"folderDeviations"` | ||
| 61 | } | ||
| 62 | } | ||
| 63 | } | ||
| 64 | } | ||
| 65 | } | ||
| 66 | PageExtraData struct { | ||
| 67 | GruserTagline string | ||
| 68 | Stats struct { | ||
| 69 | Deviations, Watchers, Watching, Pageviews, CommentsMade, Favourites, Friends int | ||
| 70 | FeedComments int `json:"commentsReceivedProfile"` | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | func UGroup(name string) (g Group) { | ||
| 76 | ujson("dauserprofile/init/about?username="+name, &g) | ||
| 77 | |||
| 78 | return | ||
| 79 | } | ||
| 80 | |||
| 81 | // гарелея пользователя или группы | ||
| 82 | func Gallery(name string, page int) (g Group) { | ||
| 83 | var url strings.Builder | ||
| 84 | url.WriteString("dauserprofile/init/gallery?username=") | ||
| 85 | url.WriteString(name) | ||
| 86 | url.WriteString("&page=") | ||
| 87 | url.WriteString(strconv.Itoa(page)) | ||
| 88 | url.WriteString("&deviations_limit=50&with_subfolders=false") | ||
| 89 | |||
| 90 | ujson(url.String(), &g) | ||
| 91 | return | ||
| 92 | } | ||