Skip to content

Commit

Permalink
twitter: Reuse cache token until it's invalid
Browse files Browse the repository at this point in the history
  • Loading branch information
Brawl345 committed Jun 23, 2024
1 parent e9f1b1c commit 367f867
Showing 1 changed file with 72 additions and 26 deletions.
98 changes: 72 additions & 26 deletions plugin/twitter/twitter.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package twitter

import (
"errors"
"fmt"
"io"
"net/http"
"net/url"
"regexp"
"strings"
Expand All @@ -24,7 +26,9 @@ const (
)

type (
Plugin struct{}
Plugin struct {
guestToken string
}
)

func New() *Plugin {
Expand Down Expand Up @@ -53,36 +57,46 @@ func (p *Plugin) Handlers(*gotgbot.User) []plugin.Handler {
Trigger: regexp.MustCompile(`(?i)(?:x|twitter)\.com/status(?:es)?/(\d+)`),
HandlerFunc: p.OnStatus,
},
&plugin.CommandHandler{
Trigger: regexp.MustCompile(`(?i)nitter\.net/\w+/status(?:es)?/(\d+)`),
HandlerFunc: p.OnStatus,
},
}
}

func (p *Plugin) OnStatus(b *gotgbot.Bot, c plugin.GobotContext) error {
_, _ = c.EffectiveChat.SendAction(b, tgUtils.ChatActionTyping, nil)

// Get Guest Token first
func (p *Plugin) renewToken() error {
var tokenResponse TokenResponse
err := httpUtils.MakeRequest(httpUtils.RequestOptions{
Method: httpUtils.MethodPost,
URL: activateUrl,
Headers: map[string]string{"Authorization": bearerToken},
Response: &tokenResponse,
})

if err != nil {
guid := xid.New().String()
log.Err(err).
Str("guid", guid).
Msg("Failed to get guest token")
_, err := c.EffectiveMessage.Reply(b, fmt.Sprintf("❌ Es ist ein Fehler aufgetreten.%s", utils.EmbedGUID(guid)), utils.DefaultSendOptions())
return err
}

guestToken := tokenResponse.GuestToken
if tokenResponse.GuestToken == "" {
return errors.New("guest token is empty")
}

p.guestToken = tokenResponse.GuestToken
return nil
}

func (p *Plugin) OnStatus(b *gotgbot.Bot, c plugin.GobotContext) error {
_, _ = c.EffectiveChat.SendAction(b, tgUtils.ChatActionTyping, nil)

if p.guestToken == "" {
err := p.renewToken()

if err != nil {
guid := xid.New().String()
log.Err(err).
Str("guid", guid).
Msg("Failed to get guest token")
_, err := c.EffectiveMessage.Reply(b, fmt.Sprintf("❌ Es ist ein Fehler aufgetreten.%s", utils.EmbedGUID(guid)), utils.DefaultSendOptions())
return err
}
}

// Now we get the tweet
_, _ = c.EffectiveChat.SendAction(b, tgUtils.ChatActionTyping, nil)
tweetID := c.Matches[1]
requestUrl := url.URL{
Expand Down Expand Up @@ -111,28 +125,60 @@ func (p *Plugin) OnStatus(b *gotgbot.Bot, c plugin.GobotContext) error {
requestUrl.RawQuery = q.Encode()

var tweetResponse TweetResponse

err = httpUtils.MakeRequest(httpUtils.RequestOptions{
var httpError *httpUtils.HttpError
err := httpUtils.MakeRequest(httpUtils.RequestOptions{
Method: httpUtils.MethodGet,
URL: requestUrl.String(),
Headers: map[string]string{
"Authorization": bearerToken,
"User-Agent": "Googlebot",
"X-Guest-Token": guestToken,
"X-Guest-Token": p.guestToken,
"X-Twitter-Active-User": "yes",
"X-Twitter-Client-Language": "de",
},
Response: &tweetResponse,
})

if err != nil {
guid := xid.New().String()
log.Err(err).
Str("guid", guid).
Str("tweetID", tweetID).
Msg("Failed to get tweet")
_, err := c.EffectiveMessage.Reply(b, fmt.Sprintf("❌ Es ist ein Fehler aufgetreten.%s", utils.EmbedGUID(guid)), utils.DefaultSendOptions())
return err
if errors.As(err, &httpError) {
if httpError.StatusCode == http.StatusForbidden {
log.Debug().Msg("Renewing guest token")
err = p.renewToken()

if err != nil {
guid := xid.New().String()
log.Err(err).
Str("guid", guid).
Msg("Failed to get guest token")
_, err := c.EffectiveMessage.Reply(b, fmt.Sprintf("❌ Es ist ein Fehler aufgetreten.%s", utils.EmbedGUID(guid)), utils.DefaultSendOptions())
return err
}

// Try request the tweet again
err = httpUtils.MakeRequest(httpUtils.RequestOptions{
Method: httpUtils.MethodGet,
URL: requestUrl.String(),
Headers: map[string]string{
"Authorization": bearerToken,
"User-Agent": "Googlebot",
"X-Guest-Token": p.guestToken,
"X-Twitter-Active-User": "yes",
"X-Twitter-Client-Language": "de",
},
Response: &tweetResponse,
})
}
}

if err != nil {
guid := xid.New().String()
log.Err(err).
Str("guid", guid).
Str("tweetID", tweetID).
Msg("Failed to get tweet")
_, err := c.EffectiveMessage.Reply(b, fmt.Sprintf("❌ Es ist ein Fehler aufgetreten.%s", utils.EmbedGUID(guid)), utils.DefaultSendOptions())
return err
}
}

result := tweetResponse.Data.TweetResult.Result
Expand Down

0 comments on commit 367f867

Please sign in to comment.