收起左侧

飞牛社区自动签到脚本指南【改良版本】

34
回复
4368
查看
[ 复制链接 ]

31

主题

63

回帖

0

牛值

fnOS系统内测组

2024-12-19 12:06:23 显示全部楼层 阅读模式

[i=s] 本帖最后由 hzming 于 2024-12-19 12:37 编辑 [/i]<br /> <br />

前言


本教程根据论坛大佬 晨阳 的改良而来,在原有基础上,将cookise等数据做成了青龙变量,增加微信消息推送,定时签到结果发送至微信。

原参考教程地址:飞牛社区签到脚本(配合青龙面板可以实现每日自动签到)

https://club.fnnas.com/forum.php?mod=viewthread&tid=5178&highlight=

实现目的


1、自动发送签到请求,获取签到结果。

2、提取并展示用户的签到情况,包括最近打卡、本月打卡和累计打卡奖励等信息并发送邮件通知本人。

3、在发生错误时,自动发送(电子邮件,PUSH,server 酱)通知本人。

教程开始


一、青龙环境搭建

飞牛NAS安装青龙面板,这就不说了,大家都会

其中青龙安装依赖遇到问题,可以参考帖子

【新生指南】解决青龙面板无法安装依赖问题(青龙面板篇)

https://club.fnnas.com/forum.php?mod=viewthread&tid=3002&highlight=

二、添加依赖

依赖管理 - 新增 python3 的依赖:bs4、requests、loguru

按图依次添加三个python的依赖项目

image.png

三、环境变量

依次添加下面三个变量:

fn_pvRK_2132_saltkey fn_pvRK_2132_auth fn_pvRK_2132_sign

PUSH_KEY //用做微信消息推送的,不想要推送,可以不填,也可以换成邮箱方

image.png

变量来源:在登录论坛的情况下访问以下页面:

https://club.fnnas.com/plugin.php?id=zqlj_sign 1、F12打开开发者模式 然后找到Network(网络)点击plugin.php?id=zqlj_sign找到 pvRK_2132_saltkey=值; pvRK_2132_auth=值;

image.png

2、右键复制打卡链接,链接中找到:sign

image.png

3、微信消息推送key

微信登录:https://sct.ftqq.com/forward

image.png

四、下载脚本

见附件:

image.png

5、建立定时任务

任务名称:飞牛论坛签到 命令脚本:task fnnas.py 定时规则:0 30 8 * // 每天早8:30

image.png

教程到此结束

不出意外的话,每天8:30,会自动在论坛签到,签到结果自动发邮箱或微信。

第四步骤的脚本文件:fnnas.pyupload 附件:fnnas.zip


import os
import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr

pvRK_2132_saltkey = os.getenv('fn_pvRK_2132_saltkey')
pvRK_2132_auth = os.getenv('fn_pvRK_2132_auth')
pvRK_2132_sign = os.getenv('fn_pvRK_2132_sign')

PUSH_PLUS_TOKEN = ''  # push+ 微信推送的用户令牌
# server 酱的 PUSH_KEY,兼容旧版与 Turbo 版
PUSH_KEY = ''
if os.getenv('PUSH_PLUS_TOKEN'):
    PUSH_PLUS_TOKEN = os.getenv('PUSH_PLUS_TOKEN')
if os.getenv('PUSH_KEY'):
    PUSH_KEY = os.getenv('PUSH_KEY')


# 填写对应的 Cookie 值
cookies = {
    'pvRK_2132_saltkey': pvRK_2132_saltkey,
    'pvRK_2132_auth': pvRK_2132_auth,
}
# SMTP 邮件服务配置
push_config = {
    'SMTP_SERVER': '',  # SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465
    'SMTP_SSL': 'true',  # SMTP 发送邮件服务器是否使用 SSL,填写 true 或 false
    'SMTP_EMAIL': '',  # SMTP 收发件邮箱,通知将会由自己发给自己
    'SMTP_PASSWORD': '',  # SMTP 登录密码,也可能为特殊口令,视具体邮件服务商说明而定
    'SMTP_NAME': '定时任务',  # SMTP 收发件人姓名,可随意填写
}

