请使用微信扫描二维码
微信内请用右上角菜单:发送给朋友 / 分享到朋友圈
虾推啥
https://wx.xtuis.cn/ABCDEFG.send?text=黄金大涨&desp=黄金大涨100元
粘贴到网页浏览器的地址栏里,并用您的token替换其中的ABCDEFG,回车,即可收到微信通知。
下方示例基于同一个 GET 请求思路(将参数编码后拼到 URL)。请把 您的token 替换成你自己的 token。
curl -G 'https://wx.xtuis.cn/您的token.send' \
--data-urlencode 'text=黄金大涨' \
--data-urlencode 'desp=黄金大涨100元'
import requests
params = {
"text": "黄金大涨",
"desp": "黄金大涨100元",
}
response = requests.get(
"https://wx.xtuis.cn/您的token.send",
params=params,
timeout=10,
)
print(response.text)
const params = new URLSearchParams({
text: "黄金大涨",
desp: "黄金大涨100元",
});
fetch(`https://wx.xtuis.cn/您的token.send?${params.toString()}`)
.then((res) => res.text())
.then((text) => console.log(text));
const axios = require("axios");
axios
.get("https://wx.xtuis.cn/您的token.send", {
params: {
text: "黄金大涨",
desp: "黄金大涨100元",
},
timeout: 10000,
})
.then(({ data }) => console.log(data))
.catch((err) => console.error(err.message));
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
params := url.Values{}
params.Set("text", "黄金大涨")
params.Set("desp", "黄金大涨100元")
endpoint := "https://wx.xtuis.cn/您的token.send?" + params.Encode()
resp, err := http.Get(endpoint)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
<?php
$query = http_build_query([
'text' => '黄金大涨',
'desp' => '黄金大涨100元',
]);
$url = 'https://wx.xtuis.cn/您的token.send?' . $query;
$result = file_get_contents($url);
echo $result;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
HttpClient client = HttpClient.newHttpClient();
String query = "text=" + URLEncoder.encode("黄金大涨", StandardCharsets.UTF_8)
+ "&desp=" + URLEncoder.encode("黄金大涨100元", StandardCharsets.UTF_8);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://wx.xtuis.cn/您的token.send?" + query))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System;
using System.Net.Http;
using System.Threading.Tasks;
using var client = new HttpClient();
var query = $"text={Uri.EscapeDataString("黄金大涨")}&desp={Uri.EscapeDataString("黄金大涨100元")}";
var url = $"https://wx.xtuis.cn/您的token.send?{query}";
var result = await client.GetStringAsync(url);
Console.WriteLine(result);
require "uri"
require "net/http"
uri = URI("https://wx.xtuis.cn/您的token.send")
uri.query = URI.encode_www_form(
text: "黄金大涨",
desp: "黄金大涨100元"
)
response = Net::HTTP.get_response(uri)
puts response.body
use reqwest::blocking::Client;
use reqwest::Url;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut url = Url::parse("https://wx.xtuis.cn/您的token.send")?;
url.query_pairs_mut()
.append_pair("text", "黄金大涨")
.append_pair("desp", "黄金大涨100元");
let body = Client::new().get(url).send()?.text()?;
println!("{body}");
Ok(())
}
import java.net.URI
import java.net.URLEncoder
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.nio.charset.StandardCharsets
fun main() {
val query = "text=" + URLEncoder.encode("黄金大涨", StandardCharsets.UTF_8) +
"&desp=" + URLEncoder.encode("黄金大涨100元", StandardCharsets.UTF_8)
val request = HttpRequest.newBuilder()
.uri(URI.create("https://wx.xtuis.cn/您的token.send?$query"))
.GET()
.build()
val response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString())
println(response.body())
}
$text = [uri]::EscapeDataString("黄金大涨")
$desp = [uri]::EscapeDataString("黄金大涨100元")
$url = "https://wx.xtuis.cn/您的token.send?text=$text&desp=$desp"
$result = Invoke-RestMethod -Method Get -Uri $url
$result
POST 示例默认发送 application/x-www-form-urlencoded,字段名为 text 和 desp。
curl 'https://wx.xtuis.cn/您的token.send' \
--data-urlencode 'text=你的标题' \
--data-urlencode 'desp=最大支持64KB的文字内容'
import requests
payload = {
"text": "你的标题",
"desp": "最大支持64KB的文字内容",
}
response = requests.post(
"https://wx.xtuis.cn/您的token.send",
data=payload,
timeout=10,
)
print(response.text)
const body = new URLSearchParams({
text: "你的标题",
desp: "最大支持64KB的文字内容",
});
fetch("https://wx.xtuis.cn/您的token.send", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
body,
})
.then((res) => res.text())
.then((text) => console.log(text));
const axios = require("axios");
const form = new URLSearchParams({
text: "你的标题",
desp: "最大支持64KB的文字内容",
});
axios
.post("https://wx.xtuis.cn/您的token.send", form, {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
timeout: 10000,
})
.then(({ data }) => console.log(data))
.catch((err) => console.error(err.message));
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
form := url.Values{}
form.Set("text", "你的标题")
form.Set("desp", "最大支持64KB的文字内容")
resp, err := http.PostForm("https://wx.xtuis.cn/您的token.send", form)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
<?php
$payload = http_build_query([
'text' => '你的标题',
'desp' => '最大支持64KB的文字内容',
]);
$opts = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $payload,
],
];
$context = stream_context_create($opts);
$result = file_get_contents('https://wx.xtuis.cn/您的token.send', false, $context);
echo $result;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
HttpClient client = HttpClient.newHttpClient();
String form = "text=" + URLEncoder.encode("你的标题", StandardCharsets.UTF_8)
+ "&desp=" + URLEncoder.encode("最大支持64KB的文字内容", StandardCharsets.UTF_8);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://wx.xtuis.cn/您的token.send"))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(form))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using var client = new HttpClient();
var form = new FormUrlEncodedContent(new Dictionary<string, string>
{
["text"] = "你的标题",
["desp"] = "最大支持64KB的文字内容",
});
var response = await client.PostAsync("https://wx.xtuis.cn/您的token.send", form);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
require "uri"
require "net/http"
uri = URI("https://wx.xtuis.cn/您的token.send")
response = Net::HTTP.post_form(uri, {
"text" => "你的标题",
"desp" => "最大支持64KB的文字内容"
})
puts response.body
use reqwest::blocking::Client;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let body = Client::new()
.post("https://wx.xtuis.cn/您的token.send")
.form(&[
("text", "你的标题"),
("desp", "最大支持64KB的文字内容"),
])
.send()?
.text()?;
println!("{body}");
Ok(())
}
import java.net.URI
import java.net.URLEncoder
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.nio.charset.StandardCharsets
fun main() {
val form = "text=" + URLEncoder.encode("你的标题", StandardCharsets.UTF_8) +
"&desp=" + URLEncoder.encode("最大支持64KB的文字内容", StandardCharsets.UTF_8)
val request = HttpRequest.newBuilder()
.uri(URI.create("https://wx.xtuis.cn/您的token.send"))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(form))
.build()
val response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString())
println(response.body())
}
$body = @{
text = "你的标题"
desp = "最大支持64KB的文字内容"
}
$result = Invoke-RestMethod -Method Post `
-Uri "https://wx.xtuis.cn/您的token.send" `
-Body $body `
-ContentType "application/x-www-form-urlencoded"
$result
直接发送http请求
https://wx.xtuis.cn/您的token.send
参数说明:
例如:
https://wx.xtuis.cn/您的token.send?text=白银大涨&desp=白银2012超过5000
仅支持iPhone,使用步骤如下:
注册:Bark服务器-私有地址
https://bark.xtuis.cn?xia=您的token
使用:发送Bark的http请求
https://bark.xtuis.cn/您的token.send
参数说明:
例如:
https://bark.xtuis.cn/您的token.send?text=白银大涨&desp=白银2012超过5000
| 限制类别 | 限制条数 | 超过后处理规则 |
|---|---|---|
| 每日推送上限 | 300 | 账户可能被锁定;需在微信中打开 https://xtuis.cn/unlock/ 支付解锁 |
| 每分钟推送上限 | 10 | 账户可能被锁定;需在微信中打开 https://xtuis.cn/unlock/ 支付解锁 |
| 单ip每日http请求上限 | 5000 | 当前 IP 的请求可能被临时拒绝;更换出口 IP 后通常仍可继续推送(与账户锁定不同) |
需要更高推送额度?
以上限制适用于免费微信/Bark推送服务。如需更高推送限额,可按需升级到以下服务: 升级版 Email 通知 或 升级版 企业微信通知推送服务(请在微信中打开 xtuis.cn/payment/)。
每条消息发送后,虾推啥都会返回一个唯一的 msg_id。用这个 ID 可以查询这条消息最终的投递结果——是成功送达手机,还是因为某种原因失败了。常见用途:程序里加上失败重试、运维脚本里加上告警闭环、抢购脚本里确认通知确实到了。
msg_id 长这样:
wx_20260623164956_8db1c691e77fe369
查询接口(GET 请求):
https://msgstatus.xtuis.cn/status/你的msg_id
把 你的msg_id 换成实际拿到的 ID。例如:
https://msgstatus.xtuis.cn/status/wx_20260623164956_8db1c691e77fe369
返回内容会告诉你这条消息当前的状态(成功 / 失败 / 处理中),失败时会附带原因(比如 token 错误、未关注公众号、超限被锁定等),方便你在程序里做精确处理。
限流:同一个 IP 每分钟最多查询 5 次,超出会被拒绝(HTTP 429)。如果你在重试退避逻辑里循环查询,记得加上间隔,避免触发限流。
需要更详细的技术信息(msg_id 生成规则、状态码定义、查询接口实现细节),请参阅项目关于 msg_id 状态追踪的设计文档。
Agent Xtuis CLI 是专为 AI Agent 打造的命令行工具——让 Agent 直接用一条 shell 命令(xtuis send)把消息推到你的手机。CLI 本身不绑定具体 Agent,Claude Code、Codex、Cline 等都能直接调用;不需要 Agent 自己拼 HTTP 请求、不需要在对话里暴露 token,全部走本地配置文件。
「自然语言一句话触发推送」的 Skill 自动适配目前仅支持 Claude Code(在 ~/.claude/skills/ 装一个 SKILL.md,Claude 会自动识别)。Codex / Cline 等其他 Agent 暂时通过 xtuis send 显式调用即可——后续会补上各自的 Skill 适配。
一句话,让 Agent 自己装好:
请阅读 https://xtuis.cn/doc/cli-setup.md 文档,按照步骤为我安装并配置 Agent Xtuis CLI。
把上面这句话发给你的 AI Agent,它会自动读取官方安装文档,独立完成 CLI 安装 → Skill 注册 → Token 配置 → 测试推送 全流程——整个过程中 Token 不会出现在对话里(Agent 会引导你自己在终端输入),你只需要最后看一眼手机,确认测试通知收到了。
装好后,你可以直接用自然语言指挥 Agent:
完整安装指南与命令清单:https://xtuis.cn/doc/cli-setup.md
如果你觉得「虾推啥」帮到了你, 如果你愿意轻轻表达一句“谢谢”—— 我们准备了一个赞赏通道。 它不是付费墙,不是充值入口, 只是你和我们之间的一次小小链接。 💡 不论是否赞赏,服务都将照常运行。 你的支持,只会让我们更有动力, 在深夜,也继续把消息送达你想要的地方。
虾推啥是一个能让你轻松地使用一行代码(一个http请求)就可以推送消息到手机通知的工具服务。
短时间内大量请求,或推送超过上方「推送限制」中的上限,账户会被锁定,无法再推送。锁定后需在微信中打开 https://xtuis.cn/unlock/ 支付后自动解锁。
请在微信里打开 https://xtuis.cn/unlock/,系统会自动识别当前微信账号,支付完成后自动解锁。若仍有问题,发 E-mail 给 weixin@xtuis.cn。
检测到微信打开。可一键填入你的 Token 到下方示例(默认脱敏显示)。