影刀RPA200篇纪念版:最实用的20个自动化场景大盘点

影刀RPA200篇纪念版:最实用的20个自动化场景大盘点

作者:林焱 | 发布平台:CSDN / 公众号 / 掘金


前言:写在200篇之际

从第一篇《影刀RPA入门指南》到现在,我们共同探索了200个自动化场景,涵盖数据采集、Excel处理、API集成、桌面自动化等各个维度。

这一篇,我们做一次大盘点------精选出最实用、最高频被读者用到的20个场景,每个场景附上核心代码片段,希望能成为你的自动化工具速查手册。


TOP 1:网页数据自动采集

🏆 使用频率最高,几乎所有业务都有数据采集需求

python 复制代码
import shadowbot as sb

def scrape_product_data(url, max_pages=10):
    """通用商品数据采集"""
    page = sb.browser.get_page(url)
    all_data = []
    
    for page_num in range(1, max_pages + 1):
        items = page.get_all_elements(".product-item")
        
        for item in items:
            all_data.append({
                "名称": item.get_text(".product-name"),
                "价格": item.get_text(".product-price"),
                "评分": item.get_text(".rating"),
                "URL": item.get_attr("a", "href"),
            })
        
        # 翻页
        next_btn = page.find_element(".pagination-next")
        if not next_btn or not next_btn.is_enabled():
            break
        
        page.click(".pagination-next")
        page.wait_for_load()
    
    sb.excel.write_rows("采集结果.xlsx", all_data)
    return all_data

TOP 2:Excel数据自动处理

在这里插入图片描述

💹 财务、运营、HR人员的必备技能

python 复制代码
import pandas as pd

def process_sales_excel(input_file, output_file):
    """销售数据自动处理"""
    df = pd.read_excel(input_file)
    
    # 数据清洗
    df = df.dropna(subset=["订单号", "销售额"])
    df["销售额"] = pd.to_numeric(df["销售额"], errors="coerce").fillna(0)
    df["利润"] = df["销售额"] * 0.3  # 假设30%利润率
    
    # 分组汇总
    summary = df.groupby("产品类别").agg({
        "销售额": ["sum", "mean", "count"],
        "利润": "sum"
    }).round(2)
    
    # 输出
    with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
        df.to_excel(writer, sheet_name="详细数据", index=False)
        summary.to_excel(writer, sheet_name="汇总分析")
    
    sb.log.info(f"处理完成:{len(df)} 行数据")
    return output_file

