99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
package browserfingerprint
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
_ "time/tzdata"
|
|
)
|
|
|
|
func GetChangeTimezoneJavaScript(timezone string, lang string, geo string) string {
|
|
return fmt.Sprintf(`
|
|
(() => {
|
|
// 设置全局时区配置
|
|
window.__rodTZConfig = {
|
|
timeZone: '%s',
|
|
language: '%s',
|
|
geo: '%s'
|
|
};
|
|
|
|
// 覆盖 Date 对象
|
|
const OriginalDate = window.Date;
|
|
window.Date = function(...args) {
|
|
if (new.target) {
|
|
// 作为构造函数
|
|
if (args.length === 0) {
|
|
// 无参数调用时应用时区偏移
|
|
const now = new OriginalDate();
|
|
const targetOffset = -480; // %s 的 UTC 偏移(分钟)
|
|
return new OriginalDate(now.getTime() + (targetOffset - now.getTimezoneOffset()) * 60000);
|
|
}
|
|
return new OriginalDate(...args);
|
|
}
|
|
// 作为函数调用
|
|
return OriginalDate();
|
|
};
|
|
|
|
// 复制静态方法和属性
|
|
Object.defineProperties(Date, Object.getOwnPropertyDescriptors(OriginalDate));
|
|
|
|
// 覆盖 Date.now()
|
|
const origDateNow = Date.now;
|
|
Date.now = function() {
|
|
return origDateNow() + (%d * 60000); // 添加时区偏移
|
|
};
|
|
|
|
// 覆盖 getTimezoneOffset
|
|
const origGetTimezoneOffset = Date.prototype.getTimezoneOffset;
|
|
Date.prototype.getTimezoneOffset = function() {
|
|
return %d; // %s 的 UTC 偏移(分钟)
|
|
};
|
|
|
|
// 覆盖 Intl.DateTimeFormat
|
|
const origDateTimeFormat = Intl.DateTimeFormat;
|
|
Intl.DateTimeFormat = function(locales, options) {
|
|
options = options || {};
|
|
options.timeZone = options.timeZone || window.__rodTZConfig.timeZone;
|
|
return new origDateTimeFormat(locales, options);
|
|
};
|
|
|
|
// 覆盖 navigator 属性
|
|
Object.defineProperty(navigator, 'language', {
|
|
get: () => window.__rodTZConfig.language,
|
|
configurable: false
|
|
});
|
|
|
|
Object.defineProperty(navigator, 'languages', {
|
|
get: () => [window.__rodTZConfig.language],
|
|
configurable: false
|
|
});
|
|
|
|
// 覆盖控制台时区
|
|
if (console._timeZone) {
|
|
console._timeZone = window.__rodTZConfig.timeZone;
|
|
}
|
|
})();
|
|
`,
|
|
timezone,
|
|
lang,
|
|
geo,
|
|
timezone, // 用于注释
|
|
getUTCOffsetMinutes(timezone), // 时区偏移分钟数
|
|
getUTCOffsetMinutes(timezone), // 时区偏移分钟数
|
|
timezone)
|
|
}
|
|
|
|
// getUTCOffsetMinutes 获取时区的UTC偏移分钟数
|
|
func getUTCOffsetMinutes(timeZone string) int {
|
|
// 使用时区名称获取实际偏移
|
|
loc, err := time.LoadLocation(timeZone)
|
|
if err != nil {
|
|
log.Printf("无法加载时区 %s: %v, 使用默认值 -480", timeZone, err)
|
|
return -480 // 默认太平洋时间
|
|
}
|
|
|
|
// 获取当前时间的偏移
|
|
_, offset := time.Now().In(loc).Zone()
|
|
return -offset / 60 // 转换为分钟并取反
|
|
}
|