高考分数查询结果自动推送至微信

news2024/11/15 17:50:45

又是一年高考时,祝各位学子金榜题名,天遂人愿!

        在您阅读以下内容时,请注意:各省查分API接口可能不相同,本人仅就技术层面谈谈, 纯属无聊,因为实用意义不大,毕竟一年一次,查询接口可能每年都变!!!

        在每年高考成绩公布前夜,人们通常会守候在电脑前查询成绩。但实际上,若了解了查询接口,就能利用爬虫自动获取成绩,并通过微信推送接口(Server酱),将信息直接发送至微信。

要定时查询一个学生的高考分数并将结果推送到微信上,可以按照以下步骤进行:

步骤一:导入所需的库

首先,我们导入需要使用的 Python 库,包括 requests、schedule 和 time。

 import requests
 import schedule
 import time

步骤二:定义 ping_website 函数

编写一个函数 ping_website(url) 来检查网站状态码是否为 200。如果状态码不是 200,则等待10秒后重新尝试。

 def ping_website(url):
     response = requests.head(url)
     return response.status_code

步骤三:定义 crawl_data_and_send_to_wechat 函数

创建一个函数 crawl_data_and_send_to_wechat(),在其中执行数据爬取并调用 Server酱接口将数据推送到微信。 

def crawl_data_and_send_to_wechat():
     website_url = "查询分数的API接口"
     
     while ping_website(website_url) != 200:
         print("查询接口还没有开放. 等待10秒钟后再试...")
         time.sleep(10)
     
     # 数据爬取逻辑
     print("爬取分数...")
     
     # 模拟爬取的数据
     crawled_data = "结果示例"
     
     # 使用Server酱推送消息至微信
     server_chan_url = "https://sc.ftqq.com/YOUR_SERVER_CHAN_KEY.send"
     requests.get(server_chan_url, params={"text": "Crawled Data", "desp": crawled_data})
     print("数据已通过Server酱发送到微信上!!!")

步骤四:定义 job 函数

创建一个 job() 函数,在其中调用 crawl_data_and_send_to_wechat() 函数。

 def job():
     crawl_data_and_send_to_wechat()

步骤五:设置定时任务

使用 schedule 库来设置每分钟执行一次的任务,并在主循环中运行定时任务。 

# 设置每分钟执行一次任务
 schedule.every().minute.do(job)
 ​
 while True:
     schedule.run_pending()
     time.sleep(1)

以下是某省2023年高考成绩查询的接口演示

67c778cb27b04cc0b4088cdf2e1dc112.png

某省2023年高考查分界面

0be320b3746a43689eda95a617af25d0.png最后结果界面

查询响应是一个table, 以下敏感信息已用x替代。

<div class="gkcj-tit">2023年xxxxx省普通高等学校招生考试成绩查询结果</div>
<div class="base-info b1">
    <table class="base-t">
        <tr>
            <td class="base-td">姓名:</td>
            <td style="width: 168px;">xxxxxx</td>
            <td class="base-td">身份证号:</td>
            <td>xxxxxxxxxxxxxxxxxxxxxxxx</td>
        </tr>
        <tr>
            <td class="base-td">高考准考证号:</td>
            <td>xxxxxxxxxx</td>
            <td class="base-td">高考报名号:</td>
            <td>xxxxxxxxxx</td>
        </tr>
    </table>
</div>
<div class="score-info">
    <table class="score-t">
        <tr>
            <td>科目名称</td>
            <td>科目成绩</td>
        </tr>
        <tr>
            <td>语文</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>数学</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>英语</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>历史</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>地理</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>生物学</td>
            <td>xxx</td>
        </tr>
        <tr>
            <td>总分</td>
            <td class="score-tcolor">xxx</td>
        </tr>
    </table>
</div>
<div class="fh">
    <a onclick="back();" href="javascript:void(0);" class="gkcj-btn">返回继续查询</a>
</div>

以下程序仅给出了数据查询的程序,读者可以根据前面的步骤,将数据查询作为一个job, 将能查询到的结果推送到微信上。

在以下程序中主要注意以下几个问题:

1、创建同一个会话

2、验证码识别

这里对于验证码识别没有做异常处理,有时验证码识别可能错误,需重新访问网页获取。

import ddddocr
import requests
from bs4 import BeautifulSoup

# 创建一个会话对象
# 要在一个会话中获取网页的源码提取__RequestVerificationToken的值,
# 同时通过接口http://查询成绩服务器IP/Validate/GetValidateCode?获取验证码

