文章学习和视频学习使用单独的context

预计添加微信公众号支持
This commit is contained in:
johlanse 2022-07-30 18:55:00 +08:00
parent d41bba79b6
commit f73ec27d46
13 changed files with 168 additions and 63 deletions

View File

@ -1,6 +1,9 @@
name: docker build name: docker build
on: [push, pull_request] on:
push:
tags:
- 'v*'
env: env:
BINARY_PREFIX: "study_xxqg_" BINARY_PREFIX: "study_xxqg_"
@ -34,5 +37,5 @@ jobs:
ls -R ls -R
pwd pwd
docker build -t jolanse/study_xxqg ./ docker build -t jolanse/study_xxqg ./
docker push jolanse/study_xxqg docker push jolanse/study_xxqg:${{github.ref}}

View File

@ -54,6 +54,12 @@ type Config struct {
// 重试时间 // 重试时间
Intervals int `json:"intervals" yaml:"intervals"` Intervals int `json:"intervals" yaml:"intervals"`
} `json:"retry" yaml:"retry"` } `json:"retry" yaml:"retry"`
Wechat struct {
Token string `json:"token" yaml:"token"`
Secret string `json:"secret" yaml:"secret"`
AppID string `json:"app_id" yaml:"app_id"`
} `json:"wechat" yaml:"wechat"`
// 专项答题可接受的最小值 // 专项答题可接受的最小值
SpecialMinScore int `json:"special_min_score" yaml:"special_min_score"` SpecialMinScore int `json:"special_min_score" yaml:"special_min_score"`

11
go.mod
View File

