Token导航 LogoToken导航TokenDH.com
研究检索external-serviceclawhub未标认证来源可访问clear审计提醒

websearch-free-skill网络搜索免费技能

Agent Skill

websearch-free-skill 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

17,283

周安装

713

GitHub Stars

公开资料未说明

下载量

5,647
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:websearch-free-skill(网络搜索免费技能)
来源仓库:https://github.com/roryyu/websearch-free-skill
安装命令:
openclaw skills install websearch-free-skill
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install websearch-free-skill

简介

整合多种搜索引擎与 API 执行通用网络搜索任务。

  • 适合快速获取公开信息、竞品分析或背景调研等开放式查询。
  • 通过 clawhub 安装,无需额外配置密钥,开箱即用。
  • 实际效果取决于所接入引擎的覆盖范围与实时性,可能存在延迟或缺失。
  • websearch-free-skill 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

name
websearch
description
Perform web searches using various search engines and APIs.
metadata
{ "openclaw": { "emoji": "🔍", "requires": { "bins": ["node","npm"] } } }

Web Search Skill / 网络搜索技能

Perform web searches using various search engines and APIs. This skill provides access to search functionality without requiring API keys for basic usage.

使用各种搜索引擎和API进行网络搜索。此技能提供搜索功能访问,无需API密钥即可进行基本操作。

Features / 功能特性

  • URL Content Extraction: Read and extract content from any web page URL

URL内容提取: 从任意网页URL读取和提取内容

  • Keyword Search: Search for specific keywords and return specified number of results

关键词搜索: 搜索特定关键词并返回指定数量的结果

  • Dependency Management: Automatic dependency installation via npm

依赖管理: 通过npm自动安装依赖项

Basic Usage / 基础用法

Read content from a specific URL:

从特定URL读取内容:

node ./search.js <url> [previewLength]

Parameters / 参数:

  • url: The URL to read (required)

要读取的URL(必需)

  • previewLength: Number of characters to preview (optional, default: 200, use 0 to disable preview)

预览字符数(可选,默认:200,使用0禁用预览)

Examples / 示例:

# Default preview (200 characters)
# 默认预览(200字符)
node ./search.js https://www.example.com

# Preview 500 characters
# 预览500字符
node ./search.js https://www.example.com 500

# No preview (show only metadata)
# 无预览(仅显示元数据)
node ./search.js https://www.example.com 0

Output Format / 输出格式:

  • Title / 标题
  • URL
  • Platform / 平台
  • Content length / 内容长度
  • Content preview / 内容预览(可选)

Advanced Usage / 高级用法

Search with specific keyword and result limit:

使用特定关键词和结果限制进行搜索:

node ./exasearch.js <keyword> [numResults]

Parameters / 参数:

  • keyword: Search query string (required)

搜索查询字符串(必需)

  • numResults: Number of results to return (optional, default: 10, max: 100)

返回结果数量(可选,默认:10,最大:100)

Examples / 示例:

# Basic search with default 10 results
# 默认10个结果的基础搜索
node ./exasearch.js "artificial intelligence"

# Search with 20 results
# 搜索20个结果
node ./exasearch.js "machine learning" 20

# Search with 50 results
# 搜索50个结果
node ./exasearch.js "deep learning" 50

Setup / 安装设置

First-time setup requires installing dependencies:

首次使用需要安装依赖:

Prerequisites / 前置要求:

  • Node.js v22 or higher / Node.js v22 或更高版本
  • npm or yarn
npm install

Dependencies / 依赖项:

  • axios: HTTP client for web requests

HTTP客户端,用于网络请求

  • mcporter: Tool integration framework

工具集成框架

Error Handling / 错误处理

The scripts include comprehensive error handling for:

脚本包含全面的错误处理:

  • Missing required parameters / 缺少必需参数
  • Invalid parameter values / 无效参数值
  • Network connection errors / 网络连接错误
  • HTTP request failures / HTTP请求失败
  • Server timeout errors / 服务器超时错误

Technical Details / 技术细节

  • Backend / 后端: Jina Reader API (https://r.jina.ai)
  • Timeout / 超时: 15 seconds for web requests / 网络请求15秒
  • Output Format / 输出格式: JSON / Markdown
  • Search Provider / 搜索提供商: Exa API (via mcporter)

Logic Examples / 逻辑示例

ReadResult.js - Result Object Class

export class ReadResult {
  constructor(title, content, url, platform = "web") {
    this.title = title;
    this.content = content;
    this.url = url;
    this.platform = platform;
  }

  toDict() {
    return {
      title: this.title,
      content: this.content,
      url: this.url,
      platform: this.platform
    };
  }
}

search.js - URL Content Extraction

import axios from 'axios';
import { ReadResult } from './ReadResult.js';

class WebChannel {
  constructor() {
    this.JINA_URL = "https://r.jina.ai/";
  }

  async read(url) {
    try {
      const response = await axios.get(`${this.JINA_URL}${url}`, {
        headers: {
          'Accept': 'text/markdown'
        },
        timeout: 15000
      });

      const text = response.data;
      let title = url;
      const lines = text.split('\
');
      
      for (const line of lines) {
        const trimmedLine = line.trim();
        if (trimmedLine.startsWith('# ')) {
          title = trimmedLine.substring(2).trim();
          break;
        }
        if (trimmedLine.startsWith('Title:')) {
          title = trimmedLine.substring(6).trim();
          break;
        }
      }

      return new ReadResult(title, text, url, "web");

    } catch (error) {
      if (error.response) {
        throw new Error(`HTTP ${error.response.status}: ${error.response.statusText}`);
      } else if (error.request) {
        throw new Error('Network error: No response received');
      } else {
        throw new Error(`Request failed: ${error.message}`);
      }
    }
  }
}

async function main() {
  const url = process.argv[2];
  const previewLength = process.argv[3] ? parseInt(process.argv[3], 10) : 200;
  
  if (!url) {
    console.error('Usage: node search.js <url> [previewLength]');
    console.error('  url: The URL to read');
    console.error('  previewLength: Number of characters to preview (optional, default: 200)');
    process.exit(1);
  }

  if (isNaN(previewLength) || previewLength < 0) {
    console.error('Error: previewLength must be a non-negative integer');
    process.exit(1);
  }

  const webChannel = new WebChannel();
  
  try {
    console.log(`Reading: ${url}`);
    const result = await webChannel.read(url);
    
    console.log('\
=== Read Result ===');
    console.log(`Title: ${result.title}`);
    console.log(`URL: ${result.url}`);
    console.log(`Platform: ${result.platform}`);
    console.log(`Content length: ${result.content.length} characters`);
    
    if (previewLength > 0) {
      console.log(`\
First ${previewLength} characters of content:`);
      const preview = result.content.substring(0, previewLength);
      console.log(preview + (result.content.length > previewLength ? '...' : ''));
    }
    
  } catch (error) {
    console.error('Error reading web page:', error.message);
    process.exit(1);
  }
}

main();

exasearch.js - Keyword Search

import { callOnce } from "mcporter";

async function main() {
  const keyword = process.argv[2];
  const num = process.argv[3];

  if (!keyword) {
    console.error('Error: Search keyword is required');
    console.error('Usage: node exasearch.js <keyword> [numResults]');
    process.exit(1);
  }

  const numResults = num ? parseInt(num, 10) : 10;

  if (isNaN(numResults) || numResults < 1) {
    console.error('Error: numResults must be a positive integer');
    process.exit(1);
  }

  if (numResults > 100) {
    console.error('Error: numResults cannot exceed 100');
    process.exit(1);
  }

  try {
    console.log(`Searching for: ${keyword}`);
    console.log(`Number of results: ${numResults}`);
    
    const result = await callOnce({
      server: "exa",
      toolName: "web_search_exa",
      args: { query: keyword, numResults: numResults },
    });

    console.log('\
=== Search Results ===');
    console.log(JSON.stringify(result, null, 2));
    
  } catch (error) {
    console.error('Error during search:', error.message);
    
    if (error.response) {
      console.error(`HTTP ${error.response.status}: ${error.response.statusText}`);
    } else if (error.request) {
      console.error('Network error: No response received from server');
    } else if (error.code === 'ECONNREFUSED') {
      console.error('Connection refused: Unable to reach the search server');
    } else if (error.code === 'ETIMEDOUT') {
      console.error('Request timeout: Server took too long to respond');
    }
    
    process.exit(1);
  }
}

main();

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

87.07%
按下载量换算4,917

安全审计

VirusTotal

通过

ClawScan

可疑

Static analysis

通过

权限和风险

external-service

该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills