Feature: latest by followed page
This commit is contained in:
parent
baffd00c8f
commit
e1035fb6eb
9 changed files with 129 additions and 33 deletions
|
@ -45,16 +45,22 @@ func (p *PixivClient) SetLang(lang string) {
|
|||
p.Lang = lang
|
||||
}
|
||||
|
||||
func (p *PixivClient) Request(URL string) (*http.Response, error) {
|
||||
func (p *PixivClient) Request(URL string, token ...string) (*http.Response, error) {
|
||||
req, _ := http.NewRequest("GET", URL, nil)
|
||||
|
||||
// Add headers
|
||||
for k, v := range p.Header {
|
||||
req.Header.Add(k, v)
|
||||
}
|
||||
|
||||
for k, v := range p.Cookie {
|
||||
req.AddCookie(&http.Cookie{Name: k, Value: v})
|
||||
}
|
||||
|
||||
if token != nil {
|
||||
req.AddCookie(&http.Cookie{Name: "PHPSESSID", Value: token[0]})
|
||||
}
|
||||
|
||||
// Make a request
|
||||
resp, err := p.Client.Do(req)
|
||||
|
||||
|
@ -69,9 +75,15 @@ func (p *PixivClient) Request(URL string) (*http.Response, error) {
|
|||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *PixivClient) TextRequest(URL string) (string, error) {
|
||||
func (p *PixivClient) TextRequest(URL string, tokens ...string) (string, error) {
|
||||
var token string
|
||||
|
||||
if len(token) > 0 {
|
||||
token = tokens[0]
|
||||
}
|
||||
|
||||
/// Make a request to a URL and return the response's string body
|
||||
resp, err := p.Request(URL)
|
||||
resp, err := p.Request(URL, token)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
@ -85,11 +97,16 @@ func (p *PixivClient) TextRequest(URL string) (string, error) {
|
|||
return string(body), nil
|
||||
}
|
||||
|
||||
func (p *PixivClient) PixivRequest(URL string) (json.RawMessage, error) {
|
||||
func (p *PixivClient) PixivRequest(URL string, tokens ...string) (json.RawMessage, error) {
|
||||
/// Make a request to a Pixiv API URL with a standard response, handle errors and return the raw JSON response
|
||||
var response models.PixivResponse
|
||||
var token string
|
||||
|
||||
body, err := p.TextRequest(URL)
|
||||
if len(token) > 0 {
|
||||
token = tokens[0]
|
||||
}
|
||||
|
||||
body, err := p.TextRequest(URL, token)
|
||||
// body = strings.ReplaceAll(body, "i.pximg.net", configs.ProxyServer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -18,4 +18,5 @@ const (
|
|||
UserBookmarksURL = "https://www.pixiv.net/ajax/user/%s/illusts/bookmarks?tag=&offset=%d&limit=48&rest=%s"
|
||||
FrequentTagsURL = "https://www.pixiv.net/ajax/tags/frequent/illust?%s"
|
||||
LandingPageURL = "https://www.pixiv.net/ajax/top/illust?mode=%s"
|
||||
NewestFromFollowURL = "https://www.pixiv.net/ajax/follow_latest/%s?mode=%s&p=%s"
|
||||
)
|
||||
|
|
|
@ -1,34 +1,64 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"regexp"
|
||||
"fmt"
|
||||
"pixivfe/models"
|
||||
|
||||
"github.com/goccy/go-json"
|
||||
)
|
||||
|
||||
func (p *PixivClient) FollowUser(id string) error {
|
||||
formData := url.Values{}
|
||||
formData.Add("mode", "add")
|
||||
formData.Add("type", "user")
|
||||
formData.Add("user_id", id)
|
||||
formData.Add("tag", "")
|
||||
formData.Add("restrict", "0")
|
||||
formData.Add("format", "json")
|
||||
func (p *PixivClient) GetNewestFromFollowing(mode, page, token string) ([]models.IllustShort, error) {
|
||||
URL := fmt.Sprintf(NewestFromFollowURL, "illust", mode, page)
|
||||
|
||||
init, err := p.GetCSRF()
|
||||
println(init)
|
||||
var body struct {
|
||||
Thumbnails json.RawMessage `json:"thumbnails"`
|
||||
}
|
||||
|
||||
var artworks struct {
|
||||
Artworks []models.IllustShort `json:"illust"`
|
||||
}
|
||||
|
||||
response, err := p.PixivRequest(URL, token)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pattern := regexp.MustCompile(`.*pixiv.context.token = "([a-z0-9]{32})"?.*`)
|
||||
quotesPattern := regexp.MustCompile(`([a-z0-9]{32})`)
|
||||
token := quotesPattern.FindString(pattern.FindString(init))
|
||||
println(token)
|
||||
|
||||
_, err = p.RequestWithFormData(FollowUserURL, formData, token)
|
||||
err = json.Unmarshal([]byte(response), &body)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
err = json.Unmarshal([]byte(body.Thumbnails), &artworks)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil
|
||||
return artworks.Artworks, nil
|
||||
}
|
||||
|
||||
// func (p *PixivClient) FollowUser(id string) error {
|
||||
// formData := url.Values{}
|
||||
// formData.Add("mode", "add")
|
||||
// formData.Add("type", "user")
|
||||
// formData.Add("user_id", id)
|
||||
// formData.Add("tag", "")
|
||||
// formData.Add("restrict", "0")
|
||||
// formData.Add("format", "json")
|
||||
|
||||
// init, err := p.GetCSRF()
|
||||
// println(init)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// pattern := regexp.MustCompile(`.*pixiv.context.token = "([a-z0-9]{32})"?.*`)
|
||||
// quotesPattern := regexp.MustCompile(`([a-z0-9]{32})`)
|
||||
// token := quotesPattern.FindString(pattern.FindString(init))
|
||||
// println(token)
|
||||
|
||||
// _, err = p.RequestWithFormData(FollowUserURL, formData, token)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// return nil
|
||||
// }
|
||||
|
|
BIN
template/assets/heart.png
Normal file
BIN
template/assets/heart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 569 B |
BIN
template/assets/users.png
Normal file
BIN
template/assets/users.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
23
template/following.jet.html
Normal file
23
template/following.jet.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
<div class="container">
|
||||
<h2>Newest works from people you follow</h2>
|
||||
<div class="switcher">
|
||||
<span class="switch-title">Filter</span>
|
||||
<a href="/following_works?mode=all&page=1" class="switch-button">All</a>
|
||||
<a href="/following_works?mode=safe&page=1" class="switch-button">Safe</a>
|
||||
<a href="/following_works?mode=r18&page=1" class="switch-button">R-18</a>
|
||||
</div>
|
||||
<div>{{ include "small-tn" Artworks }}</div>
|
||||
<div class="pagination">
|
||||
{{ url := "/following_works/" + "&mode=" + Queries.Mode + "&page=" }} {{ if Page == 1 }}
|
||||
<a href="#" class="pagination-button disabled">First</a>
|
||||
<a href="#" class="pagination-button disabled">Previous</a>
|
||||
{{ else }}
|
||||
<a href="{{url}}1" class="pagination-button">First</a>
|
||||
<a href="{{url}}{{ Page - 1 }}" class="pagination-button">Previous</a>
|
||||
{{ end }}
|
||||
|
||||
<a href="#" class="pagination-button disabled">{{ Page }}</a>
|
||||
|
||||
<a href="{{url}}{{ Page + 1 }}" class="pagination-button">Next</a>
|
||||
</div>
|
||||
</div>
|
|
@ -35,8 +35,11 @@
|
|||
<a class="sidebar-item" href="/newest">
|
||||
<img src="/assets/sparkling.png" alt="icon" />Newest</a>
|
||||
<br />
|
||||
<a class="sidebar-item" href="/self/following_works">
|
||||
<img src="/assets/users.png" alt="icon" />Latest by followed</a>
|
||||
<a class="sidebar-item" href="/self">
|
||||
<img src="/assets/user.png" alt="icon" />Your profile</a>
|
||||
<br />
|
||||
<a class="sidebar-item" href="/settings">
|
||||
<img src="/assets/settings.png" alt="icon" />Settings</a>
|
||||
</ul>
|
||||
|
|
|
@ -240,6 +240,29 @@ func discovery_page(c *fiber.Ctx) error {
|
|||
return c.Render("discovery", fiber.Map{"Title": "Discovery", "Artworks": artworks})
|
||||
}
|
||||
|
||||
func following_works_page(c *fiber.Ctx) error {
|
||||
image_proxy := get_session_value(c, "image-proxy")
|
||||
if image_proxy == nil {
|
||||
image_proxy = &configs.ProxyServer
|
||||
}
|
||||
token := get_session_value(c, "token")
|
||||
if token == nil {
|
||||
return c.Redirect("/login")
|
||||
}
|
||||
queries := make(map[string]string, 2)
|
||||
queries["Mode"] = c.Query("mode", "all")
|
||||
queries["Page"] = c.Query("page", "1")
|
||||
pageInt, _ := strconv.Atoi(queries["Page"])
|
||||
|
||||
artworks, err := PC.GetNewestFromFollowing(queries["Mode"], queries["Page"], *token)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
artworks = models.ProxyShortArtworkSlice(artworks, *image_proxy)
|
||||
|
||||
return c.Render("following", fiber.Map{"Title": "Following works", "Queries": queries, "Artworks": artworks, "Page": pageInt})
|
||||
}
|
||||
|
||||
func login_page(c *fiber.Ctx) error {
|
||||
return c.Render("login", fiber.Map{})
|
||||
}
|
||||
|
@ -269,10 +292,6 @@ func settings_post(c *fiber.Ctx) error {
|
|||
}
|
||||
|
||||
func get_logged_in_user(c *fiber.Ctx) error {
|
||||
image_proxy := get_session_value(c, "image-proxy")
|
||||
if image_proxy == nil {
|
||||
image_proxy = &configs.ProxyServer
|
||||
}
|
||||
token := get_session_value(c, "token")
|
||||
if token == nil {
|
||||
return c.Redirect("/login")
|
||||
|
|
|
@ -48,7 +48,10 @@ func SetupRoutes(r *fiber.App) {
|
|||
r.Get("ranking", ranking_page)
|
||||
r.Get("tags/:name", search_page)
|
||||
r.Get("discovery", discovery_page)
|
||||
r.Get("self", get_logged_in_user)
|
||||
|
||||
self := r.Group("self")
|
||||
self.Get("/", get_logged_in_user)
|
||||
self.Get("/following_works", following_works_page)
|
||||
r.Get("login", login_page)
|
||||
r.Post("tags", search)
|
||||
|
||||
|
|
Loading…
Reference in a new issue