def sign_in():
    try:
        # 签到请求链接右键打卡按钮直接复制替换
        # response = requests.get('**签到请求链接右键打卡按钮直接复制替换**', cookies=cookies)
        response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign&sign='+pvRK_2132_sign, cookies=cookies)

        if '恭喜您,打卡成功!' in response.text:
            print('签到详情(打卡成功):\n')
            get_sign_in_info()
        elif '您今天已经打过卡了,请勿重复操作!' in response.text:
            print('签到详情(已经打过卡了):\n')
            get_sign_in_info()
        else:
            print('打卡失败, cookies可能已经过期或站点更新.')
            smtp(title='飞牛社区自动签到(打卡失败)', content='cookies可能已经过期或站点更新.')  # 发送邮件
    except Exception as error:
        print('签到请求失败:', error)
        smtp(title='飞牛社区自动签到(请求失败)', content=str(error))  # 发送邮件


def get_sign_in_info():
    try:
        response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign', cookies=cookies)

        soup = BeautifulSoup(response.text, 'html.parser')
        content = []

        # 定义需要查找的模式和选择器
        patterns = [
            {'name': '最近打卡', 'selector': 'li:-soup-contains("最近打卡")'},
            {'name': '本月打卡', 'selector': 'li:-soup-contains("本月打卡")'},
            {'name': '连续打卡', 'selector': 'li:-soup-contains("连续打卡")'},
            {'name': '累计打卡', 'selector': 'li:-soup-contains("累计打卡")'},
            {'name': '累计奖励', 'selector': 'li:-soup-contains("累计奖励")'},
            {'name': '最近奖励', 'selector': 'li:-soup-contains("最近奖励")'},
            {'name': '当前打卡等级', 'selector': 'li:-soup-contains("当前打卡等级")'}
        ]

        for pattern in patterns:
            element = soup.select_one(pattern['selector'])
            if element:
                # 提取文本并清洗
                text = element.get_text()
                content.append(f"{pattern['name']}: {text.split(':')[-1].strip()}")
        content_text = '\n'.join(content)
        print(content_text + '\n')
        xxts(title='飞牛社区自动签到(成功)', content=str(content_text))  # 消息推送
        smtp(title='飞牛社区自动签到(成功)', content=str(content_text))  # 发送邮件

    except Exception as error:
        print('获取打卡信息失败:', error)
        xxts(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error))  # 消息推送
        smtp(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error))  # 发送邮件

def post_msg(url: str, data: dict) -> bool:
    response = requests.post(url, data=data)
    code = response.status_code
    if code == 200:
        return True
    else:
        return False

def PushPlus_send(token, title: str, desp: str = '', template: str = 'markdown') -> bool:
    url = 'http://www.pushplus.plus/send'
    data = {
        'token': token,  # 用户令牌
        'title': title,  # 消息标题
        'content': desp,  # 具体消息内容,根据不同template支持不同格式
        'template': template,  # 发送消息模板
    }
    return post_msg(url, data)


def ServerChan_send(sendkey, title: str, desp: str = '') -> bool:
    url = 'https://sctapi.ftqq.com/{0}.send'.format(sendkey)
    data = {
        'title': title,  # 消息标题,必填。最大长度为 32
        'desp': desp  # 消息内容,选填。支持 Markdown语法 ,最大长度为 32KB ,消息卡片截取前 30 显示
    }
    return post_msg(url, data)

def xxts(title: str, content: str):
    msg = title + '\n\n' + content
    if PUSH_KEY:
        ServerChan_send(PUSH_KEY, title, msg)
        print("PUSH_KEY推送成功")
    if PUSH_PLUS_TOKEN:
        PushPlus_send(PUSH_PLUS_TOKEN, title, msg)
        print("PUSH_PLUS_TOKEN推送成功")

