微信读书挑战会员助手

18 天前
 jqknono

微信读书挑战会员助手

只为便宜一点买微信读书会员.

微信读书规则

根据实际操作, 还有如下未明确说明的特点:

工具特性

Linux

直接运行

下载链接: weread-challenge.js

# 安装 nodejs
sudo apt install nodejs
# 老旧版本的 nodejs 需要安装 npm
sudo apt install npm
# 创建运行文件夹
mkdir -p $HOME/weread-challenge
cd $HOME/weread-challenge
# 安装依赖
npm install selenium-webdriver
# 通过环境变量设置运行参数
WEREAD_BROWSER="chrome"
# 运行
node weread-challenge.js

如需邮件通知, 需安装 nodemailer: npm install nodemailer

Docker Compose 运行

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

保存为 docker-compose.yml, 运行 docker compose up -d.

Docker 运行

# 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:beta

# 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

创建定时任务

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
# 首次启动后, 需微信扫描二维码登录, 二维码保存在 $HOME/weread-challenge/data/login.png
# 每天早上 7 点启动, 阅读 68 分钟
(crontab -l 2>/dev/null; echo "00 07 * * *  cd $WORKDIR && docker compose up -d") | crontab -

docker

# 启动浏览器
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)

# 首次启动后, 需微信扫描二维码登录, 二维码保存在 $HOME/weread-challenge/$WEREAD_USER/data/login.png
# 每天早上 7 点启动, 阅读 68 分钟
(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

# 安装 nodejs
winget install -e --id Node.js.Node.js
# 创建运行文件夹
mkdir -p $HOME/weread-challenge
cd $HOME/weread-challenge
# 安装依赖
npm install selenium-webdriver
# 通过环境变量设置运行参数
$WEREAD_BROWSER="MicrosoftEdge"
# 运行
node weread-challenge.js

Docker 运行同 Linux.

MacOS

# 安装 nodejs
brew install node
# 创建运行文件夹
mkdir -p $HOME/weread-challenge
# 安装依赖
npm install selenium-webdriver
# 通过环境变量设置运行参数
WEREAD_BROWSER="safari"
# 运行
node weread-challenge.js

Docker 运行同 Linux.

多用户支持

# 启动浏览器
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)

# 首次启动后, 需微信扫描二维码登录, 二维码保存在:
# /$HOME/weread-challenge/${WEREAD_USER1}/data/login.png
# /$HOME/weread-challenge/${WEREAD_USER2}/data/login.png
# 每天早上 7 点启动, 阅读 68 分钟
(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 -

可配置项

环境变量 默认值 可选值 说明
WEREAD_USER weread-default - 用户标识
WEREAD_REMOTE_BROWSER "" - 远程浏览器地址
WEREAD_DURATION 10 - 阅读时长
WEREAD_SELECTION random [0-4] 选择阅读的书籍
WEREAD_BROWSER chrome chrome,MicrosoftEdge,firefox,safari 浏览器
ENABLE_EMAIL false true,false 邮件通知
EMAIL_SMTP "" - 邮箱 SMTP 服务器
EMAIL_USER "" - 邮箱用户名
EMAIL_PASS "" - 邮箱密码
EMAIL_TO "" - 收件人
WEREAD_AGREE_TERMS true true,false 隐私同意条款

容器多架构支持

支持 linux/amd64,linux/arm64, 支持树莓派等开发板.

docker buildx create --name weread-challenge
docker buildx use weread-challenge
docker buildx inspect --bootstrap
docker buildx build --platform linux/amd64,linux/arm64 -t jqknono/weread-challenge:base -f Dockerfile.base --push .
docker buildx build --platform linux/amd64,linux/arm64 -t jqknono/weread-challenge:latest -f Dockerfile.quick --push .

注意事项

隐私政策

参考

2292 次点击
所在节点    分享创造
28 条回复
Meld
18 天前
可以考虑放到青龙面板里
tanranran
18 天前
+1
Gcourage
18 天前
macOS node22.9 执行的时候提示 TypeError: _0x2f1dd9[("addArgumen" + "ts")] is not a function
jqknono
18 天前
@Gcourage 我周末试下
Gcourage
18 天前
@jqknono 多谢,也在尝试反混淆下,顺便学习下,哈哈
menyuguren
18 天前
docker 提示找不到 cookies.json 文件,手动创建也不行
ColoThor
18 天前
啊你这代码加密的
jqknono
18 天前
@menyuguren docker 在执行目录./data/login.png 扫码登录
jqknono
18 天前
@ColoThor 是混淆
jqknono
18 天前
@Gcourage 抱歉 safari 的页面解析确实和 chrome 的不一样, firefox 也没有充分测试. 鉴于本项目没什么收益, 也很小众, 我检视代码确认没有重要信息后, 就把非混淆的代码放出来. 大家可以自行修改, 但是希望保留我的统计.
jqknono
18 天前
menyuguren
18 天前
@jqknono 这个有了,也可以扫码,扫码成功后,提示没有找到或者打开 ./data/ cookies.json 文件,接着关闭浏览器
495127903
18 天前
[INFO][2024-12-27 07:20:54.495]: Waiting for login...
[INFO][2024-12-27 07:21:17.382]: Login completed.
[INFO][2024-12-27 07:21:17.384]: Error: ENOENT: no such file or directory, open './data/cookies.json'
[INFO][2024-12-27 07:21:17.384]: Quitting the browser...
[INFO][2024-12-27 07:21:17.441]: Browser closed.

求解
jqknono
18 天前
@menyuguren
@495127903 脚本运行目录下需创建 data 文件夹
Gcourage
17 天前
@jqknono 非常感谢,本来我也怀疑是浏览器的问题,把 WEREAD_BROWSER="chrome",但是会运行后卡在
WEREAD_REMOTE_BROWSER not found. Running locally. 最近刚好想学点 js 代码,随便玩一玩,哈哈
Gcourage
17 天前
@jqknono 自己也学了点反混淆的东西,哈哈,你的开源的代码现在执行是没问题的
jqknono
16 天前
495127903
16 天前
@jqknono 收到,感谢修复
steveway
16 天前
考虑添加其他同志方式吗?比如 bark
jqknono
16 天前
@steveway 那是啥?怎么添加呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1100508

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX