|
#!/usr/bin/env bash |
|
#Target OS: [Mac, Linux, Unix-like] |
|
|
|
function social::twitter::get-user-id() { |
|
if [ -z $1 ] |
|
then |
|
echo "Please input a Twitter username" |
|
return 1; |
|
fi |
|
|
|
RESULT=$(curl 'https://tweeterid.com/ajax.php' \ |
|
-s \ |
|
-H 'Connection: keep-alive' \ |
|
-H 'Accept: */*' \ |
|
-H 'Sec-Fetch-Dest: empty' \ |
|
-H 'X-Requested-With: XMLHttpRequest' \ |
|
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36' \ |
|
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ |
|
-H 'Origin: https://tweeterid.com' \ |
|
-H 'Sec-Fetch-Site: same-origin' \ |
|
-H 'Sec-Fetch-Mode: cors' \ |
|
-H 'Referer: https://tweeterid.com/' \ |
|
-H 'Accept-Language: en-US,en;q=0.9' --data 'input='$1 --compressed); |
|
|
|
if [ $RESULT = "error" ] |
|
then |
|
echo "This profile is probably not longer available. Also, check for any typo on the username."; |
|
return 0; |
|
fi |
|
|
|
echo "https://twitter.com/i/user/$RESULT" |
|
} |
|
|
|
# @todo ALMOST IMPOSSIBLE TO GET X id |
|
function social::x::get-user-id() { |
|
if [ -z $1 ] |
|
then |
|
echo "Please input a X username" |
|
return 1; |
|
fi |
|
|
|
RESULT=$(curl -v 'https://tweethunter.io/api/convert?inputString=$1' \ |
|
-H 'accept: */*' \ |
|
-H 'accept-language: en-US,en;q=0.9' \ |
|
-H 'cookie: _gcl_au=1.1.557122941.1724355919; _ga=GA1.1.1687638455.1724355919; _fbp=fb.1.1724355919151.466908480268731104; _ga_BH3EC90N3P=GS1.1.1724355918.1.1.1724356018.60.0.0' \ |
|
-H 'if-none-match: W/"9milwn0l7672"' \ |
|
-H 'priority: u=1, i' \ |
|
-H 'referer: https://tweethunter.io/twitter-id-converter' \ |
|
-H 'sec-ch-ua: "Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"' \ |
|
-H 'sec-ch-ua-mobile: ?0' \ |
|
-H 'sec-ch-ua-platform: "macOS"' \ |
|
-H 'sec-fetch-dest: empty' \ |
|
-H 'sec-fetch-mode: cors' \ |
|
-H 'sec-fetch-site: same-origin' \ |
|
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36' \ |
|
-H 'Accept-Language: en-US,en;q=0.9' --compressed); |
|
|
|
echo $RESULT |
|
|
|
if [ $RESULT = "error" ] |
|
then |
|
echo "This profile is probably not longer available. Also, check for any typo on the username."; |
|
return 0; |
|
fi |
|
|
|
echo "https://twitter.com/i/user/$RESULT" |
|
} |
|
|
|
# https://ioflood.com/blog/bash-replace-string/ |
|
function social::youtube::get-user-id() { |
|
if [ -z $1 ] |
|
then |
|
echo "Please input a YouTube username" |
|
return 1; |
|
fi |
|
|
|
RESULT=$(curl -v --silent https://www.youtube.com/@$1 2>&1 | grep -oEi 'channel_id=+([a-zA-Z0-9_p-]+)' | sed 's/channel_id[^ ]//g' | sed 's/"//g' | tail -1) |
|
|
|
if [ -z $RESULT ] |
|
then |
|
echo "This profile is probably not longer available. Also, check for any typo on the username."; |
|
return 0; |
|
fi |
|
|
|
echo "YouTube Channel ID: $RESULT" |
|
echo "YouTube Channel URL: https://www.youtube.com/channel/$RESULT" |
|
} |
|
|
|
function social::youtube::get-user-vanity() { |
|
if [ -z $1 ] |
|
then |
|
echo "Please input a YouTube Channel/User Identifier (without @)" |
|
return 1; |
|
fi |
|
|
|
RESULT=$(curl -v --silent https://www.youtube.com/channel/$1 2>&1 | grep -oEi '"canonicalBaseUrl":\s*"([^"]+)"' | sed 's/"canonicalBaseUrl":\s*"//g' | sed 's/"//g' | tail -1) |
|
|
|
if [ -z $RESULT ] |
|
then |
|
echo "This profile is probably not longer available or ID is invalid."; |
|
return 0; |
|
fi |
|
|
|
echo "YouTube Channel ID: $RESULT" |
|
echo "YouTube Channel URL: https://www.youtube.com$RESULT" |
|
} |
|
|
|
function social::facebook::get-profile-url() { |
|
# Locked profiles are now hidden and the cURL request needs a cookie from a valid user to get FB profile data |
|
# PUBLIC=$(curl -v --silent https://www.facebook.com/$1 2>&1 | grep -oEi 'fb://(profile|page)/([0-9]+)' | grep -oEi '[0-9]+' | tail -1) |
|
# PRIVATE="" |
|
if [ -z $FB_COOKIE ] |
|
then |
|
echo "No Facebook cookie detected. Set a FB_COOKIE env-var to proceed with your request." |
|
fi |
|
|
|
PROFILE_RESPONSE=$( |
|
curl \ |
|
-H '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' \ |
|
-H 'accept-language: en-US,en;q=0.9' \ |
|
-H 'cache-control: no-cache' \ |
|
-b "$FB_COOKIE" \ |
|
-H 'dpr: 2' \ |
|
-H 'pragma: no-cache' \ |
|
-H 'priority: u=0, i' \ |
|
-H 'sec-ch-prefers-color-scheme: dark' \ |
|
-H 'sec-ch-ua: "Not=A?Brand";v="99", "Google Chrome";v="151", "Chromium";v="151"' \ |
|
-H 'sec-ch-ua-full-version-list: "Not=A?Brand";v="99.0.0.0", "Google Chrome";v="151.0.7922.77", "Chromium";v="151.0.7922.77"' \ |
|
-H 'sec-ch-ua-mobile: ?0' \ |
|
-H 'sec-ch-ua-model: ""' \ |
|
-H 'sec-ch-ua-platform: "macOS"' \ |
|
-H 'sec-ch-ua-platform-version: "15.7.7"' \ |
|
-H 'sec-fetch-dest: document' \ |
|
-H 'sec-fetch-mode: navigate' \ |
|
-H 'sec-fetch-site: same-origin' \ |
|
-H 'sec-fetch-user: ?1' \ |
|
-H 'upgrade-insecure-requests: 1' \ |
|
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36' \ |
|
https://www.facebook.com/$1 2>&1 -v |
|
) |
|
HTTP_CODE=$(echo $PROFILE_RESPONSE | grep -oEi '^< HTTP/2 [0-9]+' | grep -oEi '[0-9]+' | tail -1) |
|
if [[ "$HTTP_CODE" == "302" ]] |
|
then |
|
REFINED_URL=$(echo $PROFILE_RESPONSE | grep -oEi '^< location.*'| sed -E 's/.*(https?:\/\/[^ ]+).*/\1/' | tail -1) |
|
REFINED_URL=$(echo "$REFINED_URL" | tr -d '\r') |
|
PROFILE_RESPONSE=$( |
|
curl \ |
|
-H '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' \ |
|
-H 'accept-language: en-US,en;q=0.9' \ |
|
-H 'cache-control: no-cache' \ |
|
-b "$FB_COOKIE" \ |
|
-H 'dpr: 2' \ |
|
-H 'pragma: no-cache' \ |
|
-H 'priority: u=0,i' \ |
|
-H 'sec-ch-prefers-color-scheme: dark' \ |
|
-H 'sec-ch-ua: "Not=A?Brand";v="99", "Google Chrome";v="151", "Chromium";v="151"' \ |
|
-H 'sec-ch-ua-full-version-list: "Not=A?Brand";v="99.0.0.0", "Google Chrome";v="151.0.7922.77", "Chromium";v="151.0.7922.77"' \ |
|
-H 'sec-ch-ua-mobile: ?0' \ |
|
-H 'sec-ch-ua-model: ""' \ |
|
-H 'sec-ch-ua-platform: "macOS"' \ |
|
-H 'sec-ch-ua-platform-version: "15.7.7"' \ |
|
-H 'sec-fetch-dest: document' \ |
|
-H 'sec-fetch-mode: navigate' \ |
|
-H 'sec-fetch-site: same-origin' \ |
|
-H 'sec-fetch-user: ?1' \ |
|
-H 'upgrade-insecure-requests: 1' \ |
|
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36' \ |
|
"$REFINED_URL" -v 2>&1 |
|
) |
|
fi |
|
|
|
PROFILE_ID=$(echo $PROFILE_RESPONSE | grep -oEi '"userVanity":"'$1'","userID":"[0-9]+"' | grep -oEi '[0-9]+' | tail -1) |
|
PROFILE_NAME=$(echo $PROFILE_RESPONSE | grep -oEi '"id":"'$PROFILE_ID'","name":"[^"]+"' | grep -oEi '[^"]+' | tail -1) |
|
PROFILE_FRIENDS=$(echo $PROFILE_RESPONSE | grep -oEi '"text":"[0-9]+ friends"' | grep -oEi '[0-9]+' | tail -1) |
|
PROFILE_IS_LOCKED=$(echo $PROFILE_RESPONSE | grep -oEi '"is_viewer_locked_profile":[[:alnum:]]+,' | grep -oEi 'true|false' | tail -1) |
|
PROFILE_FRIENDSHIP_STATUS=$(echo $PROFILE_RESPONSE | grep -oEi '"friendship_status":"[^"]+"' | grep -oEi 'ARE_FRIENDS|CAN_REQUEST' | tail -1) |
|
PROFILE_FRIENDS_MUTUAL=$(echo $PROFILE_RESPONSE | grep -oEi '"text":"[0-9]+ mutual"' | grep -oEi '[0-9]+' | tail -1) |
|
|
|
# "friendship_status":"ARE_FRIENDS" |
|
# "friendship_status":"CAN_REQUEST" |
|
# "text":"64 mutual" |
|
|
|
if [ -z $PROFILE_ID ] |
|
then |
|
echo "This profile is probably not Public, or check for any typo on the username." |
|
return 0; |
|
fi |
|
|
|
URL=https://facebook.com/profile.php?id=$PROFILE_ID |
|
IS_LOCKED=$([[ $PROFILE_IS_LOCKED == "true" ]] && echo "True" || echo "False") |
|
IS_FRIEND=$([[ $PROFILE_FRIENDSHIP_STATUS == "ARE_FRIENDS" ]] && echo "True" || echo "False") |
|
|
|
# @todo WIP: |
|
echo "✅ Profile URL: " $URL |
|
echo "📙 Profile Name: " $PROFILE_NAME |
|
echo "🧑🏻🤝🧑🏼 Current Friend Count: " $PROFILE_FRIENDS |
|
echo "🧑🏻🤝🧑🏼 Mutual Friend Count: " $PROFILE_FRIENDS_MUTUAL |
|
echo "🔒 Profile Is Locked?: " $IS_LOCKED |
|
echo "🫂 Is my Friend?: " $IS_FRIEND |
|
echo "✚ Can send a friend request?:" $PROFILE_FRIENDSHIP_STATUS |
|
} |
|
|
|
function social::instagram::get-profile-url() { |
|
RESULT=$(curl 'https://www.instagram.com/'$1/ \ |
|
-H 'authority: www.instagram.com' \ |
|
-H 'cache-control: max-age=0' \ |
|
-H 'upgrade-insecure-requests: 1' \ |
|
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' -H 'sec-fetch-dest: document' \ |
|
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \ |
|
-H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' \ |
|
-H 'sec-fetch-user: ?1' -H 'accept-language: en-US,en;q=0.9' \ |
|
--compressed 2>&1 | grep -oEi 'profilePage_([0-9]+)' | grep -oEi '[0-9]+' | tail -1); |
|
|
|
if [ -z $RESULT ] |
|
then |
|
echo "This profile is probably not longer available. Also, check for any typo on the username."; |
|
return 0; |
|
fi |
|
|
|
URL=instagram://user?id=$RESULT |
|
echo $URL |
|
} |
|
|
|
# https://stackoverflow.com/questions/58354392/how-to-figure-out-an-instagram-username-from-the-user-id/58516425#58516425 |
|
function social::instagram::get_username_by_id() { |
|
USER_ID=$1 |
|
RESULT=$(curl -s https://i.instagram.com/api/v1/users/$USER_ID/info/ -H 'user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Instagram 105.0.0.11.118 (iPhone11,8; iOS 12_3_1; en_US; en-US; scale=2.00; 828x1792; 165586599)') |
|
echo $RESULT | jq |
|
} |