def smtp(title: str, content: str):
    """
    使用 SMTP 邮件 推送消息。
    """
    if (
            not push_config.get("SMTP_SERVER")
            or not push_config.get("SMTP_SSL")
            or not push_config.get("SMTP_EMAIL")
            or not push_config.get("SMTP_PASSWORD")
            or not push_config.get("SMTP_NAME")
    ):
        print("SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!\n取消邮箱推送")
        return
    print("SMTP 邮件 服务启动")

    message = MIMEText(content, "plain", "utf-8")
    message["From"] = formataddr(
        (
            Header(push_config.get("SMTP_NAME"), "utf-8").encode(),
            push_config.get("SMTP_EMAIL"),
        )
    )
    message["To"] = formataddr(
        (
            Header(push_config.get("SMTP_NAME"), "utf-8").encode(),
            push_config.get("SMTP_EMAIL"),
        )
    )
    message["Subject"] = Header(title, "utf-8")

    try:
        smtp_server = (
            smtplib.SMTP_SSL(push_config.get("SMTP_SERVER"))
            if push_config.get("SMTP_SSL") == "true"
            else smtplib.SMTP(push_config.get("SMTP_SERVER"))
        )
        smtp_server.login(
            push_config.get("SMTP_EMAIL"), push_config.get("SMTP_PASSWORD")
        )
        smtp_server.sendmail(
            push_config.get("SMTP_EMAIL"),
            push_config.get("SMTP_EMAIL"),
            message.as_bytes(),
        )
        smtp_server.close()
        print("SMTP 邮件 推送成功!")
    except Exception as e:
        print(f"SMTP 邮件 推送失败!{e}")


if __name__ == '__main__':
    sign_in()

青龙签到截图

image.png

微信通知截图

image.png

收藏
送赞 8
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

11

主题

96

回帖

195

牛值

共建版主

社区上线纪念勋章社区共建团荣誉勋章

2024-12-19 12:56:21 显示全部楼层
棒!顺便提下个人的处理方案:
1、飞牛页面其实没有拆分cooike的必要,可以考虑直接全部复制添加进变量,例如
请求头可以设置:'Cookie': os.getenv('FN_COOKIE', '')
2、青龙面板依赖添加可以勾选自动拆分,名称列表一个依赖独占一行可以实现批量添加
3、顺便提供一个企业微信机器人的调用方法:
# 从环境变量中读取企业微信机器人的Webhook URL
WEIXIN_WEBHOOK_URL = os.getenv('WEIXIN_WEBHOOK_URL')
if not WEIXIN_WEBHOOK_URL:
    logging.error('环境变量 WEIXIN_WEBHOOK_URL 未设置')
    exit(1)
def send_weixin_message(message):
    try:
        data = {
            "msgtype": "text",
            "text": {
                "content": message
            }
        }
        response = requests.post(WEIXIN_WEBHOOK_URL, json=data)
        logging.info(f'企业微信推送结果: {response.status_code} {response.reason}')
    except Exception as e:
        logging.error(f'企业微信推送失败: {e}')
drw
确实没必要拆分cookie分开填写,大佬修改过的完整脚本能否分享一下? 谢谢!  详情 回复
2025-1-22 08:25

2

主题

8

回帖

0

牛值

江湖小虾

2024-12-23 19:34:22 显示全部楼层
python3: can't open file '/ql/data/scripts/fnnas.swap.py': [Errno 2] No such file or directory
这个咋解决
fnnas.swap.py 这是撒文件,上面代码 未提及到这个文件呢,  详情 回复
2024-12-24 15:50

31

主题

63

回帖

0

牛值

fnOS系统内测组

2024-12-24 15:50:49 楼主 显示全部楼层
fnnas.swap.py   这是撒文件,上面代码 未提及到这个文件呢,
木知啊,我全部按照上面教程弄的,多多来个莫名其妙的文件结果还是对不上的  详情 回复
2024-12-24 18:34

1

主题

32

回帖

0

牛值

fnOS系统内测组

飞牛百度网盘玩家

2024-12-24 16:05:07 显示全部楼层
靠谱!!大佬,你阿里可以分享吗?

2

主题

8

回帖

0

牛值

江湖小虾

2024-12-24 18:34:05 显示全部楼层
hzming 发表于 2024-12-24 15:50
fnnas.swap.py   这是撒文件,上面代码 未提及到这个文件呢,

木知啊,我全部按照上面教程弄的,多多来个莫名其妙的文件结果还是对不上的

0

主题

36

回帖

0

牛值

江湖小虾

2024-12-24 23:18:22 显示全部楼层
按楼主教程弄了,就等明天微信消息了

8

主题

25

回帖

0

牛值

fnOS系统内测组

2024-12-25 19:02:35 显示全部楼层
先收藏,不然搞丢了

0

主题

9

回帖

0

牛值

江湖小虾

