【github action+python】完成定时任务并推送(学会自制)


前言

参考图文解释Glados自动签到免费获取天数(github action版)
之前用了一阵sever酱,然后前两天说cookie过期了,后来改了也没用,于是想自己写一份cookie不过期的。我尝试了半天,一直报一个json格式的错。(在电脑是可行的,在action上就报错)最后原博客回答:我看了下目前用github action的方式会触发cloudflare的五秒盾,阻止了脚本的签到行为。估计github上用这种方式打卡的人太多了就把这个ip给封了可能。就简单记一下学习过程。(不过其他的行为都是可以的)

一、效果图

在这里插入图片描述
最后想起来自己还租了个服务器,最后就在服务器上下了个pycharm(当然只下个解释器就行了),开着一直跑程序就行了。一天两次,懒得动脑筋,就time.sleep了。
在这里插入图片描述

二、自制流程

1.钉钉机器人推送

具体看
官方文档
主要依靠 在钉钉上拉一个群(三人及以上),不过三人群之后可以踢掉一个成为两人群,里面有个智能群助手上加入一个自定义机器人。
在这里插入图片描述
注意这个加签,我是勾上加签,关键词和ip地址没加,然后会给你一个webhook网址,对这个网址进行post请求即可完成推送。
下面代码的secret 和 webhook 我是改过的。
加上签之后网址会变复杂。
加签之后webhook
mobile 是要发送的人的手机号 /也可以改成要发送人的昵称 代码的 atUserIds
text 是文本信息

import time
import hmac
import hashlib
import base64
import urllib.parse

def dingding(mobile,text):
    timestamp = str(round(time.time() * 1000))
    #加签
    secret = 'SECe875a893333f66767cd8d09c3bd122e01ca9214b38f7130b2d1dd7d9f'
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    #Webhook
    Webhook = "https://oapi.dingtalk.com/robot/send?access_token=5efbd2e95361045ae7ed6dce1030234c573021eeefe148aac9f68d5"
    #加上签之后网址后面要加上 一段签名计算代买后的sign以及时间,不加签的应该不需要后面跟的。
    url =  Webhook + "&timestamp={}&sign={}".format(timestamp, sign)
    headers = {
        'Content-Type': 'application/json'
    }
    json ={
        "at": {
            "atMobiles":[
                mobile
            ],
            "atUserIds":[
                ""
            ],
            "isAtAll": "false"
        },
        "text": {
            "content": text
        },
        "msgtype":"text"
    }

    requests.post(url=url , headers= headers,json=json)

最后效果是这样。
在这里插入图片描述
参考python玩钉钉机器人

2.qq邮箱推送

先从qq邮箱的页面获取smtp
下面的的key也已改过。
subject为发送主题
email为收件人邮箱 格式必须为“xxxxxxxxx@qq.com”
text 为文本内容 字符串
获取smtp之后 EMAIL_ADDRESS= 换成你的邮箱地址,就是你作为发件人

def qqemail(subject,email,text):
    #无需安装第三方库
    key='bsjpqxig'      #换成你的QQ邮箱SMTP的授权码(QQ邮箱设置里)  设置-> 账户-> SMTP服务
    EMAIL_ADDRESS='885317429@qq.com'      #换成你的邮箱地址
    EMAIL_PASSWORD=key

    import smtplib
    smtp=smtplib.SMTP('smtp.qq.com',25)

    import ssl
    context=ssl.create_default_context()
    sender=EMAIL_ADDRESS               #发件邮箱
    receiver=email#"255576170@qq.com"#EMAIL_ADDRESS
                                          #收件邮箱
    from email.message import EmailMessage
    subject=subject
    body=text
    msg=EmailMessage()
    msg['subject']=subject       #邮件主题
    msg['From']=sender
    msg['To']=receiver
    msg.set_content(body)         #邮件内容

    with smtplib.SMTP_SSL("smtp.qq.com",465,context=context) as smtp:
        smtp.login(EMAIL_ADDRESS,EMAIL_PASSWORD)
        smtp.send_message(msg)

手机上关注qq邮箱公众号,每天发推送就会有提醒。效果如下。
在这里插入图片描述

3.Github Action 定时任务

参考
官方文档
其实很简单,具体分为两个部分,一个是.yml文件,一个是自己写的程序(可以不是python)
在这里插入图片描述
官方文档说yaml文件必须创建在.github/workflows下
在这里插入图片描述
创建的时候这里打出/
在这里插入图片描述
即可完成创建。
了解一下yaml的语法

test.yml

我们最关心的是定时的时间,

例子:
    # 每月的最后1天
    0 0 L * * *

    说明:
    Linux
    *    *    *    *    *
    -    -    -    -    -
    |    |    |    |    |
    |    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    |    |    |    +---------- month (1 - 12) OR jan,feb,mar,apr ...
    |    |    +--------------- day of month (1 - 31)
    |    +-------------------- hour (0 - 23)
    +------------------------- minute (0 - 59)
- cron:  0 16 * * * 
这个意思就是定时每天的16点 但因为这个是国际协调时间UTC 
我们比它晚8个小时,所以对我们来说就是定时每天24点的时候 

test.yml
代码中都有注解,意思就是每修改一次[master]里的分支一次 或者每定时一次 运行一次写好的代码g1.py
我们要装的python包就写在根目录创建的requirements.txt文件下即可。如果知识qq邮箱推送,可以不装包都行。
它的默认分支应该叫main,在setting里的branch下改个名就好,或者把yml文件的master改成main就行。
在这里插入图片描述
示例:


