From 2e9694689f960925aac7e1a5b5b6ba9ea0859600 Mon Sep 17 00:00:00 2001 From: stefanodvx <69367859+stefanodvx@users.noreply.github.com> Date: Mon, 14 Apr 2025 15:47:22 +0200 Subject: [PATCH] instagram: adds support for share urls --- ext/instagram/main.go | 48 +++++++++++++++++++++++++++++++++++++++++++ ext/main.go | 1 + 2 files changed, 49 insertions(+) diff --git a/ext/instagram/main.go b/ext/instagram/main.go index 9107046..f85f516 100644 --- a/ext/instagram/main.go +++ b/ext/instagram/main.go @@ -29,6 +29,23 @@ const ( // to get the API key and timestamp ) +var igHeaders = map[string]string{ + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "Accept-Language": "en-GB,en;q=0.9", + "Cache-Control": "max-age=0", + "Dnt": "1", + "Priority": "u=0, i", + "Sec-Ch-Ua": `Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99`, + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "macOS", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Sec-Fetch-User": "?1", + "Upgrade-Insecure-Requests": "1", + "User-Agent": util.ChromeUA, +} + var HTTPClient = &http.Client{ Transport: &http3.Transport{ TLSClientConfig: &tls.Config{ @@ -73,6 +90,37 @@ var StoriesExtractor = &models.Extractor{ }, } +var ShareURLExtractor = &models.Extractor{ + Name: "Instagram Share URL", + CodeName: "instagram:share", + Type: enums.ExtractorTypeSingle, + Category: enums.ExtractorCategorySocial, + URLPattern: regexp.MustCompile(`https?:\/\/(www\.)?instagram\.com\/share\/((reels?|video|s|p)\/)?(?P[^\/\?]+)`), + IsRedirect: true, + + Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { + req, err := http.NewRequest( + http.MethodGet, + ctx.MatchedContentURL, + nil, + ) + if err != nil { + return nil, fmt.Errorf("failed to create request: %w", err) + } + for k, v := range igHeaders { + req.Header.Set(k, v) + } + resp, err := HTTPClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to send request: %w", err) + } + defer resp.Body.Close() + return &models.ExtractorResponse{ + URL: resp.Request.URL.String(), + }, nil + }, +} + func MediaListFromAPI( ctx *models.DownloadContext, stories bool, diff --git a/ext/main.go b/ext/main.go index 588776b..f372a4b 100644 --- a/ext/main.go +++ b/ext/main.go @@ -14,6 +14,7 @@ var List = []*models.Extractor{ tiktok.VMExtractor, instagram.Extractor, instagram.StoriesExtractor, + instagram.ShareURLExtractor, twitter.Extractor, twitter.ShortExtractor, pinterest.Extractor,