OpenCode 实践课:3 分钟用 Python 写出一个命令行二维码生成器

项目介绍

今天我们用 OpenCode 来做一个命令行二维码生成器。输入任意文字或链接,输出一张 PNG 格式的二维码图片。

  • 语言:Python
  • 依赖:qrcode + Pillow
  • 功能:支持自定义输出路径、二维码尺寸、容错级别
  • 代码量:约 100 行

最终效果:在终端输入 python qr.py "https://opencode.ai" -o opencode.png,就能在当前目录生成一张二维码图片。

准备工作

  • Python 3.8+ 已安装
  • OpenCode 已安装并配置好 API Key(参考 opencode.ai 文档)
  • 在终端中打开一个空目录作为项目目录

实践过程

第一步:搭建项目骨架

我对 OpenCode 说:

> 帮我创建一个 Python 命令行二维码生成器,先搭好项目骨架:读取命令行参数中的文本内容,调用 qrcode 库生成二维码,保存为 PNG 文件。使用 argparse 处理参数,支持 --output、--size、--error 三个可选参数。

OpenCode 立刻分析了需求,创建了 qr.py 文件:

import argparse
import qrcode

def main():
    parser = argparse.ArgumentParser(description="命令行二维码生成器")
    parser.add_argument("text", help="要编码的文本或链接")
    parser.add_argument("-o", "--output", default="qrcode.png", help="输出文件名")
    parser.add_argument("-s", "--size", type=int, default=10, help="二维码格子大小")
    parser.add_argument("-e", "--error", choices=["L", "M", "Q", "H"], default="M", help="容错级别")
    args = parser.parse_args()

    qr = qrcode.QRCode(
        version=None,
        error_correction=getattr(qrcode.constants, f"ERROR_CORRECT_{args.error}"),
        box_size=args.size,
        border=2,
    )
    qr.add_data(args.text)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    img.save(args.output)
    print(f"二维码已保存到 {args.output}")

if __name__ == "__main__":
    main()

要点:OpenCode 自动处理了 argparse 的参数验证(choices 限定容错级别),以及 getattr 动态获取 qrcode 常量,这些都是标准库的最佳实践。

第二步:添加依赖和输入校验

我对 OpenCode 说:

> 生成 requirements.txt 文件,并给代码加上输入校验——文本不能为空,输出路径要确保目录存在。

OpenCode 先生成了 requirements.txt

qrcode>=7.4
Pillow>=10.0

然后修改了 qr.py,在 main() 函数开头加入了校验逻辑:

import argparse
import os
import qrcode
import sys

def validate_input(text: str) -> str:
    text = text.strip()
    if not text:
        print("错误:输入内容不能为空", file=sys.stderr)
        sys.exit(1)
    return text

def ensure_output_dir(filepath: str) -> None:
    dirname = os.path.dirname(filepath)
    if dirname and not os.path.exists(dirname):
        os.makedirs(dirname, exist_ok=True)

要点:OpenCode 不仅加了校验,还提取了 validate_inputensure_output_dir 两个独立函数,体现了良好的代码组织习惯。os.makedirs(exist_ok=True) 也避免了目录已存在时的报错。

第三步:加入终端预览功能

我对 OpenCode 说:

> 加一个 --preview 参数,生成二维码后在终端用 ASCII 字符打印预览,这样不需要打开图片就能确认内容是否正确。

OpenCode 利用 qrcode 库内置的终端输出能力,加上了预览功能:

import argparse
import os
import qrcode
import sys


def validate_input(text: str) -> str:
    text = text.strip()
    if not text:
        print("错误:输入内容不能为空", file=sys.stderr)
        sys.exit(1)
    return text


def ensure_output_dir(filepath: str) -> None:
    dirname = os.path.dirname(filepath)
    if dirname and not os.path.exists(dirname):
        os.makedirs(dirname, exist_ok=True)


def preview_qr(qr: qrcode.QRCode) -> None:
    qr.print_ascii(out=sys.stdout)