#工作名字
name: glados-checkin
#
on:
  workflow_dispatch: 
  push:
  # 当对分支master进行push操作的时候,这个工作流就被触发了
    branches: [ master ]
  pull_request:
  #只运行特定分支master
    branches: [ master ]
  schedule:
  # 定时任务,在每天的24点 18点推送签到信息到邮箱
    - cron:  0 16 * * * 
      # 定时器更改时间
      # https://tool.lu/crontab/
      # https://datetime360.com/cn/utc-cst-china-time/ #UTC时间 国际协调时间+8=北京时间
      # https://docs.github.com/cn/actions/using-workflows/workflow-syntax-for-github-actions#onschedule 官方参考
  #watch:
  #    types: started   

jobs:
#将工作流程中运行的所有作业组合在一起
  checkin:
  #定义名为 checkin 的作业。 子键将定义作业的属性 
    runs-on: ubuntu-latest
    #将作业配置为在最新版本的 Ubuntu Linux 运行器上运行
    #if: github.event.repository.owner.id == github.event.sender.id
    # https://p3terx.com/archives/github-actions-manual-trigger.html
    
    steps:
    - uses: actions/checkout@v2
#uses 关键字指定此步骤将运行 actions/checkout 操作的 v3。 这是一个将存储
#库签出到运行器上的操作,允许您对代码(如生成和测试工具)运行脚本或其他操
#作。 每当工作流程将针对存储库的代码运行时,都应使用签出操作。
    
    - name: Set up Python 3.9
      uses: actions/setup-python@v2
      with:
        python-version: 3.9.1
    - name: requirements
      run: |
        python -m pip install --upgrade pip
        pip3 install -r requirements.txt
       # if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 
    - name: Checkin
      run: |
        python3 ./g1.py 
  env: 
  #设置secrets的环境变量
    COOKIE1: ${{ secrets.COOKIE1 }}
    COOKIE2: ${{ secrets.COOKIE2 }}
    #SMTP: ${{ secrets.SMTP }}
    MAIL1: ${{ secrets.MAIL1 }}
    MAIL2: ${{ secrets.MAIL2 }}

secrets

如果不想让别人知道自己的cookie 或者smtp一些比较隐私的东西,可以最后加上环境变量

      env: 
      #设置secrets的环境变量
        COOKIE1: ${{ secrets.COOKIE1 }}
        COOKIE2: ${{ secrets.COOKIE2 }}
        #SMTP: ${{ secrets.SMTP }}
        MAIL1: ${{ secrets.MAIL1 }}
        MAIL2: ${{ secrets.MAIL2 }}

然后在setting里的secrets添加即可,参考,这里的名称必须为大写
在这里插入图片描述
在python 中调用的时候,这样调用就行了

cookie1 = os.environ["COOKIE1"]#因为$前面是大写所以也是大写

还有一个说法说是smtp的授权码是加密的,所以必须要放在Secrets里,但我没放还是发出去了,应该不影响,只是防隐私(之前一直出错,就把cookie啥的加进去试试)。

如果只是个人用,我是直接把仓库换成私有的了,在setting下,把仓库性质改成private,就不用加这个secrets这么麻烦了。
在这里插入图片描述

最后

钉钉机器人的限制是每分钟最多发20条消息,超过了就会系统就会禁你机器人10分钟。
qq邮箱的限制是每天最多发500条邮箱。
github的限制是每人最多20个免费的工作流程。(相当于也是20个轻量服务器)
如果只是上上github这种网页,不用glados上外网,用网易云加速器的学术资源加速也能加快不少。
在这里插入图片描述
我租的服务器是腾讯云上面的,本来期待能github 上action 能免费帮忙签到的,ip竟然被封了,不过其他网页的ip应该没封。下面是爬虫签到glados的代码,在windows上能用。
在这里插入图片描述

爬虫签到代码

def start(cookie,who):
    # 创建一个session,作用会自动保存cookie
    session = requests.session()
    #点签到之后的页
    url= "https://glados.rocks/api/user/checkin"
    url2= "https://glados.rocks/api/user/status"
    referer = 'https://glados.rocks/console/checkin'
    #checkin = requests.post(url,headers={'cookie': cookie ,'referer': referer })
    #state =  requests.get(url2,headers={'cookie': cookie ,'referer': referer})
    origin = "https://glados.rocks"
    useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
    #请求负载
    payload={
        # 'token': 'glados_network'
        'token': 'glados.network'
    }
    #referer 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器 籍此可以获得一些信息用于处理。
    #json.dumps请求序列化
    checkin = session.post(url,headers={'cookie': cookie ,'referer': referer,'origin':origin,'user-agent':useragent,'content-type':'application/json;charset=UTF-8'},data=json.dumps(payload))
    state =  session.get(url2,headers={'cookie': cookie ,'referer': referer,'origin':origin,'user-agent':useragent})
   # print(res)
    print(checkin.text )
    while(1):
        try:
            if 'message' in checkin.text:
                mess = checkin.json()['message']
                time = state.json()['data']['leftDays']
                time = time.split('.')[0]
                print(time)
                text = mess +',you have '+time+' days left'
                if "@qq.com" in who:
                    qqemail("GLaDOS签到", who, text)
                else:#因为两个who 不一样
                    dingding(who, text)
            break
        except Exception as e:
            print(e)

总结

不过,最后还是知道了定时说晚安的方式,还能逗逗女友。

在这里插入图片描述


2024.3.13更新代码见:【任务计划程序】打卡签到(自用)

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值