feat: x.com migration + public API for cookie-based auth

- migrate all API URLs from twitter.com to x.com
- add SetBearerToken, SetHTTPClient, SetLoggedIn public methods
- accept 202/204 status codes in handleResponse
- module path -> src.cultist.club/lain/twitter-scrapper
This commit is contained in:
Lain Iwakura 2026-05-21 18:54:10 +03:00
parent 76cb95cd3e
commit 34db837a9e
Signed by: lain
GPG key ID: 8160466B2E8D1441
19 changed files with 75 additions and 63 deletions

View file

@ -104,7 +104,7 @@ func (s *Scraper) uploadInit(filePath string, fileContent []byte) (*Media, error
return nil, fmt.Errorf("file type %s unsupported by twitter, make sure you uploading photo, video or gif", fileType)
}
req, err := s.newRequest("POST", "https://upload.twitter.com/i/media/upload.json")
req, err := s.newRequest("POST", "https://upload.x.com/i/media/upload.json")
if err != nil {
return nil, err
}
@ -118,8 +118,8 @@ func (s *Scraper) uploadInit(filePath string, fileContent []byte) (*Media, error
query.Set("video_duration_ms", strconv.FormatFloat(videoDuration*1000, 'f', -1, 64))
}
req.URL.RawQuery = query.Encode()
req.Header.Set("Origin", "https://twitter.com")
req.Header.Set("Referer", "https://twitter.com/")
req.Header.Set("Origin", "https://x.com")
req.Header.Set("Referer", "https://x.com/")
var uploadInit uploadInitResponse
@ -158,7 +158,7 @@ func (s *Scraper) uploadAppend(media *Media, fileContent []byte) error {
}
w.Close()
req, err := s.newRequest("POST", "https://upload.twitter.com/i/media/upload.json")
req, err := s.newRequest("POST", "https://upload.x.com/i/media/upload.json")
if err != nil {
return err
}
@ -169,8 +169,8 @@ func (s *Scraper) uploadAppend(media *Media, fileContent []byte) error {
query.Set("segment_index", strconv.Itoa(i))
req.URL.RawQuery = query.Encode()
req.Header.Set("Content-Type", w.FormDataContentType())
req.Header.Set("Origin", "https://twitter.com")
req.Header.Set("Referer", "https://twitter.com/")
req.Header.Set("Origin", "https://x.com")
req.Header.Set("Referer", "https://x.com/")
req.Body = io.NopCloser(&buf)
err = s.RequestAPI(req, nil)
@ -183,7 +183,7 @@ func (s *Scraper) uploadAppend(media *Media, fileContent []byte) error {
}
func (s *Scraper) uploadFinalize(media *Media) (*ProcessingInfo, error) {
req, err := s.newRequest("POST", "https://upload.twitter.com/i/media/upload.json")
req, err := s.newRequest("POST", "https://upload.x.com/i/media/upload.json")
if err != nil {
return nil, err
}
@ -193,8 +193,8 @@ func (s *Scraper) uploadFinalize(media *Media) (*ProcessingInfo, error) {
query.Set("media_id", strconv.Itoa(media.ID))
query.Set("allow_async", "true")
req.URL.RawQuery = query.Encode()
req.Header.Set("Origin", "https://twitter.com")
req.Header.Set("Referer", "https://twitter.com/")
req.Header.Set("Origin", "https://x.com")
req.Header.Set("Referer", "https://x.com/")
var response uploadStatusResponse
@ -207,7 +207,7 @@ func (s *Scraper) uploadFinalize(media *Media) (*ProcessingInfo, error) {
}
func (s *Scraper) uploadStatus(media *Media) (*ProcessingInfo, error) {
req, err := s.newRequest("GET", "https://upload.twitter.com/i/media/upload.json")
req, err := s.newRequest("GET", "https://upload.x.com/i/media/upload.json")
if err != nil {
return nil, err
}
@ -216,8 +216,8 @@ func (s *Scraper) uploadStatus(media *Media) (*ProcessingInfo, error) {
query.Set("command", "STATUS")
query.Set("media_id", strconv.Itoa(media.ID))
req.URL.RawQuery = query.Encode()
req.Header.Set("Origin", "https://twitter.com")
req.Header.Set("Referer", "https://twitter.com/")
req.Header.Set("Origin", "https://x.com")
req.Header.Set("Referer", "https://x.com/")
var response uploadStatusResponse