Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 102 additions & 11 deletions .github/workflows/streak-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,116 @@ name: Streak Automation

on:
schedule:
- cron: '5 */4 * * *' # Runs every 4 hours at minute 5 (UTC)
workflow_dispatch: # Allows manual triggering
- cron: '5 */4 * * *' # Запуск каждые 4 часа на 5-й минуте (UTC)
workflow_dispatch: # Ручной запуск

permissions:
contents: read # Restrict GITHUB_TOKEN to minimum needed permissions
contents: read

jobs:
streak:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Run streak request
- name: Request Streak from Duolingo PRO
run: |
echo "📤 Sending streak request..."
RESPONSE=$(curl --ssl-no-revoke -s -X POST https://api.duolingopro.net/streak \
-H "Authorization: Bearer ${{ secrets.DUOLINGO_TOKEN }}" \
echo "🔥 Starting Streak automation..."
echo "⏳ Waiting 10 seconds before request..."
sleep 10

# Проверяем токен
TOKEN="${{ secrets.DUOLINGO_TOKEN }}"
if [ -z "$TOKEN" ]; then
echo "❌ ERROR: DUOLINGO_TOKEN secret is not set"
echo "Please add your JWT token to GitHub Secrets"
exit 1
fi

echo "📤 Sending streak request (10 streak)..."

# Создаем корректный payload
PAYLOAD='{
"type": "streak",
"amount": 10,
"version": "3.1BETA.03"
}'

echo "🔄 Processing request (this may take a moment)..."

# Отправляем запрос с обработкой SSE (Server-Sent Events)
RESPONSE=$(curl --silent --ssl-no-revoke -X POST https://api.duolingopro.net/request \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount": 10}')
echo "📨 Response from server:"
echo "$RESPONSE"
-H "Accept: text/event-stream" \
-d "$PAYLOAD")

# Парсим последний JSON из потока SSE
LAST_LINE=$(echo "$RESPONSE" | tail -n1 | sed 's/^data: //')

# Если не удалось распарсить, используем весь ответ
if [ -z "$LAST_LINE" ]; then
LAST_LINE="$RESPONSE"
fi

echo "📋 Server response:"
echo "$LAST_LINE" | jq '.' 2>/dev/null || echo "$LAST_LINE"

# Проверяем статус ответа
if echo "$LAST_LINE" | grep -q '"status": "completed"'; then
# Извлекаем сообщение об успехе
SUCCESS_MSG=$(echo "$LAST_LINE" | sed -n 's/.*"head": "\([^"]*\)".*/\1/p')
STREAK_AMOUNT=$(echo "$LAST_LINE" | sed -n 's/.*received \([0-9]*\) streak.*/\1/p')

if [ -n "$SUCCESS_MSG" ]; then
echo "✅ $SUCCESS_MSG"
else
echo "✅ Request completed successfully!"
fi

if [ -n "$STREAK_AMOUNT" ]; then
echo "🔥 Successfully received $STREAK_AMOUNT streak days!"
else
echo "🔥 Successfully extended your streak!"
fi

# Извлекаем дополнительную информацию
BODY_INFO=$(echo "$LAST_LINE" | sed -n 's/.*"body": "\([^"]*\)".*/\1/p' | sed 's/<[^>]*>//g')
if [ -n "$BODY_INFO" ]; then
echo "📊 $BODY_INFO"
fi

echo "⏰ Next request available in 4 hours"

elif echo "$LAST_LINE" | grep -q '"status": false'; then
# Обрабатываем лимит (как в случае с Super)
HEAD=$(echo "$LAST_LINE" | grep -o '"head": "[^"]*"' | cut -d'"' -f4)
BODY=$(echo "$LAST_LINE" | grep -o '"body": "[^"]*"' | cut -d'"' -f4 | sed 's/<[^>]*>//g')

echo "⏳ LIMIT REACHED: $HEAD"
echo "📊 Details: $BODY"
echo "✅ INFO: Daily limit already used - this is expected"
echo "🔄 Next streak request will be available according to the limit"