@ -29,18 +29,25 @@ require (
) )
require ( require (
github.com/beevik/etree v1.1.0 // indirect
github.com/codegangsta/negroni v1.0.0 // indirect
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.13.0 // indirect github.com/go-playground/locales v0.13.0 // indirect
github.com/go-playground/universal-translator v0.17.0 // indirect github.com/go-playground/universal-translator v0.17.0 // indirect
github.com/go-playground/validator/v10 v10.5.0 // indirect github.com/go-playground/validator/v10 v10.5.0 // indirect
github.com/goincremental/negroni-sessions v0.0.0-20171223143234-40b49004abee // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.2 // indirect
github.com/gorilla/context v1.1.1 // indirect
github.com/gorilla/securecookie v1.1.1 // indirect
github.com/gorilla/sessions v1.2.1 // indirect
github.com/gorilla/websocket v1.4.2 // indirect github.com/gorilla/websocket v1.4.2 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/huoxue1/lorca v0.1.11 // indirect github.com/huoxue1/lorca v0.1.11 // indirect
github.com/jonboulle/clockwork v0.2.2 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/json-iterator/go v1.1.10 // indirect github.com/json-iterator/go v1.1.10 // indirect
github.com/julienschmidt/httprouter v1.3.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/leodido/go-urn v1.2.1 // indirect github.com/leodido/go-urn v1.2.1 // indirect
github.com/lestrrat-go/strftime v1.0.5 // indirect github.com/lestrrat-go/strftime v1.0.5 // indirect
@ -51,9 +58,13 @@ require (
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/rosbit/go-wget v1.2.5 // indirect
github.com/rosbit/go-wx-api v0.5.0 // indirect
github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/pretty v1.2.0 // indirect
github.com/ugorji/go/codec v1.2.5 // indirect github.com/ugorji/go/codec v1.2.5 // indirect
github.com/urfave/negroni v1.0.0 // indirect
github.com/yujinliang/wechat v0.0.0-20220623135211-fb0809eeece2 // indirect
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
golang.org/x/mod v0.3.0 // indirect golang.org/x/mod v0.3.0 // indirect
golang.org/x/net v0.0.0-20220111093109-d55c255bac03 // indirect golang.org/x/net v0.0.0-20220111093109-d55c255bac03 // indirect

22
go.sum
View File

@ -1,5 +1,9 @@
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII= github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk= github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
github.com/codegangsta/negroni v1.0.0 h1:+aYywywx4bnKXWvoWtRfJ91vC59NbEhEY03sZjQhbVY=
github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0=
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -23,6 +27,8 @@ github.com/go-playground/validator/v10 v10.5.0 h1:X9rflw/KmpACwT8zdrm1upefpvdy6u
github.com/go-playground/validator/v10 v10.5.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= github.com/go-playground/validator/v10 v10.5.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0-beta.0 h1:mbEDV1g6RBzKd4sFjOWuyZdxItw4CWu5Kq4KaBAJbHM= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0-beta.0 h1:mbEDV1g6RBzKd4sFjOWuyZdxItw4CWu5Kq4KaBAJbHM=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0-beta.0/go.mod h1:5+h9c5l1Z/+Pi+5boa1Fmr4Q+FImsXYnifor92ljaVs= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0-beta.0/go.mod h1:5+h9c5l1Z/+Pi+5boa1Fmr4Q+FImsXYnifor92ljaVs=
github.com/goincremental/negroni-sessions v0.0.0-20171223143234-40b49004abee h1:aBLa9mJSmSV0I7vZrb+jMakH/B5rR+mRI6Q/DxQ+O7g=
github.com/goincremental/negroni-sessions v0.0.0-20171223143234-40b49004abee/go.mod h1:32Cq/6avji0Xp32YipwaOV3PsvpGfuYKTJP9XJrdXe8=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
@ -34,6 +40,12 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/guonaihong/gout v0.2.9 h1:8nU5hrtwP1qDwiadFvU+D+z3ud9WEk8iPSfxQDiebng= github.com/guonaihong/gout v0.2.9 h1:8nU5hrtwP1qDwiadFvU+D+z3ud9WEk8iPSfxQDiebng=
@ -52,6 +64,8 @@ github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUB
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
@ -101,6 +115,10 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6O
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rosbit/go-wget v1.2.5 h1:XQFUwTJR8HDwYvxYH8X0cq3BkN1BOMoADc92KKp9Pcs=
github.com/rosbit/go-wget v1.2.5/go.mod h1:8Tt92GKM/K9WI65yYkX0lwJDnRp64Vd082ojViWT6T4=
github.com/rosbit/go-wx-api v0.5.0 h1:aAjTHCd2o3b14O0JYx2b+qzbZh8ThlKWMD+QsQEK9vQ=
github.com/rosbit/go-wx-api v0.5.0/go.mod h1:+HyYx6Avz1sPXTN+JBGyW1mf/jToDkXoNZXHX7S2F8I=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
@ -128,7 +146,11 @@ github.com/ugorji/go v1.2.5/go.mod h1:gat2tIT8KJG8TVI8yv77nEO/KYT6dV7JE1gfUa8Xul
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.2.5 h1:8WobZKAk18Msm2CothY2jnztY56YVY8kF1oQrj21iis= github.com/ugorji/go/codec v1.2.5 h1:8WobZKAk18Msm2CothY2jnztY56YVY8kF1oQrj21iis=
github.com/ugorji/go/codec v1.2.5/go.mod h1:QPxoTbPKSEAlAHPYt02++xp/en9B/wUdwFCz+hj5caA= github.com/ugorji/go/codec v1.2.5/go.mod h1:QPxoTbPKSEAlAHPYt02++xp/en9B/wUdwFCz+hj5caA=
github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc=
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yujinliang/wechat v0.0.0-20220623135211-fb0809eeece2 h1:beflFd/e1LnYqtB9cDPEmc1NNV4GvdWzRFtKp9+o/HQ=
github.com/yujinliang/wechat v0.0.0-20220623135211-fb0809eeece2/go.mod h1:Rv+LwiyfMMdSkJP5Kt+8QmcXlufGNcR+D6yz21gI2eM=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=

View File

@ -36,7 +36,6 @@ import (
type Core struct { type Core struct {
pw *playwright.Playwright pw *playwright.Playwright
browser playwright.Browser browser playwright.Browser
context *playwright.BrowserContext
ShowBrowser bool ShowBrowser bool
Push func(kind string, message string) Push func(kind string, message string)
} }
@ -255,12 +254,11 @@ func (c *Core) L(retryTimes int) (*model.User, error) {
} }
if retryTimes == 0 { if retryTimes == 0 {
return nil, errors.New("time out") return nil, errors.New("time out")
} else {
// 等待几分钟后重新执行
time.Sleep(time.Duration(conf.GetConfig().Retry.Intervals) * time.Minute)
c.Push("text", fmt.Sprintf("登录超时,将进行第%d重新次登录", retryTimes))
return c.L(retryTimes - 1)
} }
// 等待几分钟后重新执行
time.Sleep(time.Duration(conf.GetConfig().Retry.Intervals) * time.Minute)
c.Push("text", fmt.Sprintf("登录超时,将进行第%d重新次登录", retryTimes))
return c.L(retryTimes - 1)
} }
func (c *Core) initWindows() { func (c *Core) initWindows() {
@ -319,14 +317,6 @@ func (c *Core) initWindows() {
} }
c.browser = browser c.browser = browser
context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
return
}
c.context = &context
} }
func (c *Core) initNotWindows() { func (c *Core) initNotWindows() {
@ -389,21 +379,10 @@ func (c *Core) initNotWindows() {
return return
} }
c.browser = browser c.browser = browser
context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
return
}
c.context = &context
} }
func (c *Core) Quit() { func (c *Core) Quit() {
err := (*c.context).Close() err := c.browser.Close()
if err != nil {
return
}
err = c.browser.Close()
if err != nil { if err != nil {
return return
} }

View File

@ -44,20 +44,32 @@ func (c *Core) RespondDaily(user *model.User, model string) {
return return
} }
page, err := (*c.context).NewPage() context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
log.Errorln("创建实例对象错误" + err.Error())
return
}
defer func(context playwright.BrowserContext) {
err := context.Close()
if err != nil {
log.Errorln("错误的关闭了实例对象" + err.Error())
}
}(context)
page, err := context.NewPage()
if err != nil { if err != nil {
log.Errorln("创建页面失败" + err.Error()) log.Errorln("创建页面失败" + err.Error())
return return
} }
defer func() { defer func() {
page.Close() page.Close()
}() }()
log.Infoln(user.ToBrowserCookies())
err = (*c.context).AddCookies(user.ToBrowserCookies()...) err = context.AddCookies(user.ToBrowserCookies()...)
if err != nil { if err != nil {
log.Errorln(err.Error()) log.Errorln("添加cookie失败" + err.Error())
log.Errorln("添加cookie信息失败已退出答题")
return return
} }
_, _ = page.Goto("https://pc.xuexi.cn/points/my-points.html") _, _ = page.Goto("https://pc.xuexi.cn/points/my-points.html")

