# Send v2ex to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "v2ex",
    "name": "v2ex",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/timqian/v2ex",
    "canonicalUrl": "https://clawhub.ai/timqian/v2ex",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/v2ex",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=v2ex",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "v2ex",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-12T20:27:39.601Z",
      "expiresAt": "2026-05-19T20:27:39.601Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=v2ex",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=v2ex",
        "contentDisposition": "attachment; filename=\"v2ex-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "v2ex"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/v2ex"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/v2ex",
    "downloadUrl": "https://openagent3.xyz/downloads/v2ex",
    "agentUrl": "https://openagent3.xyz/skills/v2ex/agent",
    "manifestUrl": "https://openagent3.xyz/skills/v2ex/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/v2ex/agent.md"
  }
}
```
## Documentation

### Overview

This skill provides integration with V2EX API 2.0 Beta, allowing you to access V2EX forum functionality including notifications, topics, nodes, and member information.

### Authentication

V2EX API 2.0 requires a Personal Access Token for authentication.

Visit https://www.v2ex.com/settings/tokens to create a token
Use the token in the Authorization header: Authorization: Bearer <your-token>
Store your token securely (e.g., in environment variables)

### API Base URL

https://www.v2ex.com/api/v2/

### Notifications

Get Latest Notifications

GET /notifications

Optional parameters:

p - Page number (default: 1)

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/notifications?p=1"

Delete a Notification

DELETE /notifications/:notification_id

Example:

curl -X DELETE \\
  -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/notifications/123456"

### Member

Get Your Profile

GET /member

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/member"

### Token

Get Current Token Info

GET /token

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/token"

### Nodes

Get Node Information

GET /nodes/:node_name

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/nodes/programmer"

Get Topics in a Node

GET /nodes/:node_name/topics

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/nodes/programmer/topics"

### Topics

Get Hot Topics (Classic API)

GET https://www.v2ex.com/api/topics/hot.json

Returns the currently trending topics across all nodes. No authentication required.

Example:

curl -s "https://www.v2ex.com/api/topics/hot.json"

Get Latest Topics (Classic API)

GET https://www.v2ex.com/api/topics/latest.json

Returns the most recent topics across all nodes. No authentication required.

Example:

curl -s "https://www.v2ex.com/api/topics/latest.json"

Get Topic Details (API v2)

GET /topics/:topic_id

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/topics/12345"

Get Topic Replies (API v2)

GET /topics/:topic_id/replies

Example:

curl -H "Authorization: Bearer <token>" \\
  "https://www.v2ex.com/api/v2/topics/12345/replies"

### Rate Limiting

Default rate limit: 600 requests per hour per IP

Rate limit headers in responses:

X-Rate-Limit-Limit - Total allowed requests
X-Rate-Limit-Reset - Unix timestamp when limit resets
X-Rate-Limit-Remaining - Remaining requests in current window

Note: CDN-cached requests only consume rate limit on the first request.

### Check New Notifications

Call GET /notifications to fetch latest notifications
Parse the response for unread items
Optionally delete notifications after reading

### Browse Hot Topics

Call GET /api/topics/hot.json to get trending topics (no token required)
Parse response to see popular discussions across all nodes
Use topic URLs or IDs to view details on V2EX website

### Browse Node Topics

Call GET /nodes/:node_name/topics to get topics
Use topic IDs to fetch detailed information with GET /topics/:topic_id
Fetch replies with GET /topics/:topic_id/replies

### Monitor Specific Topics

Store topic IDs of interest
Periodically poll GET /topics/:topic_id for updates
Check GET /topics/:topic_id/replies for new comments

### Response Format

All API responses are in JSON format. Common fields include:

success - Boolean indicating request success
message - Error message if request failed
Data fields specific to each endpoint

### Error Handling

Common HTTP status codes:

200 - Success
401 - Unauthorized (invalid or missing token)
403 - Forbidden (insufficient permissions)
404 - Not found
429 - Rate limit exceeded
500 - Server error

### Best Practices

Store Personal Access Tokens securely (environment variables, not in code)
Handle rate limits by checking headers and implementing backoff
Cache responses when appropriate to reduce API calls
Use pagination for endpoints that support it
Handle errors gracefully with user-friendly messages

### References

V2EX API Documentation: https://www.v2ex.com/help/api
Personal Access Tokens: https://www.v2ex.com/settings/tokens
V2EX API Node: https://www.v2ex.com/go/v2ex-api

### Example Implementation (Python)

import os
import requests

class V2EXClient:
    BASE_URL = "https://www.v2ex.com/api/v2"
    
    def __init__(self, token=None):
        self.token = token or os.environ.get('V2EX_TOKEN')
        if not self.token:
            raise ValueError("V2EX token is required")
        self.headers = {
            "Authorization": f"Bearer {self.token}"
        }
    
    def get_notifications(self, page=1):
        """Get latest notifications"""
        response = requests.get(
            f"{self.BASE_URL}/notifications",
            headers=self.headers,
            params={"p": page}
        )
        response.raise_for_status()
        return response.json()
    
    def delete_notification(self, notification_id):
        """Delete a specific notification"""
        response = requests.delete(
            f"{self.BASE_URL}/notifications/{notification_id}",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_member(self):
        """Get current member profile"""
        response = requests.get(
            f"{self.BASE_URL}/member",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_node(self, node_name):
        """Get node information"""
        response = requests.get(
            f"{self.BASE_URL}/nodes/{node_name}",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_node_topics(self, node_name):
        """Get topics in a node"""
        response = requests.get(
            f"{self.BASE_URL}/nodes/{node_name}/topics",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_topic(self, topic_id):
        """Get topic details"""
        response = requests.get(
            f"{self.BASE_URL}/topics/{topic_id}",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_topic_replies(self, topic_id):
        """Get replies for a topic"""
        response = requests.get(
            f"{self.BASE_URL}/topics/{topic_id}/replies",
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()
    
    def get_hot_topics(self):
        """Get trending topics across all nodes (classic API, no token required)"""
        response = requests.get("https://www.v2ex.com/api/topics/hot.json")
        response.raise_for_status()
        return response.json()
    
    def get_latest_topics(self):
        """Get latest topics across all nodes (classic API, no token required)"""
        response = requests.get("https://www.v2ex.com/api/topics/latest.json")
        response.raise_for_status()
        return response.json()

# Usage example
if __name__ == "__main__":
    client = V2EXClient()
    
    # Get notifications
    notifications = client.get_notifications()
    print(f"You have {len(notifications.get('result', []))} notifications")
    
    # Get member profile
    member = client.get_member()
    print(f"Hello, {member.get('result', {}).get('username')}!")
    
    # Get node info
    node = client.get_node("python")
    print(f"Node: {node.get('result', {}).get('title')}")
    
    # Get topics from a node
    topics = client.get_node_topics("python")
    for topic in topics.get('result', []):
        print(f"- {topic.get('title')}")
    
    # Get hot topics (no token required)
    hot_topics = client.get_hot_topics()
    print("\\n🔥 Hot Topics:")
    for topic in hot_topics[:5]:
        print(f"- [{topic['node']['title']}] {topic['title']} ({topic['replies']} replies)")

### Testing with REST Client

You can use VS Code's REST Client extension to test the API:

### Get hot topics (classic API, no auth required)
GET https://www.v2ex.com/api/topics/hot.json

### Get latest topics (classic API, no auth required)
GET https://www.v2ex.com/api/topics/latest.json

### Get notifications
GET https://www.v2ex.com/api/v2/notifications
Authorization: Bearer <your-token>

### Get member profile
GET https://www.v2ex.com/api/v2/member
Authorization: Bearer <your-token>

### Get node info
GET https://www.v2ex.com/api/v2/nodes/programmer
Authorization: Bearer <your-token>

### Get topic
GET https://www.v2ex.com/api/v2/topics/12345
Authorization: Bearer <your-token>
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: timqian
- Version: 1.0.0
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-05-12T20:27:39.601Z
- Expires at: 2026-05-19T20:27:39.601Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/v2ex)
- [Send to Agent page](https://openagent3.xyz/skills/v2ex/agent)
- [JSON manifest](https://openagent3.xyz/skills/v2ex/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/v2ex/agent.md)
- [Download page](https://openagent3.xyz/downloads/v2ex)