<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC</id>
	<title>查看Xray中各用户流量使用情况的脚本 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;action=history"/>
	<updated>2026-04-05T14:30:24Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1425&amp;oldid=prev</id>
		<title>2026年2月18日 (三) 15:27 Koud Wind</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1425&amp;oldid=prev"/>
		<updated>2026-02-18T15:27:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年2月18日 (三) 08:27的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l222&quot;&gt;第222行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第222行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;main &amp;quot;$@&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;main &amp;quot;$@&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;推荐配置定时任务:&#039;&#039;&#039;&amp;lt;syntaxhighlight line=&quot;1&quot;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TZ=Asia/Shanghai&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;# 每月8号早上7点重置统计信息&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;0 7 8 * * /usr/local/bin/xray api statsquery -s=127.0.0.1:8080 -reset=true &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;# 每天早上7点重启日志记录器&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;0 7 * * * /usr/local/bin/xray api restartlogger -s=127.0.0.1:8080&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff:1.41:old-1424:rev-1425:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1424&amp;oldid=prev</id>
		<title>Koud Wind：​创建页面，内容为“== 预览 == ----1104x1104px ----  == 要求 == Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&lt;code&gt;email&lt;/code&gt;与&lt;code&gt;level&lt;/code&gt;  &#039;&#039;&#039;配置参考:&#039;&#039;&#039; &lt;syntaxhi…”</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1424&amp;oldid=prev"/>
		<updated>2026-02-18T15:18:33Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“== 预览 == ----&lt;a href=&quot;/index.php?title=File:%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC-%E9%A2%84%E8%A7%881.png&quot; title=&quot;File:查看Xray中各用户流量使用情况的脚本-预览1.png&quot;&gt;alt=|frameless|1104x1104px&lt;/a&gt; ----  == 要求 == Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt;  &amp;#039;&amp;#039;&amp;#039;配置参考:&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhi…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 预览 ==&lt;br /&gt;
