WeChat Read Auto Check-in & Read-Time Boost

WeChat Read Challenge Assistant is a tool that helps users obtain WeChat Read membership at a lower cost through automated reading and check-in features. It completes WeChat Reading challenge tasks to unlock member privileges. The tool supports multiple platforms and browsers, provides rich configuration options, and scheduled tasks.

Just to get a cheaper WeChat Read membership.

This document may be out of date; for the latest version visit the open-source repository: https://github.com/jqknono/weread-challenge-selenium

Cheaper WeChat Read membership

WeChat Read Rules

  • Offline reading counts toward the total, but must sync while online.
  • Web edition, e-ink, mini-program, TTS, and audiobook listening all count.
  • Sessions judged as “too long” in a single auto-read/listen will have the excess excluded based on behavioral features.
  • A day counts only after >5 minutes of reading that day.
  • Pay ¥5 to get 2 days of membership immediately; read for 29 of the next 30 days and rack up 30 hours to earn 30 more days + 30 coins.
  • Pay ¥50 to get 30 days immediately; read 360 of the next 365 days and reach 300 hours to earn 365 days + 500 coins.

Undocumented quirks observed in practice:

  • On the 29th day, after check-in, you instantly get the membership reward and can immediately start the next round of challenges—no need to wait until day 31. The 29th check-in is counted for both the previous and the next round.
  • After the first round (29 days), every 28 days grants 32 days of membership.
    1 + 28 × 13 = 365 ⇒ 13 rounds a year, costing ¥65, yielding 32 × 13 = 416 days of membership + 390 coins.
  • The annual challenge is cheaper but runs longer and carries more risk.

Tool Features

  • Headful browser.
  • Local or remote browser support.
  • Random browser width & height.
  • Wait-for-login support.
  • QR login refresh support.
  • Save / load cookies.
  • Choose the X-th last-read book or pick at random.
  • Auto page turning.
  • Jump to next chapter.
  • Loop back to chapter 1 after finishing.
  • Configurable reading speed.
  • Random per-page and turn-page delays.
  • Screenshot every minute.
  • Logging.
  • Scheduled tasks.
  • Configurable reading duration.
  • Email notifications.
  • Multi-platform: linux | windows | macos.
  • Browser support: chrome | MicrosoftEdge | firefox.
  • Multi-user support.
  • Force refresh on error.
  • Usage stats.

Linux

Run Directly

# install nodejs
sudo apt install nodejs
# old nodejs versions need npm
sudo apt install npm
# create work dir
mkdir -p $HOME/Documents/weread-challenge
cd $HOME/Documents/weread-challenge
# install deps
npm install selenium-webdriver
# download script
wget https://storage1.techfetch.dev/weread-challenge/weread-challenge.js -O weread-challenge.js
# set runtime param via env
export WEREAD_BROWSER="chrome"
# run
WEREAD_BROWSER="chrome" node weread-challenge.js

For e-mail notifications install nodemailer: npm install nodemailer

Docker Compose Run

services:
  app:
    image: jqknono/weread-challenge:latest
    pull_policy: always
    environment:
      - WEREAD_REMOTE_BROWSER=http://selenium:4444
      - WEREAD_DURATION=68
    volumes:
      - ./data:/app/data
    depends_on:
      selenium:
        condition: service_healthy

  selenium:
    image: selenium/standalone-chrome:4.26
    pull_policy: if_not_present
    shm_size: 2gb
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - SE_ENABLE_TRACING=false
      - SE_BIND_HOST=false
      - SE_JAVA_DISABLE_HOSTNAME_VERIFICATION=false
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"]
      interval: 5s
      timeout: 60s
      retries: 10

Save as docker-compose.yml, then run docker compose up -d.
On first launch you must scan the WeChat QR code; the code is saved in ./data/login.png.

Docker Run