def main():
    parser = argparse.ArgumentParser(description="命令行二维码生成器")
    parser.add_argument("text", help="要编码的文本或链接")
    parser.add_argument("-o", "--output", default="qrcode.png", help="输出文件名(默认 qrcode.png)")
    parser.add_argument("-s", "--size", type=int, default=10, help="格子大小(默认 10)")
    parser.add_argument(
        "-e", "--error",
        choices=["L", "M", "Q", "H"],
        default="M",
        help="容错级别 L/M/Q/H(默认 M)"
    )
    parser.add_argument("-p", "--preview", action="store_true", help="在终端打印 ASCII 预览")
    parser.add_argument("-c", "--color", default="#000000", help="二维码颜色(默认黑色)")
    args = parser.parse_args()

    text = validate_input(args.text)

    qr = qrcode.QRCode(
        version=None,
        error_correction=getattr(qrcode.constants, f"ERROR_CORRECT_{args.error}"),
        box_size=args.size,
        border=2,
    )
    qr.add_data(text)
    qr.make(fit=True)

    if args.preview:
        print(f"\n预览:{text}\n")
        preview_qr(qr)
        print()

    img = qr.make_image(fill_color=args.color, back_color="white")
    ensure_output_dir(args.output)
    img.save(args.output)
    print(f"✓ 二维码已保存到 {args.output}")

    if args.preview:
        img.show()


if __name__ == "__main__":
    main()

要点:OpenCode 还额外加上了 --color 参数和 img.show() 调用(在预览模式下弹出系统图片查看器),超出预期。这就是 AI 编程的优势——它会补充你可能没想到但合理的设计细节。

第四步:运行验证

我对 OpenCode 说:

> 帮我安装依赖并测试生成一个二维码。

OpenCode 执行了 pip install -r requirements.txt,然后跑了测试命令:

python qr.py "https://www.linweiqin.com" -o blog.png -p

终端打印出了 ASCII 二维码预览,同时生成了清晰的 PNG 图片。一次通过,无需调试。

完整代码

最终 qr.py 共约 90 行,完整代码如下:

import argparse
import os
import qrcode
import sys


def validate_input(text: str) -> str:
    text = text.strip()
    if not text:
        print("错误:输入内容不能为空", file=sys.stderr)
        sys.exit(1)
    return text


def ensure_output_dir(filepath: str) -> None:
    dirname = os.path.dirname(filepath)
    if dirname and not os.path.exists(dirname):
        os.makedirs(dirname, exist_ok=True)


def preview_qr(qr: qrcode.QRCode) -> None:
    qr.print_ascii(out=sys.stdout)


def main():
    parser = argparse.ArgumentParser(description="命令行二维码生成器")
    parser.add_argument("text", help="要编码的文本或链接")
    parser.add_argument("-o", "--output", default="qrcode.png", help="输出文件名(默认 qrcode.png)")
    parser.add_argument("-s", "--size", type=int, default=10, help="格子大小(默认 10)")
    parser.add_argument(
        "-e", "--error",
        choices=["L", "M", "Q", "H"],
        default="M",
        help="容错级别 L/M/Q/H(默认 M)"
    )
    parser.add_argument("-p", "--preview", action="store_true", help="在终端打印 ASCII 预览")
    parser.add_argument("-c", "--color", default="#000000", help="二维码颜色(默认黑色)")
    args = parser.parse_args()

    text = validate_input(args.text)

    qr = qrcode.QRCode(
        version=None,
        error_correction=getattr(qrcode.constants, f"ERROR_CORRECT_{args.error}"),
        box_size=args.size,
        border=2,
    )
    qr.add_data(text)
    qr.make(fit=True)

    if args.preview:
        print(f"\n预览:{text}\n")
        preview_qr(qr)
        print()

    img = qr.make_image(fill_color=args.color, back_color="white")
    ensure_output_dir(args.output)
    img.save(args.output)
    print(f"✓ 二维码已保存到 {args.output}")

    if args.preview:
        img.show()


if __name__ == "__main__":
    main()

小结

整个过程不到 3 分钟,我做了 4 件事:描述需求 → 补充校验 → 加预览 → 运行验证。全程没有写一行代码,也没有查 qrcode 文档——OpenCode 替我完成了从导包、参数解析、错误处理到文件保存的全部实现。

相比传统开发流程(查文档→写代码→调试→修 bug),OpenCode 把"想法到成品"的路径压缩到了零。尤其是它主动加上的 --colorimg.show(),这种"懂你所想"的细节补充,才是 AI 编程助手真正拉开效率差距的地方。

如果你还没试过用自然语言写代码,不妨从这个小项目开始:打开终端,对 OpenCode 说出你的需求,看看它能在几分钟内帮你做出什么。