使用GitHub的action将每日天气推送到微信和QQ
目录
- 什么是GitHub action
- action基本使用
- GitHub action 中的一些基本概念
- GitHub action执行定时任务脚本
- 拓展:关于action的定时设置
什么是GitHub action
官方定义:使用GitHub Actions在存储库中自动化,自定义和执行软件开发工作流程。您可以发现,创建和共享操作以执行所需的任何作业(包括CI / CD),并在完全定制的工作流程中组合操作。
官方帮助文档
action基本使用
进入自己的GitHub 公开仓库,点击ACTION按钮
选择自己来写工作流文件,不从GitHub已经提供的工作流模板中做选择。因为是第一次写,所以自己先写可以更直观的了解一些GitHub acton 的基本概念和要素,后面再根据自己的需求在对应的模板中做选择,这样可以提高写action的效率。
GitHub自动给我们生成了这个main.yml文件,里头已经填充上一个工作流所必须的基本要素了。
这个文件可以好好说明一下。首先是文件的位置,GitHub默认给我们创建的位置是基于项目下的.github/workflows/目录中,其实这是GitHub action执行工作流的指定路径,要想让GitHub识别并执行工作流的话,对应的工作流文件是必须要放在这个目录下的。
当然最终要的是这个文件的内容了,我将其拷贝出来并做一些精简,如下。
# name属性用来指定这个工作流的名字
name: HELLO GITHUB ACITON# 这个部分用来指定能够触发工作流执行的事件
on:# 当对分支main进行push操作的时候,这个工作流就被触发了push:branches: [ main ]# 工作流是由一个或多个的jobs构成的,在jobs里来说明要交给GitHub aciton执行的任务
jobs:# 这个jobs中的一个任务,名字叫build(随便怎么取)build:# 用来指定这个任务在什么操作系统上跑(服务器是GitHub免费提供的)runs-on: ubuntu-latest# 指出这个build任务的步骤steps:# 步骤,这里只写了一个步骤,目的是输出hello github acition- name: Run a one-line scriptrun: echo Hello, github action!
当我们push或者修改文件代码时,workflows会被运行
GitHub action 中的一些基本概念
刚才直观地通过一个例子来说明了一下GitHub action是怎么执行的,接下来把GitHub action的一些基本概念给汇总下,这里主要引用了阮一峰老师的文章。
GitHub Actions 有一些自己的术语。
(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
(2)job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
(3)step(步骤):每个 job 由多个 step 构成,一步步完成。
(4)action (动作):每个 step 可以依次执行一个或多个命令(action)。
GitHub Actions
的配置文件叫做workflow
文件,存放在代码仓库的.github/workflows
目录。
workflow
文件采用YAML
格式,文件名可以任意取,但是后缀名统一为.yml
,比如foo.yml
。一个库可以有多个workflow
文件。GitHub 只要发现.github/workflows
目录里面有.yml
文件,就会自动运行该文件。
我们要写的主要文件也就是workflow文件,其中可以配置的字段非常多,主要介绍下一些常用的字段,更多的可以查看官方文档。
还是直接给出一个完整的worflow文件,字段直接用注解备注了。
#字段1 name:用来指定workflow的名称,必备
name: Greeting from Mona
#字段2 on: 用来指定触发 workflow 的条件,通常是某些事件。
# 也可以是数组,如 on: [push, pull_request]
on: push
#字段3 jobs: workflow文件的主体是jobs字段,表示要执行的一项或多项任务
jobs:
#字段4: jobs.job_id: job_id是自定义的,比如这里写my_jobmy-job:# 字段5: jobs.job_id.name: 用来指定这个job的说明name: My Job# 字段6: jobs.job_id.runs-on: 用来指定这个job要在什么环境跑,也是必备的runs-on: ubuntu-latest# 字段7: jobs.job_id.steps: steps字段指定每个 Job 的运行步骤,可以包含一个或多个步骤。steps是一个数组,每个元素是一个stepsteps:# 字段8: name,具体的一个step的名字- name: Print a greeting# 字段9: env,具体的一个step会用到的环境变量env:MY_VAR: Hi there! My name isFIRST_NAME: MonaMIDDLE_NAME: TheLAST_NAME: Octocat#字段10: run,具体的一个步骤运行的命令或者 action。run: |echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
通过workflow示例文件也可以看出GitHub action中涉及到的基本概念的关系:在一个step中说明要做的事,比如执行指令或者使用他人的action, 一个job由多个step构成,jobs由多个job构成,而workflow的主体是jobs。workflow就是通过这样的层次组织来实现工作流的执行。
GitHub action执行定时任务脚本
使用使用GitHub action来推送天气到微信或QQ
现在,我们写一个爬虫脚本用来获取天气信息
github项目地址
参考教程
#!/usr/bin/python3
#coding=utf-8import requests, json# SCKEY=os.environ.get('SCKEY','') ##Server酱推送KEY
# SKey=os.environ.get('SKey','') #CoolPush酷推KEY
SCKEY='你的Server酱推送KEY' #通过 http://sc.ftqq.com/?c=code 获取
SKey='你的CoolPush酷推KEY' #通过 https://cp.xuthus.cc/ 获取
def get_iciba_everyday():icbapi = 'http://open.iciba.com/dsapi/'eed = requests.get(icbapi)bee = eed.json() #返回的数据english = bee['content']zh_CN = bee['note']str = '【奇怪的知识】\n' + english + '\n' + zh_CNreturn strdef ServerPush(info): #Server酱推送api = "https://sc.ftqq.com/{}.send".format(SCKEY)title = u"天气推送"content = info.replace('\n','\n\n')data = {"text": title,"desp": content}print(content)requests.post(api, data=data)
def CoolPush(info): #CoolPush酷推# cpurl = 'https://push.xuthus.cc/group/'+spkey #推送到QQ群# cpurl = 'https://push.xuthus.cc/send/' + SKey # 推送到个人QQapi='https://push.xuthus.cc/send/{}'.format(SKey)print(info)requests.post(api, info.encode('utf-8'))
def main():try:api = 'http://t.weather.itboy.net/api/weather/city/' #API地址,必须配合城市代码使用city_code = '101110105' #进入https://where.heweather.com/index.html查询你的城市代码tqurl = api + city_coderesponse = requests.get(tqurl)d = response.json() #将数据以json形式返回,这个d就是返回的json数据if(d['status'] == 200): #当返回状态码为200,输出天气状况parent = d["cityInfo"]["parent"] #省city = d["cityInfo"]["city"] #市update_time = d["time"] #更新时间date = d["data"]["forecast"][0]["ymd"] #日期week = d["data"]["forecast"][0]["week"] #星期weather_type = d["data"]["forecast"][0]["type"] # 天气wendu_high = d["data"]["forecast"][0]["high"] #最高温度wendu_low = d["data"]["forecast"][0]["low"] #最低温度shidu = d["data"]["shidu"] #湿度pm25 = str(d["data"]["pm25"]) #PM2.5pm10 = str(d["data"]["pm10"]) #PM10quality = d["data"]["quality"] #天气质量fx = d["data"]["forecast"][0]["fx"] #风向fl = d["data"]["forecast"][0]["fl"] #风力ganmao = d["data"]["ganmao"] #感冒指数tips = d["data"]["forecast"][0]["notice"] #温馨提示# 天气提示内容tdwt = "【今日份天气】\n城市: " + parent + city + \"\n日期: " + date + "\n星期: " + week + "\n天气: " + weather_type + "\n温度: " + wendu_high + " / "+ wendu_low + "\n湿度: " + \shidu + "\nPM25: " + pm25 + "\nPM10: " + pm10 + "\n空气质量: " + quality + \"\n风力风向: " + fx + fl + "\n感冒指数: " + ganmao + "\n温馨提示: " + tips + "\n更新时间: " + update_time + "\n✁-----------------------------------------\n" + get_iciba_everyday()# print(tdwt)# requests.post(cpurl,tdwt.encode('utf-8')) #把天气数据转换成UTF-8格式,不然要报错。ServerPush(tdwt)CoolPush(tdwt)except Exception:error = '【出现错误】\n 今日天气推送错误,请检查服务或网络状态!'print(error)print(Exception)if __name__ == '__main__':main()
我们需要编写的main.yml
文件
# name属性用来指定这个工作流的名字
name: GITHUB ACITON Weater# 这个部分用来指定能够触发工作流执行的事件
on:# 当对分支main进行push操作的时候,这个工作流就被触发了push:branches: [ main ]# 工作流是由一个或多个的jobs构成的,在jobs里来说明要交给GitHub aciton执行的任务
jobs:# 这个jobs中的一个任务,名字叫build(随便怎么取)build:# 用来指定这个任务在什么操作系统上跑(服务器是GitHub免费提供的)runs-on: ubuntu-lateststeps:# 首先copy git仓库到虚拟机上- name: Checkoutuses: actions/checkout@v2# 安装初始化python- name: 'Set up Python'uses: actions/setup-python@v1with:python-version: 3.8# 安装脚本所需的依赖- name: 'Install requests'run: pip install requests# 运行脚本- name: 'Working'env: #添加环境变量SCKEY: ${{ secrets.SCKEY }}SKEY: ${{ secrets.SKEY }}run: python ./weater.py
爬虫脚本文件weater.py
#!/usr/bin/python3
#coding=utf-8import requests, json
import osSCKEY=os.environ.get('SCKEY') ##Server酱推送KEY
SKey=os.environ.get('SKEY') #CoolPush酷推KEY
def get_iciba_everyday():icbapi = 'http://open.iciba.com/dsapi/'eed = requests.get(icbapi)bee = eed.json() #返回的数据english = bee['content']zh_CN = bee['note']str = '【奇怪的知识】\n' + english + '\n' + zh_CNreturn strdef ServerPush(info): #Server酱推送api = "https://sc.ftqq.com/{}.send".format(SCKEY)title = u"天气推送"content = info.replace('\n','\n\n')data = {"text": title,"desp": content}print(content)requests.post(api, data=data)
def CoolPush(info): #CoolPush酷推# cpurl = 'https://push.xuthus.cc/group/'+spkey #推送到QQ群# cpurl = 'https://push.xuthus.cc/send/' + SKey # 推送到个人QQapi='https://push.xuthus.cc/send/{}'.format(SKey)print(api)print(info)requests.post(api, info.encode('utf-8'))
def main():try:api = 'http://t.weather.itboy.net/api/weather/city/' #API地址,必须配合城市代码使用city_code = '101110105' #进入https://where.heweather.com/index.html查询你的城市代码tqurl = api + city_coderesponse = requests.get(tqurl)d = response.json() #将数据以json形式返回,这个d就是返回的json数据if(d['status'] == 200): #当返回状态码为200,输出天气状况parent = d["cityInfo"]["parent"] #省city = d["cityInfo"]["city"] #市update_time = d["time"] #更新时间date = d["data"]["forecast"][0]["ymd"] #日期week = d["data"]["forecast"][0]["week"] #星期weather_type = d["data"]["forecast"][0]["type"] # 天气wendu_high = d["data"]["forecast"][0]["high"] #最高温度wendu_low = d["data"]["forecast"][0]["low"] #最低温度shidu = d["data"]["shidu"] #湿度pm25 = str(d["data"]["pm25"]) #PM2.5pm10 = str(d["data"]["pm10"]) #PM10quality = d["data"]["quality"] #天气质量fx = d["data"]["forecast"][0]["fx"] #风向fl = d["data"]["forecast"][0]["fl"] #风力ganmao = d["data"]["ganmao"] #感冒指数tips = d["data"]["forecast"][0]["notice"] #温馨提示# 天气提示内容tdwt = "【今日份天气】\n城市: " + parent + city + \"\n日期: " + date + "\n星期: " + week + "\n天气: " + weather_type + "\n温度: " + wendu_high + " / "+ wendu_low + "\n湿度: " + \shidu + "\nPM25: " + pm25 + "\nPM10: " + pm10 + "\n空气质量: " + quality + \"\n风力风向: " + fx + fl + "\n感冒指数: " + ganmao + "\n温馨提示: " + tips + "\n更新时间: " + update_time + "\n✁-----------------------------------------\n" + get_iciba_everyday()# print(tdwt)# requests.post(cpurl,tdwt.encode('utf-8')) #把天气数据转换成UTF-8格式,不然要报错。ServerPush(tdwt)CoolPush(tdwt)except Exception:error = '【出现错误】\n 今日天气推送错误,请检查服务或网络状态!'print(error)print(Exception)if __name__ == '__main__':main()
如果你不想做那么多的步骤,像直接白嫖的的话,毕竟读书人的事,怎么能算嫖呢
使用GitHub的action将每日天气推送到微信和QQ相关推荐
- 【微信每日早安推送】每日天气推送
微信每日早安推送 效果和网络上其他代码都大差不差,不过当地习俗是按照阴历过生日的,所以距离下一个生日是和阴历生日对应的. 效果 代码里有计时任务,只需要让你的代码保持24小时运行,你的女神早上七点半便 ...
- DailyInfo——利用Python实现基于企业微信的每日图文推送
DailyInfo 基于企业微信的每日图文推送 项目地址 Gitee地址 Github地址 支持功能 Bing必应 每日壁纸 金山词霸 每日一句 ONE·一个 一图一句 和风天气 多地区天气预报 农历 ...
- 微信每日早安推送 Windows版
应诸多网友要求,这次上一个windows版的. 使用方法就是双击打开,立即就会推送一次.需要定时执行,可以使用windows的 任务计划程序 实现.帮大家百度好了 windows如何定时运行程序htt ...
- python爬虫教程:如何用40行Python代码实现天气预报和每日鸡汤推送功能
这篇文章主要介绍了通过40行Python代码实现天气预报和每日鸡汤推送功能,代码简单易懂,非常不错具有一定的参考借鉴价值 ,需要的朋友可以参考下 情人节刚过去几天,但是这和我们程序员有什么关系呢,对我 ...
- 【java】java天气消息推送至微信公众号详细教程
文章目录 读前必看 测试号推送 天气接口获取数据 谁说程序员不懂浪漫? 将你的关心 推送至微信公众号 给女朋友及时的关怀~(这位同学 你女朋友呢?) 读前必看 关于微信开发平台,小程序和公众号是不一样 ...
- android 定时推送提醒,使用workManager实现每日定时推送通知
写这篇博客的缘由来自一个需求: 每日定时推送通知,提醒用户完成签到.如果后台被清理,则在打开App后立即推送. 众所周知,如今的Android国产ROM想要实现定时操作需要做极强的保活.然而一旦做了保 ...
- 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
近期已经写了不少关于微信的消息了,本来想换个话题休息一下,谁知道微信不休息啊,又开始内测了.7月25日,部分iOS内测微信用户会收到系统对长时间未读订阅号的提醒,并可通过提醒入口选择不接收这部分订阅号 ...
- php 微信客服信息推送失败 微信重复推送客服消息 40001 45047
1 /*** 2 * 微信客服发送信息 3 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 4 * 递归提交到微信 直到提交成功 5 * @param $openid 6 * ...
- 实战技巧:Python爬取OEM 12C上的告警信息并推送至微信企业号
关注我们获得更多精彩 作者 | 徐美兰 ,邮政软件开发工程师,广东.湖南邮政金融数据中心任职多年,擅长Oracle数据库性能诊断与调优,对基于Python的数据分析与挖掘开发具有浓厚兴趣. 编者说明: ...
最新文章
- 在SunOS5.8/solaris7上使用Xerces-C解析器
- Linux的tree
- ant 实现批量打包android应用
- tensorflow--模型的保存和提取
- 【TensorFlow】通过两个简单的例子实现反向传播
- 魔改和上线你的合成大西瓜,最全教程!
- tail 显示文件最后若干行内容
- Android之本地摄像头,Android之调用本地摄像头
- Struts中提示Invalid result location value/parameter
- C语言练手题(52个小练习)
- USB Server应用于RPA机器人案例分析
- iOS远程真机之usbmuxd中iproxy的作用
- svg 右键意见删除cvs_一种实现svg自定义鼠标右键菜单的方法
- 配置与管理Ubuntu 21.10
- 【c语言】复习无止境,day4--堆内存宏函数篇
- “众里寻她千百度”情人节
- Servlet3 过滤器 Filer
- SSM框架配置文件整理
- H3C服务器BIOS界面,全新改版图形化界面
- Spring框架核心思想
热门文章
- CQUPT Java平时作业02
- opencv实现车辆跟踪
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- 什么是BIOS?如何进入BIOS,恢复BIOS原始设置的快捷方法
- java bpm 开源_几种Java开源工作流引擎的简单比较
- 可能你也怀疑,5G时代下,学web前端培训会有什么影响?
- Nginx代理-端口转发
- mkv怎么转mp4,mkv转mp4方法
- 浙江省计算机二级题库excel,2014年浙江省计算机二级题库Excel03
- android zxing生成条形码,使用ZXing创建android条形码扫描应用程序