# run selenium standalone
docker run --restart always -d --name selenium-live \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --shm-size="2g" \
  -p 4444:4444 \
  -p 7900:7900 \
  -e SE_ENABLE_TRACING=false \
  -e SE_BIND_HOST=false \
  -e SE_JAVA_DISABLE_HOSTNAME_VERIFICATION=false \
  -e SE_NODE_MAX_INSTANCES=10 \
  -e SE_NODE_MAX_SESSIONS=10 \
  -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \
  selenium/standalone-chrome:4.26

# run weread-challenge
docker run --rm --name user-read \
  -v $HOME/weread-challenge/user/data:/app/data \
  -e WEREAD_REMOTE_BROWSER=http://172.17.0.2:4444 \
  -e WEREAD_DURATION=68 \
  weread-challenge:latest

# add another user
docker run --rm --name user2-read \
  -v $HOME/weread-challenge/user2/data:/app/data \
  -e WEREAD_REMOTE_BROWSER=http://172.17.0.2:4444 \
  -e WEREAD_DURATION=68 \
  weread-challenge:latest

On first launch you must scan the WeChat QR code; the code is saved in ./data/login.png.

Create Cron Jobs

Via docker-compose

WORKDIR=$HOME/weread-challenge
mkdir -p $WORKDIR
cd $WORKDIR
cat > $WORKDIR/docker-compose.yml <<EOF
services:
  app:
    image: jqknono/weread-challenge:latest
    pull_policy: always
    environment:
      - WEREAD_REMOTE_BROWSER=http://selenium:4444
      - WEREAD_DURATION=68
    volumes:
      - ./data:/app/data
    depends_on:
      selenium:
        condition: service_healthy

  selenium:
    image: selenium/standalone-chrome:4.26
    pull_policy: if_not_present
    shm_size: 2gb
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - SE_ENABLE_TRACING=false
      - SE_BIND_HOST=false
      - SE_JAVA_DISABLE_HOSTNAME_VERIFICATION=false
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"]
      interval: 5s
      timeout: 60s
      retries: 10
EOF
# after first launch scan the QR code saved in $HOME/weread-challenge/data/login.png
# start at 07:00 daily, read for 68 min
(crontab -l 2>/dev/null; echo "00 07 * * *  cd $WORKDIR && docker compose up -d") | crontab -

Via Docker only

# launch browser
docker run --restart always -d --name selenium-live \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --shm-size="2g" \
  -p 4444:4444 \
  -p 7900:7900 \
  -e SE_ENABLE_TRACING=false \
  -e SE_BIND_HOST=false \
  -e SE_JAVA_DISABLE_HOSTNAME_VERIFICATION=false \
  -e SE_NODE_MAX_INSTANCES=3 \
  -e SE_NODE_MAX_SESSIONS=3 \
  -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \
  -e SE_SESSION_REQUEST_TIMEOUT=10 \
  -e SE_SESSION_RETRY_INTERVAL=3 \
  selenium/standalone-chrome:4.26

WEREAD_USER="user"
mkdir -p $HOME/weread-challenge/$WEREAD_USER/data

# Get container IP
Selenium_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' selenium-live)

# after first launch scan the QR code saved in $HOME/weread-challenge/$WEREAD_USER/data/login.png
# start at 07:00 daily, read for 68 min
(crontab -l 2>/dev/null; echo "00 07 * * * docker run --rm --name ${WEREAD_USER}-read -v $HOME/weread-challenge/${WEREAD_USER}/data:/app/data -e WEREAD_REMOTE_BROWSER=http://${Selenium_IP}:4444 -e WEREAD_DURATION=68 -e WEREAD_USER=${WEREAD_USER} jqknono/weread-challenge:latest") | crontab -

Windows

# install nodejs
winget install -e --id Node.js.Node.js
# create work dir
mkdir -p $HOME/Documents/weread-challenge
cd $HOME/Documents/weread-challenge
# install deps
npm install selenium-webdriver
# download script via powershell
Invoke-WebRequest -Uri https://storage1.techfetch.dev/weread-challenge/weread-challenge.js -OutFile weread-challenge.js
# set runtime param
$env:WEREAD_BROWSER="MicrosoftEdge"
# run
node weread-challenge.js

Docker usage is the same as on Linux.

MacOS