session = requests.Session()

# 请求网页获取源码
url = "http://查询成绩服务器IP/gk/gkcj2023?token=98c1234e8d5678bb"
response = session.get(url)
html_content = response.text

# 使用BeautifulSoup解析网页源代码
soup = BeautifulSoup(html_content, 'html.parser')
# 从网页源代码中提取到__RequestVerificationToken的值
input_tag = soup.find('input', {'name': '__RequestVerificationToken'})
verification_token = input_tag['value']
print(verification_token)

# 从网页源代码中提取验证码图片URL
validate_code_url = "http://查询成绩服务器IP/Validate/GetValidateCode?"

for img in soup.find_all('img'):
    if "ValidateCode" in img['src']:
        validate_code_url += img['src']
        break

# 获取验证码图片
response = session.get(validate_code_url, stream=True)
if response.status_code == 200:
    with open('captcha_image.png', 'wb') as out_file:
        for chunk in response.iter_content(chunk_size=128):
            out_file.write(chunk)

# 打印验证码图片保存成功消息
print("验证码图片已保存为 captcha_image.png 文件")


# 识别验证码
def imgRecognition(img):
    try:
        ocr = ddddocr.DdddOcr()
        with open(img, 'rb') as f:
            img_bytes = f.read()
        res = ocr.classification(img_bytes)
        return res
    except:
        return None


randCode = imgRecognition('captcha_image.png')


