From 1a2f72596f34eb7ef78236ca05a720868797884f Mon Sep 17 00:00:00 2001
From: Recolic Keghart <root@recolic.net>
Date: Wed, 25 Apr 2018 13:33:58 +0800
Subject: [PATCH] answer bug fix. Reconstruct configurations. autosign added.
 rewrite readme

---
 README.md                   |  28 +++++++++++++++++++-------
 config.fish                 |  13 ++++++++++++
 daemon.sh                   |   7 ++-----
 impl/autosignin-success.mp3 | Bin 0 -> 14796 bytes
 impl/daemon-answer.fish     |   7 +++++--
 impl/daemon-signin.fish     |  38 ++++++++++++++++++++++++++++++------
 6 files changed, 73 insertions(+), 20 deletions(-)
 create mode 100644 config.fish
 create mode 100644 impl/autosignin-success.mp3

diff --git a/README.md b/README.md
index e29e3a4..b7df9b7 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,37 @@
 # micro-teaching-assistant-fucker
 
+微助教工具箱
+
 自动检测是否有老师在微助教发布了新的题 并在特殊情况下及时提醒答题
 
-自动检测是否有老师在微助教发布了新的签到 并在特殊情况下及时提醒签到
+自动检测是否有老师在微助教发布了新的签到 并延时自动签到
 
 ## Hard PreRequirements
 
-Non-Windows OS. curl. bash. fish. awk. One mp3 player available on command line.
+Non-Windows OS. curl. bash. fish. awk. grep. One mp3 player available on command line.
+
+## Configuration
+
+编辑config.fish,设置自动签到的经纬度和延时,设置你想使用的mp3播放器然后保存。
 
 ## Usage
 
-打开微信 微助教 学生 答题/签到,在页面加载完成之前迅速按下右上角...,然后复制这个页面的url。
+- 获得openid
 
-运行你想要的daemon.sh 输入openid或含有openid的完整URL 它会每5秒检查一次并判断是否需要答题/签到。你也可以将openid直接写进daemon.sh。
+打开微信 微助教 学生 答题/签到,在*页面加载完成之前*迅速按下右上角的`...`,然后复制链接(copy url)。
 
-daemon.sh使用了notify-send,其他用户请根据自己的情况选择修改或删除气泡提醒。
+- 自动签到
 
-daemonx.sh默认使用mpg123/cvlc来播放mp3,其他播放器用户请根据自己情况进行修改。**请将电脑声音调大**。
+运行`./daemon.sh sign`并填写openid(或含有openid的url),它会监视你的所有课堂并自动签到。注意,如果有多个课堂同时发起签到请求,其行为是未定义的。
+
+- 监视答题
+
+运行`./daemon.sh ans`(或含有openid的url),它会监视你的所有课堂是否有答题。注意,如果有多个课堂同时发起答题,其行为是未定义的。
 
 ## Tips
 
-根据经验,url一般会在约1080次请求后失效。这意味着,如果你只开一个脚本,5秒请求一次,它可以使用约90分钟。同时使用签到和答题监测时,时间会减半。
+daemon.sh使用了notify-send,其他用户请根据自己的情况选择修改或删除气泡提醒。
+
+daemonx.sh默认使用mpg123/cvlc来播放mp3,其他播放器用户请根据自己情况进行修改。**请将电脑声音调大**。
+
+根据经验,url一般会在约1080次请求后失效。这意味着,如果你只开一个脚本,5秒请求一次,它可以自动运行约90分钟。
diff --git a/config.fish b/config.fish
new file mode 100644
index 0000000..17231b2
--- /dev/null
+++ b/config.fish
@@ -0,0 +1,13 @@
+# What mp3 player do you want? (Tip, you can write a wrapper here to set player to highest volume)
+#set _audio_player="mpg123"
+set _audio_player "cvlc --play-and-exit"
+
+# Where should I signin ?
+set _NorthLatitude "30.509604"
+set _EastLongitude "114.41374"
+
+# How many seconds should I sleep after every check ?
+set _monitor_interval "5"
+
+# How many seconds should I delay before autosign ?
+set _autosign_delay "10"
diff --git a/daemon.sh b/daemon.sh
index 41efe08..ed5ac49 100755
--- a/daemon.sh
+++ b/daemon.sh
@@ -6,9 +6,6 @@
 _openid=$(echo "$_openid" | sed 's/^.*openid=//g')
 echo "Set openid to $_openid"
 