----[[File:查看Xray中各用户流量使用情况的脚本-预览1.png|alt=|frameless|1104x1104px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 要求 ==&lt;br /&gt;
Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;配置参考:&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stats&amp;quot;: {},&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;api&amp;quot;: {&lt;br /&gt;
    &amp;quot;tag&amp;quot;: &amp;quot;API&amp;quot;,&lt;br /&gt;
    &amp;quot;listen&amp;quot;: &amp;quot;127.0.0.1:8080&amp;quot;,&lt;br /&gt;
    &amp;quot;services&amp;quot;: [&lt;br /&gt;
      &amp;quot;LoggerService&amp;quot;,&lt;br /&gt;
      &amp;quot;StatsService&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;policy&amp;quot;: {&lt;br /&gt;
    &amp;quot;levels&amp;quot;: {&lt;br /&gt;
      &amp;quot;0&amp;quot;: {&lt;br /&gt;
        &amp;quot;handshake&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;connIdle&amp;quot;: 600,&lt;br /&gt;
        &amp;quot;statsUserUplink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserDownlink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserOnline&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;system&amp;quot;: {&lt;br /&gt;
      &amp;quot;statsInboundUplink&amp;quot;: true,&lt;br /&gt;
      &amp;quot;statsInboundDownlink&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;&amp;#039;&amp;#039;用户配置参考:&amp;#039;&amp;#039;&amp;#039;&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;UserId123456&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;易于标识的名称&amp;quot;,&lt;br /&gt;
    &amp;quot;level&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 内容 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
XRAY_BIN=&amp;quot;${XRAY_BIN:-xray}&amp;quot;&lt;br /&gt;
# 自行修改 Xray API 地址&lt;br /&gt;
SERVER=&amp;quot;${1:-127.0.0.1:8080}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
declare -A IN_UP IN_DOWN IN_TOTAL&lt;br /&gt;
declare -A U_UP U_DOWN U_TOTAL&lt;br /&gt;
declare -A USERSET&lt;br /&gt;
&lt;br /&gt;
bytes_to_gb() {&lt;br /&gt;
  local b=&amp;quot;${1-}&amp;quot;&lt;br /&gt;
  if [[ -z &amp;quot;${b}&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;null&amp;quot;&lt;br /&gt;
    return 0&lt;br /&gt;
  fi&lt;br /&gt;
  awk -v b=&amp;quot;${b}&amp;quot; &amp;#039;BEGIN{printf &amp;quot;%.3f&amp;quot;, b/1024/1024/1024}&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
normalize_stats_objects() {&lt;br /&gt;
  tr -d &amp;#039;\n\r\t &amp;#039; \&lt;br /&gt;
  | grep -oE &amp;#039;\{&amp;quot;name&amp;quot;:&amp;quot;[^&amp;quot;]+&amp;quot;,&amp;quot;value&amp;quot;:[0-9]+\}&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extract_field() {&lt;br /&gt;
  local obj=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local key=&amp;quot;$2&amp;quot;&lt;br /&gt;
  echo &amp;quot;$obj&amp;quot; | sed -nE &amp;quot;s/.*\&amp;quot;${key}\&amp;quot;:\&amp;quot;?([^\&amp;quot;,}]*)\&amp;quot;?.*/\1/p&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
accumulate_stats() {&lt;br /&gt;
  local stats_json=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local line name value kind tag dir email&lt;br /&gt;
&lt;br /&gt;
  while IFS= read -r line; do&lt;br /&gt;
    [[ -z &amp;quot;$line&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    name=&amp;quot;$(extract_field &amp;quot;$line&amp;quot; &amp;quot;name&amp;quot;)&amp;quot;&lt;br /&gt;
    [[ -z &amp;quot;$name&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    value=&amp;quot;$(echo &amp;quot;$line&amp;quot; | sed -nE &amp;#039;s/.*&amp;quot;value&amp;quot;:([0-9]+).*/\1/p&amp;#039;)&amp;quot;&lt;br /&gt;
    value=&amp;quot;${value:-0}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    kind=&amp;quot;$(awk -F&amp;#039;&amp;gt;&amp;gt;&amp;gt;&amp;#039; &amp;#039;{print $1}&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$kind&amp;quot; == &amp;quot;inbound&amp;quot; ]]; then&lt;br /&gt;
      tag=&amp;quot;$(awk -F&amp;#039;&amp;gt;&amp;gt;&amp;gt;&amp;#039; &amp;#039;{print $2}&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&amp;#039;&amp;gt;&amp;gt;&amp;gt;&amp;#039; &amp;#039;{print $4}&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        IN_UP[&amp;quot;$tag&amp;quot;]=$(( ${IN_UP[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        IN_DOWN[&amp;quot;$tag&amp;quot;]=$(( ${IN_DOWN[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      IN_TOTAL[&amp;quot;$tag&amp;quot;]=$(( ${IN_TOTAL[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
&lt;br /&gt;
    elif [[ &amp;quot;$kind&amp;quot; == &amp;quot;user&amp;quot; ]]; then&lt;br /&gt;
      email=&amp;quot;$(awk -F&amp;#039;&amp;gt;&amp;gt;&amp;gt;&amp;#039; &amp;#039;{print $2}&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&amp;#039;&amp;gt;&amp;gt;&amp;gt;&amp;#039; &amp;#039;{print $4}&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      USERSET[&amp;quot;$email&amp;quot;]=1&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        U_UP[&amp;quot;$email&amp;quot;]=$(( ${U_UP[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        U_DOWN[&amp;quot;$email&amp;quot;]=$(( ${U_DOWN[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      U_TOTAL[&amp;quot;$email&amp;quot;]=$(( ${U_TOTAL[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt; &amp;lt;(echo &amp;quot;$stats_json&amp;quot; | normalize_stats_objects)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
query_online_ips() {&lt;br /&gt;
  local email=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local out pairs status&lt;br /&gt;
&lt;br /&gt;
  out=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsonlineiplist -s=&amp;quot;$SERVER&amp;quot; -email &amp;quot;$email&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  pairs=&amp;quot;$(echo &amp;quot;$out&amp;quot; | tr -d &amp;#039;\n\r\t &amp;#039; \&lt;br /&gt;
  | grep -oE &amp;#039;&amp;quot;([0-9]{1,3}\.){3}[0-9]{1,3}&amp;quot;:[0-9]+&amp;#039; \&lt;br /&gt;
  | sed -E &amp;#039;s/&amp;quot;//g&amp;#039; \&lt;br /&gt;
  | awk -F: &amp;#039;{&lt;br /&gt;
      ip=$1&lt;br /&gt;
      ts=$2&lt;br /&gt;
      cmd=&amp;quot;TZ=Asia/Shanghai date -d @&amp;quot;ts&amp;quot; \&amp;quot;+%Y-%m-%d %H:%M:%S\&amp;quot;&amp;quot;&lt;br /&gt;
      cmd | getline t&lt;br /&gt;
      close(cmd)&lt;br /&gt;
      printf &amp;quot;%s(%s) &amp;quot;, ip, t&lt;br /&gt;
    }&amp;#039; \&lt;br /&gt;
  | sed -E &amp;#039;s/[[:space:]]+$//&amp;#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -n &amp;quot;$pairs&amp;quot; ]]; then&lt;br /&gt;
    status=&amp;quot;ONLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;$status&amp;quot;&lt;br /&gt;
    echo &amp;quot;$pairs&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;OFFLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;-&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  local stats_json&lt;br /&gt;
  stats_json=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsquery --server=&amp;quot;$SERVER&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
  #echo &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -z &amp;quot;$stats_json&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
    echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  accumulate_stats &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
  echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for tag in &amp;quot;${!IN_TOTAL[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$tag&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r tag; do&lt;br /&gt;
    local up down total up_s down_s total_s&lt;br /&gt;
&lt;br /&gt;
    if [[ -v IN_UP[&amp;quot;$tag&amp;quot;] ]]; then up=&amp;quot;${IN_UP[&amp;quot;$tag&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_DOWN[&amp;quot;$tag&amp;quot;] ]]; then down=&amp;quot;${IN_DOWN[&amp;quot;$tag&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_TOTAL[&amp;quot;$tag&amp;quot;] ]]; then total=&amp;quot;${IN_TOTAL[&amp;quot;$tag&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;$tag&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for email in &amp;quot;${!USERSET[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$email&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r email; do&lt;br /&gt;
    local up down total up_s down_s total_s status ips&lt;br /&gt;
    local qout&lt;br /&gt;
&lt;br /&gt;
    if [[ -v U_UP[&amp;quot;$email&amp;quot;] ]]; then up=&amp;quot;${U_UP[&amp;quot;$email&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_DOWN[&amp;quot;$email&amp;quot;] ]]; then down=&amp;quot;${U_DOWN[&amp;quot;$email&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_TOTAL[&amp;quot;$email&amp;quot;] ]]; then total=&amp;quot;${U_TOTAL[&amp;quot;$email&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    qout=&amp;quot;$(query_online_ips &amp;quot;$email&amp;quot;)&amp;quot;&lt;br /&gt;
    status=&amp;quot;$(sed -n &amp;#039;1p&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
    ips=&amp;quot;$(sed -n &amp;#039;2p&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; \&lt;br /&gt;
      &amp;quot;$email&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot; &amp;quot;$status&amp;quot; &amp;quot;$ips&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
</feed>