多设备同步课程表,适用于iOS与Android

2023-05-16

声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接

关键词:iCloud日历同步,RFC 2445,iCalendar,Outlook,GMail

文章目录

    • 摘要 🔑
      • 知识准备
    • 前提 🚩
    • 想法💡
    • 可行性验证 ⚖️
    • 想法实现 🔨
        • 爬虫编写
        • ics文件生成
        • 生成ics日历订阅
        • 爬虫定期爬取数据
    • 最终效果示例 📽
    • 分析与结论 📝
        • 帮助链接

摘要 🔑

知识准备

  • RFC 2445标准:1998由微软公司发布的标准的互联网日历标准,让用户能够在各种计算机和各种程序之间创建和共享电子日历。
  • iCloud同步:在多台支持iCloud的Apple设备中,只需在任意一个设备中进行某项设置或工作内容,其他设备均可同步得到此项设置或工作内容。
  • ics文件:后缀为ics的文件,是RFC 2445标准下的日历文件,使用此文件可以直接向日历中添加日程时间表。
  • 订阅:在不打开某项链接的前提下,自动获取此链接的最新内容。

前提 🚩

​ 本文均以iOS为例说明,目前,所有流行日历工具比如:Lotus Notes、Outlook、GMail 和 Apple 的 iCal 都支持RFC 2445标准,故Android也适用。

​ 在过去的两年,博主在每学期初一直坚持将自己的课程表手动输入到自己的iCloud日历中,通过iCloud提供的多设备同步,可以做到MacBook、iPad、iPhone、Apple Watch都有课程表信息,利用iOS提供的小组件以及Apple Watch的先天便捷性,可以非常方便地了解到自己当天及本周甚至本学期的所有课程名称,时间,上课地点及任课教师。

​ 但是上述做法有如下已知缺点:

  • 课程不会自动更新:每逢节假日调休,需手动调整课程表
  • 课表错误率高:手动输入极大可能会导致人工错误,检查过程繁琐
  • 每个学期均需手动录入一次课程信息:过程繁琐

​ 于是,在上学期期末复习时突发奇想,有了如下想法。

想法💡

使用爬虫获取课程表信息,生成ics文件,产生此ics文件订阅,使用MacBook订阅日历地址。爬虫定期爬取课程表,更新ics文件。

可行性验证 ⚖️

  • 爬虫可用性:此项因学校而异,需要自己去尝试。本人尝试成功,不再赘述。
  • ics文件生成:博主用MacBook导出了自己已有的日历日程后用文本编辑打开了此ics文件,结合RFC 2445标准与网上现有博客得知,可行。
  • 生成ics订阅:博主在网络上查了一下,未查到ics订阅生成方法。于是自己随便找了一个已有的订阅地址,发现地址路径末尾为ics文件名,猜测是ics文件下载地址,将此地址放入浏览器中,回车直接下载到了此ics日历文件,得知可行。
  • 爬虫定期爬取:学校教务处不更新,就一直能行。

如果读者想要实现如上步骤,另需满足如下前置要求:

  • 一台拥有固定IP的服务器
  • Python的基本阅读调试技能

想法验证可行,开始实现想法。

想法实现 🔨

爬虫编写

注:此过程因学校而异,本人就不放出此爬虫的Python代码,只给出用于后续步骤的数据样本使步骤连贯。

数据样本下载

ics文件生成

经过观察学习,ics文件的格式模版如下所示:

# -*- coding: UTF-8 -*- 
BEGIN:VCALENDAR
# 下面是一个日程
BEGIN:VEVENT
CREATED:20191203T142408Z
UID:20200831T10250020200831T12000024231812
DTEND;TZID=Asia/Shanghai:20200831T120000 #日程结束时间
TRANSP:OPAQUE
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
SUMMARY:标题
LAST-MODIFIED:20191227T060829Z
DTSTAMP:20191203T142417Z
DTSTART;TZID=Asia/Shanghai:20200831T102500 #日程开始时间
LOCATION:地点
DESCRIPTION:备注
SEQUENCE:0
END:VEVENT
# 上面是一个日程
# 顺序排列多个日程
END:VCALENDAR