2024-12-26 10:04:58 显示全部楼层
我是按照这个步骤一步一步走下来的,但是提示错误,水平有限看不懂,哪位帮忙看一下问题出在哪儿?## 开始执行... 2024-12-26 09:30:00


  File "/ql/data/scripts/fnnas.py", line 10
    pvRK_2132_auth = 04aeo%2B1mDchTthXgQHResqcm1w%2BEOZn4WBy%2FfPTchuA1DPY0aNgWDQjRfQaDuQxdqFaKyzXnAC85RzrLPAoQybsnsw;
                     ^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

## 执行结束... 2024-12-26 09:30:00  耗时 1 秒     
pvRK_2132_auth 获取错误,pvRK_2132_auth 里面不应该出现百分号的 %  详情 回复
2024-12-26 11:43

31

主题

63

回帖

0

牛值

fnOS系统内测组

2024-12-26 11:43:05 楼主 显示全部楼层
pvRK_2132_auth 获取错误,pvRK_2132_auth 里面不应该出现百分号的 %
我发了个截图,帮我看看pvRK_2132_auth  详情 回复
2024-12-26 12:24
[md]![image.png](data/attachment/forum/202412/26/122219zppslx3mpw6txtsu.png "image.png") [/md]  详情 回复
2024-12-26 12:22

0

主题

9

回帖

0

牛值

江湖小虾

2024-12-26 12:22:24 显示全部楼层

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

9

回帖

0

牛值

江湖小虾

2024-12-26 12:24:02 显示全部楼层
我发了个截图,帮我看看pvRK_2132_auth
[md]![image.png](data/attachment/forum/202412/26/133310qp40u4wx4c4ff908.png "image.png") [/md]  详情 回复
2024-12-26 13:33

31

主题

63

回帖

0

牛值

fnOS系统内测组

2024-12-26 13:33:19 楼主 显示全部楼层

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这么勇的,cookie直接放  详情 回复
2025-4-9 11:29

1

主题

35

回帖

0

牛值

fnOS系统内测组

2024-12-26 17:33:58 显示全部楼层
我用的是 QD 框架,配置比较简单,只实现签到的话,那用 QD 框架比较方便。

我是新手,QD框架怎样操作?能给个详细的教程吗?  详情 回复
2024-12-26 17:56

0

主题

9

回帖

0

牛值

江湖小虾

2024-12-26 17:56:07 显示全部楼层
我是新手,QD框架怎样操作?能给个详细的教程吗?
百度一下即可,那么多教程。  详情 回复
2025-1-2 10:05

1

主题

35

回帖

0

牛值

fnOS系统内测组

2025-1-2 10:05:48 显示全部楼层
13909167275 发表于 2024-12-26 17:56
我是新手,QD框架怎样操作?能给个详细的教程吗?

百度一下即可,那么多教程。

0

主题

2

回帖

0

牛值

江湖小虾

2025-1-3 13:44:02 显示全部楼层
飞牛社区自动签到(成功)

最近打卡: 2025-01-03 12:10:52 本月打卡: 2天 连续打卡: 2天 累计打卡: 2天 累计奖励: 11飞牛币 最近奖励: 1飞牛币 当前打卡等级: 无名新人

用PUSH+推送的,怎么实现显示换行呢。
好像在代码里面 加上 \r 或 \n 就可以,自己试试。  详情 回复
2025-1-3 16:20

31

主题

63

回帖

0

牛值

fnOS系统内测组

2025-1-3 16:20:46 楼主 显示全部楼层
好像在代码里面 加上 \r  或 \n  就可以,自己试试。

4

主题

12

回帖

0

牛值

fnOS系统内测组

2025-1-13 11:57:18 显示全部楼层
请问 这个咋解决  SMTP 邮件 服务启动
SMTP 邮件 推送失败!(535, b'Error: authentication failed, system busy')   qq后台  重新生成的授权码  不显示登录信息
qq邮件的密码不是你qq的密码,需要在网页版邮箱的设置里,生成一组授权码,用来代替密码在客户端使用。  详情 回复
2025-1-24 09:04

1

主题

35

回帖

0

牛值

fnOS系统内测组

2025-1-14 09:55:23 显示全部楼层
测试一下成功了,谢谢楼主

0

主题

3

回帖

0

牛值

江湖小虾