View File

@ -39,7 +39,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
if !gjson.GetBytes(resp, "ok").Bool() { if !gjson.GetBytes(resp, "ok").Bool() {
return Score{}, errors.New("token check failed") return Score{}, errors.New("token check failed")
} }
log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) // log.Debugln(gjson.GetBytes(resp, "@this|@pretty"))
score.TotalScore = int(gjson.GetBytes(resp, "data.score").Int()) score.TotalScore = int(gjson.GetBytes(resp, "data.score").Int())
// 获取用户今日得分 // 获取用户今日得分
@ -51,7 +51,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
return Score{}, err return Score{}, err
} }
log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) // log.Debugln(gjson.GetBytes(resp, "@this|@pretty"))
score.TodayScore = int(gjson.GetBytes(resp, "data.score").Int()) score.TodayScore = int(gjson.GetBytes(resp, "data.score").Int())
err = gout.GET(user_rateScore_url).SetCookies(cookies...).SetHeader(gout.H{ err = gout.GET(user_rateScore_url).SetCookies(cookies...).SetHeader(gout.H{
@ -61,7 +61,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
log.Errorln("获取用户积分出现错误" + err.Error()) log.Errorln("获取用户积分出现错误" + err.Error())
return Score{}, err return Score{}, err
} }
log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) // log.Debugln(gjson.GetBytes(resp, "@this|@pretty"))
datas := gjson.GetBytes(resp, "data.taskProgress").Array() datas := gjson.GetBytes(resp, "data.taskProgress").Array()
m := make(map[string]Data, 7) m := make(map[string]Data, 7)
m["article"] = Data{ m["article"] = Data{

View File

@ -114,7 +114,22 @@ func (c *Core) LearnArticle(user *model.User) {
links, _ := getLinks("article") links, _ := getLinks("article")
if score.Content["article"].CurrentScore < score.Content["article"].MaxScore { if score.Content["article"].CurrentScore < score.Content["article"].MaxScore {
log.Infoln("开始加载文章学习模块") log.Infoln("开始加载文章学习模块")
page, err := (*c.context).NewPage()
context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
log.Errorln("创建实例对象错误" + err.Error())
return
}
defer func(context playwright.BrowserContext) {
err := context.Close()
if err != nil {
log.Errorln("错误的关闭了实例对象" + err.Error())
}
}(context)
page, err := context.NewPage()
if err != nil { if err != nil {
return return
} }
@ -122,7 +137,7 @@ func (c *Core) LearnArticle(user *model.User) {
page.Close() page.Close()
}() }()
err = (*c.context).AddCookies(user.ToBrowserCookies()...) err = context.AddCookies(user.ToBrowserCookies()...)
if err != nil { if err != nil {
log.Errorln("添加cookie失败" + err.Error()) log.Errorln("添加cookie失败" + err.Error())
return return
@ -209,27 +224,29 @@ func (c *Core) LearnVideo(user *model.User) {
// core := Core{} // core := Core{}
// core.Init() // core.Init()
page, err := (*c.context).NewPage() context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
log.Errorln("创建实例对象错误" + err.Error())
return
}
defer func(context playwright.BrowserContext) {
err := context.Close()
if err != nil {
log.Errorln("错误的关闭了实例对象" + err.Error())
}
}(context)
page, err := context.NewPage()
if err != nil { if err != nil {
return return
} }
defer func() { defer func() {
page.Close() page.Close()
}() }()
var resp string
err = gout.GET("http://1.15.144.22/stealth.min.js").BindBody(&resp).Do()
if err != nil {
return
}
err = page.AddInitScript(playwright.PageAddInitScriptOptions{
Script: playwright.String(resp),
Path: nil,
})
if err != nil {
return
}
err = (*c.context).AddCookies(user.ToBrowserCookies()...) err = context.AddCookies(user.ToBrowserCookies()...)
if err != nil { if err != nil {
log.Errorln("添加cookie失败" + err.Error()) log.Errorln("添加cookie失败" + err.Error())
return return

View File

@ -161,7 +161,6 @@ func login(bot *Telegram, args []string) {
core := Core{ core := Core{
pw: nil, pw: nil,
browser: nil, browser: nil,
context: nil,
ShowBrowser: config.ShowBrowser, ShowBrowser: config.ShowBrowser,
Push: func(kind string, message string) { Push: func(kind string, message string) {
switch { switch {
@ -219,7 +218,6 @@ func studyAll(bot *Telegram, args []string) {
core := Core{ core := Core{
pw: nil, pw: nil,
browser: nil, browser: nil,
context: nil,
ShowBrowser: config.ShowBrowser, ShowBrowser: config.ShowBrowser,
Push: func(kind string, message string) { Push: func(kind string, message string) {
switch { switch {
@ -313,7 +311,6 @@ func study(bot *Telegram, args []string) {
core := Core{ core := Core{
pw: nil, pw: nil,
browser: nil, browser: nil,
context: nil,
ShowBrowser: config.ShowBrowser, ShowBrowser: config.ShowBrowser,
Push: func(kind string, message string) { Push: func(kind string, message string) {
switch { switch {

22
main.go
View File

@ -4,6 +4,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"io" "io"
"net/http"
"os" "os"
"path" "path"
"strconv" "strconv"
@ -95,7 +96,10 @@ func main() {
if config.Web.Enable { if config.Web.Enable {
engine := web.RouterInit() engine := web.RouterInit()
go func() { go func() {
err := engine.Run(fmt.Sprintf("%s:%d", config.Web.Host, config.Web.Port)) h := http.NewServeMux()
h.Handle("/", engine)
//h.HandleFunc("/wx", web.HandleWechat)
err := http.ListenAndServe(fmt.Sprintf("%s:%d", config.Web.Host, config.Web.Port), h)
if err != nil { if err != nil {
return return
} }
@ -186,9 +190,17 @@ func do(m string) {
var user *model.User var user *model.User
users, _ := model.Query() users, _ := model.Query()
study := func(core2 *lib.Core, u *model.User) { study := func(core2 *lib.Core, u *model.User) {
go core2.LearnArticle(u)
go core2.LearnVideo(u) defer func() {
lib.WaitStudy(u, "") err := recover()
if err != nil {
log.Errorln("学习过程异常")
log.Errorln(err)
}
}()
core2.LearnArticle(u)
core2.LearnVideo(u)
if config.Model == 2 { if config.Model == 2 {
core2.RespondDaily(u, "daily") core2.RespondDaily(u, "daily")
} else if config.Model == 3 { } else if config.Model == 3 {
@ -205,7 +217,7 @@ func do(m string) {
message := u.Nick + " 学习完成:今日得分:" + strconv.Itoa(score.TodayScore) message := u.Nick + " 学习完成:今日得分:" + strconv.Itoa(score.TodayScore)
score, _ = lib.GetUserScore(user.ToCookies()) score, _ = lib.GetUserScore(user.ToCookies())
content := lib.FormatScore(score) content := lib.FormatScore(score)
err = push.PushMessage(user.Nick+"学习情况", content, "score", user.PushId) err = push.PushMessage(user.Nick+"学习情况", user.Nick+"学习情况"+content, "score", user.PushId)
if err != nil { if err != nil {
log.Errorln(err.Error()) log.Errorln(err.Error())
err = nil err = nil

View File

@ -94,7 +94,7 @@ func getScore() gin.HandlerFunc {
ctx.JSON(200, Resp{ ctx.JSON(200, Resp{
Code: 200, Code: 200,
Message: "获取成功", Message: "获取成功",
Data: lib.PrintScore(score), Data: lib.FormatScore(score),
Success: true, Success: true,
Error: "", Error: "",
}) })
@ -215,7 +215,7 @@ func study() gin.HandlerFunc {
uid := ctx.Query("uid") uid := ctx.Query("uid")
user := model.Find(uid) user := model.Find(uid)
core := &lib.Core{ core := &lib.Core{
ShowBrowser: false, ShowBrowser: conf.GetConfig().ShowBrowser,
Push: func(kind, message string) { Push: func(kind, message string) {
}, },
} }

View File

@ -20,6 +20,10 @@ func RouterInit() *gin.Engine {
router := gin.Default() router := gin.Default()
router.Use(Cors()) router.Use(Cors())
router.Group("/wx", func(context *gin.Context) {
})
router.StaticFS("/static", http.FS(static)) router.StaticFS("/static", http.FS(static))
router.GET("/", func(ctx *gin.Context) { router.GET("/", func(ctx *gin.Context) {
ctx.Redirect(301, "/static/xxqg/build/home.html") ctx.Redirect(301, "/static/xxqg/build/home.html")

42
web/wx.go Normal file
View File

@ -0,0 +1,42 @@
package web
import (
"net/http"
log "github.com/sirupsen/logrus"
"github.com/yujinliang/wechat/mp"
"github.com/yujinliang/wechat/mp/request"
"github.com/huoxue1/study_xxqg/conf"
)
func init() {
//InitWechat()
}
var (
wx *mp.WeiXin
)
func InitWechat() {
config := conf.GetConfig()
log.Infoln(config.Wechat)
wx = mp.New(config.Wechat.Token, config.Wechat.AppID, config.Wechat.Secret, "123", "123")
wx.CreateMenu(&mp.Menu{Buttons: []mp.MenuButton{
{
Name: "登录",
Type: "click",
Key: "login",
Url: "",
MediaId: "",
SubButtons: nil,
},
}})
wx.HandleFunc("eventCLICK", func(wx *mp.WeiXin, w http.ResponseWriter, r *request.WeiXinRequest, timestamp, nonce string) {
log.Infoln(r.EventKey)
})
}
func HandleWechat(rep http.ResponseWriter, req *http.Request) {
wx.ServeHTTP(rep, req)
}