-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
96 lines (83 loc) · 2.36 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"strconv"
"time"
"github.com/dghubble/oauth1"
"github.com/joho/godotenv"
)
type Tweet struct {
ID string `json:"id"`
Text string `json:"text"`
}
func main() {
err := godotenv.Load()
if err != nil {
fmt.Println("Error loading .env file")
return
}
config := oauth1.NewConfig(os.Getenv("CONSUMER_KEY"), os.Getenv("CONSUMER_SECRET"))
token := oauth1.NewToken(os.Getenv("ACCESS_TOKEN"), os.Getenv("ACCESS_SECRET"))
httpClient := config.Client(oauth1.NoContext, token)
twitterID := os.Getenv("TWITTER_ID")
likesURL := fmt.Sprintf("https://api.twitter.com/2/users/%s/liked_tweets", twitterID)
for {
// Fetch likes
resp, err := httpClient.Get(likesURL)
if err != nil {
fmt.Printf("Error fetching likes: %v\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("Error reading response body: %v\n", err)
return
}
var likedTweets struct {
Data []Tweet `json:"data"`
}
err = json.Unmarshal(body, &likedTweets)
if err != nil {
fmt.Printf("Error parsing JSON: %v\n", err)
return
}
if len(likedTweets.Data) == 0 {
fmt.Println("No more likes to delete.")
break
}
// Delete likes
for _, tweet := range likedTweets.Data {
deleteURL := fmt.Sprintf("https://api.twitter.com/2/users/%s/likes/%s", twitterID, tweet.ID)
req, err := http.NewRequest(http.MethodDelete, deleteURL, nil)
if err != nil {
fmt.Printf("Error creating request for tweet %s: %v\n", tweet.ID, err)
continue
}
deleteResp, err := httpClient.Do(req)
if err != nil {
fmt.Printf("Error deleting like for tweet %s: %v\n", tweet.ID, err)
continue
}
fmt.Printf("Deleted like for tweet: \"%s\", status code: %d\n", tweet.Text, deleteResp.StatusCode)
// Handle rate limits
if deleteResp.StatusCode == http.StatusTooManyRequests {
fmt.Println("Rate limit exceeded. Waiting for reset...")
var resetTime time.Time
resetTimestamp, err := strconv.ParseInt(deleteResp.Header.Get("x-rate-limit-reset"), 10, 64)
if err != nil {
fmt.Printf("Error parsing rate limit reset time: %v\n", err)
}
resetTime = time.Unix(resetTimestamp, 0)
timeToWait := time.Until(resetTime)
fmt.Printf("Waiting for %v\n", timeToWait)
time.Sleep(timeToWait)
}
deleteResp.Body.Close()
}
}
}