2025-1-14 21:52:42 显示全部楼层
感谢,这个可以用,原来的用不了,很奇怪是什么问题。

2

主题

5

回帖

0

牛值

江湖小虾

2025-1-22 08:25:57 显示全部楼层
确实没必要拆分cookie分开填写,大佬修改过的完整脚本能否分享一下?
谢谢!

11

主题

11

回帖

0

牛值

江湖小虾

2025-1-24 09:04:26 显示全部楼层
qq邮件的密码不是你qq的密码,需要在网页版邮箱的设置里,生成一组授权码,用来代替密码在客户端使用。

0

主题

1

回帖

0

牛值

江湖小虾

2025-1-24 10:23:46 显示全部楼层
cookie的值可以不用拆分,直接放到请求头里headers,
headers = {
    "Cookie":<cookie所有值>
}
然后把下面两个get请求中的cookies参数改为headers = headers,就可以了

3

主题

5

回帖

0

牛值

江湖小虾

2025-1-28 15:52:24 显示全部楼层
## 开始执行... 2025-01-28 15:50:46

打卡失败, cookies可能已经过期或站点更新.
SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!
取消邮箱推送

## 执行结束... 2025-01-28 15:50:51  耗时 5 秒     
这个是为什么

4

主题

19

回帖

0

牛值

江湖小虾

2025-2-19 12:25:22 显示全部楼层
打卡失败, cookies可能已经过期或站点更新.

31

主题

77

回帖

0

牛值

fnOS系统内测组

2025-2-21 07:57:48 显示全部楼层
从今天开始好像不好使了这个
可以使用,好像论坛更新了撒东西,导致cookies等数据都变了,重新论坛获取下这些变量就可以了。  详情 回复
2025-2-21 15:11

31

主题

63

回帖

0

牛值

fnOS系统内测组

2025-2-21 15:11:28 楼主 显示全部楼层
可以使用,好像论坛更新了撒东西,导致cookies等数据都变了,重新论坛获取下这些变量就可以了。
确实 感谢  详情 回复
2025-2-21 16:37

31

主题

77

回帖

0

牛值

fnOS系统内测组

2025-2-21 16:37:22 显示全部楼层
hzming 发表于 2025-2-21 15:11
可以使用,好像论坛更新了撒东西,导致cookies等数据都变了,重新论坛获取下这些变量就可以了。 ...

确实 感谢

0

主题

2

回帖

0

牛值

江湖小虾

2025-3-21 10:33:44 显示全部楼层
本帖最后由 陈平安 于 2025-3-21 10:35 编辑

按楼主的教程一步步完美实现啦,非常感谢,我是苹果手机,Bark推送比较方便,所以增加了Bark推送内容,删除了邮件推送(不怎么看邮箱)

def Bark_send(key, title: str, content: str) -> bool:
    url = f'https://api.day.app/{key}/{title}/{content}'
    response = requests.get(url)
    code = response.status_code
    if code == 200:
        return True
    else:
        return False




def xxts(title: str, content: str):
    msg = title + '\n\n' + content
    if PUSH_KEY:
        ServerChan_send(PUSH_KEY, title, msg)
        print("PUSH_KEY推送成功")
    if PUSH_PLUS_TOKEN:
        PushPlus_send(PUSH_PLUS_TOKEN, title, msg)
        print("PUSH_PLUS_TOKEN推送成功")
    if BARK_KEY:
        if Bark_send(BARK_KEY, title, content):
            print("BARK推送成功")
        else:
            print("BARK推送失败")

3

主题

5

回帖

0

牛值

江湖小虾

2025-4-3 09:59:41 显示全部楼层
原教程设置邮箱推送一直能成功,改用楼主的成功了。感谢!

0

主题

2

回帖

0

牛值

江湖小虾

2025-4-9 11:29:12 显示全部楼层

<br /> <br /> 这么勇的,cookie直接放

0

主题

4

回帖

0

牛值

江湖小虾

2025-4-9 16:47:05 显示全部楼层

请教一下我的推送消息里面除了标题,怎么没有下面这些具体信息呢?
image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

24

回帖

0

牛值

fnOS系统内测组

2025-4-27 14:53:38 显示全部楼层

感谢楼主分享

0

主题

2

回帖

0

牛值

江湖小虾

按楼主教程弄了,测试可用

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则