前言

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)
}
版权声明: 本博客所有文章除特别声明外,均采用署名-非商业性使用-相同方式共享 4.0 国际CC BY-NC-SA 4.0 )许可协议。转载请注明出处!
最后修改:2021 年 03 月 01 日 11 : 07 AM
如果觉得我的文章对你有用,请随意赞赏