headers = {
    "Accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Cache-Control": "no-cache",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "DNT": "1",
    "Origin": "http://查询成绩服务器IP",
    "Pragma": "no-cache",
    "Proxy-Connection": "keep-alive",
    "Referer": "http://查询成绩服务器IP/gk/gkcj2023?token=98c1234e8d5678bb",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
cookies = {
    "__RequestVerificationToken_Lw__": "lcVcsxDb0RiSVf1wSZeQxzeD9WZ7+y4lBW7+5DkJmLDpT5hiTaxPXlpokbYfDTcEL3ujpDdB9qEezLBdnNZy/C8dYe9o9pJLTUqWeOnAmVWio0bRwhEkNK/jKbQLSE3T2t4rfg==",
    "ValidateCode": randCode
}
url = "http://查询成绩服务器IP/gk/gkcj2023"  # 成绩查询接口
data = {
    "zkzh": "xxxxxxxxx",  # 准考证号
    "ksbh": "",  # 报名号
    "zjhm": "xxxxxxxxx",  # 身份证
    "yzm": randCode,  # 验证码
    "__RequestVerificationToken": verification_token  # 从网页中获取的值
}
response = session.post(url, headers=headers, cookies=cookies, data=data, verify=False)

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')

# 提取表格数据
table_data = []
for table in soup.find_all('table'):
    for row in table.find_all('tr'):
        cols = row.find_all(['td'])
        cols = [ele.text.strip() for ele in cols]
        table_data.append(cols)

# 保存提取的表格数据到.txt文件
with open("高考成绩.txt", "w") as file:
    for row in table_data:
        file.write('\t'.join(row) + '\n')

print("表格数据已保存为 高考成绩.txt 文件")

最后查询结果:

b83930f2d7e2497abdc7b0889ed08d9d.png各高考查分接口,为保障查询速度,一般仅采取了简单的反爬措施,所以获取结果不是很困难!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1800595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】XGBoost: 强化学习与梯度提升的杰作

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 XGBoost: 强化学习与梯度提升的杰作引言1. XGBoost概览1.1 什么是XGBoost&#…

27 ssh+scp+nfs+yum进阶

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是…

【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射

&#x1f4ad; 写在前面&#xff1a;上一章中&#xff0c;我们详细讲解了列表的合并&#xff0c;本章我们来详细讲解一下列表的过滤&#xff0c;在 F# 中&#xff0c;过滤列表是指从列表中提取满足某个条件的元素&#xff0c;形成一个新的列表。这个操作通常使用 List.filter 函…

第R3周:天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 我的环境 语言环境&#xff1a;python3.8.18编译器&#xff1a;jupyter not…

用HTML实现拓扑面,动态4D圆环面,可手动调节,富有创新性的案例。(有源代码)

文章目录 前言一、示例二、目录结构三、index.html&#xff08;主页面&#xff09;四、main.js五、Tour4D.js六、swissgl.js七、dat.gui.min.js八、style.css 前言 如果你觉得对代码进行复制粘贴很麻烦的话&#xff0c;你可以直接将资源下载到本地。无需部署&#xff0c;直接可…

如何利用Varjo混合现实技术改变飞机维修训练方式

自2017年以来&#xff0c;总部位于休斯顿的HTX实验室一直在推进混合现实技术&#xff0c;与美国空军密切合作&#xff0c;通过其EMPACT平台提供可扩展的沉浸式飞机维护虚拟现实培训。 虚拟和混合现实对维修训练的好处&#xff1a; l 实践技能&#xff1a;提供一个非常接近真实场…

独享IP VS 原生IP,二者的区别与定义详解

原生IP&#xff1a;原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中&…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

Ghost Mirror

Ghost Mirror 操作系统镜像 windows servers linux Windows XP 老古董&#xff0c;唉 安装完重启一下 设置下BIOS 1小时内弄完3台。。。

【MMU】——页表映射示例

文章目录 页表映射示例一级页表二级页表二级页表的优势页表映射示例 一级页表 上图一级页表中假设以 4KB 物理页为映射单位,一个进程 4GB 的虚拟地址空间需要:4GB/4KB = 1MB 个页表项,每个页表项目占用 4 个字节所以每个一级页表需要 4MB 的存储空间,每个进程需要 4MB 的内…

ARM32开发--GPIO--LED驱动开发

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求介绍 现实问题 需求分析 测试案例构建 BSP驱动构建 接口定义 业务实现 总结 前言 前言&#xff1a; 在这个快节奏的开发环境中&#xff0c;面对紧迫的项目截止日期和有限的资源&#xff0c;我们作为软…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

MPU6050篇——姿态解算,卡尔曼滤波

一、DMP文件的修改&#xff1a; 首先我们打开inv_mpu.c文件夹&#xff0c;如下图所示便是第一个要修改的地方&#xff1a; 我们将其修改为&#xff1a;define定义可以改为自己使用的型号的单片机。 修改后在上面定义这个宏&#xff0c;并加上一个MPU6050的宏&#xff0c;用于源…

算法005:有效三角形的个数

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/valid-triangle-number/ 要组成三角形的三条边&#xff0c;需要保证&am…

【MATLAB源码-第224期】基于matlab的快跳频系统仿真采用4FSK,模拟了单音干扰,宽带干扰以及部分频带干扰,输出误码率曲线以及各节点图像。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 跳频通信系统概述 跳频通信系统是一种通过快速切换载波频率来进行信息传输的无线通信技术。它在军事和商业通信中广泛应用&#xff0c;具有较强的抗干扰和抗截获能力。系统设计主要包括信号调制、跳频序列生成、信道模拟以及…

BC6 小飞机

BC6 小飞机 废话不多说先上题目&#xff1a; 代码如下&#xff1a; #include<stdio.h> int main() {printf(" ## \n############\n############\n # # \n # # \n");return 0; }这是用一个printf打印我们还可以用多个printf发打印代码如下…

俄罗斯服务器租用攻略:选择优质服务器,开启海外市场新征程

随着国际贸易的不断发展&#xff0c;俄罗斯作为一个重要的贸易伙伴备受关注。许多企业和公司为了开拓海外市场&#xff0c;选择将业务拓展到俄罗斯&#xff0c;而在这个过程中&#xff0c;租用一台优质的服务器成为了必须面对的问题。俄罗斯作为一个经济发展迅速的国家&#xf…

JavaEE初阶---多线程编程(一.线程与进程)

目录 &#x1f923;一.线程与进程的概念与联系&#xff1a; 进程的基本概念&#xff1a; 线程的基本概念&#xff1a; 进程和线程的区别与联系&#xff1a; &#x1f643;代码执行实列&#xff1a; 1.通过继承Thread父类来实现多线程 2.通过实现Runnable接口来实现多线程…

JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!

&#x1f4c3;HTTP请求 ▐ http超文本传输协议&#xff1a; ⦁ http超文本传输协议属于应用层协议&#xff0c;传输内容必须是超文本内容 (网页内容) ⦁ 例如在网页上点击超链接&#xff0c;提交表单&#xff0c;都可以向后端发送一个http请求 ⦁ 一次http请求中包含请求行、…

《深入浅出C语言:从基础到指针的全面指南》

1. 简介 C语言是一种通用的编程语言&#xff0c;广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发&#xff0c;并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称&#xff0c;是许多现代编程语言的基础。 2. 基本语法 2.1 Hello, …