上述中文内容已经把一个日程在存在形式描述清楚,未描述的可以先不理会,不影响最终的使用效果。

编写Python代码:

import random

# 创建日历文件
def createCalender(filename, data):
    file = open(filename + ".ics", "a")
    file.write("# -*- coding: UTF-8 -*- \nBEGIN:VCALENDAR\n")
    file.close()
    for w in data:
        data1 = w['classes']
        for d in data1['classes']:
            for c in d.values():
                for course in c:
                    createCourse(course, filename + ".ics", data1['weekdays'])
    file = open(filename + ".ics", "a")
    file.write("END:VCALENDAR")
    file.close()
# 为每个课程创建对应的日历信息
def createCourse(course, file_name, weekdays):
    courseDay = weekdays[course['weekday'] - 1].replace('-', '') + 'T'
    courseTime = course['course_time'].split('~')
    startTime = courseDay + courseTime[0].replace(':', '') + '00'
    endTime = courseDay + courseTime[1].replace(':', '') + '00'
    uid = startTime + endTime + str(course['credit']) + str(random.randint(0, 9999999))
    coursename = course['course_name']
    location = course['location'] + ' ' + course['teacher']
    description = '课程号:' + course['course_id'] + '\\n' + '学分:' + str(course['credit'])
    file = open(file_name, "a")
    file.write("BEGIN:VEVENT\nCREATED:20191203T142408Z\n")
    file.write('UID:{}\n'.format(uid))
    file.write("DTEND;TZID=Asia/Shanghai:{}\n".format(endTime))
    file.write("TRANSP:OPAQUE\nX-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC\n")
    file.write("SUMMARY:{}\n".format(coursename))
    file.write("LAST-MODIFIED:20191227T060829Z\nDTSTAMP:20191203T142417Z\n")
    file.write("DTSTART;TZID=Asia/Shanghai:{}\n".format(startTime))
    file.write("LOCATION:{}\n".format(location))
    file.write("DESCRIPTION:{}\n".format(description))
    file.write("SEQUENCE:0\nEND:VEVENT\n")
    file.close()
if __name__ == '__main__':
		createCalender("course.ics", data) #data使用上面的数据样本,使用eval()转换为dict

运行此代码,可以得到course.ics文件。

生成ics日历订阅

由上文分析,生成ics日历订阅也就等价于生成ics文件的下载链接,博主使用的是Nginx,所以方法如下。其他http服务器如tomcat自行百度相关方法。

  • 找到nginx的index.html所在目录,在此目录下的一切文件及递归文件均可直接下载。

假设nginx的index.html路径为/home/nginx/html/index.html

在日常访问域名https://xxx.com时,浏览器下载得到index.html并打开,就是我们看到的网页。

所以如果访问https://xxx.com/ics/xxx.ics,浏览器就会下载/home/nginx/html/ics/xxx.ics得到xxx.ics,如果没有找到,那就是404 Not Found。

  • 将ics文件放置在nginx的index.html所在目录下或其子文件夹下即可。
  • 订阅地址就自然是https://xxx.com/ics/xxx.ics了。

爬虫定期爬取数据

在CentOS下,编辑/etc/crontab增加相应定时任务即可。

最终效果示例 📽

在这里插入图片描述

分析与结论 📝

  • 解决了上述提出的缺点
  • 若教务处网站不进行防爬虫更新,理论上可一直使用
  • 简化了生活流程,使其更加条理化

帮助链接

使用 iCloud 日历订阅 --Apple 支持

