Skip to content

Instantly share code, notes, and snippets.

@morkin1792
Last active July 22, 2023 22:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morkin1792/2ac94289d6115e86d1f156e612d22bb4 to your computer and use it in GitHub Desktop.
Save morkin1792/2ac94289d6115e86d1f156e612d22bb4 to your computer and use it in GitHub Desktop.
This script finds GitHub users' emails
function findGithubEmails() {
username="$1"
remove_fork="${2:-N}"
if [ -z $ZSH_VERSION ]; then
printf "$(hostname): Oops, this script requires zsh! \n$(whoami): Why?\n$(hostname): Well... there are some problems, one of them is https://stackoverflow.com/q/59289355 \n$(whoami): You convinced me, how can I install zsh? \n$(hostname): https://itsfoss.com/zsh-ubuntu/ or https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH\n"
return
fi
function checkRateLimit() {
if $(printf "%s" "$1" | grep -q 'rate limit'); then
printf "[*] GitHub API has reached the rate limit, you can wait a few minutes, change your IP address or modify this code to use an API token.\n" >&2
return 2
fi
}
message=$(curl -s "https://api.github.com/users/$username/repos?page=1&per_page=100")
repos=( $(printf "%s" "$message" | jq -r '.[] | .name' 2>/dev/null || exit 2) )
if [ $? = 2 ]; then
checkRateLimit "$message"
if [ $? != 2 ]; then
printf "[-] Something is wrong, the API is returning:\n"
printf "$message" | jq
fi
return
fi
if [ "$remove_fork" != "N" ] && [ "$remove_fork" != "n" ] && [ "$remove_fork" != "0" ];then
repos=( $(printf "%s" "$message" | jq -r '.[] | select (.fork != true) | .name') )
printf "[*] Filtering forks\n"
fi
printf "[*] Found ${#repos[@]} public repositories\n\n"
allEmails=()
for repo in "${repos[@]}"; do
printf "https://github.com/$username/$repo\n"
currentEmails=()
function findEmails() {
commits="$(curl -s https://api.github.com/repos/$username/$repo/commits)"
checkRateLimit "$commits"
[ $? = 2 ] && return
set -o pipefail
printf "%s" "$commits" | jq '.[] | .commit' 2> /dev/null | jq '.author,.committer' | jq -r '.name + ":" + .email' | sort -u
}
function appendArray() {
while read; do currentEmails+=("$REPLY"); done
}
set -o pipefail
(findEmails || ([ $? = 2 ] && break) ) | appendArray
printf '%s\n' "${currentEmails[@]}" | sed 's/^/\t/g'
allEmails+=( $currentEmails )
done
printf '\n\n[!] Final results:\n'
printf '%s\n' "${allEmails[@]}" | sort -u | grep -Ev 'users.noreply.github.com|noreply@github.com'
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment