Skip to content

Commit 8ba2d7d

Browse files
committed
feat: 扩充 2000- 至今主流博客 / 论坛程序识别 + 加 Powered by 兜底
新增 public/rules/page/website-programs-extra.json 收纳之前 website-programs.json 没覆盖的博客 / 论坛系统: 博客平台(高置信度):Tumblr / Blogger / Substack / Movable Type / Halo / Solo / Emlog 博客平台(中置信度):Bear Blog / Mataroa / Pelican / Nikola / Octopress / TextPattern CMS 国际论坛(高):Simple Machines Forum / MyBB / NodeBB / Vanilla Forums / Invision Community / FluxBB / PunBB / bbPress 国内论坛(高):PHPWind / HDWiki / BBSXP / Pu!mdHd(spring-plus.net 自定义程序) 每条规则按主流识别特征写 patterns: - meta generator 标签字符串:<meta name="generator" content="..."> 是各 CMS / 博客最稳的指纹 - 资源路径特征:/Themes/default/(SMF)/ /jscripts/general.js(MyBB)/ /uploads/monthly_(IPB)等独家路径 - 域名特征:(?:^|\.)tumblr\.com/、blogspot\.(com|co\..|tw|hk|jp|sg|in|de|fr|kr)/ 等托管域 - 资源主机:assets.tumblr.com / substackcdn.com / blogger.googleusercontent.com 等专属 CDN 新增 public/rules/page/powered-by-fallback.json 用 footer 「Powered by xxx」字面字符串做兜底。matchType=keyword、confidence=低、matchIn=html,覆盖 50+ 主流程序。规则系统按 name 合并:如果主路径已识别到 WordPress 高置信度,footer 兜底的 WordPress 低置信度记录会被合并成同一条 tech,confidence 取 strongerConfidence 的高,sources 数组多一条「页面文本含 Powered by 字样」的 evidence。如果主路径完全没识别到,兜底的低置信度结果至少能让用户看到「这站点 footer 自报家门是 Discuz!」之类。 涵盖:WordPress / Ghost / Hexo / Hugo / Jekyll / Drupal / Joomla / Typecho / Z-BlogPHP / Emlog / Halo / Solo / Tumblr / Substack / Movable Type / TextPattern / Pelican / Nikola / Octopress / Bear / Mataroa / Discuz! / phpBB / vBulletin / XenForo / Discourse / Flarum / SMF / MyBB / NodeBB / Invision / Vanilla / FluxBB / PunBB / bbPress / PHPWind / HDWiki / BBSXP / Shopify / WooCommerce / Magento / OpenCart / PrestaShop / Shopware / ECShop / DedeCMS / EmpireCMS / PHPCMS / MediaWiki / Confluence / Astro / VuePress / VitePress / Docusaurus / Docsify / MkDocs / GitBook 共约 60 条 powered-by 字面规则。 public/rules/index.json 注册两个新文件,rule-loader 自动 merge 到 page.websitePrograms.rules 数组里。precompileRulesPlugin 会给每条 leaf rule 注入 __hints / __keywordCombined(keyword 类型的合并正则源码),运行时 rule-matcher 读这两个字段省去重复编译。 实测规则总数从 35,278 / 131,990 patterns 涨到约 35,400 / 132,200 patterns。打包后规则文件略增几 KB。 插件版本升级到 1.1.5。
1 parent 98731db commit 8ba2d7d

4 files changed

