GitHub自動化利器:Probot框架實戰指南

引言

在當今快節奏的軟件開發世界中,自動化已成為提高生產力和保證代碼質量的關鍵要素。GitHub作為全球最大的代碼托管平臺,其豐富的API生態系統為自動化提供了無限可能。Probot作為一個基于Node.js的開源框架,專門用于構建GitHub應用程序,正在改變開發者與GitHub交互的方式。

本文將深入探討Probot框架的核心概念、工作原理、實戰應用以及最佳實踐。通過閱讀本文,您將學習到:

  • Probot框架的核心架構和工作原理
  • 如何搭建和配置Probot開發環境
  • Webhook機制與GitHub事件的深度解析
  • 構建各種自動化工作流的實戰技巧
  • 高級特性與性能優化策略
  • 生產環境部署與監控方案
  • Probot生態系統的擴展與社區資源

無論您是想要簡化團隊工作流程的Tech Lead,還是希望為開源項目添加自動化功能的維護者,本文都將為您提供全面的指導和技術細節。

大綱

  1. ??Probot框架概述??
    • 1.1 什么是Probot
    • 1.2 Probot的核心特性
    • 1.3 Probot與其它GitHub自動化工具的對比
  2. ??環境搭建與項目初始化??
    • 2.1 環境要求與前置條件
    • 2.2 使用create-probot-app創建項目
    • 2.3 項目結構解析
  3. ??核心概念深度解析??
    • 3.1 GitHub Webhook機制
    • 3.2 Node.js與Express在Probot中的角色
    • 3.3 GitHub API認證與權限管理
  4. ??實戰:構建你的第一個Probot應用??
    • 4.1 基礎事件處理
    • 4.2 自動化代碼審查實現
    • 4.3 Issue自動管理機器人
  5. ??高級特性與最佳實踐??
    • 5.1 狀態管理與持久化
    • 5.2 錯誤處理與日志記錄
    • 5.3 測試策略:單元測試與集成測試
  6. ??部署與運維??
    • 6.1 本地開發與調試技巧
    • 6.2 無服務器部署(AWS Lambda)
    • 6.3 監控與性能優化
  7. ??Probot生態系統與社區??
    • 7.1 官方與社區插件
    • 7.2 優秀案例研究
    • 7.3 貢獻與參與社區
  8. ??未來展望與總結??
    • 8.1 Probot的發展方向
    • 8.2 自動化工作流的未來趨勢
    • 8.3 總結與資源推薦

1. Probot框架概述

1.1 什么是Probot

Probot是一個基于Node.js的開源框架,專門用于構建GitHub應用程序(GitHub Apps)。它旨在簡化接收和處理GitHub webhook事件的流程,讓開發者能夠專注于業務邏輯而非基礎設施代碼。Probot提供了一套強大的工具和抽象,使得創建響應GitHub事件的自動化機器人變得異常簡單。

與傳統的OAuth應用相比,Probot應用具有更高的安全性和更細粒度的權限控制。每個Probot應用都作為一個獨立的GitHub App存在,可以安裝在一個或多個倉庫中,并只請求它實際需要的權限。

// 一個最簡單的Probot應用示例
module.exports = (app) => {app.on('issues.opened', async (context) => {// 當有新issue創建時自動添加評論const issueComment = context.issue({body: '感謝您提交issue!我們會盡快查看。'});await context.github.issues.createComment(issueComment);});
};

1.2 Probot的核心特性

Probot框架具有幾個關鍵特性,使其成為GitHub自動化的理想選擇:

  • ??簡化的事件處理??:Probot提供了直觀的API來處理GitHub webhook事件,開發者只需關注特定事件的處理邏輯。
  • ??內置認證??:框架自動處理GitHub API認證,無需手動管理token或實現OAuth流程。
  • ??TypeScript支持??:Probot完全支持TypeScript,提供了完整的類型定義,增強了開發體驗和代碼可靠性。
  • ??測試工具??:提供了豐富的測試工具,使得編寫單元測試和集成測試變得簡單。
  • ??擴展生態系統??:擁有豐富的插件生態系統,可以輕松擴展功能。

1.3 Probot與其它GitHub自動化工具的對比

雖然GitHub提供了多種自動化方式(如GitHub Actions、Webhook直接集成等),但Probot在某些場景下具有獨特優勢。

與GitHub Actions相比,Probot提供了更細粒度的事件控制和更復雜的狀態管理能力。而與直接使用Webhook相比,Probot大大降低了開發復雜度,提供了開箱即用的認證、日志和錯誤處理機制。

2. 環境搭建與項目初始化

2.1 環境要求與前置條件

在開始Probot開發之前,需要確保系統滿足以下要求:

  • Node.js 18.0.0或更高版本
  • npm(通常隨Node.js一起安裝)或yarn
  • Git
  • GitHub賬戶

可以通過以下命令檢查Node.js版本:

node -v

如果未安裝Node.js,需要從Node.js官網下載并安裝最新版本。

2.2 使用create-probot-app創建項目

Probot提供了便捷的命令行工具create-probot-app來快速初始化項目:

# 使用npx直接創建Probot應用
npx create-probot-app my-first-app# 按照提示輸入應用信息
# 應用名稱: my-first-app
# 描述: My first Probot app
# 作者: Your Name
# 模板: basic-js (或basic-ts用于TypeScript)

創建完成后,進入項目目錄并查看結構:

cd my-first-app
ls -la

2.3 項目結構解析

一個典型的Probot項目包含以下文件和目錄:

my-first-app/
├── src/
│   └── index.js          # 主應用文件
├── test/
│   └── index.test.js     # 測試文件
├── .env                  # 環境變量
├── app.yml               # GitHub App配置
├── package.json          # 項目依賴和腳本
└── README.md             # 項目說明文檔

??package.json??是項目的核心配置文件,包含了所有依賴和腳本:

{"name": "my-first-app","version": "1.0.0","description": "My first Probot app","author": "Your Name","dependencies": {"probot": "^12.0.0"},"scripts": {"start": "probot run ./src/index.js","test": "jest"},"devDependencies": {"jest": "^27.0.0","smee-client": "^1.0.0"}
}

3. 核心概念深度解析

3.1 GitHub Webhook機制

Webhook是Probot與GitHub交互的核心機制。當GitHub上發生特定事件(如創建issue、提交PR等)時,GitHub會向配置的Webhook URL發送HTTP POST請求。

Probot框架內置了Webhook處理功能,簡化了事件處理流程:

GitHubProbot ServerApp LogicPOST Webhook EventVerify Webhook SignatureParse Event PayloadRoute to Event HandlerProcess EventOptional API ResponseGitHubProbot ServerApp Logic

Webhook事件處理代碼示例:

module.exports = (app) => {// 處理issue相關事件app.on(['issues.opened', 'issues.edited'], async (context) => {// context.payload包含完整的事件數據const { issue, repository } = context.payload;// 使用context.github進行API調用await context.github.issues.addLabels({owner: repository.owner.login,repo: repository.name,issue_number: issue.number,labels: ['triage']});});// 處理PR相關事件app.on('pull_request.opened', async (context) => {// 自動請求代碼審查const { pull_request, repository } = context.payload;await context.github.pulls.requestReviewers({owner: repository.owner.login,repo: repository.name,pull_number: pull_request.number,reviewers: ['team-lead', 'senior-dev']});});
};

3.2 Node.js與Express在Probot中的角色

Probot基于Node.js和Express構建,利用了Node.js的非阻塞I/O模型和Express的Web框架能力。這種組合使得Probot能夠高效處理大量并發Webhook請求。

Express中間件在Probot中的應用:

// 自定義中間件示例
const addRequestId = (req, res, next) => {req.id = Date.now() + Math.random().toString(36).substr(2, 5);next();
};module.exports = (app) => {// 注冊自定義中間件app.use(addRequestId);// 內置中間件的使用app.on('push', async (context) => {// 這個處理函數本質上是一個特殊的Express路由app.log.debug(`Processing push event with ID: ${context.req.id}`);// 業務邏輯...});
};

3.3 GitHub API認證與權限管理

Probot自動處理GitHub API認證,支持兩種主要認證方式:

  1. ??應用認證??:用于獲取應用級別信息
  2. ??安裝認證??:用于在特定倉庫執行操作

權限通過在app.yml中配置來管理:

# app.yml示例
name: my-probot-app
description: My awesome Probot app
# 請求的API權限
permissions:issues: writepull_requests: writecontents: read
# 訂閱的事件
events:- issues- pull_request- push

API調用示例:

module.exports = (app) => {app.on('issue_comment.created', async (context) => {// 使用認證后的GitHub API客戶端const { github, payload } = context;// 創建issue評論await github.issues.createComment({owner: payload.repository.owner.login,repo: payload.repository.name,issue_number: payload.issue.number,body: '感謝您的評論!'});// 讀取文件內容const fileContent = await github.repos.getContent({owner: payload.repository.owner.login,repo: payload.repository.name,path: 'README.md'});});
};

4. 實戰:構建你的第一個Probot應用

4.1 基礎事件處理

讓我們構建一個簡單的Probot應用,當用戶創建新issue時自動歡迎他們:

module.exports = (app) => {app.on('issues.opened', async (context) => {const { issue, repository, sender } = context.payload;// 構建歡迎消息const welcomeMessage = `
嗨 @${sender.login}!感謝您為${repository.name}提交issue。我們的團隊會盡快查看您的問題。與此同時,請確保您已經:1. 查看了我們的文檔
2. 搜索了已有的issue,避免重復祝您有美好的一天!?`;// 創建評論return context.github.issues.createComment({owner: repository.owner.login,repo: repository.name,issue_number: issue.number,body: welcomeMessage});});
};

4.2 自動化代碼審查實現

實現一個基本的自動化代碼審查功能,當PR創建時自動運行ESLint檢查:

const { ESLint } = require('eslint');module.exports = (app) => {app.on('pull_request.opened', async (context) => {const { pull_request, repository } = context.payload;const { github } = context;// 獲取PR中的文件變更const { data: files } = await github.pulls.listFiles({owner: repository.owner.login,repo: repository.name,pull_number: pull_request.number});// 過濾出JavaScript文件const jsFiles = files.filter(file => file.filename.endsWith('.js') || file.filename.endsWith('.jsx'));if (jsFiles.length === 0) {return; // 沒有JS文件,退出}// 初始化ESLintconst eslint = new ESLint();let lintResults = [];// 檢查每個JS文件for (const file of jsFiles) {// 這里簡化了代碼獲取邏輯,實際中需要獲取文件內容const results = await eslint.lintText('模擬的JS代碼');lintResults = lintResults.concat(results);}// 生成審查報告const errors = lintResults.reduce((sum, result) => sum + result.errorCount, 0);const warnings = lintResults.reduce((sum, result) => sum + result.warningCount, 0);// 添加審查評論await github.issues.createComment({owner: repository.owner.login,repo: repository.name,issue_number: pull_request.number,body: `## ESLint檢查結果發現${errors}個錯誤和${warnings}個警告。<details>
<summary>查看詳細報告</summary>\`\`\`
${JSON.stringify(lintResults, null, 2)}
\`\`\`</details>`});});
};

4.3 Issue自動管理機器人

創建一個智能的issue管理機器人,自動分類和標記issue:

module.exports = (app) => {// 關鍵詞到標簽的映射const keywordToLabel = {'bug': 'bug','error': 'bug','fix': 'bug','feature': 'enhancement','improvement': 'enhancement','docs': 'documentation','documentation': 'documentation'};app.on(['issues.opened', 'issues.edited'], async (context) => {const { issue, repository } = context.payload;const { title, body } = issue;const content = (title + ' ' + body).toLowerCase();// 識別關鍵詞并確定標簽const labelsToAdd = new Set();for (const [keyword, label] of Object.entries(keywordToLabel)) {if (content.includes(keyword)) {labelsToAdd.add(label);}}// 如果沒有識別到標簽,添加默認標簽if (labelsToAdd.size === 0) {labelsToAdd.add('needs-triage');}// 添加標簽await context.github.issues.addLabels({owner: repository.owner.login,repo: repository.name,issue_number: issue.number,labels: Array.from(labelsToAdd)});// 如果是bug,自動分配給核心團隊if (labelsToAdd.has('bug')) {await context.github.issues.addAssignees({owner: repository.owner.login,repo: repository.name,issue_number: issue.number,assignees: ['core-team']});}});
};

5. 高級特性與最佳實踐

5.1 狀態管理與持久化

對于復雜的Probot應用,通常需要持久化狀態數據。雖然Probot本身不提供內置的持久化解決方案,但可以輕松集成各種數據庫:

const { Sequelize, DataTypes } = require('sequelize');// 初始化數據庫連接
const sequelize = new Sequelize('database', 'username', 'password', {host: 'localhost',dialect: 'sqlite',storage: './database.sqlite'
});// 定義數據模型
const Issue = sequelize.define('Issue', {id: {type: DataTypes.INTEGER,primaryKey: true,autoIncrement: true},githubId: {type: DataTypes.INTEGER,unique: true},title: DataTypes.STRING,status: DataTypes.STRING,triagedAt: DataTypes.DATE
});module.exports = (app) => {// 在應用啟動時初始化數據庫app.on('app.start', async () => {await sequelize.sync();app.log.info('Database synchronized');});app.on('issues.opened', async (context) => {const { issue } = context.payload;// 保存issue到數據庫await Issue.create({githubId: issue.id,title: issue.title,status: 'new',triagedAt: new Date()});app.log.debug(`Issue ${issue.id} saved to database`);});
};

5.2 錯誤處理與日志記錄

健壯的錯誤處理和日志記錄對生產環境應用至關重要:

module.exports = (app) => {// 全局錯誤處理中間件app.on('error', (error) => {app.log.error('Unhandled error occurred:', error);});app.on('issues.opened', async (context) => {try {const { issue, repository } = context.payload;app.log.debug(`Processing new issue #${issue.number} in ${repository.name}`);// 模擬可能失敗的操作if (issue.title.includes('fail')) {throw new Error('Simulated failure');}// 業務邏輯...await context.github.issues.createComment({owner: repository.owner.login,repo: repository.name,issue_number: issue.number,body: '感謝您的提交!'});app.log.info(`Successfully processed issue #${issue.number}`);} catch (error) {// 記錄錯誤并嘗試優雅恢復app.log.error({err: error,payload: context.payload}, `Failed to process issue event`);// 可以在這里添加錯誤通知邏輯(如發送到Slack)}});
};

5.3 測試策略:單元測試與集成測試

Probot提供了優秀的測試支持,使得編寫測試變得簡單:

// test/my-app.test.js
const { Probot } = require('probot');
const app = require('../src/index');describe('My Probot App', () => {let probot;beforeEach(() => {probot = new Probot();// 加載應用probot.load(app);});test('adds labels to new issues', async () => {// 模擬GitHub webhook事件const mock = nock('https://api.github.com')// 預期會調用添加標簽API.post('/repos/test/repo/issues/1/labels', (body) => {return body.labels.includes('triage');}).reply(200);// 發送模擬事件await probot.receive({name: 'issues.opened',payload: {issue: { number: 1 },repository: { owner: { login: 'test' }, name: 'repo' }}});// 驗證API被調用expect(mock.pendingMocks()).toEqual([]);});
});

測試配置文件示例(jest.config.js):

module.exports = {testEnvironment: 'node',setupFilesAfterEnv: ['./test/setup.js'],coverageDirectory: 'coverage',collectCoverageFrom: ['src/**/*.js','!src/index.js']
};

6. 部署與運維

6.1 本地開發與調試技巧

本地開發Probot應用時,可以使用Smee.io轉發Webhook事件:

# 啟動Smee客戶端
npx smee -u https://smee.io/your-unique-url -t http://localhost:3000# 在另一個終端啟動Probot應用
npm start

調試配置(.vscode/launch.json):

{"version": "0.2.0","configurations": [{"type": "node","request": "launch","name": "Debug Probot","skipFiles": ["<node_internals>/**"],"program": "${workspaceFolder}/node_modules/.bin/probot","args": ["run", "${workspaceFolder}/src/index.js"],"env": {"WEBHOOK_PROXY_URL": "https://smee.io/your-unique-url"}}]
}

6.2 無服務器部署(AWS Lambda)

Probot應用可以輕松部署到無服務器平臺如AWS Lambda:

// lambda.js
const { createLambdaFunction } = require('@probot/serverless-lambda');
const app = require('./src/index');module.exports = createLambdaFunction(app, {probot: {// 從環境變量讀取配置appId: process.env.APP_ID,privateKey: process.env.PRIVATE_KEY,secret: process.env.WEBHOOK_SECRET}
});

Serverless框架配置(serverless.yml):

service: my-probot-appprovider:name: awsruntime: nodejs18.xenvironment:APP_ID: ${env:APP_ID}PRIVATE_KEY: ${env:PRIVATE_KEY}WEBHOOK_SECRET: ${env:WEBHOOK_SECRET}functions:webhook:handler: lambda.handlerevents:- http:path: /method: postplugins:- serverless-dotenv-plugin

部署腳本:

# 設置環境變量
export APP_ID=12345
export PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
export WEBHOOK_SECRET=your-secret# 部署到AWS Lambda
npx serverless deploy

6.3 監控與性能優化

生產環境中的Probot應用需要適當的監控和性能優化:

// 添加性能監控
const { monitor } = require('@probot/monitor');module.exports = (app) => {// 啟用監控monitor(app, {enabled: process.env.NODE_ENV === 'production',metrics: true,healthCheck: true});// 添加自定義指標app.on('issues.opened', async (context) => {const startTime = Date.now();// 業務邏輯...// 記錄處理時間const duration = Date.now() - startTime;app.metrics.histogram('issue_processing_time').observe(duration);});
};

性能優化策略:

  1. ??批量處理API調用??:減少對GitHub API的請求次數
  2. ??使用緩存??:緩存不經常變動的數據
  3. ??異步處理??:對于耗時操作,使用隊列異步處理
  4. ??限制并發??:控制同時處理的事件數量

7. Probot生態系統與社區

7.1 官方與社區插件

Probot擁有豐富的插件生態系統,以下是一些常用插件:

  • ??probot-scheduler??:用于定期觸發事件,例如定期清理舊的GitHub問題。
  • ??probot-metadata??:用于在GitHub問題中存儲和檢索元數據。
  • ??probot-commands??:為應用添加斜杠命令支持
  • ??probot-config??:基于倉庫的配置文件管理

使用插件示例:

const scheduler = require('probot-scheduler');
const metadata = require('probot-metadata');module.exports = (app) => {// 啟用調度器scheduler(app, {delay: !process.env.DISABLE_DELAY,interval: 24 * 60 * 60 * 1000 // 每天運行一次});// 定期清理任務app.on('schedule.repository', async (context) => {const { owner, name } = context.repo();// 獲取30天前的issuesconst cutoffDate = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);const { data: issues } = await context.github.issues.listForRepo({owner, repo: name,state: 'open',since: cutoffDate.toISOString()});// 關閉過期issuesfor (const issue of issues) {await context.github.issues.update({owner, repo: name,issue_number: issue.number,state: 'closed'});}});// 使用元數據存儲app.on('issues.opened', async (context) => {// 存儲元數據await metadata(context).set('firstSeen', new Date().toISOString());// 讀取元數據const firstSeen = await metadata(context).get('firstSeen');app.log.debug(`Issue first seen at: ${firstSeen}`);});
};

7.2 優秀案例研究

許多知名組織和項目使用Probot自動化他們的工作流程:

  1. ??Welcome Bot??:當新用戶創建新問題、新的提取請求或首次合并時,該機器人會歡迎新用戶。
  2. ??Stale Bot??:關閉了過時的問題和提取請求,幫助維護大型倉庫。
  3. ??WIP Bot??:通過在標題中添加WIP來防止合并請求請求。
  4. ??All Contributors??:自動生成貢獻者列表,展示項目中的所有貢獻者。

7.3 貢獻與參與社區

Probot是開源項目,歡迎社區貢獻:

  • ??GitHub倉庫??:probot/probot
  • ??問題報告??:使用GitHub Issues報告bug或提出功能請求
  • ??文檔改進??:幫助改進文檔和教程
  • ??插件開發??:創建和分享自己的Probot插件

社區資源:

  • ??官方文檔??:probot.github.io
  • ??Slack頻道??:加入Probot的Slack社區進行實時討論
  • ??Stack Overflow??:使用probot標簽提問

8. 未來展望與總結

8.1 Probot的發展方向

隨著GitHub平臺的不斷演進,Probot框架也在持續發展。未來的方向可能包括:

  1. ??更好的TypeScript支持??:提供更完整的類型定義和開發體驗
  2. ??增強的測試工具??:更強大的模擬和測試實用程序
  3. ??擴展的無服務器支持??:更多部署平臺的官方支持
  4. ??性能優化??:改進事件處理性能和資源利用率

8.2 自動化工作流的未來趨勢

GitHub自動化領域正在快速發展,幾個趨勢值得關注:

  • ??AI驅動的自動化??:使用機器學習智能分類issue和PR
  • ??跨平臺集成??:與更多開發工具和服務集成
  • ??可視化工作流構建器??:低代碼方式創建自動化工作流
  • ??增強的安全特性??:更細粒度的權限控制和審計功能

8.3 總結與資源推薦

Probot框架為GitHub自動化提供了強大而靈活的基礎。通過本文,您應該對Probot的核心概念、實戰應用和高級特性有了全面了解。

??推薦學習資源??:

  1. Probot官方文檔 - 官方指南和API參考
  2. GitHub Apps文檔 - 了解GitHub Apps底層機制
  3. GitHub API文檔 - 完整的API參考

??下一步行動建議??:

  1. 從簡單應用開始,逐步增加復雜度
  2. 參與社區,學習其他開發者的實踐經驗
  3. 關注Probot和GitHub平臺的更新
  4. 考慮將自動化應用到自己的項目中

自動化是現代軟件開發的核心競爭力之一,掌握Probot等工具將極大提升您和團隊的生產力。開始構建您的第一個Probot應用,探索GitHub自動化的無限可能吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96572.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十四屆藍橋杯青少組C++選拔賽[2023.2.12]第二部分編程題(4、最大空白區)

參考程序1&#xff1a;#include <bits/stdc.h> using namespace std;int main() {int N, M;cin >> N >> M;vector<vector<int>> grid(N, vector<int>(M));for (int i 0; i < N; i)for (int j 0; j < M; j)cin >> grid[i][j]…

文心一言-Agent崗三輪面試全記錄

面經分享&#xff5c;文心一言-Agent崗三輪面試全記錄 前段時間面試了 文心一言團隊 - 大模型 Agent 崗&#xff0c;三輪面試下來感觸頗多。整體來說&#xff0c;文心團隊的面試節奏偏“循序漸進”&#xff1a;一面看基礎&#xff0c;二面看綜合素養&#xff0c;三面看思考深度…

【大前端++】幾大特征

大綱 大前端業務模型結構如下&#xff1a; 服務后臺大前端原生系統可定制的終端硬件 1、業務的起點技術結構基于跨平臺前端框架 Electronvue/Rect/其他web框架js/ts FlutterDartvue/Rect/其他web框架js/ts 其他前端框架結構 2、有特定的業務使用場景 人臉識別考勤 數字…

計算機網絡---網絡體系結構

文章目錄1. 網絡的概念1.1 什么是計算機網絡1.2 簡單的計算機網絡1.3 互聯網&#xff08;或因特網&#xff0c;Internet&#xff09;1.4 計算機網絡、互連網和互聯網三者的區別1.5 總結2. 網絡的組成、功能2.1 組成2.1.1 從組成部分看2.1.2 從工作方式看2.1.3 從邏輯功能看2.2 …

機器學習超參數調優全方法介紹指南

本篇文章Master Hyperparameter Tuning in Machine Learning適合希望深入了解超參數調優的讀者。文章的亮點在于介紹了多種調優方法&#xff0c;如手動搜索、網格搜索、隨機搜索、貝葉斯優化和元啟發式算法&#xff0c;并通過實際案例展示了這些方法在復雜模型&#xff08;如CN…

怎么降低 AIGC 生成率?

怎么降低 AIGC 生成率&#xff1f;市面上那些號稱 "AI 降重神器" 的工具真的有用嗎&#xff1f;想和大家聊聊我的看法 ——人工修改生成內容&#xff0c;可能是目前最靠譜的辦法。一、AI 降重工具的實際效果現在很多工具說能通過 AI 降低 AIGC 生成率&#xff0c;原理…

心磁圖 QRS 參數在 Brugada 綜合征心律失常風險分層中的應用

研究背景Brugada 綜合征是一種與致命性室性心律失常及心源性猝死風險相關的遺傳性心臟離子通道病&#xff0c;其典型特征為右胸導聯&#xff08;V1-V3&#xff09;出現特征性ST段抬高&#xff08;1型、2型或3型 Brugada 心電圖表現&#xff09;。然而&#xff0c;靜息心電圖呈現…

Futuring robot旗下家庭機器人F1將于2025年面世

2025年9月10日&#xff0c;張翼二次創業的機器人公司Futuring Robot發布了第一款家庭服務機器人F1。這款F1機器人不僅具備端茶送水、物品遞送、家庭整理等日常服務能力&#xff0c;還深度融合了多項教育輔助功能&#xff0c;如學習陪伴、棋類對弈、作業進度管理等&#xff0c;旨…

User類CRUD實現

代碼&#xff1a; WYend/Myblog_springbook3: 我的第一個個人網站&#xff08;后端版&#xff09; 隨時更新 一、數據庫的構建 交給ai 二、各類注解 Lombok注解 Data&#xff1a; 自動生成類的getter、setter、toString()、equals()、hashCode()方法適用于實體類&#xff…

【Linux | 網絡】數據鏈路層

一、以太網1.1 認識以太網1.2 以太網幀格式1.3 MAC地址1.3.1 認識MAC地址1.3.2 MAC地址的類型1.3.3 MAC地址 VS IP地址1.4 局域網如何通信1.5 局域網數據碰撞1.5.1 數據碰撞1.5.2 劃分碰撞域&#xff08;交換機&#xff09;二、ARP協議2.1 ARP協議的作用2.2 ARP數據報的格式2.3…

Google Ads廣告驗證全攻略:如何借助動態住宅IP精準投放?

在競爭激烈的數字廣告領域&#xff0c;Google Ads扮演著至關重要的角色。然而&#xff0c;隨著廣告政策的不斷更新和平臺對廣告質量要求的提高&#xff0c;廣告驗證已成為許多廣告主繞不開的環節。同時&#xff0c;如何實現精準投放&#xff0c;將廣告觸達最相關的目標受眾&…

鴻蒙Next Web組件生命周期詳解:從加載到銷毀的全流程掌控

想要精通鴻蒙應用開發&#xff1f;Web組件的9大生命周期回調是你必須掌握的上帝視角&#xff01;在鴻蒙應用開發中&#xff0c;Web組件是我們加載本地或在線網頁的強大工具。它提供了完整的生命周期回調體系&#xff0c;讓開發者能夠精準感知網頁加載的每個階段&#xff0c;從而…

python學習進階之異常和文件操作(三)

文章目錄1.程序異常2.文件操作3.json操作1.程序異常 1.1 異常 異常概念&#xff1a; 程序在運行時, 如果Python解釋器遇到到一個錯誤, 則會停止程序的執行, 并且提示一些錯誤信息, 這就是異常 拋出異常&#xff1a; 程序停止執行并且提示錯誤信息這個動作, 通常稱之為拋出(ra…

NodeJS 8 ,從 0 到 1:npm 包發布與更新全流程指南( 含多場景適配與踩坑總結 )

目錄 前言 一、準備工作 1.1 開發環境搭建 1.1.1 環境安裝 1.1.2 配置問題 1.2 賬號注冊 1.2.1 賬號注冊&#xff08;兩種方式&#xff09; 1.2.2 登錄驗證 1.2.3 個人設置 1.2.4 安全配置 1.3 初始配置 1.3.1 初始項目目錄 1.3.2 關鍵字段詳解 1.3.3 手動完善 二…

BERT中文預訓練模型介紹

bert-base-chinese 是由谷歌基于 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型預訓練得到的適用于中文任務的模型版本。以下從多個方面對其進行詳細解釋&#xff1a; 模型概述 BERT 是一種基于 Transformer 架構的預訓練語言模型…

Archon01-項目部署

Archon01-項目部署當前已經參考B站視頻針對代碼進行修改&#xff0c;可直接使用BigModel智譜的GLM-4.5替換openAI進行使用&#xff0c;部署環境&#xff08;Python3.12-slim環境&#xff09;1-核心知識點關鍵字&#xff1a; Docker Supabase Archon BigModel Python1&#xff0…

HarmonyOS時間戳完全指南:DevEco Studio中的時間處理與實戰應用

時間戳是現代應用開發中不可或缺的基礎功能&#xff0c;無論是日志記錄、數據同步、緩存管理還是狀態追蹤都離不開時間戳的支持。本文將深入探討在DevEco Studio中如何處理和使用時間戳&#xff0c;并提供豐富的實戰示例。一、時間戳基礎概念什么是時間戳&#xff1f;時間戳&am…

論文筆記:On the Biology of a Large Language Model

《關于大型語言模型的生物學》&#xff08;On the Biology of a Large Language Model&#xff09;的文章&#xff0c;深入探究了 Anthropic 公司 Claude 3.5 Haiku 模型的內部工作機制。研究人員將理解語言模型比作生物學研究&#xff0c;旨在揭示其復雜行為背后的“神經回路”…

TCP/IP、HTTP 和 HTTPS簡介

我們來系統地介紹一下 TCP/IP、HTTP 和 HTTPS。它們之間的關系可以概括為&#xff1a;??HTTP 和 HTTPS 是運行在 TCP/IP 基礎網絡架構之上的具體應用協議??。為了更直觀地理解它們之間的關系&#xff0c;我們可以參考下面的網絡分層模型&#xff1a;flowchart TDsubgraph A…

【30】C#實戰篇——獲取路徑下的文件名(不包含路徑和擴展名),文件名由連續的數字編號+連續的字母編號組成,并分離出文件名數字部分和英文部分

文章目錄1 要求2 分析 與 實現1 要求 寫一個函數&#xff0c;獲取路徑下的文件名&#xff08;不包含路徑和擴展名&#xff09;&#xff0c;并分離出文件名fileName &#xff0c;文件名編號SN&#xff0c;文件名前綴WMT &#xff1b; 輸入文件路徑&#xff0c;解析出不帶"…