fix: 对齐平台渠道与最新情报快照

2026-08-14 平台渠道专项更新:前端和静态SEO只展示平台官网、官方入驻及非中文入驻页辅助翻译;移除类目入口翻译、消费者官网翻译和内部成熟度/新兴参考分文案。

同步59/59权威源、65场跨境活动、28个平台和208条趋势内容;修正IBTE、CCBEC、法国教育部、Shopee和Shopify语种判断,更新README与CHANGELOG并通过Python、Node及静态构建验证。
This commit is contained in:
Jack
2026-08-14 22:18:51 +08:00
parent f1ce583fd1
commit 7e74bd989e
14 changed files with 64302 additions and 63460 deletions
+24
View File
@@ -2,6 +2,30 @@
本文件按日期倒序记录独立版的代码、数据、交互和部署变化。每次提交必须先更新本文件,确保公司研发人员可以判断影响范围并使用 `git revert <commit>` 回滚。
## 2026-08-14 - 平台渠道入口与数据快照对齐
### 解决的问题
- 旧数据契约为平台类目页、消费者官网和官方入驻页分别生成翻译字段,导致每张卡出现多组无意义的“译文版”按钮。
- 平台类目成熟度、新兴渠道参考分等内部排序依据仍显示在前台,容易被误解为实时市场指标。
- IBTE 英文官网曾被中文来源名称覆盖为中文站点;CCBEC、贸促会、Shopee 和 Shopify 中文入口也存在误判风险。
- 主站与独立站的业务快照不同步,独立站少了最新活动和时装趋势内容。
### 数据与交互调整
- 平台卡只展示平台官网和官方入驻入口;类目 URL 保留在 JSON 中供内部研究使用,不再展示“查看家纺类目”。
- 只为非中文官方入驻页生成 `seller_*` 翻译字段和“辅助翻译入驻说明”;删除 `official_*`、`homepage_*` 翻译字段。
- Shopify 官网与入驻页相同时只显示一个中文入口;Shopee 中文入驻页不显示翻译。
- URL 语言标记和已核实域名优先于来源中文标题,保证 IBTE 有翻译,CCBEC 与中文政务/平台页面无翻译。
- 隐藏家纺类目成熟度和新兴渠道参考分文案,排序逻辑仍保留在生成端。
- 独立站同步主站通过严格核验的同一份快照:59/59 个权威源、79 场展会、65 场跨境活动、28 个平台、208 条趋势与灵感内容。
### SEO、验证与回滚
- 平台详情静态页同步为平台官网、官方入驻和可选入驻翻译三类链接,避免搜索引擎索引无效翻译入口。
- 验证命令:`python -m unittest discover -s tests`、`node --test tests/test_frontend.mjs`、`python scripts/build_site.py`。
- 回滚时对本提交执行 `git revert <commit>`,并重新构建整份 `dist/`;代码与两份公开 JSON 必须保持同一提交版本。
## 2026-08-14 - 公司 Git 首次发布基线
### 新增
+5 -3
View File
@@ -12,13 +12,13 @@
|---|---:|
| 严格权威源 | 59/59 |
| 日历原始事件 / 聚合机会 | 1270 / 673 |
| 今日必看 | 23 |
| 今日必看 | 24 |
| 展会 | 79 |
| 政策与召回 | 48 |
| 标准事实 | 4 |
| 跨境平台 | 28 |
| 跨境活动 | 48 |
| 趋势与灵感内容 | 206 |
| 跨境活动 | 65 |
| 趋势与灵感内容 | 208 |
这些数字是可回归的仓库快照,不是写死在页面里的宣传数字。每次数据更新后,应以 `textile-intelligence.json.summary`、`source_target/source_success` 和 `textile-trends.json.total_items` 重新核对。
@@ -51,6 +51,8 @@ flowchart LR
| 趋势雷达 | 趋势文章、灵感图库、时装趋势和原图查看 | RSS/HTML/博物馆公开 API,URL 与标题规则去重 |
| SEO/GEO | 可直接索引的中文正文和稳定实体页面 | 静态 HTML、canonical、JSON-LD、Sitemap、robots、llms.txt |
平台渠道页只向用户展示“平台官网”和“官方入驻”两个真实业务入口。类目 URL 仅作为内部研究数据保留,不在前台展示;消费者官网和类目页不提供网页翻译,只有非中文官方入驻页才显示“辅助翻译入驻说明”。
## AI、模型与渠道清单
### 当前没有的模型链路
+166 -166
View File
@@ -1,6 +1,6 @@
{
"version": 4,
"generated_at": "2026-08-14T07:28:03.180959Z",
"generated_at": "2026-08-14T13:45:57.799409Z",
"target_sources": 59,
"success_sources": 59,
"failed_sources": 0,
@@ -36,12 +36,12 @@
"status_code": 200,
"final_url": "https://date.nager.at/api/v3/AvailableCountries",
"content_type": "application/json",
"elapsed_ms": 1895,
"elapsed_ms": 864,
"size_bytes": 8289,
"content_hash": "563c533783c48a20df89f25c7aa6ae247762b74713626daca2b41d876e71292d",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:31.738724Z",
"checked_at": "2026-08-14T13:45:23.416809Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -81,12 +81,12 @@
"status_code": 200,
"final_url": "https://www.gov.uk/bank-holidays.json",
"content_type": "application/json",
"elapsed_ms": 1616,
"elapsed_ms": 835,
"size_bytes": 22207,
"content_hash": "098670970a96058d9c1f2f39eeb851d2031d10fad05bd96cf9a3d1121f344af1",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:31.738724Z",
"checked_at": "2026-08-14T13:45:23.416809Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -125,12 +125,12 @@
"status_code": 200,
"final_url": "https://www.gov.uk/school-term-holiday-dates",
"content_type": "text/html",
"elapsed_ms": 2105,
"elapsed_ms": 1878,
"size_bytes": 66394,
"content_hash": "52e6a5ab9e4e16be08697bd3485bd0e18dbd8526b9fb2d7dd9399c479f792ec3",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:33.356106Z",
"checked_at": "2026-08-14T13:45:23.416809Z",
"page_title": "School term and holiday dates",
"page_description": "Find your child's school term, half term and holiday dates on your local council's website",
"page_language": "en",
@@ -169,12 +169,12 @@
"status_code": 200,
"final_url": "https://www.kmk.org/service/ferienregelung.html",
"content_type": "text/html",
"elapsed_ms": 2149,
"elapsed_ms": 1760,
"size_bytes": 99471,
"content_hash": "10d8951cfda15eb437d6bf74813b5e484818aeb9af39c655289284a3af6fc6ca",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:33.634637Z",
"checked_at": "2026-08-14T13:45:23.416809Z",
"page_title": "Ferienregelung der Kultusministerkonferenz - Kultusministerkonferenz",
"page_description": "Die Sommerferien der Länder werden in einem mehrjährigen Rhythmus von einer Länderarbeitsgruppe abgestimmt und von der Kultusministerkonferenz beschlossen. Die übrigen Ferientermine werden von den Ländern bestimmt.",
"page_language": "de-DE",
@@ -213,12 +213,12 @@
"status_code": 200,
"final_url": "https://www.opm.gov/policy-data-oversight/pay-leave/federal-holidays/",
"content_type": "text/html",
"elapsed_ms": 2249,
"size_bytes": 154325,
"content_hash": "3909fc4f5f278867677727af83a327dce41f8e3b767884fba0c7f38dd89cb11e",
"elapsed_ms": 1115,
"size_bytes": 154213,
"content_hash": "2d67f1e992b479b05bf9dd53e18e2bcca9b95a3e1c7dde731b52c72acc5b7528",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:35.473067Z",
"checked_at": "2026-08-14T13:45:23.416809Z",
"page_title": "Federal Holidays",
"page_description": "Welcome to opm.gov",
"page_language": "en",
@@ -257,12 +257,12 @@
"status_code": 200,
"final_url": "https://www.japaneselawtranslation.go.jp/en/laws/view/4846/en",
"content_type": "text/html",
"elapsed_ms": 2159,
"elapsed_ms": 1904,
"size_bytes": 32598,
"content_hash": "28b80d347b35df7dcdb0d930b95a09a00ad7f81178afb947b1745ef3684a88f1",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:35.806844Z",
"checked_at": "2026-08-14T13:45:23.418313Z",
"page_title": "Act on National Holidays - English - Japanese Law Translation",
"page_description": "",
"page_language": "",
@@ -301,12 +301,12 @@
"status_code": 200,
"final_url": "https://www.gov.hk/en/about/abouthk/holiday/",
"content_type": "text/html",
"elapsed_ms": 2188,
"elapsed_ms": 2730,
"size_bytes": 81111,
"content_hash": "6edb9e407594461f4c6909b1f025c1b76216eeaa5c68ba91efc103b85b637e85",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:37.770164Z",
"checked_at": "2026-08-14T13:45:23.418313Z",
"page_title": "GovHK: General holidays for 2023 – 2027",
"page_description": "General holidays for 2023 – 2027",
"page_language": "en",
@@ -346,12 +346,12 @@
"status_code": 200,
"final_url": "https://aladhan.com/islamic-calendar-api",
"content_type": "text/html",
"elapsed_ms": 2344,
"elapsed_ms": 1465,
"size_bytes": 172422,
"content_hash": "751cc967b0dba7a4852f2d3560cdb2f9eb85f43341fca9e0b881f287704311a6",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:37.981081Z",
"checked_at": "2026-08-14T13:45:23.418313Z",
"page_title": "Islamic / Hijri Calendar API",
"page_description": "Free REST API for Hijri to Gregorian (and back) date conversion, full Islamic month calendars and Islamic holy days. Built on the Umm al-Qura method.",
"page_language": "en",
@@ -391,12 +391,12 @@
"status_code": 200,
"final_url": "https://www.nfl.com/super-bowl",
"content_type": "text/html",
"elapsed_ms": 2592,
"size_bytes": 753594,
"content_hash": "b105d5ce583b02242f663e6cc49aac3e73d2ded247dfe4bcd5536e4681709e61",
"elapsed_ms": 1593,
"size_bytes": 754881,
"content_hash": "133630fff6bf03f40d56b14eea11a6699d0b20644139fc157accd1d7cae4efea",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:39.983260Z",
"checked_at": "2026-08-14T13:45:24.252106Z",
"page_title": "2026 Super Bowl LX Sunday - When, Where & More - NFL.com",
"page_description": "The home of NFL Super Bowl news, ticket, apparel & event info. Get Super Bowl Sunday info about the National Football League's annual championship game.",
"page_language": "en",
@@ -435,12 +435,12 @@
"status_code": 200,
"final_url": "https://la28.org/en/games-plan/olympics.html",
"content_type": "text/html",
"elapsed_ms": 2186,
"elapsed_ms": 1051,
"size_bytes": 90820,
"content_hash": "94df00987401b8a2a9d12d0f0bfd82ae0020b373a40a21c79df9cf9e1db9e2ff",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:40.365389Z",
"checked_at": "2026-08-14T13:45:24.280765Z",
"page_title": "Full List of Olympic Sports for the LA28 Summer Olympics",
"page_description": "LA28 will host an incredible lineup of Olympic sports including some of the most popular and dynamic events, for the first time in Olympic history.",
"page_language": "en",
@@ -479,12 +479,12 @@
"status_code": 200,
"final_url": "https://nrf.com/research-insights/holiday-data-and-trends/winter-holidays",
"content_type": "text/html",
"elapsed_ms": 2347,
"size_bytes": 358093,
"elapsed_ms": 1615,
"size_bytes": 358376,
"content_hash": "76e1a16191eaeea808b087c43d575bbf6b8a8962e94c17c3846748d7a329ff3e",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:42.573983Z",
"checked_at": "2026-08-14T13:45:24.597018Z",
"page_title": "Winter Holiday Data and Trends | 2025 Holiday Consumer Spending Insights | NRF",
"page_description": "NRF’s 2025 winter holiday shopping trends, consumer spending insights and sales forecasts for Thanksgiving, Black Friday, Cyber Monday and Christmas.",
"page_language": "en",
@@ -523,12 +523,12 @@
"status_code": 200,
"final_url": "https://www.alibabagroup.com/en-US/document-1926184987447525376",
"content_type": "text/html",
"elapsed_ms": 313,
"size_bytes": 96275,
"content_hash": "c1d3c06e6871c5349af2e9e3e6bd2a085d760f981e3a73ad66d6781d959e8606",
"elapsed_ms": 222,
"size_bytes": 96286,
"content_hash": "063d163bfa4316ce174f419a524d0e4c44313d922c8ad318e5ab8bafb83c41d5",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T04:48:21.843941Z",
"checked_at": "2026-08-14T13:45:24.926250Z",
"page_title": "Taobao and Tmall’s 11.11 Shopping Festival Delivers Solid Growth for Brands-Alibaba Group",
"page_description": "Tmall Records Strongest 11.11 Growth in Four YearsHangzhou, China, November",
"page_language": "",
@@ -568,12 +568,12 @@
"status_code": 200,
"final_url": "https://heimtextil.messefrankfurt.com/frankfurt/en.html",
"content_type": "text/html",
"elapsed_ms": 2127,
"elapsed_ms": 3211,
"size_bytes": 202816,
"content_hash": "3e41b843cf89ed08f5e9b96ddbce6178c1a5d496ce6365466494a272abb7effd",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:43.313500Z",
"checked_at": "2026-08-14T13:45:25.157080Z",
"page_title": "Heimtextil – International Trade Fair for Home and Contract Textiles",
"page_description": "Discover Heimtextil in Frankfurt, the leading global trade fair for home and contract textiles, textile design, trends and sustainable innovation.",
"page_language": "en",
@@ -614,12 +614,12 @@
"status_code": 200,
"final_url": "https://intertextile-shanghai-hometextiles-autumn.hk.messefrankfurt.com/shanghai/zh-cn/planning-preparation/visiting.html",
"content_type": "text/html",
"elapsed_ms": 2929,
"elapsed_ms": 5917,
"size_bytes": 117865,
"content_hash": "ff168855ecf15f83544f8115f8a6be95c1b944e4900d96e72fa503a7f10eaede",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:44.936118Z",
"checked_at": "2026-08-14T13:45:25.198919Z",
"page_title": "观众资讯",
"page_description": "",
"page_language": "zh",
@@ -660,12 +660,12 @@
"status_code": 200,
"final_url": "https://intertextile-shanghai-apparel-fabrics-autumn.hk.messefrankfurt.com/shanghai/en.html",
"content_type": "text/html",
"elapsed_ms": 2336,
"elapsed_ms": 17162,
"size_bytes": 154801,
"content_hash": "a3624d8d0c1bc5700a210b3013ed090f8c5a643719cab08aae234cbaeb2a20fc",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:45.469151Z",
"checked_at": "2026-08-14T13:45:25.305631Z",
"page_title": "Autumn Exhibition | Apparel Fabrics | Intertextile",
"page_description": "Intertextile Shanghai Apparel Fabrics – Autumn Edition is a well-known exhibition that attracts plenty of exhibitors and visitors every year.",
"page_language": "en",
@@ -705,12 +705,12 @@
"status_code": 200,
"final_url": "https://texworld-paris.fr.messefrankfurt.com/paris/en.html",
"content_type": "text/html",
"elapsed_ms": 2715,
"elapsed_ms": 4817,
"size_bytes": 92909,
"content_hash": "01599bcf2d3259a9f23001d20aaea179590d04033520b303474bc56a3c67c314",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:47.827179Z",
"checked_at": "2026-08-14T13:45:25.330639Z",
"page_title": "Texworld Apparel Sourcing Paris - Fabric and apparel fair Paris",
"page_description": "Texworld, Apparel Sourcing and Avantex are held in Paris, Le Bourget. These meetings bring to Paris all the fabric professionals",
"page_language": "en",
@@ -749,12 +749,12 @@
"status_code": 200,
"final_url": "https://paris.premierevision.com/en",
"content_type": "text/html",
"elapsed_ms": 3988,
"size_bytes": 883632,
"elapsed_ms": 10084,
"size_bytes": 883570,
"content_hash": "59193360b86cdb7fb0761a53fb592bdfa1df72b25ebfe3f02308f664242d2936",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:47.882987Z",
"checked_at": "2026-08-14T13:45:25.351490Z",
"page_title": "Première Vision Paris Septembre 2026",
"page_description": "A bi-annual destination for fashion professionals, Première Vision Paris is a unique event that supports your sourcing and fuels your creativity.",
"page_language": "en",
@@ -793,12 +793,12 @@
"status_code": 200,
"final_url": "https://www.milanounica.it/en",
"content_type": "text/html",
"elapsed_ms": 1661,
"elapsed_ms": 1469,
"size_bytes": 59996,
"content_hash": "d56f564861df25f92f0d5a612dc4c66e5e5276894a6c3a097f6f65fa310e2949",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:50.559436Z",
"checked_at": "2026-08-14T13:45:25.888341Z",
"page_title": "Home page English",
"page_description": "Milano Unica is the reference fair for high-end fabrics and accessories for women's and men's clothing.",
"page_language": "en",
@@ -837,12 +837,12 @@
"status_code": 200,
"final_url": "https://www.maison-objet.com/en/paris",
"content_type": "text/html",
"elapsed_ms": 1990,
"size_bytes": 234876,
"elapsed_ms": 1100,
"size_bytes": 235010,
"content_hash": "c4fd84bfab155bd3323fe3d6f1f37261401f0d7f67b9dc2889433843563a6261",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:51.897411Z",
"checked_at": "2026-08-14T13:45:26.192106Z",
"page_title": "Maison&Objet",
"page_description": "INSPIRE, REVEAL & CONNECT … BEYOND THE FAIR! Sparking business opportunities and creative interaction between the world’s decoration, design and lifestyle community, Maison&Objet is your never-ending source of inspiration, constantly serving up exciting new finds: in the flesh twice a year at our trade fair in Paris; in the streets of Paris during Paris Design Week; and in the digital world via MOM, and through our social media presence",
"page_language": "en",
@@ -881,12 +881,12 @@
"status_code": 200,
"final_url": "https://www.highpointmarket.org/",
"content_type": "text/html",
"elapsed_ms": 2690,
"elapsed_ms": 3496,
"size_bytes": 186518,
"content_hash": "769d57e4fd53b12c429b65345df201855534122adc4f7c4981718ddc39ba2d2f",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:52.235753Z",
"checked_at": "2026-08-14T13:45:26.230334Z",
"page_title": "High Point Market Authority - High Point Market",
"page_description": "Meet me at Fall 2026 Market | October 17-21, 2026",
"page_language": "en",
@@ -926,12 +926,12 @@
"status_code": 200,
"final_url": "https://www.andmore.com/markets",
"content_type": "text/html",
"elapsed_ms": 1070,
"elapsed_ms": 987,
"size_bytes": 39033,
"content_hash": "8d54f25d354a784a81545dc75756e3af5e41637f0dd7e1b042e0279dec0c9b1f",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:53.929966Z",
"checked_at": "2026-08-14T13:45:27.356831Z",
"page_title": "About Us - ANDMORE",
"page_description": "Discover our Markets, connecting buyers and sellers across diverse industries.",
"page_language": "en",
@@ -971,12 +971,12 @@
"status_code": 200,
"final_url": "https://www.indexexhibition.com/",
"content_type": "text/html",
"elapsed_ms": 2031,
"size_bytes": 120642,
"elapsed_ms": 1960,
"size_bytes": 120776,
"content_hash": "5d6d0ddc50dd3d75d8096b815466764472ad82994149933996f1a55bb524a868",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:54.947446Z",
"checked_at": "2026-08-14T13:45:27.374254Z",
"page_title": "INDEX | 1 - 3 June 2027 | Dubai World Trade Centre",
"page_description": "MENA's leading event for the interiors industry connecting global suppliers with top buyers who attend to source, network and innovate.",
"page_language": "en-US",
@@ -1015,12 +1015,12 @@
"status_code": 200,
"final_url": "https://www.domotexasiachinafloor.com/",
"content_type": "application/json",
"elapsed_ms": 1474,
"elapsed_ms": 2477,
"size_bytes": 77749,
"content_hash": "b289d3dc438bf3325fe774bb52f53f5421567ec22fb1079cb3b8b7b6131f5efc",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:55.008300Z",
"checked_at": "2026-08-14T13:45:28.353470Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -1059,12 +1059,12 @@
"status_code": 200,
"final_url": "https://en.ciff-sh.com/",
"content_type": "text/html",
"elapsed_ms": 2368,
"size_bytes": 1295064,
"elapsed_ms": 4814,
"size_bytes": 1160078,
"content_hash": "127afd89f38bb77068180214e1f21257ecf196bc05af8b8d9b98a68155277ba4",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:56.484437Z",
"checked_at": "2026-08-14T13:45:28.393733Z",
"page_title": "CIFF Shanghai International Furniture Fair | Shanghai Furniture Fair | Furniture China Expo | China Furniture Exhibition | China Home Expo",
"page_description": "China International Furniture Fair (Shanghai) will be held from September 5 to 8, 2026, at the National Exhibition and Convention Center (Shanghai) in Hongqiao, Shanghai. With an exhibition area of over 300,000 square meters, the fair will feature 1,500 participating brands, covering a comprehensive range of products across the entire upstream and downstream home furnishing industry chain. Centered on designer furniture, the exhibits include a full spectrum of categories such as sleep furniture, sofas and living & dining furniture, office, commercial and hotel furniture, furniture production e",
"page_language": "en-US",
@@ -1103,12 +1103,12 @@
"status_code": 200,
"final_url": "https://techtextil.messefrankfurt.com/frankfurt/en.html",
"content_type": "text/html",
"elapsed_ms": 2825,
"elapsed_ms": 2356,
"size_bytes": 198910,
"content_hash": "8ab00fb306e8223cb719e6048404c5b69d2a7507f9b4bc270f34cf19a6f5104d",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:56.999386Z",
"checked_at": "2026-08-14T13:45:29.353848Z",
"page_title": "Techtextil – Leading international trade fair for technical textiles and nonwovens",
"page_description": "Discover technical textiles, nonwovens and innovative solutions for twelve application areas at Techtextil 2028.",
"page_language": "en",
@@ -1147,12 +1147,12 @@
"status_code": 200,
"final_url": "https://home-textiles-sourcing.us.messefrankfurt.com/new-york/en.html",
"content_type": "text/html",
"elapsed_ms": 2290,
"elapsed_ms": 1847,
"size_bytes": 141205,
"content_hash": "0d883881416fd8601e9b0dec9f2ee6be4cfc33e21a8307049341e802e7000b7b",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:58.856490Z",
"checked_at": "2026-08-14T13:45:29.756972Z",
"page_title": "Home Textiles Sourcing | Discover Innovations in New York",
"page_description": "Join us at Home Textiles Sourcing in New York! Explore the latest trends, connect with industry leaders, and elevate your textile business.",
"page_language": "en",
@@ -1191,12 +1191,12 @@
"status_code": 200,
"final_url": "https://texpertisenetwork.messefrankfurt.com/frankfurt/en/calendar.html",
"content_type": "text/html",
"elapsed_ms": 1525,
"elapsed_ms": 2054,
"size_bytes": 48046,
"content_hash": "b594014d3fa62fd23d6f237b4509f817cb1150537b3e78af089ad4b85d9dc806",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:01:59.854498Z",
"checked_at": "2026-08-14T13:45:30.195257Z",
"page_title": "Calendar | Upcoming Events of Texpertise Network",
"page_description": "Discover upcoming events and key dates in the textile and fashion industry on the Texpertise Network calendar. Stay updated!",
"page_language": "en",
@@ -1235,12 +1235,12 @@
"status_code": 200,
"final_url": "https://www.ufi.org/search-approved-events/?business_sector=TextilesApparelFashion",
"content_type": "text/html",
"elapsed_ms": 2564,
"size_bytes": 158046,
"elapsed_ms": 2527,
"size_bytes": 157999,
"content_hash": "aad2a53fc74011bfe8956fd9e79e3207e928267151b5999ed9f14bc171041e7b",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:01.166038Z",
"checked_at": "2026-08-14T13:45:30.832583Z",
"page_title": "Search Approved Events - UFI",
"page_description": "Search the UFI directory of approved events — trade shows and exhibitions worldwide that meet UFI's quality standards, searchable by country, sector, and venue.",
"page_language": "en",
@@ -1286,15 +1286,15 @@
"status_code": 200,
"final_url": "https://www.ccbec-shenzhen.com/",
"content_type": "application/json",
"elapsed_ms": 540,
"elapsed_ms": 3276,
"size_bytes": 127655,
"content_hash": "78174fb433b5b066c75bb9d19a8520147320a3c1c7845f240eb68c93e3fc29dd",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T04:48:25.375930Z",
"page_title": "深圳跨境电商展览会",
"checked_at": "2026-08-14T13:45:31.139335Z",
"page_title": "",
"page_description": "",
"page_language": "zh",
"page_language": "",
"image": "",
"evidence": [
"深圳跨境电商展览会",
@@ -1332,12 +1332,12 @@
"status_code": 200,
"final_url": "https://www.hktdc.com/event/homeinstyle/en/fair-at-a-glance",
"content_type": "text/html",
"elapsed_ms": 1906,
"elapsed_ms": 2719,
"size_bytes": 262673,
"content_hash": "b9bc52e0d25adf5783670f2c41e968fbed81cb0b46989f3c97015880a7a04682",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T04:48:25.466187Z",
"checked_at": "2026-08-14T13:45:31.621197Z",
"page_title": "Fair at a Glance",
"page_description": "Home InStyle offers a wide range of houseware collections in the brand new \"Exhibition+ \" hybrid online and offline format.",
"page_language": "en",
@@ -1377,12 +1377,12 @@
"status_code": 200,
"final_url": "https://ustr.gov/issue-areas/enforcement/section-301-investigations",
"content_type": "text/html",
"elapsed_ms": 706,
"elapsed_ms": 1957,
"size_bytes": 39611,
"content_hash": "93ef1916081b8a01752f7ff2ab710f6484e920159d9b88a10c13d6d434a457a3",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:01.388009Z",
"checked_at": "2026-08-14T13:45:31.735993Z",
"page_title": "Section 301 Investigations",
"page_description": "Investigation of Ukraine IPR Acts, Policies, and Practices Notice of InitiationNotice of Rescheduled Hearing",
"page_language": "en",
@@ -1421,12 +1421,12 @@
"status_code": 200,
"final_url": "https://www.cbp.gov/trade",
"content_type": "text/html",
"elapsed_ms": 875,
"size_bytes": 124131,
"content_hash": "56d47748654e5f3e16438933dc3fe3cf2d2a2b9485e76dafd24b8de4d76d1842",
"elapsed_ms": 1855,
"size_bytes": 124097,
"content_hash": "4ebcec49f74e6c65655682d4abc39e30bfcd7539dfd674720d1725b0dc3f1968",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:02.106484Z",
"checked_at": "2026-08-14T13:45:32.267609Z",
"page_title": "Trade",
"page_description": "U.S. Customs and Border Protection provides information on border security, trade, travel, customs regulations, trusted traveler programs and enforcement news to the public.",
"page_language": "en",
@@ -1468,12 +1468,12 @@
"status_code": 200,
"final_url": "https://www.tid.gov.hk/en/tradecircular/2026/ci5442026.html",
"content_type": "text/html",
"elapsed_ms": 2511,
"elapsed_ms": 1867,
"size_bytes": 11402,
"content_hash": "6413c5ce6e78856cfecbcbc5d6f41094b4cb8207b6790cdeaed9878f1e78970f",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:03.009746Z",
"checked_at": "2026-08-14T13:45:33.211716Z",
"page_title": "US : Indefinite Suspension of the De Minimis Exemption for Mail Shipments and Merchandise Arriving Through All Modes other than the International Postal Network",
"page_description": "24-hour hotline : 23 922 922 e-mail address : enquiry@tid.gov.hk Ref. :EIC 111/3 EIC 111/3/13 25 June 2026(updated on 9 July 2026) Dear Sirs, Commercial Information Circular No. 544/2026 US",
"page_language": "en",
@@ -1512,12 +1512,12 @@
"status_code": 200,
"final_url": "https://taxation-customs.ec.europa.eu/customs_en",
"content_type": "text/html",
"elapsed_ms": 7626,
"size_bytes": 116276,
"elapsed_ms": 5965,
"size_bytes": 116294,
"content_hash": "9af4f8315b0be10286e04f116cd8db876a722556253b2356bfbbfe6dda36c882",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:03.753071Z",
"checked_at": "2026-08-14T13:45:33.392975Z",
"page_title": "Customs",
"page_description": "All about EU Customs policy and customs procedures",
"page_language": "en",
@@ -1556,12 +1556,12 @@
"status_code": 200,
"final_url": "https://environment.ec.europa.eu/strategy/textiles-strategy_en",
"content_type": "text/html",
"elapsed_ms": 1584,
"size_bytes": 94048,
"elapsed_ms": 3025,
"size_bytes": 94044,
"content_hash": "817ea00e1d8e2287723f5dbaad6813df009973b36dcb995fc1f0d4924dad3483",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:05.526782Z",
"checked_at": "2026-08-14T13:45:33.704471Z",
"page_title": "Textiles Strategy",
"page_description": "Tackling issues affecting the sector, while recognising the importance of the industry.",
"page_language": "en",
@@ -1599,12 +1599,12 @@
"status_code": 200,
"final_url": "https://chem.echa.europa.eu/",
"content_type": "text/html",
"elapsed_ms": 1951,
"elapsed_ms": 6108,
"size_bytes": 66539,
"content_hash": "8f96190ef0eb05da0dc21857d1e6552f27334b1a792e9982cb851ff25728c9cf",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:07.123323Z",
"checked_at": "2026-08-14T13:45:34.174755Z",
"page_title": "ECHA CHEM",
"page_description": "Welcome to ECHA CHEM",
"page_language": "en",
@@ -1642,12 +1642,12 @@
"status_code": 200,
"final_url": "https://www.saferproducts.gov/RestWebServices/Recall?format=json",
"content_type": "application/json",
"elapsed_ms": 7862,
"size_bytes": 27442608,
"content_hash": "b4dffae3258f0c785de6f4c74ea5dfbc50c5d739fbad6dcc37b3f32177731237",
"elapsed_ms": 3215,
"size_bytes": 27500132,
"content_hash": "34a659e820677514d8f57d004d27ecefa83dd256615a881c89dbfefcb2cc09e9",
"hash_version": 3,
"changed": true,
"checked_at": "2026-08-13T16:02:09.076267Z",
"checked_at": "2026-08-14T13:45:34.362605Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -1686,12 +1686,12 @@
"status_code": 200,
"final_url": "https://www.ftc.gov/business-guidance/resources/threading-your-way-through-labeling-requirements-under-textile-wool-acts",
"content_type": "text/html",
"elapsed_ms": 3963,
"size_bytes": 1084311,
"elapsed_ms": 4730,
"size_bytes": 1084320,
"content_hash": "a2436cb581a78b7f2ac4ad79e0220a79003657418b433b550eca2f534b17426d",
"hash_version": 3,
"changed": true,
"checked_at": "2026-08-13T16:02:11.392286Z",
"checked_at": "2026-08-14T13:45:34.417510Z",
"page_title": "Threading Your Way Through the Labeling Requirements Under the Textile and Wool Acts",
"page_description": "IntroductionWho's Covered and Who's NotTextile Products: What's Covered and What's NotWool Products: What's Covered and What's NotFiber ContentExceptions to the Fiber Disclosure RequirementSectional Disclosure of Fiber ContentPile FabricsFiber Na",
"page_language": "en",
@@ -1730,12 +1730,12 @@
"status_code": 200,
"final_url": "https://www.gov.uk/trade-tariff",
"content_type": "text/html",
"elapsed_ms": 3223,
"elapsed_ms": 1698,
"size_bytes": 67192,
"content_hash": "82a00ebc69b989cf649f5ca09cb7586f56be1c07ada985f717e0e9490ac62388",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:15.424970Z",
"checked_at": "2026-08-14T13:45:35.084687Z",
"page_title": "Trade Tariff: look up commodity codes, duty and VAT rates",
"page_description": "Search for import and export commodity codes and for tax, duty and licences that apply to your goods.",
"page_language": "en",
@@ -1774,12 +1774,12 @@
"status_code": 200,
"final_url": "https://www.mofcom.gov.cn/zcfb/",
"content_type": "text/html",
"elapsed_ms": 181,
"elapsed_ms": 8218,
"size_bytes": 20834,
"content_hash": "f7451f5f3d5f204c8d130caf7e4322ca0bf43e42c62685614b55729ed29622ac",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:17.260122Z",
"checked_at": "2026-08-14T13:45:35.522712Z",
"page_title": "政策发布",
"page_description": "",
"page_language": "zh-cn",
@@ -1821,12 +1821,12 @@
"status_code": 200,
"final_url": "https://sellercentral.amazon.com/help/hub/reference/external/G200164330",
"content_type": "text/html",
"elapsed_ms": 3045,
"size_bytes": 171823,
"elapsed_ms": 8131,
"size_bytes": 173634,
"content_hash": "2d93345a9e832ddb8c1fcbf6f5991ab0785cdfcb24358d66294f343336d70082",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:17.446660Z",
"checked_at": "2026-08-14T13:45:36.742715Z",
"page_title": "亚马逊",
"page_description": "",
"page_language": "zh-CN",
@@ -1870,12 +1870,12 @@
"status_code": 200,
"final_url": "https://eec.eaeunion.org/en/news/sovet-eek-ustanovil-porog-besposhlinnogo-vvoza-i-stavki-tamozhennykh-poshlin-dlya-tovarov-vneshney-e/",
"content_type": "text/html",
"elapsed_ms": 4034,
"elapsed_ms": 2297,
"size_bytes": 88735,
"content_hash": "46ef039c8279ab01b4d757a0d07bd439816f855d423c35bc568edf4e8385dbf8",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:18.659642Z",
"checked_at": "2026-08-14T13:45:36.793875Z",
"page_title": "EEC Council approves duty-free import threshold and customs duty rates for goods in foreign e-trade",
"page_description": "The Eurasian Economic Commission Council adopted a number of decisions establishing the conditions and rules for the import of e-commerce goods purchased by individuals on foreign marketplaces. Particularly, the duty-free import threshold of 200 euros was set with the possibility of its future revision. If this value is exceeded, a customs duty of 5% above the nationally established VAT rates will be levied on the entire purchase price, but not less than one euro per one kilogram. For certain types of goods, such as cars, special customs duty rates have been established. In addition, a list of",
"page_language": "en",
@@ -1917,12 +1917,12 @@
"status_code": 200,
"final_url": "https://abai.kgd.gov.kz/en/content/rules-application-prohibitions-and-restrictions-when-moving-goods-across-customs-border",
"content_type": "text/html",
"elapsed_ms": 1980,
"size_bytes": 104484,
"content_hash": "d9ca9fb4f0579d5deac639e49029f43c8894f9081675cf4262de0186022beeed",
"elapsed_ms": 9773,
"size_bytes": 69570,
"content_hash": "dfd5eca51f604173a5b8da6264a30510efc3d2f2cc84361fb11da316095b589a",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:20.502714Z",
"checked_at": "2026-08-14T13:45:37.933388Z",
"page_title": "Rules for the application of prohibitions and restrictions when moving goods across the customs border of the Republic of Kazakhstan | Department of State Revenues for Abay Region",
"page_description": "1",
"page_language": "en",
@@ -1968,12 +1968,12 @@
"status_code": 200,
"final_url": "https://asean.org/wp-content/uploads/2020/12/ASEAN-Trade-in-Goods-Agreement.pdf",
"content_type": "application/pdf",
"elapsed_ms": 2781,
"elapsed_ms": 2929,
"size_bytes": 1044004,
"content_hash": "0f8140bd6b12497dfe648331e4aad00b1475d91c36f9d34b2c0a9570887de083",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:22.506591Z",
"checked_at": "2026-08-14T13:45:39.100705Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -2014,12 +2014,12 @@
"status_code": 200,
"final_url": "https://www.customs.gov.sg/doing-business/import-operations/import-procedures/importing-by-postal-or-courier-service/",
"content_type": "text/html",
"elapsed_ms": 2710,
"elapsed_ms": 5177,
"size_bytes": 534690,
"content_hash": "84ae2dca2a019acf2fc8e3a1e674abfa49c798c52980d6399f3dd2bbac987bf7",
"content_hash": "30cbd937e634b53c9beba0a3762ec8748342cf7648430ae924296d4159e1a729",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:22.703203Z",
"checked_at": "2026-08-14T13:45:39.230309Z",
"page_title": "Importing by Postal or Courier Service",
"page_description": "Learn the requirements for importing goods into Singapore via postal or courier services.",
"page_language": "en",
@@ -2061,12 +2061,12 @@
"status_code": 200,
"final_url": "https://tax.gov.ae/en/taxes/vat/guides.references.aspx",
"content_type": "text/html",
"elapsed_ms": 5935,
"elapsed_ms": 6236,
"size_bytes": 385163,
"content_hash": "24163ca8b238e2670a7f0c818f84fc512ff7c7774ef27609a7e2866a4aedfb09",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:25.286853Z",
"checked_at": "2026-08-14T13:45:39.385210Z",
"page_title": "Guides, References & Public Clarifications",
"page_description": "The Federal Tax Authority provides you with a set of guides, clarifications and references that will help you understand your tax obligations. &nbsp",
"page_language": "en-US",
@@ -2108,12 +2108,12 @@
"status_code": 200,
"final_url": "https://zatca.gov.sa/en/RulesRegulations/Taxes/Pages/customs-individual/e-stores-customers.aspx",
"content_type": "text/html",
"elapsed_ms": 4015,
"size_bytes": 249278,
"content_hash": "9b309de5b6e715c14b7a79c52666e6a1c90d23d520b0c2e16285c179eca1f561",
"elapsed_ms": 3907,
"size_bytes": 249237,
"content_hash": "1ff17a42a572e21ca24283a29a2d369c1652a1ab6283fe1fc7d0a558aec57ab0",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T04:48:30.388263Z",
"checked_at": "2026-08-14T13:45:40.284228Z",
"page_title": "E-Store Customers",
"page_description": "E-Store Customers",
"page_language": "en",
@@ -2155,12 +2155,12 @@
"status_code": 200,
"final_url": "https://www.bsmi.gov.tw/wSite/np?ctNode=8871&mp=1",
"content_type": "text/html",
"elapsed_ms": 1628,
"elapsed_ms": 2076,
"size_bytes": 32351,
"content_hash": "b114ed3557503040898fe9e48261327b6b7053b314a23774575813eb0937367b",
"content_hash": "f55d50f31c48350f7891f96378e0fdbdde33bc0dcc3f1997cd4c04c8e75b2d51",
"hash_version": 3,
"changed": true,
"checked_at": "2026-08-13T04:48:30.595534Z",
"checked_at": "2026-08-14T13:45:42.029996Z",
"page_title": "經濟部標準檢驗局紡織品",
"page_description": "",
"page_language": "zh-TW",
@@ -2204,12 +2204,12 @@
"status_code": 200,
"final_url": "https://www.saso.gov.sa/en/laws-and-regulations/technical_regulations/pages/regulation22.aspx",
"content_type": "text/html",
"elapsed_ms": 4116,
"size_bytes": 190124,
"elapsed_ms": 4355,
"size_bytes": 190445,
"content_hash": "c2d42ce32772a37f9186b36fc7b6c6e969f9adf47e098161923f251f5b35e217",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T04:48:30.657203Z",
"checked_at": "2026-08-14T13:45:42.503166Z",
"page_title": "Kingdom of Saudi Arabia - Saudi Standards, Metrology and Quality Organization.",
"page_description": "The official website of the Saudi Standards, Metrology and Quality Organization.",
"page_language": "en-US",
@@ -2256,12 +2256,12 @@
"status_code": 200,
"final_url": "https://export.ebay.com/en/regulations/",
"content_type": "text/html",
"elapsed_ms": 1580,
"elapsed_ms": 1742,
"size_bytes": 108938,
"content_hash": "b8fcd90e19acd71a216ee5ab93535bca1a3d7f6f7cf59f80eb41aea97f9056ea",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:27.215258Z",
"checked_at": "2026-08-14T13:45:43.751119Z",
"page_title": "Regulations & policies",
"page_description": "",
"page_language": "en",
@@ -2306,12 +2306,12 @@
"status_code": 200,
"final_url": "https://seller-us.tiktok.com/university/home?identity=1&menu=policy&role=seller",
"content_type": "text/html",
"elapsed_ms": 862,
"elapsed_ms": 1187,
"size_bytes": 12232,
"content_hash": "4e5a2f1cce102f1066666d32d7b7683da7f4892a4bb6e0f7dd624f97c4429603",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:28.807121Z",
"checked_at": "2026-08-14T13:45:44.127381Z",
"page_title": "Learn How to Boost Sales | TikTok Shop Academy | United States",
"page_description": "Welcome to TikTok Shop Academy! This is the one-stop learning platform for TikTok sellers, creators, partners...to get the latest information about policy and features.",
"page_language": "",
@@ -2353,12 +2353,12 @@
"status_code": 200,
"final_url": "https://marketplace.walmart.com/",
"content_type": "text/html",
"elapsed_ms": 1752,
"size_bytes": 334472,
"elapsed_ms": 8945,
"size_bytes": 334462,
"content_hash": "60253ecc95284fb6121ff55fc51a4fa514fed29004a4895ac582e29a7e202288",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:29.671717Z",
"checked_at": "2026-08-14T13:45:44.212308Z",
"page_title": "Walmart Marketplace - Let's grow together!",
"page_description": "The marketplace built for sellers, by sellers.",
"page_language": "en-US",
@@ -2404,12 +2404,12 @@
"status_code": 200,
"final_url": "https://global-selling.mercadolibre.com/learning-center",
"content_type": "text/html",
"elapsed_ms": 2568,
"size_bytes": 157599,
"content_hash": "de712cd1625ac07029f856f71d9822b8fa929f1197f4fe7d5ae40bb66ffc6d52",
"elapsed_ms": 13349,
"size_bytes": 160068,
"content_hash": "d4b8359049ff57a84e678ea5cb2a8efed0a5ff0e1c4afa04fbec9c87b06674e9",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:31.270113Z",
"checked_at": "2026-08-14T13:45:44.437282Z",
"page_title": "Mercado Libre",
"page_description": "",
"page_language": "en-US",
@@ -2448,12 +2448,12 @@
"status_code": 200,
"final_url": "https://www.wipo.int/en/web/global-brand-database",
"content_type": "text/html",
"elapsed_ms": 3895,
"size_bytes": 110440,
"elapsed_ms": 2303,
"size_bytes": 110634,
"content_hash": "55ab23d1352d3605995d22822dcbcd9c089a956b6e9db7ccc35b68705b8e6f20",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:31.442551Z",
"checked_at": "2026-08-14T13:45:44.890817Z",
"page_title": "Global Brand Database",
"page_description": "Use the Global Brand Database to search internationally protected trademarks, appellations of origin, state emblems etc.",
"page_language": "en-US",
@@ -2492,12 +2492,12 @@
"status_code": 200,
"final_url": "https://www.euipo.europa.eu/en/search-ip",
"content_type": "text/html",
"elapsed_ms": 2494,
"elapsed_ms": 3181,
"size_bytes": 360133,
"content_hash": "296551c4f553281bdfd519f6168b1d458a09e67db09592e05fe7503daf7b5a6c",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:33.848495Z",
"checked_at": "2026-08-14T13:45:45.318746Z",
"page_title": "Searches - EUIPO",
"page_description": "Searches",
"page_language": "en",
@@ -2536,12 +2536,12 @@
"status_code": 200,
"final_url": "https://www.pantone.com/color-of-the-year/2026",
"content_type": "text/html",
"elapsed_ms": 3269,
"size_bytes": 572691,
"elapsed_ms": 1642,
"size_bytes": 480596,
"content_hash": "2a4495b9f61f8ff06c8a492c2c6c41bd109f3ca0ee54260d710b9f2534ed7fc5",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:35.351397Z",
"checked_at": "2026-08-14T13:45:45.511395Z",
"page_title": "PANTONE® USA | PANTONE 11-4201 Cloud Dancer | Color of the Year 2026",
"page_description": "Pantone Color of the Year 2026, PANTONE 11-4201 Cloud Dancer, a lofty white that serves as a symbol of calming influence.",
"page_language": "en",
@@ -2579,12 +2579,12 @@
"status_code": 200,
"final_url": "https://textileexchange.org/app/uploads/2025/04/Materials-Benchmark-Survey-Guide-2025.pdf",
"content_type": "application/pdf",
"elapsed_ms": 6308,
"elapsed_ms": 9063,
"size_bytes": 3465349,
"content_hash": "ceae323dedf124134ad9e3b0214eccf0187e3ec147351ddb69f7a10c648428db",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:36.357201Z",
"checked_at": "2026-08-14T13:45:45.696400Z",
"page_title": "",
"page_description": "",
"page_language": "",
@@ -2622,12 +2622,12 @@
"status_code": 200,
"final_url": "https://www.oeko-tex.com/en/news",
"content_type": "text/html",
"elapsed_ms": 1179,
"elapsed_ms": 1074,
"size_bytes": 70182,
"content_hash": "7f2dd80b003e8f895bd223c2abf35e319b559b3b04d675e0b67c5b7faf89ae9d",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:38.631784Z",
"checked_at": "2026-08-14T13:45:46.882700Z",
"page_title": "Welcome to the OEKO-TEX® Newsroom",
"page_description": "Here you will find current news, press releases and information about events.",
"page_language": "en",
@@ -2666,12 +2666,12 @@
"status_code": 200,
"final_url": "https://www.aatcc.org/news-read/insights",
"content_type": "text/html",
"elapsed_ms": 4874,
"size_bytes": 225810,
"elapsed_ms": 2057,
"size_bytes": 225859,
"content_hash": "b9e59734c41a1ec5cfe74acb6479294437abe6c2398999450c1073c5220ceff1",
"hash_version": 3,
"changed": false,
"checked_at": "2026-08-13T16:02:39.826352Z",
"checked_at": "2026-08-14T13:45:47.174436Z",
"page_title": "News & Insights - AATCC",
"page_description": "",
"page_language": "en-US",
@@ -2696,8 +2696,8 @@
"ok": true,
"status_code": 200,
"final_url": "https://www.cifnews.com/activity",
"items": 4,
"checked_at": "2026-08-13T16:02:44.735116Z",
"items": 5,
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2710,7 +2710,7 @@
"status_code": 200,
"final_url": "https://gs.amazon.cn/resources/live-broadcast",
"items": 4,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2723,7 +2723,7 @@
"status_code": 200,
"final_url": "https://www.wipo.int/meetings/en/topic.jsp?group_id=7",
"items": 5,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2736,7 +2736,7 @@
"status_code": 200,
"final_url": "https://www.cbp.gov/trade/stakeholder-engagement/webinars",
"items": 1,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2748,8 +2748,8 @@
"ok": true,
"status_code": 200,
"final_url": "https://bizevent.ccpit.org/",
"items": 8,
"checked_at": "2026-08-13T16:02:44.735116Z",
"items": 10,
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2762,7 +2762,7 @@
"status_code": 200,
"final_url": "https://sell.amazon.com/events",
"items": 1,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2775,7 +2775,7 @@
"status_code": 200,
"final_url": "https://community.ebay.com/ebay-seller-events/",
"items": 0,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2788,7 +2788,7 @@
"status_code": 200,
"final_url": "https://intellectual-property-helpdesk.ec.europa.eu/news-events/upcoming-trainings-events_en",
"items": 1,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2801,7 +2801,7 @@
"status_code": 200,
"final_url": "https://www.uspto.gov/about-us/events",
"items": 4,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
},
{
@@ -2814,7 +2814,7 @@
"status_code": 200,
"final_url": "https://policy.trade.ec.europa.eu/events_en",
"items": 2,
"checked_at": "2026-08-13T16:02:44.735116Z",
"checked_at": "2026-08-14T13:45:57.802206Z",
"error": ""
}
]
+62029 -61411
View File
File diff suppressed because it is too large Load Diff
+2021 -1834
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
import { getIntelligenceSection, renderIntelligence, setIntelligenceSection, shareIntelligence } from "./render-intelligence.js?v=20260814n";
import { getIntelligenceSection, renderIntelligence, setIntelligenceSection, shareIntelligence } from "./render-intelligence.js?v=20260814o";
const DATA_ROOT = "./data";
+4 -7
View File
@@ -430,15 +430,13 @@ function appendTranslationLinks(actions, item, className = "intelligence-source-
function appendPrefixedTranslationLink(actions, item, prefix, className = "platform-action translate") {
if (!item[`${prefix}_needs_translation`]) return;
const translation = preferredTranslation(item, prefix);
if (translation.url) actions.appendChild(makeExternalLink(TEXT.translatedVersion, translation.url, `${className}${translation.isFallback ? " is-fallback" : ""}`));
if (translation.url) actions.appendChild(makeExternalLink("辅助翻译入驻说明", translation.url, `${className}${translation.isFallback ? " is-fallback" : ""}`));
}
function makePlatformActionGroup(label, url, item, prefix, className = "platform-action") {
const group = create("span", "platform-action-group translation-action-group");
group.appendChild(makeExternalLink(label, url, className));
const actions = group;
if (prefix === "official") appendPrefixedTranslationLink(actions, item, "official");
if (prefix === "homepage") appendPrefixedTranslationLink(actions, item, "homepage");
if (prefix === "seller") appendPrefixedTranslationLink(actions, item, "seller");
return group;
}
@@ -1020,9 +1018,8 @@ function makePlatformCard(item) {
const access = create("div", "platform-access-note");
access.append(create("strong", "", "入驻判断"), create("p", "", item.cross_border || "以平台当前规则为准。"));
const actions = create("div", "platform-actions");
actions.appendChild(makePlatformActionGroup("查看家纺类目", item.official_url, item, "official", "platform-action primary"));
actions.appendChild(makePlatformActionGroup("打开平台官网", item.homepage_url, item, "homepage"));
actions.appendChild(makePlatformActionGroup("去官方入驻", item.seller_url, item, "seller"));
if (item.homepage_url && item.homepage_url !== item.seller_url) actions.appendChild(makePlatformActionGroup("打开平台官网", item.homepage_url, item, "homepage"));
actions.appendChild(makePlatformActionGroup("去官方入驻", item.seller_url, item, "seller", "platform-action primary"));
if (item.language_url) actions.appendChild(makeExternalLink("官网学习中心(可选中文)", item.language_url, "platform-action language"));
const proof = create("p", "platform-proof", `${item.confidence} · ${item.link_status || "待人工复核"} · 核验 ${String(item.checked_at || "").slice(0, 10)}`);
card.append(header, markets, category, access, fit, actions, proof);
@@ -1073,7 +1070,7 @@ function renderPlatforms(data, container) {
return normalized([item.name, item.region, item.type, item.textile_category, item.cross_border, ...(item.markets || []), ...(item.fit_sellers || [])].join(" ")).includes(keyword);
}).sort((a, b) => (Number(b.home_textile_sales_score || 0) + Number(b.emergence_score || 0)) - (Number(a.home_textile_sales_score || 0) + Number(a.emergence_score || 0)) || String(a.access_level).localeCompare(String(b.access_level)) || a.name.localeCompare(b.name, "zh-CN"));
header.innerHTML = "";
header.append(create("strong", "", `${selected.length}/${all.length} 个家纺销售渠道`), create("span", "", "默认按家纺类目成熟度 + 新兴渠道参考分排序;分值为运营研究标记,不是实时搜索量。准入条件以平台卖家中心为准"));
header.append(create("strong", "", `${selected.length}/${all.length} 个家纺销售渠道`), create("span", "", "准入条件以平台卖家中心为准"));
grid.innerHTML = "";
selected.forEach((item) => grid.appendChild(makePlatformCard(item)));
if (!selected.length) grid.appendChild(create("div", "intelligence-empty", "当前筛选条件下没有已核验平台,请调整市场或开放等级。"));
+1 -1
View File
@@ -1,5 +1,5 @@
import { state } from "./render-intelligence-state.js?v=20260814e";
import { TEXT, create, detectViewerCountry, currentTranslationProvider, formatVerified, sectionItems, matchesFilters, makeCard, renderCalendar, renderPlatforms } from "./render-intelligence-core.js?v=20260814k";
import { TEXT, create, detectViewerCountry, currentTranslationProvider, formatVerified, sectionItems, matchesFilters, makeCard, renderCalendar, renderPlatforms } from "./render-intelligence-core.js?v=20260814l";
import { renderExhibitions, renderPolicies, renderStandards, renderTrendNews, renderTrendSearchHub, trendItems } from "./render-intelligence-scenes.js?v=20260814i";
import { renderActivities } from "./render-intelligence-activities.js?v=20260814h";
+1 -1
View File
@@ -78,6 +78,6 @@
</main>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script type="module" src="./assets/js/app.js?v=20260814p"></script>
<script type="module" src="./assets/js/app.js?v=20260814q"></script>
</body>
</html>
+4 -9
View File
@@ -144,7 +144,7 @@ def tags_html(values: list[str] | tuple[str, ...] | None) -> str:
TRANSLATED_LINK_LABEL = "查看译文版"
def links_html(links: list[tuple[str, str]], class_name: str = "") -> str:
def links_html(links: list[tuple[str, str]], class_name: str = "", translation_label: str = TRANSLATED_LINK_LABEL) -> str:
seen: set[str] = set()
output: list[str] = []
translation_group = 0
@@ -154,7 +154,7 @@ def links_html(links: list[tuple[str, str]], class_name: str = "") -> str:
seen.add(url)
provider = "yandex" if "translate.yandex.com/" in url else ("google" if "translate.google.com/" in url else "")
if provider:
label = TRANSLATED_LINK_LABEL
label = translation_label
else:
translation_group += 1
translation_gate = f' data-translation-provider="{provider}" data-translation-group="{translation_group}" hidden' if provider else ""
@@ -349,16 +349,11 @@ def build_detail(item: dict[str, Any], section: str, site_url: str) -> str:
</section>"""
elif section == "platforms":
platform_links = links_html([
("查看家纺类目", str(item.get("official_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("official_translation_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("official_translation_fallback_url") or "")),
("打开平台官网", str(item.get("homepage_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("homepage_translation_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("homepage_translation_fallback_url") or "")),
("打开平台官网", str(item.get("homepage_url") or "") if item.get("homepage_url") != item.get("seller_url") else ""),
("去官方入驻", str(item.get("seller_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("seller_translation_url") or "")),
(TRANSLATED_LINK_LABEL, str(item.get("seller_translation_fallback_url") or "")),
])
], translation_label="辅助翻译入驻说明")
section_details = f"""<section class="seo-context">
<h2>家纺类目与入驻判断</h2>
<p><strong>{esc(item.get('access_level'))} {esc(item.get('access_label'))}</strong> · {esc(item.get('cross_border'))}</p>
+2 -6
View File
@@ -93,10 +93,7 @@ def build_platforms(checked_at: str, session: requests.Session) -> list[dict[str
for item in PLATFORMS:
homepage_url = PLATFORM_HOME_URLS[item["id"]]
sales_score, emergence_score = PLATFORM_RANKING.get(item["id"], (50, 50))
translated = {
prefix: translation_fields(url)
for prefix, url in (("official", item["official_url"]), ("homepage", homepage_url), ("seller", item["seller_url"]))
}
seller_translation = translation_fields(item["seller_url"])
items.append({
**item,
"title": item["name"],
@@ -112,8 +109,7 @@ def build_platforms(checked_at: str, session: requests.Session) -> list[dict[str
"verified_at": checked_at,
"checked_at": checked_at,
**{
f"{prefix}_{field}": values[field]
for prefix, values in translated.items()
f"seller_{field}": seller_translation[field]
for field in ("needs_translation", "translation_url", "translation_fallback_url")
},
"seller_url_status": status_codes[item["id"]],
+8 -4
View File
@@ -53,13 +53,16 @@ def detect_text_language(text: str = "", declared_language: str = "") -> str:
def url_language_hint(url: str) -> str:
value = (url or "").lower()
if re.search(r"(?:[?&](?:lang|language|localetype)=|/)(?:zh-cn|zh-hans|cn)(?:\.html?)?(?:[&#/?]|$)", value):
if re.search(r"(?:[?&](?:lang|language|localetype)=|/)(?:zh-cn|zh-hans|zh|cn)(?:\.html?)?(?:[&#/?]|$)", value):
return "zh-CN"
if re.search(r"(?:[?&](?:lang|language|localetype)=|/)(?:zh-tw|zh-hant|tw|hk)(?:\.html?)?(?:[&#/?]|$)", value):
return "zh-Hant"
host = (urlparse(url).hostname or "").lower().rstrip(".")
host_languages = {
"bizevent.ccpit.org": "zh-CN",
"ccbec-shenzhen.com": "zh-CN",
"ibte.co.id": "en",
"www.ccbec-shenzhen.com": "zh-CN",
"www.coupang.com": "ko",
"www.mercadolibre.com": "es",
}
@@ -88,11 +91,12 @@ def is_simplified_chinese_site(url: str, source_language: str = "", source_text:
host = (urlparse(url).hostname or "").lower().rstrip(".")
if host.endswith(".cn"):
return True
url_language = url_language_hint(url)
if url_language:
return url_language == "zh-CN"
declared = detect_text_language("", source_language) if source_language else ""
content_language = detect_text_language(source_text) if source_text.strip() else ""
if declared in ("zh-CN", "zh-hans", "zh-sg") or content_language == "zh-CN":
return True
return False
return declared == "zh-CN" or content_language == "zh-CN"
def needs_simplified_chinese_translation(language: str) -> bool:
+9 -1
View File
@@ -10,7 +10,7 @@ test("独立首页只展示家纺情报并加载独立入口", async () => {
const dongguanCss = await text("public/assets/fonts/dongguan-bold/result.css");
assert.match(html, /三笙AI情报局/);
assert.match(html, /assets\/js\/app\.js/);
assert.match(html, /assets\/js\/app\.js\?v=20260814p/);
assert.match(html, /assets\/js\/app\.js\?v=20260814q/);
assert.match(html, /assets\/css\/base\.css\?v=20260814h/);
assert.match(html, /assets\/css\/intelligence\.css\?v=20260814s/);
assert.match(html, /<details[^>]+class="intelligence-metrics"/);
@@ -42,6 +42,14 @@ test("七个业务入口与趋势四子类均保留", async () => {
}
assert.doesNotMatch(modules, /设计师检索|设计师图片检索台/);
assert.match(modules, /appendPrefixedTranslationLink/);
assert.match(modules, /appendPrefixedTranslationLink\(actions, item, "seller"\)/);
assert.doesNotMatch(modules, /appendPrefixedTranslationLink\(actions, item, "official"\)/);
assert.doesNotMatch(modules, /appendPrefixedTranslationLink\(actions, item, "homepage"\)/);
assert.doesNotMatch(modules, /查看家纺类目/);
assert.doesNotMatch(modules, /家纺类目成熟度|新兴渠道参考分/);
assert.match(modules, /打开平台官网/);
assert.match(modules, /去官方入驻/);
assert.match(modules, /辅助翻译入驻说明/);
assert.match(modules, /官方/);
assert.match(modules, /requires-cross-border-network/);
});
+17 -6
View File
@@ -156,10 +156,16 @@ class StandaloneProjectContractTests(unittest.TestCase):
self.assertNotIn("Bandages", cbp_titles)
self.assertTrue(all("bing.com/images/search" in item["visual_reference_url"] for item in intelligence["calendar_insights"] if item.get("visual_reference_url")))
for platform in intelligence["platforms"]:
for prefix in ("official", "homepage", "seller"):
if platform[f"{prefix}_needs_translation"]:
self.assertIn("tl=zh-CN", platform[f"{prefix}_translation_url"])
self.assertIn("translate.yandex.com/translate", platform[f"{prefix}_translation_fallback_url"])
for prefix in ("official", "homepage"):
for field in ("needs_translation", "translation_url", "translation_fallback_url"):
self.assertNotIn(f"{prefix}_{field}", platform)
if platform["seller_needs_translation"]:
self.assertIn("tl=zh-CN", platform["seller_translation_url"])
self.assertIn("translate.yandex.com/translate", platform["seller_translation_fallback_url"])
platforms = {platform["id"]: platform for platform in intelligence["platforms"]}
self.assertTrue(platforms["temu"]["seller_needs_translation"])
self.assertFalse(platforms["shopee"]["seller_needs_translation"])
self.assertFalse(platforms["shopify"]["seller_needs_translation"])
def test_known_translation_restrictions_match_verified_services(self) -> None:
translation_fields = load_translation_module().translation_fields
@@ -171,6 +177,9 @@ class StandaloneProjectContractTests(unittest.TestCase):
self.assertIn("translate.yandex.com/translate", fields["translation_fallback_url"])
self.assertFalse(abai["translation_url"])
self.assertFalse(abai["translation_fallback_url"])
shopify_zh = translation_fields("https://www.shopify.com/zh")
self.assertFalse(shopify_zh["needs_translation"])
self.assertFalse(shopify_zh["translation_url"])
chinese_html = translation_fields(
"https://intertextile-shanghai-hometextiles-autumn.hk.messefrankfurt.com/shanghai/zh-cn.html",
"en",
@@ -181,7 +190,7 @@ class StandaloneProjectContractTests(unittest.TestCase):
ccpit = translation_fields("https://bizevent.ccpit.org/meetings/4575")
self.assertFalse(ccpit["needs_translation"])
self.assertFalse(ccpit["translation_url"])
ibte = translation_fields("https://ibte.co.id/")
ibte = translation_fields("https://ibte.co.id/", "zh-CN", "国际展会")
self.assertTrue(ibte["needs_translation"])
self.assertIn("translate.google.com/translate", ibte["translation_url"])
self.assertIn("translate.yandex.com/translate", ibte["translation_fallback_url"])
@@ -233,7 +242,9 @@ class StandaloneProjectContractTests(unittest.TestCase):
def test_source_files_remain_maintainable(self) -> None:
seo_builder = (ROOT / "scripts/build_seo.py").read_text(encoding="utf-8")
self.assertIn("official_translation_url", seo_builder)
self.assertIn("seller_translation_url", seo_builder)
self.assertNotIn("official_translation_url", seo_builder)
self.assertNotIn("homepage_translation_url", seo_builder)
self.assertIn("source_translation_url", seo_builder)
self.assertIn("seo_config", seo_builder)
self.assertNotIn("selected = items[:", seo_builder)