# install nodejs
brew install node
# create work dir
mkdir -p $HOME/Documents/weread-challenge
cd $HOME/Documents/weread-challenge
# install deps
npm install selenium-webdriver
# download script
wget https://storage1.techfetch.dev/weread-challenge/weread-challenge.js -O weread-challenge.js
# set runtime param
export WEREAD_BROWSER="chrome"
# run
node weread-challenge.js

Docker usage the same as on Linux.

Multi-User Support

# launch browser
docker run --restart always -d --name selenium-live \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --shm-size="2g" \
  -p 4444:4444 \
  -p 7900:7900 \
  -e SE_ENABLE_TRACING=false \
  -e SE_BIND_HOST=false \
  -e SE_JAVA_DISABLE_HOSTNAME_VERIFICATION=false \
  -e SE_NODE_MAX_INSTANCES=10 \
  -e SE_NODE_MAX_SESSIONS=10 \
  -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \
  selenium/standalone-chrome:4.26

WEREAD_USER1="user1"
WEREAD_USER2="user2"
mkdir -p $HOME/weread-challenge/$WEREAD_USER1/data
mkdir -p $HOME/weread-challenge/$WEREAD_USER2/data

# Get container IP
Selenium_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' selenium-live)

# after first launch, scan the QR codes stored in:
# /$HOME/weread-challenge/${WEREAD_USER1}/data/login.png
# /$HOME/weread-challenge/${WEREAD_USER2}/data/login.png
# start at 07:00 daily, read for 68 min
(crontab -l 2>/dev/null; echo "00 07 * * * docker run --rm --name ${WEREAD_USER1}-read -v $HOME/weread-challenge/${WEREAD_USER1}/data:/app/data -e WEREAD_REMOTE_BROWSER=http://${Selenium_IP}:4444 -e WEREAD_DURATION=68 -e WEREAD_USER=${WEREAD_USER1} jqknono/weread-challenge:latest") | crontab -
(crontab -l 2>/dev/null; echo "00 07 * * * docker run --rm --name ${WEREAD_USER2}-read -v $HOME/weread-challenge/${WEREAD_USER2}/data:/app/data -e WEREAD_REMOTE_BROWSER=http://${Selenium_IP}:4444 -e WEREAD_DURATION=68 -e WEREAD_USER=${WEREAD_USER2} jqknono/weread-challenge:latest") | crontab -

Configurable Options

Environment Variable Default Options Description
WEREAD_USER weread-default - User label
WEREAD_REMOTE_BROWSER "" - Remote browser URL
WEREAD_DURATION 10 - Reading duration (min)
WEREAD_SPEED slow slow,normal,fast Reading speed
WEREAD_SELECTION random [0-4] Select book to read
WEREAD_BROWSER chrome chrome,MicrosoftEdge,firefox Browser to use
ENABLE_EMAIL false true,false Enable email notification
EMAIL_SMTP "" - SMTP server
EMAIL_USER "" - Username
EMAIL_PASS "" - Password/App key
EMAIL_TO "" - Recipient address
WEREAD_AGREE_TERMS true true,false Privacy consent

Notes

  • 28-day cycle → 30 hrs → at least 65 min daily (not 60).
  • WeChat Read’s count may drop a few minutes, so aim for 68 min instead of 65.
  • Login cookies via QR expire in 30 days—perfect for monthly challenges.
  • Emails may land in spam; whitelist the sender.
  • Educational use only—no commercial or illegal use.
  • If infringement is suspected, contact [email protected] for immediate takedown.

Privacy Policy

  • Data Collected
    • Cookies used only for user stat display.
    • Usage stats: user name | first launch | last launch | total runs | browser | OS | reading duration | abnormal exit reason.
    • Set WEREAD_AGREE_TERMS=false to opt out entirely.
  • Risk Warning
    • Cookies can log into WeChat Read but this tool never uses them to log in again.
    • Tencent shows risk prompts on abnormal logins; check in mobile client under Settings → Logged-in Devices.
    • Pure JS, easily de-obfuscated—always verify logged-in devices when using automation.

References