通过 iCloud 将“日历”保持为最新状态 --Apple 支持

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多设备同步课程表,适用于iOS与Android 的相关文章

  • 【24考研数学找研友】

    24数学考研 听说今年数学考研好难呀 xff0c 有没有同学一起考研一起复习的 大家一起看图交流一下
  • 【24北京交通大学901软件工程考研】

    有没有考北京交通大学901软工的同学 xff0c 一起组个队呀 xff0c 相互监督 xff5e 每日打卡学习
  • 【2024海南大学835软件工程考研笔记】

  • python中的装饰器(基础装饰器)

    文章目录 一 前置知识 高阶函数 xff0c 闭包1 高阶函数2 闭包 二 函数装饰器1 什么是装饰器 xff08 原理 xff09 xff1f 2 装饰器的实现3 何时执行装饰器4 wraps方法 三 类装饰器 一 前置知识 高阶函数 x
  • python中的装饰器二(带参数的装饰器)

    文章目录 前言 一 被装饰函数带参数二 被装饰函数有返回值三 装饰器带参数四 多个装饰器 前言 看大佬们写的代码看的我是眼花缭乱 xff0c 不知所云啊 真是感叹 xff0c 自己还看都看不懂 xff0c 人家就能写出来了 xff0c 人与
  • STlink、Jlink驱动一直安装失败的解决办法

    STlink Jlink驱动一直安装失败的解决办法 STlink驱动安装失败问题详情 Jlink驱动安装的问题也类似 xff0c 总是有一项安装失败 xff01 xff01 xff01 在经过各种尝试完毕之后 xff0c 怀疑是系统的问题
  • 数据可视化--实验四:地理数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果 概要 学院 xff1a 计算机科学与技术学院实验日期 xff1a 2020 10
  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)

    51单片机课设 智能小车 一 课设任务二 硬件设计及相关传感器模块1 车模2 51单片机3 红外循迹模块4 电机及驱动5 蓝牙模块6 硬件搭建 三 程序代码1 main c文件2 motor c文件 四 我的大学 造车 史 注 xff1a
  • 课设-基于51单片机+超声波模块的避障小车(源码+原理图+Protel仿真)

    基于51单片机 43 超声波模块的避障小车 xff08 源码 43 原理图 43 Protel仿真 xff09 一 功能二 模块2 1 电机驱动模块2 2 超声波模块 三 程序代码四 PCB原理图 一 功能 设计一辆利用超声波传感器来实现避
  • 路径规划(一):使用Matlab快速绘制栅格地图

    目录 一 Matlab快速绘制栅格地图1 几种常用的地图形式 xff1a 1 1 尺度地图 xff1a 1 2 拓扑地图 xff1a 1 3 语义地图 xff1a 2 栅格地图用于路径规划的优势 xff1a 3 matlab绘制栅格地图的核
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 毕设--基于51单片机的温度报警器设计

    目录 1 简介2 设计要求与方案论证2 1 设计要求2 2 系统基本方案选择和论证2 2 1 单片机芯片的选择方案和论证2 2 2 温度传感器设计方案论证 2 3 电路设计最终方案决定 3 硬件设计介绍3 1 STC89C51介绍3 1 1
  • 基于51单片机的篮球比赛计时器

    目录 基于51单片机的篮球比赛计时器1 PCB原理图2 仿真图3 毕设要求 xff1a 4 总体方案设计5 程序源码6 资源下载 基于51单片机的篮球比赛计时器 注 xff1a 本毕设资源可在微信公众号 xff1a Kevin的学习站 中获
  • 毕设--基于51单片机数字电压表的设计

    目录 基于51单片机数字电压表的设计1 PCB原理图2 Proteus 仿真图3 设计目标3 1 基本功能3 2 主要技术参数 4 总设计框图5 硬件设计分析5 1 电源的设计5 2 单片机最小系统5 3 模数转换 6 软件设计的组成7 元
  • 基于51单片机的智能温控风扇(程序+仿真+原理图)

    目录 基于51单片机的智能温控风扇1 主要功能2 实验结果3 仿真工程4 原理图5 程序源码6 资源获取 基于51单片机的智能温控风扇 1 主要功能 基于51单片机的智能温控风扇 xff0c 通过DS180温度传感器采集温度 xff0c 并
  • 基于51单片机的八路竞赛抢答器设计

    目录 基于51单片机的八路抢答器设计1 主要功能2 仿真图3 测试图4 程序源码5 资源获取 基于51单片机的八路抢答器设计 1 主要功能 利用STC89C52单片机及外围接口实现的抢答系统 xff1b 在抢答过程中 xff0c 只有启动抢
  • 赛灵思-Zynq UltraScale+ MPSoC学习笔记汇总

    Zynq UltraScale 43 MPSoC学习目录 xff1a 1 赛灵思 Zynq UltraScale 43 MPSoCs xff1a 产品简介 2 赛灵思 Zynq UltraScale 43 MPSoC学习笔记 xff1a P
  • 数据可视化--实验五:高维非空间数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果平行坐标系room1 6房间人员时长饼图 概要 学院 xff1a 计算机科学与技术
  • 7、AUTOSAR MCAL入门-实战:I/O驱动组

    7 AUTOSAR MCAL入门 实战 xff1a I O驱动组 在第三节中有介绍AUTOSAR 把MCAL 抽象分为4个驱动组 xff0c 分别为 xff1a 微控制器驱动组 xff0c 存储器驱动组 xff0c 通信驱动组 输入 输出驱
  • FreeRTOS学习笔记:FreeRTOS启动方式及流程

    FreeRTOS启动方式及流程 FreeRTOS有两种比较流行的启动方式 1 方式一 xff1a 在main函数中创建所有任务 具体说明 xff1a 在main函数中将硬件初始化 RTOS系统初始化 xff0c 创建所有的任务 xff0c