elif echo "$LAST_LINE" | grep -q '"status": "failed"'; then
ERROR_MSG=$(echo "$LAST_LINE" | sed -n 's/.*"head": "\([^"]*\)".*/\1/p')
echo "❌ Request failed: $ERROR_MSG"
exit 1
else
# Если получили ответ, но не распознали формат
if [ -n "$LAST_LINE" ]; then
echo "⚠️ Received response (check above for details)"
else
echo "❌ ERROR: No response from server"
exit 1
fi
fi

echo "✨ Streak automation completed at: $(date -u '+%H:%M:%S UTC')"

- name: Log completion
run: |
echo "📝 Log entry: Streak automation ran"
echo "Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
echo "Next scheduled run: In 4 hours"
56 changes: 46 additions & 10 deletions .github/workflows/super-duolingo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ name: Super Automation

on:
schedule:
- cron: '0 0 * * *' # Every day at 00:00 UTC
workflow_dispatch: # Allow manual run too
- cron: '0 0 * * *' # Каждый день в полночь (UTC)
workflow_dispatch: # Ручной запуск

permissions:
contents: read
Expand All @@ -13,14 +13,50 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Send Super Request
- name: Request 3 Days of Super
run: |
echo "🚀 Requesting Super..."
RESPONSE=$(curl --ssl-no-revoke -s -X POST https://api.duolingopro.net/request \
-H "Authorization: Bearer ${{ secrets.DUOLINGO_TOKEN }}" \
echo "🚀 Starting Super automation..."
sleep 5

TOKEN="${{ secrets.DUOLINGO_TOKEN }}"
if [ -z "$TOKEN" ]; then
echo "❌ ERROR: DUOLINGO_TOKEN secret is not set"
exit 1
fi

echo "📤 Requesting 3 Days of Super..."

RESPONSE=$(curl --silent --ssl-no-revoke -X POST https://api.duolingopro.net/request \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"gain_type": "super", "amount": 1}')
echo "📝 Response from server:"
echo "$RESPONSE"
-H "Accept: text/event-stream" \
-d '{"type": "super", "amount": 1, "version": "3.1BETA.03"}')

# Берем последнюю строку ответа
LAST_LINE=$(echo "$RESPONSE" | tail -n1 | sed 's/^data: //')

echo "📋 Server response received"
echo "$LAST_LINE" | jq '.' 2>/dev/null || echo "$LAST_LINE"

# Простая проверка - если есть response, считаем успехом
if [ -n "$LAST_LINE" ]; then
if echo "$LAST_LINE" | grep -q '"status": "completed"'; then
echo "🎉 SUCCESS: 3 Days of Super added!"
elif echo "$LAST_LINE" | grep -q '"status": false'; then
echo "⏳ INFO: Daily limit reached (normal - try again tomorrow)"
else
echo "⚠️ Response received (check above for details)"
fi
echo "✅ Automation completed"
else
echo "❌ ERROR: No response from server"
exit 1
fi

echo "⏰ Next run: $(date -u -d 'tomorrow 00:00' '+%Y-%m-%d %H:%M UTC')"

- name: Log completion
run: |
echo "📝 Super automation ran at: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
112 changes: 100 additions & 12 deletions .github/workflows/xp-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,116 @@ name: XP Automation

on:
schedule:
- cron: '5 */4 * * *' # Runs every 4 hours at minute 5 (UTC)
workflow_dispatch: # Allows manual triggering
- cron: '5 */4 * * *' # Каждые 4 часа в 5-й минуте (UTC)
workflow_dispatch: # Ручной запуск

permissions:
contents: read # Least-privilege permissions for GITHUB_TOKEN
contents: read

jobs:
send-xp:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Run XP request
- name: Request XP from Duolingo PRO
run: |
echo "⏳ Waiting 10 seconds..."
echo "🚀 Starting XP automation..."
echo "⏳ Waiting 10 seconds before request..."
sleep 10
echo "📤 Sending XP request..."
RESPONSE=$(curl --ssl-no-revoke -s -X POST https://api.duolingopro.net/request \
-H "Authorization: Bearer ${{ secrets.DUOLINGO_TOKEN }}" \

# Проверяем токен
TOKEN="${{ secrets.DUOLINGO_TOKEN }}"
if [ -z "$TOKEN" ]; then
echo "❌ ERROR: DUOLINGO_TOKEN secret is not set"
echo "Please add your JWT token to GitHub Secrets"
exit 1
fi

echo "📤 Sending XP request (30,000 XP)..."

# Создаем корректный payload с указанием языка ЯПОНСКИЙ (ja)
PAYLOAD='{
"type": "xp",
"amount": 30000,
"version": "3.1BETA.03",
"lang": "ja"
}'

# Отправляем запрос с обработкой SSE (Server-Sent Events)
echo "🔄 Processing request (this may take a moment)..."

RESPONSE=$(curl --silent --ssl-no-revoke -X POST https://api.duolingopro.net/request \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"gain_type": "xp", "amount": 30000}')
echo "📨 Response from server:"
echo "$RESPONSE"
-H "Accept: text/event-stream" \
-d "$PAYLOAD")

# Парсим последний JSON из потока SSE
LAST_LINE=$(echo "$RESPONSE" | tail -n1 | sed 's/^data: //')

# Если не удалось распарсить, используем весь ответ
if [ -z "$LAST_LINE" ]; then
LAST_LINE="$RESPONSE"
fi

echo "📋 Server response:"
echo "$LAST_LINE" | jq '.' 2>/dev/null || echo "$LAST_LINE"

# Улучшенная проверка ответов
if echo "$LAST_LINE" | grep -q '"status": "completed"'; then
# Извлекаем сообщение об успехе
SUCCESS_MSG=$(echo "$LAST_LINE" | sed -n 's/.*"head": "\([^"]*\)".*/\1/p')
XP_AMOUNT=$(echo "$LAST_LINE" | sed -n 's/.*You received \([0-9]*\) XP.*/\1/p')

if [ -n "$SUCCESS_MSG" ]; then
echo "✅ $SUCCESS_MSG"
else
echo "✅ Request completed successfully!"
fi

if [ -n "$XP_AMOUNT" ]; then
echo "🎉 Successfully received $XP_AMOUNT XP!"
else
echo "🎉 Successfully received XP!"
fi

# Извлекаем информацию о лимите
LIMIT_INFO=$(echo "$LAST_LINE" | sed -n 's/.*"body": "\([^"]*\)".*/\1/p' | sed 's/<[^>]*>//g')
if [ -n "$LIMIT_INFO" ]; then
echo "📊 $LIMIT_INFO"
fi

echo "⏰ Next request available in 4 hours"

elif echo "$LAST_LINE" | grep -q '"status": false'; then
# Обрабатываем лимит (как в случае с Super и Streak)
HEAD=$(echo "$LAST_LINE" | grep -o '"head": "[^"]*"' | cut -d'"' -f4)
BODY=$(echo "$LAST_LINE" | grep -o '"body": "[^"]*"' | cut -d'"' -f4 | sed 's/<[^>]*>//g')

echo "⏳ LIMIT REACHED: $HEAD"
echo "📊 Details: $BODY"
echo "✅ INFO: This may be expected if limit is reached"

elif echo "$LAST_LINE" | grep -q '"status": "failed"'; then
ERROR_MSG=$(echo "$LAST_LINE" | sed -n 's/.*"head": "\([^"]*\)".*/\1/p')
echo "❌ Request failed: $ERROR_MSG"
exit 1
else
# Если получили ответ, но не распознали формат
if [ -n "$LAST_LINE" ]; then
echo "⚠️ Received response (check above for details)"
else
echo "❌ ERROR: No response from server"
exit 1
fi
fi

echo "✨ XP automation completed at: $(date -u '+%H:%M:%S UTC')"

- name: Log completion
run: |
echo "📝 Log entry: XP automation ran"
echo "Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
echo "Next scheduled run: In 4 hours"