video(video-crnicyhY-1782424991356)(type-csdn)(url-[live.csdn.net/v/embed/525...](https://link.juejin.cn?target=https%3A%2F%2Flive.csdn.net%2Fv%2Fembed%2F525010)(image-https%3A%2F%2Fi-blog.csdnimg.cn%2Fimg_convert%2Ffbc90f4b1fc63e7fc3ccf655a82d74d4.jpeg)(title-%25E5%25BA%2597%25E7%25BE%25A4%25E7%259F%25A9%25E9%2598%25B5%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E7%25AA%2581%25E7%25A0%25B4%25E8%25BF%2590%25E8%2590%25A5%25E6%259E%2581%25E9%2599%2590%25EF%25BC%2581 "https://live.csdn.net/v/embed/525010)(image-https://i-blog.csdnimg.cn/img_convert/fbc90f4b1fc63e7fc3ccf655a82d74d4.jpeg)(title-%E5%BA%97%E7%BE%A4%E7%9F%A9%E9%98%B5%E8%87%AA%E5%8A%A8%E5%8C%96%E7%AA%81%E7%A0%B4%E8%BF%90%E8%90%A5%E6%9E%81%E9%99%90%EF%BC%81"))

TOP 3:定时邮件自动发送

📧 日报、周报、预警通知的标配方案

python 复制代码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def send_report_email(to_list, subject, body, attachments=None):
    """发送报告邮件"""
    config = {
        "smtp_host": "smtp.qq.com",
        "smtp_port": 465,
        "from_email": sb.config.get("email_user"),
        "password": sb.config.get("email_password"),
    }
    
    msg = MIMEMultipart()
    msg["From"] = config["from_email"]
    msg["To"] = "; ".join(to_list)
    msg["Subject"] = subject
    msg.attach(MIMEText(body, "html", "utf-8"))
    
    # 附件
    for attachment in (attachments or []):
        with open(attachment, "rb") as f:
            part = MIMEBase("application", "octet-stream")
            part.set_payload(f.read())
        encoders.encode_base64(part)
        import os
        part.add_header("Content-Disposition", f'attachment; filename="{os.path.basename(attachment)}"')
        msg.attach(part)
    
    with smtplib.SMTP_SSL(config["smtp_host"], config["smtp_port"]) as server:
        server.login(config["from_email"], config["password"])
        server.sendmail(config["from_email"], to_list, msg.as_string())
    
    sb.log.info(f"邮件已发送至 {len(to_list)} 人")

TOP 4:HTTP API自动调用

🔌 打通系统间的数据互通

python 复制代码
import requests

class APIClient:
    """通用HTTP API客户端"""
    
    def __init__(self, base_url, token=None):
        self.base_url = base_url.rstrip("/")
        self.session = requests.Session()
        if token:
            self.session.headers.update({"Authorization": f"Bearer {token}"})
    
    def get(self, path, params=None):
        resp = self.session.get(f"{self.base_url}/{path}", params=params, timeout=30)
        resp.raise_for_status()
        return resp.json()
    
    def post(self, path, data=None):
        resp = self.session.post(f"{self.base_url}/{path}", json=data, timeout=30)
        resp.raise_for_status()
        return resp.json()
    
    def paginate(self, path, page_param="page", page_size=100):
        """自动翻页获取全部数据"""
        all_data = []
        page = 1
        
        while True:
            data = self.get(path, {page_param: page, "per_page": page_size})
            items = data.get("data", data.get("items", data if isinstance(data, list) else []))
            
            if not items:
                break
            
            all_data.extend(items)
            
            if len(items) < page_size:
                break
            
            page += 1
        
        return all_data

# 使用
api = APIClient("https://api.example.com", token=sb.config.get("api_token"))
all_orders = api.paginate("orders")

TOP 5:企业微信/钉钉消息推送

💬 运营监控和团队协作的消息中枢

python 复制代码
import requests

def send_wecom_message(webhook_url, title, content, color="green"):
    """发送企业微信卡片消息"""
    color_map = {"green": "info", "red": "warning", "orange": "comment"}
    
    md_content = f"## {title}\n\n{content}"
    
    resp = requests.post(webhook_url, json={
        "msgtype": "markdown",
        "markdown": {"content": md_content}
    })
    
    return resp.json().get("errcode") == 0

def send_alert_if_needed(metric_name, current_value, threshold, webhook_url):
    """条件触发告警"""
    if current_value > threshold:
        content = f"""
> **监控指标**:{metric_name}
> **当前值**:{current_value}
> **告警阈值**:{threshold}
> **超出比例**:{(current_value/threshold - 1)*100:.1f}%
> **时间**:{datetime.now().strftime('%Y-%m-%d %H:%M')}

⚠️ 请及时处理!
        """.strip()
        
        send_wecom_message(webhook_url, f"🚨 {metric_name} 告警", content, "red")
        return True
    return False

TOP 6:PDF文件自动处理

📄 合同、发票、报告的批量处理

python 复制代码
import fitz  # PyMuPDF

def extract_pdf_data(pdf_path):
    """提取PDF文本内容"""
    doc = fitz.open(pdf_path)
    text_content = []
    
    for page_num, page in enumerate(doc, 1):
        text = page.get_text("text")
        text_content.append({"页码": page_num, "内容": text.strip()})
    
    doc.close()
    return text_content

![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/552de2b388da4730836f5c7b4307a645~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5p6X54SxUlBB:q75.awebp?rk3s=f64ab15b&x-expires=1786183802&x-signature=5%2BRlnGYCZ9F6mS4W6mJ1vwhgG%2FM%3D)

def merge_pdfs(pdf_files, output_path):
    """合并多个PDF"""
    merged = fitz.open()
    
    for pdf_file in pdf_files:
        doc = fitz.open(pdf_file)
        merged.insert_pdf(doc)
        doc.close()
    
    merged.save(output_path)
    merged.close()
    sb.log.info(f"合并 {len(pdf_files)} 个PDF → {output_path}")

TOP 7:OCR图片文字识别

🔍 发票、证件、扫描件的数字化提取

python 复制代码
def batch_ocr_recognition(image_folder, output_excel):
    """批量OCR识别"""
    import os
    
    results = []
    images = [f for f in os.listdir(image_folder) if f.lower().endswith(('.jpg', '.png', '.pdf'))]
    
    for image_file in images:
        image_path = os.path.join(image_folder, image_file)
        
        # 使用影刀内置OCR
        text = sb.ocr.recognize(image_path)
        
        results.append({
            "文件名": image_file,
            "识别内容": text,
            "字数": len(text),
        })
        
        sb.log.info(f"OCR完成:{image_file}({len(text)}字)")
    
    sb.excel.write_rows(output_excel, results)
    return results

batch_ocr_recognition("C:/发票/", "发票识别结果.xlsx")

TOP 8:数据库自动操作

🗄️ SQLite/MySQL的数据读写与维护

python 复制代码
import sqlite3
from contextlib import contextmanager

@contextmanager
def get_db_connection(db_path):
    conn = sqlite3.connect(db_path)
    conn.row_factory = sqlite3.Row
    try:
        yield conn
        conn.commit()
    except Exception:
        conn.rollback()
        raise
    finally:
        conn.close()

def batch_upsert(db_path, table, records, key_fields):
    """批量更新或插入数据"""
    if not records:
        return 0
    
    fields = list(records[0].keys())
    placeholders = ", ".join(["?" for _ in fields])
    field_names = ", ".join(fields)
    
    update_clause = ", ".join([
        f"{f} = excluded.{f}"
        for f in fields if f not in key_fields
    ])
    
    sql = f"""
        INSERT INTO {table} ({field_names})
        VALUES ({placeholders})
        ON CONFLICT({", ".join(key_fields)})
        DO UPDATE SET {update_clause}
    """
    
    with get_db_connection(db_path) as conn:
        conn.executemany(sql, [list(r.values()) for r in records])
    
    sb.log.info(f"批量Upsert完成:{len(records)} 条")
    return len(records)

TOP 9:文件自动整理归档

📁 桌面/下载文件夹的智能整理

python 复制代码
import os, shutil
from datetime import datetime

def smart_file_organizer(source_dir, archive_base):
    """智能文件归档"""
    
    extension_map = {
        '.pdf': '文档/PDF',
        '.docx': '文档/Word',
        '.xlsx': '文档/Excel',
        '.pptx': '文档/PPT',
        '.jpg': '图片',
        '.png': '图片',
        '.mp4': '视频',
        '.mp3': '音频',
        '.zip': '压缩包',
    }
    
    moved = []
    
    for filename in os.listdir(source_dir):
        filepath = os.path.join(source_dir, filename)
        
        if not os.path.isfile(filepath):
            continue
        
        ext = os.path.splitext(filename)[1].lower()
        category = extension_map.get(ext, '其他')
        
        # 按年月子目录
        month_str = datetime.now().strftime("%Y%m")
        dest_dir = os.path.join(archive_base, category, month_str)
        os.makedirs(dest_dir, exist_ok=True)
        
        dest_path = os.path.join(dest_dir, filename)
        
        # 处理重名
        if os.path.exists(dest_path):
            name, ext2 = os.path.splitext(filename)
            dest_path = os.path.join(dest_dir, f"{name}_{datetime.now().strftime('%H%M%S')}{ext2}")
        
        shutil.move(filepath, dest_path)
        moved.append({"原路径": filepath, "新路径": dest_path})
    
    sb.log.info(f"文件整理完成:移动 {len(moved)} 个文件")
    return moved

在这里插入图片描述

TOP 10:异常监控与自动恢复

video(video-CHYevVDn-1782424997969)(type-csdn)(url-[live.csdn.net/v/embed/524...](https://link.juejin.cn?target=https%3A%2F%2Flive.csdn.net%2Fv%2Fembed%2F524992)(image-https%3A%2F%2Fi-blog.csdnimg.cn%2Fimg_convert%2Ffe264a0ef04b2df03c8adfcf0e76df6c.jpeg)(title-temu%25E5%25BA%2597%25E7%25BE%25A4%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E6%258A%25A5%25E6%25B4%25BB%25E5%258A%25A8%25E6%25A1%2588%25E4%25BE%258B "https://live.csdn.net/v/embed/524992)(image-https://i-blog.csdnimg.cn/img_convert/fe264a0ef04b2df03c8adfcf0e76df6c.jpeg)(title-temu%E5%BA%97%E7%BE%A4%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8A%A5%E6%B4%BB%E5%8A%A8%E6%A1%88%E4%BE%8B"))

🔧 让流程更健壮的容错机制

python 复制代码
import functools
import time

def retry_on_exception(max_retries=3, delay=2, exceptions=(Exception,)):
    """重试装饰器"""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            last_exception = None
            
            for attempt in range(max_retries + 1):
                try:
                    return func(*args, **kwargs)
                except exceptions as e:
                    last_exception = e
                    if attempt < max_retries:
                        sb.log.warning(f"第{attempt+1}次失败,{delay}秒后重试:{e}")
                        time.sleep(delay * (2 ** attempt))  # 指数退避
                    else:
                        sb.log.error(f"已重试{max_retries}次,最终失败:{e}")
            
            raise last_exception
        return wrapper
    return decorator

@retry_on_exception(max_retries=3, delay=5)
def fetch_data_with_retry(url):
    page = sb.browser.get_page(url)
    return page.get_table_data(".data-table")

TOP 11-20:速查清单

# 场景 核心技术 适用行业
11 自动登录管理 Cookie持久化 + 二次验证 全行业
12 定时任务调度 schedule/APScheduler 全行业
13 多浏览器标签操作 多Tab切换 + iframe穿透 电商/金融
14 键鼠精准控制 pyautogui + win32api 桌面应用
15 图片批处理 Pillow 压缩/水印/格式转换 电商/媒体
16 反爬虫应对 随机UA/IP/等待时间 数据采集
17 子流程模块化 函数封装 + 参数化 全行业
18 日志监控告警 结构化JSON日志 + 实时告警 企业运维
19 多账号轮换 Cookie池 + 状态机管理 电商/运营
20 版本控制部署 Git + 环境配置分离 全行业

自动化成熟度模型

markdown 复制代码
Level 0:手工操作(0%自动化)
    ↓
Level 1:工具辅助(Excel宏、批处理脚本)
    ↓
Level 2:单点自动化(解决特定重复任务)
    ↓  ← 大多数读者入门后的位置
Level 3:流程自动化(端到端流程串联)
    ↓
Level 4:智能自动化(加入AI判断和异常处理)
    ↓
Level 5:自适应自动化(系统能自我优化和扩展)

从Level 2到Level 3是最关键的跨越,需要:

  1. 系统思维:把点连成线
  2. 异常处理:考虑所有边界情况
  3. 监控能力:知道流程是否正常运行

写给读者的话

200篇文章,是一段持续的探索旅程。

RPA自动化的本质,不是用技术替代人,而是用技术释放人的创造力------把重复的、规则明确的工作交给机器,让人专注于需要判断力和创意的事情。

影刀RPA提供了一个门槛很低的入口:不需要深厚的编程背景,只要愿意花时间了解自己的业务流程,就能用它创造价值。

感谢每一位读者的陪伴,接下来会有更多精彩内容等着大家。


作者:林焱 | 转载请注明出处

相关推荐
名字还没想好☜1 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
每天都要进步哦3 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
不剪发的Tony老师3 小时前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql
dotnet903 小时前
批量生成所有表的修改脚本
数据库·sql·oracle
@Mike@3 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习
南凉北往4 小时前
PandasAI连接LLM对MySQL数据库进行数据分析
数据库·mysql·数据分析
回眸不遇4 小时前
详谈 QT 布局 QLayout::SizeConstraint 和 QSizePolicy 对 QWidget 尺寸的影响
数据库·qt·系统架构
2601_965798474 小时前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
zdl6865 小时前
EasyMarkets:“机器人商业化仍待验证”
数据库·机器人