|
| 1 | +#!/bin/bash |
| 2 | +# fetch-fork-emails.sh |
| 3 | +# Fetches public email addresses from Cortex fork contributors |
| 4 | +# Usage: ./fetch-fork-emails.sh |
| 5 | + |
| 6 | +echo "═══════════════════════════════════════════════════════════════════" |
| 7 | +echo " CORTEX FORK CONTRIBUTOR EMAIL FETCHER" |
| 8 | +echo " $(date '+%Y-%m-%d %H:%M:%S')" |
| 9 | +echo "═══════════════════════════════════════════════════════════════════" |
| 10 | +echo "" |
| 11 | + |
| 12 | +OUTPUT_FILE="fork-contributor-contacts.csv" |
| 13 | +echo "username,email,name,company,location,twitter,blog,bio" > "$OUTPUT_FILE" |
| 14 | + |
| 15 | +# Get all fork owners |
| 16 | +echo "📥 Fetching fork contributors..." |
| 17 | +echo "" |
| 18 | + |
| 19 | +FORKS=$(curl -s "https://api.github.com/repos/cortexlinux/cortex/forks?per_page=100" | jq -r '.[].owner.login') |
| 20 | + |
| 21 | +for username in $FORKS; do |
| 22 | + echo -n "→ $username: " |
| 23 | + |
| 24 | + # Fetch user profile |
| 25 | + USER_DATA=$(curl -s "https://api.github.com/users/$username") |
| 26 | + |
| 27 | + EMAIL=$(echo "$USER_DATA" | jq -r '.email // "N/A"') |
| 28 | + NAME=$(echo "$USER_DATA" | jq -r '.name // "N/A"') |
| 29 | + COMPANY=$(echo "$USER_DATA" | jq -r '.company // "N/A"') |
| 30 | + LOCATION=$(echo "$USER_DATA" | jq -r '.location // "N/A"') |
| 31 | + TWITTER=$(echo "$USER_DATA" | jq -r '.twitter_username // "N/A"') |
| 32 | + BLOG=$(echo "$USER_DATA" | jq -r '.blog // "N/A"') |
| 33 | + BIO=$(echo "$USER_DATA" | jq -r '.bio // "N/A"' | tr ',' ';' | tr '\n' ' ') |
| 34 | + |
| 35 | + # Try to get email from recent commits if not in profile |
| 36 | + if [ "$EMAIL" = "N/A" ] || [ "$EMAIL" = "null" ]; then |
| 37 | + COMMIT_EMAIL=$(curl -s "https://api.github.com/users/$username/events/public" | \ |
| 38 | + jq -r '[.[] | select(.type=="PushEvent") | .payload.commits[]?.author.email] | first // "N/A"') |
| 39 | + if [ "$COMMIT_EMAIL" != "N/A" ] && [ "$COMMIT_EMAIL" != "null" ] && [[ ! "$COMMIT_EMAIL" =~ "noreply" ]]; then |
| 40 | + EMAIL="$COMMIT_EMAIL" |
| 41 | + fi |
| 42 | + fi |
| 43 | + |
| 44 | + echo "$username,$EMAIL,$NAME,$COMPANY,$LOCATION,$TWITTER,$BLOG,\"$BIO\"" >> "$OUTPUT_FILE" |
| 45 | + |
| 46 | + if [ "$EMAIL" != "N/A" ] && [ "$EMAIL" != "null" ]; then |
| 47 | + echo "✓ Found email: $EMAIL" |
| 48 | + else |
| 49 | + echo "○ No public email (check Twitter: $TWITTER, Blog: $BLOG)" |
| 50 | + fi |
| 51 | + |
| 52 | + sleep 0.5 # Rate limiting |
| 53 | +done |
| 54 | + |
| 55 | +echo "" |
| 56 | +echo "═══════════════════════════════════════════════════════════════════" |
| 57 | +echo " SUMMARY" |
| 58 | +echo "═══════════════════════════════════════════════════════════════════" |
| 59 | +echo "" |
| 60 | +TOTAL=$(echo "$FORKS" | wc -l | tr -d ' ') |
| 61 | +WITH_EMAIL=$(grep -v "N/A" "$OUTPUT_FILE" | grep -v "null" | grep "@" | wc -l | tr -d ' ') |
| 62 | +echo "Total contributors: $TOTAL" |
| 63 | +echo "With public email: $WITH_EMAIL" |
| 64 | +echo "" |
| 65 | +echo "✅ Results saved to: $OUTPUT_FILE" |
| 66 | +echo "" |
| 67 | + |
| 68 | +# Display results |
| 69 | +echo "═══════════════════════════════════════════════════════════════════" |
| 70 | +echo " CONTACT DETAILS" |
| 71 | +echo "═══════════════════════════════════════════════════════════════════" |
| 72 | +column -t -s',' "$OUTPUT_FILE" | head -20 |
0 commit comments