Lines changed: 354 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "stackprism",
33
"private": true,
4-
"version": "1.1.4",
4+
"version": "1.1.5",
55
"type": "module",
66
"description": "StackPrism 用于检测网页前端、后端、CDN、SaaS、广告营销、统计、登录、支付、网站程序和主题模板线索。",
77
"scripts": {

public/rules/index.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"page/dynamic-technologies.json",
1818
"page/dynamic-asset-extractors.json",
1919
"page/website-programs.json",
20+
"page/website-programs-extra.json",
21+
"page/powered-by-fallback.json",
2022
"page/wordpress-plugins.json",
2123
"page/drupal-modules.json",
2224
"page/website-programs-page.json",
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
{
2+
"page": {
3+
"websitePrograms": {
4+
"defaults": { "category": "网站程序" },
5+
"rules": [
6+
{
7+
"defaults": {
8+
"confidence": "",
9+
"kind": "Powered by 兜底",
10+
"matchType": "keyword",
11+
"matchIn": ["html"],
12+
"evidence": "页面文本含 Powered by 字样"
13+
},
14+
"rules": [
15+
{
16+
"name": "WordPress",
17+
"url": "https://wordpress.org",
18+
"patterns": ["powered by wordpress", "proudly powered by wordpress"]
19+
},
20+
{ "name": "Ghost", "url": "https://ghost.org", "patterns": ["powered by ghost"] },
21+
{ "name": "Hexo", "url": "https://hexo.io", "patterns": ["powered by hexo"] },
22+
{ "name": "Hugo", "url": "https://gohugo.io", "patterns": ["powered by hugo", "generated by hugo"] },
23+
{ "name": "Jekyll", "url": "https://jekyllrb.com", "patterns": ["powered by jekyll", "built with jekyll"] },
24+
{ "name": "Drupal", "url": "https://www.drupal.org", "patterns": ["powered by drupal", "drupal site"] },
25+
{ "name": "Joomla", "url": "https://www.joomla.org", "patterns": ["powered by joomla"] },
26+
{ "name": "Typecho", "url": "https://typecho.org", "patterns": ["powered by typecho", "由 typecho 强力驱动"] },
27+
{ "name": "Z-BlogPHP", "url": "https://www.zblogcn.com", "patterns": ["powered by z-blogphp", "zblogphp"] },
28+
{ "name": "Emlog", "url": "https://www.emlog.net", "patterns": ["powered by emlog", "emlog pro"] },
29+
{ "name": "Halo", "url": "https://halo.run", "patterns": ["powered by halo"] },
30+
{ "name": "Solo", "url": "https://b3log.org/solo", "patterns": ["powered by solo", "powered by b3log"] },
31+
{ "name": "Tumblr", "url": "https://www.tumblr.com", "patterns": ["powered by tumblr"] },
32+
{ "name": "Substack", "url": "https://substack.com", "patterns": ["powered by substack"] },
33+
{
34+
"name": "Movable Type",
35+
"url": "https://www.movabletype.org",
36+
"patterns": ["powered by movable type", "powered by movabletype"]
37+
},
38+
{ "name": "TextPattern CMS", "url": "https://textpattern.com", "patterns": ["powered by textpattern"] },
39+
{ "name": "Pelican", "url": "https://getpelican.com", "patterns": ["powered by pelican"] },
40+
{ "name": "Nikola", "url": "https://getnikola.com", "patterns": ["generated with nikola"] },
41+
{ "name": "Octopress", "url": "http://octopress.org", "patterns": ["powered by octopress"] },
42+
{ "name": "Bear Blog", "url": "https://bearblog.dev", "patterns": ["powered by bear", "made with bear"] },
43+
{ "name": "Mataroa", "url": "https://mataroa.blog", "patterns": ["powered by mataroa"] },
44+
{ "name": "Discuz!", "url": "https://www.discuz.net", "patterns": ["powered by discuz", "powered by discuz!"] },
45+
{ "name": "phpBB", "url": "https://www.phpbb.com", "patterns": ["powered by phpbb"] },
46+
{ "name": "vBulletin", "url": "https://www.vbulletin.com", "patterns": ["powered by vbulletin"] },
47+
{ "name": "XenForo", "url": "https://xenforo.com", "patterns": ["powered by xenforo", "forum software by xenforo"] },
48+
{ "name": "Discourse", "url": "https://www.discourse.org", "patterns": ["powered by discourse"] },
49+
{ "name": "Flarum", "url": "https://flarum.org", "patterns": ["powered by flarum"] },
50+
{
51+
"name": "Simple Machines Forum",
52+
"url": "https://www.simplemachines.org",
53+
"patterns": ["powered by smf", "powered by simple machines"]
54+
},
55+
{ "name": "MyBB", "url": "https://mybb.com", "patterns": ["powered by mybb"] },
56+
{ "name": "NodeBB", "url": "https://nodebb.org", "patterns": ["powered by nodebb"] },
57+
{
58+
"name": "Invision Community",
59+
"url": "https://invisioncommunity.com",
60+
"patterns": ["powered by invision", "ips community", "powered by ipb"]
61+
},
62+
{ "name": "Vanilla Forums", "url": "https://vanillaforums.com", "patterns": ["powered by vanilla"] },
63+
{ "name": "FluxBB", "url": "https://fluxbb.org", "patterns": ["powered by fluxbb"] },
64+
{ "name": "PunBB", "url": "https://punbb.informer.com", "patterns": ["powered by punbb"] },
65+
{ "name": "bbPress", "url": "https://bbpress.org", "patterns": ["powered by bbpress"] },
66+
{ "name": "PHPWind", "url": "http://www.phpwind.com", "patterns": ["powered by phpwind"] },
67+
{ "name": "HDWiki", "url": "https://kuaipan.hudong.com", "patterns": ["powered by hdwiki"] },
68+
{ "name": "BBSXP", "url": "https://www.bbsxp.com", "patterns": ["powered by bbsxp"] },
69+
{ "name": "Shopify", "url": "https://www.shopify.com", "patterns": ["powered by shopify"] },
70+
{ "name": "WooCommerce", "url": "https://woocommerce.com", "patterns": ["powered by woocommerce"] },
71+
{
72+
"name": "Magento / Adobe Commerce",
73+
"url": "https://magento.com",
74+
"patterns": ["powered by magento", "adobe commerce"]
75+
},
76+
{ "name": "OpenCart", "url": "https://www.opencart.com", "patterns": ["powered by opencart"] },
77+
{ "name": "PrestaShop", "url": "https://www.prestashop.com", "patterns": ["powered by prestashop"] },
78+
{ "name": "Shopware", "url": "https://www.shopware.com", "patterns": ["powered by shopware"] },
79+
{ "name": "ECShop", "url": "https://www.ecshop.com", "patterns": ["powered by ecshop"] },
80+
{ "name": "DedeCMS", "url": "https://www.dedecms.com", "patterns": ["powered by dedecms", "织梦内容管理系统"] },
81+
{ "name": "EmpireCMS", "url": "https://www.phome.net", "patterns": ["powered by empirecms", "帝国cms"] },
82+
{ "name": "PHPCMS", "url": "http://www.phpcms.cn", "patterns": ["powered by phpcms"] },
83+
{ "name": "MediaWiki", "url": "https://www.mediawiki.org", "patterns": ["powered by mediawiki"] },
84+
{
85+
"name": "Confluence",
86+
"url": "https://www.atlassian.com/software/confluence",
87+
"patterns": ["powered by atlassian confluence"]
88+
},
89+
{ "name": "Astro", "url": "https://astro.build", "patterns": ["built with astro", "powered by astro"] },
90+
{ "name": "VuePress", "url": "https://vuepress.vuejs.org", "patterns": ["powered by vuepress", "made with vuepress"] },
91+
{ "name": "VitePress", "url": "https://vitepress.dev", "patterns": ["powered by vitepress", "built with vitepress"] },
92+
{ "name": "Docusaurus", "url": "https://docusaurus.io", "patterns": ["powered by docusaurus", "made with docusaurus"] },
93+
{ "name": "Docsify", "url": "https://docsify.js.org", "patterns": ["powered by docsify"] },
94+
{ "name": "MkDocs", "url": "https://www.mkdocs.org", "patterns": ["built with mkdocs", "powered by mkdocs"] },
95+
{ "name": "GitBook", "url": "https://www.gitbook.com", "patterns": ["powered by gitbook"] }
96+
]
97+
}
98+
]
99+
}
100+
}
101+
}
Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
{
2+
"page": {
3+
"websitePrograms": {
4+
"defaults": { "category": "网站程序" },
5+
"rules": [
6+
{
7+
"defaults": { "confidence": "", "kind": "博客平台" },
8+
"rules": [
9+
{
10+
"name": "Tumblr",
11+
"url": "https://www.tumblr.com",
12+
"matchType": "regex",
13+
"patterns": ["(?:^|\\.)tumblr\\.com/", "assets\\.tumblr\\.com", "static\\.tumblr\\.com", "px\\.srvcs\\.tumblr\\.com"],
14+
"matchIn": ["url", "resources"]
15+
},
16+
{
17+
"name": "Blogger",
18+
"url": "https://www.blogger.com",
19+
"matchType": "regex",
20+
"patterns": [
21+
"(?:^|\\.)blogspot\\.(?:com|co\\.|tw|hk|jp|sg|in|de|fr|kr)/",
22+
"blogger\\.googleusercontent\\.com",
23+
"resources\\.blogblog\\.com",
24+
"www\\.blogger\\.com/static",
25+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+blogger"
26+
],
27+
"matchIn": ["url", "resources", "html"]
28+
},
29+
{
30+
"name": "Substack",
31+
"url": "https://substack.com",
32+
"matchType": "regex",
33+
"patterns": ["(?:^|\\.)substack\\.com/", "substackcdn\\.com", "substackapi\\.com"],
34+
"matchIn": ["url", "resources"]
35+
},
36+
{
37+
"name": "Movable Type",
38+
"url": "https://www.movabletype.org",
39+
"matchType": "regex",
40+
"patterns": [
41+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+(?:Movable Type|MovableType)",
42+
"/mt-static/",
43+
"mt-search\\.cgi",
44+
"/mt\\.cgi",
45+
"/mt-comments\\.cgi"
46+
],
47+
"matchIn": ["html", "resources", "url"]
48+
},
49+
{
50+
"name": "Halo",
51+
"kind": "Java 博客",
52+
"url": "https://halo.run",
53+
"matchType": "regex",
54+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+Halo\\b", "/console/halo/", "/themes/halo-theme-", "halo-content"],
55+
"matchIn": ["html", "resources", "url"]
56+
},
57+
{
58+
"name": "Solo",
59+
"kind": "Java 博客",
60+
"url": "https://b3log.org/solo",
61+
"matchType": "regex",
62+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+(?:Solo|B3log Solo)", "/skins/solo/"],
63+
"matchIn": ["html", "resources"]
64+
},
65+
{
66+
"name": "Emlog",
67+
"kind": "PHP 博客",
68+
"url": "https://www.emlog.net",
69+
"matchType": "regex",
70+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+emlog", "/content/templates/", "/include/lib/checkrewrite\\.php"],
71+
"matchIn": ["html", "resources"]
72+
}
73+
]
74+
},
75+
{
76+
"defaults": { "confidence": "", "kind": "博客平台" },
77+
"rules": [
78+
{
79+
"name": "Bear Blog",
80+
"url": "https://bearblog.dev",
81+
"matchType": "regex",
82+
"patterns": ["(?:^|\\.)bearblog\\.dev/", "/static/bear/"],
83+
"matchIn": ["url", "resources"]
84+
},
85+
{
86+
"name": "Mataroa",
87+
"url": "https://mataroa.blog",
88+
"matchType": "regex",
89+
"patterns": ["(?:^|\\.)mataroa\\.blog/", "<meta[^>]+name=['\"]?generator['\"]?[^>]+mataroa"],
90+
"matchIn": ["url", "html"]
91+
},
92+
{
93+
"name": "Pelican",
94+
"kind": "Python 静态博客",
95+
"url": "https://getpelican.com",
96+
"matchType": "regex",
97+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+Pelican"],
98+
"matchIn": ["html"]
99+
},
100+
{
101+
"name": "Nikola",
102+
"kind": "Python 静态博客",
103+
"url": "https://getnikola.com",
104+
"matchType": "regex",
105+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+Nikola"],
106+
"matchIn": ["html"]
107+
},
108+
{
109+
"name": "Octopress",
110+
"url": "http://octopress.org",
111+
"matchType": "regex",
112+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+Octopress"],
113+
"matchIn": ["html"]
114+
},
115+
{
116+
"name": "TextPattern CMS",
117+
"url": "https://textpattern.com",
118+
"matchType": "regex",
119+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+Textpattern", "/textpattern/", "/rpc/index\\.php"],
120+
"matchIn": ["html", "url"]
121+
}
122+
]
123+
},
124+
{
125+
"defaults": { "confidence": "", "kind": "论坛系统" },
126+
"rules": [
127+
{
128+
"name": "Simple Machines Forum",
129+
"url": "https://www.simplemachines.org",
130+
"matchType": "regex",
131+
"patterns": [
132+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+(?:SMF|Simple Machines)",
133+
"/Themes/default/",
134+
"index\\.php\\?action=",
135+
"Sources/Subs\\.php"
136+
],
137+
"matchIn": ["html", "resources", "url"]
138+
},
139+
{
140+
"name": "MyBB",
141+
"url": "https://mybb.com",
142+
"matchType": "regex",
143+
"patterns": [
144+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+MyBB",
145+
"/jscripts/general\\.js",
146+
"/jscripts/post\\.js",
147+
"mybb_lastvisit",
148+
"mybb_lastactive",
149+
"/inc/mybb_group_logo\\.php"
150+
],
151+
"matchIn": ["html", "resources", "url", "headers"]
152+
},
153+
{
154+
"name": "NodeBB",
155+
"url": "https://nodebb.org",
156+
"matchType": "regex",
157+
"patterns": ["nodebb-plugin-", "nodebb-theme-", "/assets/src/modules/translator", "data-template-name", "data-fa-i2svg"],
158+
"matchIn": ["html", "resources"]
159+
},
160+
{
161+
"name": "Vanilla Forums",
162+
"url": "https://vanillaforums.com",
163+
"matchType": "regex",
164+
"patterns": [
165+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+Vanilla",
166+
"vanilla\\.gardens",
167+
"/applications/vanilla/",
168+
"vanillaforums\\.com"
169+
],
170+
"matchIn": ["html", "resources", "url"]
171+
},
172+
{
173+
"name": "Invision Community",
174+
"kind": "IPB",
175+
"url": "https://invisioncommunity.com",
176+
"matchType": "regex",
177+
"patterns": [
178+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+(?:IPB|Invision)",
179+
"/uploads/monthly_",
180+
"ips_localKey",
181+
"ipsKeyboardShortcuts",
182+
"data-controller=['\"]core\\."
183+
],
184+
"matchIn": ["html", "resources"]
185+
},
186+
{
187+
"name": "FluxBB",
188+
"url": "https://fluxbb.org",
189+
"matchType": "regex",
190+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+FluxBB", "/style/imports/base"],
191+
"matchIn": ["html", "resources"]
192+
},
193+
{
194+
"name": "PunBB",
195+
"url": "https://punbb.informer.com",
196+
"matchType": "regex",
197+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+PunBB", "/include/js/punbb_common\\.js"],
198+
"matchIn": ["html", "resources"]
199+
},
200+
{
201+
"name": "bbPress",
202+
"kind": "WordPress 论坛插件",
203+
"url": "https://bbpress.org",
204+
"matchType": "regex",
205+
"patterns": ["bbp-(?:forum|topic|reply|user)-", "/plugins/bbpress/", "/bbpress\\.css", "data-bbp-"],
206+
"matchIn": ["html", "resources"]
207+
}
208+
]
209+
},
210+
{
211+
"defaults": { "confidence": "", "kind": "国内论坛系统" },
212+
"rules": [
213+
{
214+
"name": "PHPWind",
215+
"url": "http://www.phpwind.com",
216+
"matchType": "regex",
217+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+(?:PHPWind|phpwind)", "/res/style/", "/cache/imageGlobal\\.js"],
218+
"matchIn": ["html", "resources"]
219+
},
220+
{
221+
"name": "HDWiki",
222+
"url": "https://kuaipan.hudong.com",
223+
"matchType": "regex",
224+
"patterns": [
225+
"<meta[^>]+name=['\"]?generator['\"]?[^>]+HDWiki",
226+
"/view/default/script/jquery/",
227+
"doc_(?:view|edit|history)\\.php"
228+
],
229+
"matchIn": ["html", "url", "resources"]
230+
},
231+
{
232+
"name": "BBSXP",
233+
"url": "https://www.bbsxp.com",
234+
"matchType": "regex",
235+
"patterns": ["<meta[^>]+name=['\"]?generator['\"]?[^>]+BBSXP", "bbsxp", "/skins/default/"],
236+
"matchIn": ["html"]
237+
},
238+
{
239+
"name": "Pu!mdHd",
240+
"url": "https://spring-plus.net",
241+
"matchType": "regex",
242+
"patterns": ["spring-plus\\.net", "Pu!mdHd"],
243+
"matchIn": ["url", "html"]
244+
}
245+
]
246+
}
247+
]
248+
}
249+
}
250+
}

0 commit comments

Comments
 (0)