前言
2021考研已经过去这么久了,眼看到了2月中旬,但是却迟迟没有成绩的消息。于是博主就写了这个小程序来定时查询一下成绩,如果查询到成绩就发送到邮箱。(PS:院校有时候会上传数据测试查询功能,说不定可以捡漏提前查到成绩哦~)
代码
废话不多说,直接上代码。程序采用Go语言编写,有两种发信方式,分别是阿里云的邮件推送服务和smtp的方式。大家可以根据需求自行选择,使用前填写相应参数即可。
package main
import (
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/dm"
"io/ioutil"
"net/http"
"net/smtp"
"strings"
"time"
)
var xm string
var zjhm string
var ksbh string
var bkdwdm string
func main() {
xm="张三" //姓名
zjhm="4111111111111111111" //身份证号
ksbh="104591111111111" //准考证号
bkdwdm="10459" //报考单位号码
var tt time.Duration =60
for{
htmlBody:=cxResult()
fmt.Println(htmlBody)
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
if !strings.Contains(htmlBody, "无查询结果") {
aliyunSendMail(htmlBody) //使用阿里云邮件推送发送邮件
//smtpSendMail(htmlBody) //使用smtp发送邮件
tt+=600
}
time.Sleep(time.Millisecond* 1000*tt)
}
}
//smtp服务发送邮件
func smtpSendMail( body string) error {
user:="xxxx@xx.com" //发信账号
password:="xxxxxxxxxx" //发信密码
host:="smtp.qq.com:587" //smtp服务器
to:="1111111@xx.com" //收信账号
mailtype:="html"
hp := strings.Split(host, ":")
auth := smtp.PlainAuth("", user, password, hp[0])
var content_type string
if mailtype == "html" {
content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"
} else {
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
}
msg := []byte("To: " + to + "\r\nFrom: " + user + ">\r\nSubject: " + "\r\n" + content_type + "\r\n\r\n" + body)
send_to := strings.Split(to, ";")
err := smtp.SendMail(host, auth, user, send_to, msg)
return err
}
//阿里云邮件推送发送邮件
func aliyunSendMail(html string) {
accessKeyId:="" //阿里云邮件推送accessKeyId
accessKeySecret:=""
accountName:="" //发信地址
toAddress:="" //收信地址
client, err := dm.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessKeySecret)
request := dm.CreateSingleSendMailRequest()
request.Scheme = "https"
request.AccountName = accountName
request.AddressType = requests.NewInteger(1)
request.ReplyToAddress = requests.NewBoolean(false)
request.ToAddress = toAddress
request.Subject = "初试成绩查询" //邮件标题
request.HtmlBody = html
response, err := client.SingleSendMail(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response)
}
func cxResult() string {
url := "https://yz.chsi.com.cn/apply/cjcx/cjcx.do"
method := "POST"
payload := strings.NewReader(`xm=`+xm+`&zjhm=`+zjhm+`&ksbh=`+ksbh+`&bkdwdm=`+bkdwdm+`&checkcode=`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return ""
}
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Cache-Control", "max-age=0")
req.Header.Add("sec-ch-ua", "\"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \";Not\\\\A\\\"Brand\";v=\"99\"")
req.Header.Add("sec-ch-ua-mobile", "?1")
req.Header.Add("Upgrade-Insecure-Requests", "1")
req.Header.Add("Origin", "https://yz.chsi.com.cn")
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Mobile Safari/537.36")
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
req.Header.Add("Sec-Fetch-Site", "same-origin")
req.Header.Add("Sec-Fetch-Mode", "navigate")
req.Header.Add("Sec-Fetch-User", "?1")
req.Header.Add("Sec-Fetch-Dest", "document")
req.Header.Add("Referer", "https://yz.chsi.com.cn/apply/cjcx/t/"+bkdwdm+".dhtml")
req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return ""
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return ""
}
return string(body)
}