Feature: latest by followed page

This commit is contained in:
VnPower 2023-07-25 20:55:32 +07:00
parent baffd00c8f
commit e1035fb6eb
Signed by: vnpower
GPG key ID: 881DE3DEB966106C
9 changed files with 129 additions and 33 deletions

View file

@ -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

View file

@ -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"
)

View file

@ -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)
if err != nil {
return err
var body struct {
Thumbnails json.RawMessage `json:"thumbnails"`
}
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
var artworks struct {
Artworks []models.IllustShort `json:"illust"`
}
return nil
response, err := p.PixivRequest(URL, token)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(response), &body)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(body.Thumbnails), &artworks)
if err != nil {
return nil, err
}
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

BIN
template/assets/users.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View 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>

View file

@ -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>

View file

@ -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")

View file

@ -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)