随机推荐

  • 树莓派4B与Android之缘——树莓派下LineageOS(Android 9)系统开机联网与远程控制

    一 树莓派连接屏幕 1 找到树莓派的micro hdmi口 xff0c 是视频图像的输出口 xff0c 见下图中的MICRO HDMI PORTS 2 连接屏幕 xff08 1 xff09 如果显示屏输入端口是HDMI xff0c 就用mi
  • Deep SDF 、NeuS学习

    DeepSDF Learning Continuous Signed Distance Functions for Shape Representation xff1a 学习用于形状表示的连续有符号距离函数 NeuS Learning Ne
  • layui 引入方式

    layui xff08 谐音 xff1a 类UI 是一款采用自身模块规范编写的前端 UI 框架 xff0c 遵循原生 HTML CSS JS 的书写与组织形式 xff0c 门槛极低 xff0c 拿来即用 其外在极简 xff0c 却又不失饱满
  • ubuntu20.04安装ROS及常见问题

    ubuntu20 04安装ROS及常见问题 一 ubuntu安装参考 xff08 双系统 xff09 1 ios镜像官网下载地址 xff1a https releases ubuntu com ga 61 2 239339907 18418
  • 在jetson xavier nx上配置orbslam3,带稠密重建

    这里写自定义目录标题 主要记录一下踩过的各种坑 xff0c 包括从配置开发板系统到配置orbslam3一条龙服务 xff0c 带cuda加速的opencv3 4 5开发板刷系统将系统移植到M 2硬盘上Sdkmanager安装cuda cud
  • ROS入门教程(五)—— RViz仿真

    上篇文章我们介绍了URDF文件的导出 xff0c 本文将继上文介绍安装完导出URDF文件后 xff0c 如何在机器人操作系统 ROS 中显示 xff0c 并且让它动起来 目录 前言 RViz机器人模型可视化 launch启动RViz配置文件
  • js几种继承

    提示 xff1a 主要是原型链继承 构造函数继承 原型链加构造函数继承 寄生组合式继承 一 原型链继承 子类想要继承父类的属性和方法 xff0c 可以将其原型对象指向父类的实例 xff0c 根据原型链就可以使用到父类的方法和属性 父类 fu
  • C++ 学习(基础语法篇)

    一 基础语法 1 1 C 43 43 简介 C 43 43 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 xff0c 支持过程化编程 面向对象编程和泛型编程 C 43 43 是 C 的一个超集 xff0c 事实上 xf
  • 数据可视化--实验六:层次和网络可视化、文本可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果邮件往来网络图职位树图邮件主题词云图 实验结论 概要 学院 xff1a 计算机科学
  • ssh连接windows10拒绝连接

    第一步 xff1a ssh使用的22端口 xff0c 首先确认windows10的22端口是否开启 开启步骤 1 控制面板 gt Windws Defender 防火墙 gt 高级设置 gt 入站规则 gt 新建规则 2 选择端口 gt 下
  • Jetson TX1 学习1 GPIO

    学习过程中为了防止遗忘 以此文字记录 如有错误 多多包涵 怕什么真理无穷 进一寸有一寸的欢喜 胡适 前置内容 xff1a Jetson GPIO 库 学习目标 xff1a 简单控制 Jetson TX1 官方载板 GPIO 引脚 学习内容
  • It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType

    在使用MyBatis Plus的时候 xff0c 他会将实体类以及表字段自动关联起来 xff0c 但是当我们想要指定额外的一对多关系的时候 xff0c 例如 xff1a 订单保存的时候同时需要保存订单详情列表 xff0c 此时订单与订单详情
  • WSL安装xfce4图像界面,并通过windows远程桌面登陆

    一 下载xorg xorg为X11的一个实现 xff0c xfce4需要 sudo apt install xrog 二 下载xfce4 sudo apt install xfce4 三 下载xrdp xrdp为远程连接软件 xff0c 默
  • linux 线程池 (C语言实现)

    线程池分为三个部分 xff1a 任务队列工作线程 xff0c N个 xff08 任务队列的消费者 xff09 管理者线程 xff0c 1个 主要实现的函数 xff1a 创建线程池线程池添加任务销毁线程池任务函数 xff08 做什么 xff0
  • javascript之异步操作理解---回调函数,async,await以及promise对象

    javascript之异步操作理解 回调函数 xff0c async xff0c await以及promise对象 概述 概述 写在前面 xff1a 虽然平时做项目 xff0c 但是发现自己写的代码还是很烂 最近接触了一个对性能要求比较高的
  • Linux Ubuntu 查看文件大小 查看磁盘大小

    文章目录 1 查看某个文件的信息 xff08 其中大小以字节B为单位 xff09 2 查看文件夹的大小3 查看磁盘分区的大小参考 xff1a 1 查看某个文件的信息 xff08 其中大小以字节B为单位 xff09 span class to
  • 虚拟化管理服务器(手动安装虚拟机,利用脚本命令安装虚拟机,虚拟机的管理,复制,快照)

    实验环境 xff1a 真机的shell 手动安装虚拟机 xff1a 前提 xff1a 镜像文件已经下载好 xff0c 并要知道其所存放的路径 步骤一 xff1a 在真机的shell 中输入virt manager 进入虚拟化管理 步骤二 x
  • java面试题(仅供参考)

    java面试题 仅供参考 框架阶段 概念宝典 1 自我介绍 P2P网贷项目 4 第三个月 基础框架篇 8 一 基础概念篇 8 1 Get和Post的区别 xff1f 8 2 List Set Collection Collections的区
  • 解决javaweb网站因重定向次数过多无法访问的方法

    解决方法 xff1a 1 Chrome浏览器打开 chrome flags 2 搜索SameSite 3 将SameSite by default cookies 设置为 disabled 4 重启Chrome浏览器
  • 多设备同步课程表,适用于iOS与Android

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 关键词 xff1a iCloud日历同步 xff0c RFC 2445 xff0c iCalendar xff0c Outlook