-#_audio_player="mpg123"
-_audio_player="cvlc --play-and-exit"
-
 function _segfault_detected () {
     echo "WARNING: segfault captured!"
     while true; do
@@ -27,12 +24,12 @@ fi
 cd impl
 
 if [[ $1 == sign ]]; then
-    _openid="$_openid" _audio_player="$_audio_player" ./daemon-signin.fish
+    _openid="$_openid" ./daemon-signin.fish
     [[ $? == 127 ]] && exit 127
     _segfault_detected
 fi
 if [[ $1 == ans ]]; then
-    _openid="$_openid" _audio_player="$_audio_player" ./daemon-answer.fish
+    _openid="$_openid" ./daemon-answer.fish
     [[ $? == 127 ]] && exit 127
     _segfault_detected
 fi
diff --git a/impl/autosignin-success.mp3 b/impl/autosignin-success.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e471c40db2c948fdf799f19d53617f391a63ea59
GIT binary patch
literal 14796
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

literal 0
HcmV?d00001

diff --git a/impl/daemon-answer.fish b/impl/daemon-answer.fish
index 2925801..5e1079c 100755
--- a/impl/daemon-answer.fish
+++ b/impl/daemon-answer.fish
@@ -1,7 +1,10 @@
 #!/usr/bin/fish
 #Usage: fill _openid with openid from url of the page "学生->答题".
 
-_url="https://www.teachermate.com.cn/wechat/wechat/guide/answer?openid=$_openid"
+test -z $_openid; and echo 'openid is unset.' ; and exit 1
+set _url "https://www.teachermate.com.cn/wechat/wechat/guide/answer?openid=$_openid"
+
+source ../config.fish
 
 function _check_and_warn
     if _all_answered
@@ -74,7 +77,7 @@ while true
     else if test "$_status" = "OPENED"
         _check_and_warn
     end
-    sleep 5
+    sleep $_monitor_interval
 end
 
 
diff --git a/impl/daemon-signin.fish b/impl/daemon-signin.fish
index 45eca31..9b9e586 100755
--- a/impl/daemon-signin.fish
+++ b/impl/daemon-signin.fish
@@ -1,21 +1,47 @@
 #!/usr/bin/fish
 
-_url="https://www.teachermate.com.cn/wechat/wechat/guide/signin?openid=$_openid"
+test -z $_openid; and echo 'openid is unset.' ; and exit 1
+set _url "https://www.teachermate.com.cn/wechat/wechat/guide/signin?openid=$_openid"
+
+source ../config.fish
+
+# Where should I signin ?
+test -z $_NorthLatitude; and set _NorthLatitude "30.509604"
+test -z $_EastLongitude; and set _EastLongitude "114.41374"
+
+# How many seconds should I delay before autosign ?
+test -z $_autosign_delay; and set _autosign_delay "10"
 
 set tmpfl (mktemp)
+set cookiefl (mktemp)
+# Just to skip first sleep
 rm $tmpfl
 
+set signed_in false
+
+function do_signin
+    if test $signed_in = true
+        return
+    end
+    echo "sleep for $_autosign_delay seconds..."
+    sleep $_autosign_delay
+    set _courseid (curl "$_url" -v 2>&1 | grep '^< Location: ' | sed 's/^.*course_id=//')
+    set _wx_csrf (grep 'Set-Cookie' $cookiefl | sed 's/^.*wx_csrf_cookie=//' | sed 's/;.*$//')
+    curl "https://www.teachermate.com.cn/wechat-api/v1/class-attendance/student-sign-in" --data "openid=$_openid&course_id=$_courseid&lon=$_EastLongitude&lat=$_NorthLatitude&wx_csrf_name=$_wx_csrf" > $cookiefl
+    grep -F 'repeat sign in' $cookiefl; and set signed_in true; and return
+    grep -F '":["OK",' $cookiefl; and set signed_in true; and eval $_audio_player autosignin-success.mp3; or eval $_audio_player signin.mp3
+end
+
 while true
-    test -f $tmpfl; and sleep 5
+    test -f $tmpfl; and sleep $_monitor_interval
     date
-    curl -L "$_url" 2>/dev/null > $tmpfl
+    curl -L "$_url" -v 2>$cookiefl > $tmpfl
     if grep '{"data":\[\],"msg":"unauthorized"}' $tmpfl
-        mpg123 badid.mp3
+        eval $_audio_player badid.mp3
         continue
     end
     if grep '签到中...' $tmpfl
-        echo 'got'
-        mpg123 signin.mp3
+        do_signin
         continue
     end
     if grep "<p class='success-tip'>暂无签到开启</p>" $tmpfl
-- 
GitLab