{"id":21301964,"url":"https://github.com/liudding/puppy","last_synced_at":"2025-03-15T18:40:57.985Z","repository":{"id":246731283,"uuid":"738404762","full_name":"liudding/puppy","owner":"liudding","description":"A webpage screenshot service built with puppeteer. 基于 puppeteer 实现的网页截图服务","archived":false,"fork":false,"pushed_at":"2025-01-08T08:22:46.000Z","size":16,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T08:15:35.699Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liudding.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-03T06:37:17.000Z","updated_at":"2025-01-08T08:22:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"6dff6788-1fd9-4407-87fe-6820b21c7927","html_url":"https://github.com/liudding/puppy","commit_stats":null,"previous_names":["liudding/puppy"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liudding%2Fpuppy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liudding%2Fpuppy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liudding%2Fpuppy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liudding%2Fpuppy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liudding","download_url":"https://codeload.github.com/liudding/puppy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243776315,"owners_count":20346350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T15:53:39.435Z","updated_at":"2025-03-15T18:40:57.962Z","avatar_url":"https://github.com/liudding.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Puppy 截图狗 🐶\n\n基于 Puppeteer 实现的网页截图服务\n\n### 功能\n\n* 页面整页截图\n* 指定元素及系列元素截图\n* 指定区域截图\n* 支持 jpg、png 和 pdf 等\n\n### API\n\n| api         | 请求方法  | 说明     |\n| ----------- | --------- | -------- |\n| /screenshot | GET、POST | 截图     |\n| /pdf        | GET、POST | 生成 pdf |\n\n`http://puppyservice.com/screenshot?url=xxxxxxx`\n\n`http://puppyservice.com/pdf?url=xxxxxxx`\n\n参数列表：（GET 请求时需要 encode）\n\n**公共部分**\n\n| 参数          | 类型           | 默认值   | 说明                                                         |\n| ------------- | -------------- | -------- | ------------------------------------------------------------ |\n| url           | string         | 必填     | 需要截图的网页地址                                           |\n| response_type | string         | url      | 接口返回数据格式: buffer, base64, url                                |\n| timeout       | integer        | 60000    | 单位 ms。如果未能在指定时间内截取图片，则返回 timeout 报错。 |\n| headers       | array          | null     | 请求头，如 Cookie:sessId=xxxxxxxx。\u003cbr /\u003e数组形式，get 里为 headers[], post 里为 headers。 |\n| wait_for      | integer/string | 200ms    | 等待指定时间 ms，或者等待某个元素出现 (css selector)。\u003cbr /\u003e如果找不到指定的元素，则报错 |\n| zoom          | integer        |          | 网页缩放 10 - 400                                            |\n| roi           | string         | null     | 截图区域，格式一：css 选择器，selector:#xxid；格式二：region:x,y,w,h\u003cbr /\u003enull代表整个页面 |\n| full_page     | boolean        |          | 为 true，则代表截取整个页面；false，则仅截取视窗             |\n| multi         | boolean        | false    | 是否多个元素截图                                             |\n| script        | string         | null     | 使用的内置截图脚本名称，不传则使用默认脚本                   |\n| custom_script | string         | null     | 自定义脚本，格式为：function(page) { /** 截图逻辑 */ }       |\n|               |                |          |                                                              |\n| format        | string         | jpeg     | 输出的文件格式: jpeg, png                                    |\n| width         | integer        | null     | 图片输出宽度。null 代表使用实际渲染的宽高                    |\n| height        | integer        | null     | 图片输出高度                                                 |\n| quality       | integer        | 80       | 图片输出质量 0 - 100                                         |\n|               |                |          |                                                              |\n| paper         | string         |          | 纸张类型：A4, A3, A2, A1, A0 等                              |\n| orientation   | string         | portrait | 方向，portrait, landscape                                    |\n| media         | string         | print    | 导出 pdf 的模式： screen 整屏, print 只输出打印区域          |\n|               |                |          |                                                              |\n| upload:type   | string         |          | 配置的上传方式                                            |\n| upload:path   | string         |          | 上传的路径                                   |\n\n#### 响应\n\nsuccess: 200\n\n```json\n{\n  \"filename\": \"xxxx\"\n}\n```\n\nerror: 400 校验数据错误\n\n```json\n{\n  \"error\": \"URL 无效\"\n}\n```\n\n截图服务的 User-Agent 中会加入 `Puppy`\n\n## 开发\n\n### 目录说明\n\n```\n.\n├── Dockerfile \n├── logs  日志输出目录\n└── src\n    ├── index.js      入口文件\n    ├── app.js      HTTP 服务\n    ├── configs      配置目录\n    │   ├── chrome.js  \n    │   └── index.js\n    ├── middleware       express 中间件\n    │   └── error-handler.js  错误处理中间件\n    ├── puppy          截图核心逻辑\n    │   ├── browser-manager.js 浏览器管理器，管理浏览器（页面）的创建、回收、销毁等\n    │   └── index.js      负责加载页面，查找 ROI，以及调度具体的处理器来执行逻辑\n    ├── handlers         截图处理器目录\n    │   ├── index.js\n    │   └── internal.js     内置截图处理器\n    └── utils          工具类\n        ├── index.js\n        └── logger.js\n```\n\n### Docker\n\n构建 container\n\n```shell\ndocker build -t puppy .\n```\n\n运行 container\n\n```shell\ndocker run --rm -d -p 4000:3000 -v xxxxxx/puppy/src:/app --cap-add=SYS_ADMIN --name puppy puppy\n```\n\n由于 docker 默认限制了 `/dev/shd` 共享内存为 64MB，完全不够 Chrome 使用。解决方法：\n\n```js\nconst browser = await puppeteer.launch({\n  args: ['--disable-dev-shm-usage'],\n});\n```\n\n更多问题，参考\n\u003chttps://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-in-docker\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliudding%2Fpuppy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliudding%2Fpuppy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliudding%2Fpuppy/lists"}