Last active
November 25, 2024 06:48
-
-
Save theagoliveira/6b5cc61b8d8861cb28df866516db7625 to your computer and use it in GitHub Desktop.
Script that retrives the name from an Instagram profile from the username and adds the page to buku
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Created by https://www.toptal.com/developers/gitignore/api/go,visualstudiocode | |
# Edit at https://www.toptal.com/developers/gitignore?templates=go,visualstudiocode | |
### Go ### | |
# If you prefer the allow list template instead of the deny list, see community template: | |
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore | |
# | |
# Binaries for programs and plugins | |
*.exe | |
*.exe~ | |
*.dll | |
*.so | |
*.dylib | |
# Test binary, built with `go test -c` | |
*.test | |
# Output of the go coverage tool, specifically when used with LiteIDE | |
*.out | |
# Dependency directories (remove the comment below to include it) | |
# vendor/ | |
# Go workspace file | |
go.work | |
### VisualStudioCode ### | |
.vscode/* | |
!.vscode/settings.json | |
!.vscode/tasks.json | |
!.vscode/launch.json | |
!.vscode/extensions.json | |
!.vscode/*.code-snippets | |
# Local History for Visual Studio Code | |
.history/ | |
# Built Visual Studio Code Extensions | |
*.vsix | |
### VisualStudioCode Patch ### | |
# Ignore all local history of files | |
.history | |
.ionide | |
# End of https://www.toptal.com/developers/gitignore/api/go,visualstudiocode | |
add-instagram-link |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module add-instagram-link | |
go 1.23.3 | |
require ( | |
github.com/PuerkitoBio/goquery v1.10.0 | |
github.com/atotto/clipboard v0.1.4 | |
) | |
require ( | |
github.com/andybalholm/cascadia v1.3.2 // indirect | |
golang.org/x/net v0.29.0 // indirect | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= | |
github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= | |
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= | |
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= | |
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= | |
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= | |
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | |
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | |
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | |
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | |
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | |
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | |
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= | |
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= | |
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= | |
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | |
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | |
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= | |
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | |
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | |
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | |
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | |
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | |
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"log" | |
"os" | |
"os/exec" | |
"strings" | |
"net/http" | |
"github.com/PuerkitoBio/goquery" | |
"github.com/atotto/clipboard" | |
) | |
// fetchInstagramName retrieves the profile name from the Instagram user's profile page | |
func fetchInstagramName(username string) (string, error) { | |
url := fmt.Sprintf("https://www.instagram.com/%s/", username) | |
resp, err := http.Get(url) | |
if err != nil { | |
return "", fmt.Errorf("failed to fetch Instagram profile: %v", err) | |
} | |
defer resp.Body.Close() | |
if resp.StatusCode != 200 { | |
return "", fmt.Errorf("non-OK HTTP status: %d", resp.StatusCode) | |
} | |
doc, err := goquery.NewDocumentFromReader(resp.Body) | |
if err != nil { | |
return "", fmt.Errorf("failed to parse HTML: %v", err) | |
} | |
// Fetch the name from the og:title meta tag | |
metaContent := doc.Find(`meta[property="og:title"]`).AttrOr("content", "") | |
if metaContent == "" { | |
return "", fmt.Errorf("profile name not found") | |
} | |
// Extract the name before the first "(" | |
parts := strings.Split(metaContent, "(") | |
if len(parts) == 0 { | |
return "", fmt.Errorf("unexpected format in og:title content") | |
} | |
name := strings.TrimSpace(parts[0]) | |
return name, nil | |
} | |
// runBukuCommand runs the `buku` command with the given parameters | |
func runBukuCommand(username, profileName string) error { | |
bookmarksPath := os.Getenv("BOOKMARKS") | |
if bookmarksPath == "" { | |
return fmt.Errorf("BOOKMARKS environment variable not set") | |
} | |
dbPath := fmt.Sprintf("%s/untitled.db", bookmarksPath) | |
url := fmt.Sprintf("https://www.instagram.com/%s", username) | |
title := fmt.Sprintf("Instagram: %s @%s", profileName, username) | |
// Log the command being executed | |
fmt.Printf("Running command: buku --db %q -a %q --title %q --immutable 1\n", dbPath, url, title) | |
cmd := exec.Command("buku", "--db", dbPath, "-a", url, "--title", title, "--immutable", "1") | |
cmd.Stdout = os.Stdout | |
cmd.Stderr = os.Stderr | |
if err := cmd.Run(); err != nil { | |
return fmt.Errorf("failed to execute buku command: %v", err) | |
} | |
return nil | |
} | |
func main() { | |
var username string | |
// Check if a command-line argument is provided | |
if len(os.Args) > 1 { | |
username = os.Args[1] | |
} else { | |
// Attempt to read from the clipboard if no argument is provided | |
clip, err := clipboard.ReadAll() | |
if err != nil { | |
log.Fatalf("Failed to read from clipboard: %v", err) | |
} | |
username = clip | |
} | |
if username == "" { | |
log.Fatalf("No username provided. Please provide it as an argument or copy it to the clipboard.") | |
} | |
fmt.Printf("Processing Instagram username: %s\n", username) | |
profileName, err := fetchInstagramName(username) | |
if err != nil { | |
log.Fatalf("Error retrieving profile name: %v", err) | |
} | |
if err := runBukuCommand(username, profileName); err != nil { | |
log.Fatalf("Error executing buku command: %v", err) | |
} | |
fmt.Printf("Successfully added Instagram profile for @%s (%s) to Buku.\n", username, profileName) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment