diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..8abe057
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index a9ef76c..d56657a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/scripts.iml b/.idea/scripts.iml
index d8e9ed3..7eb1baf 100644
--- a/.idea/scripts.iml
+++ b/.idea/scripts.iml
@@ -1,8 +1,10 @@
-
-
+
+
+
+
\ No newline at end of file
diff --git a/bigdata/kfk.py b/bigdata/kfk.py
deleted file mode 100644
index 95eb1be..0000000
--- a/bigdata/kfk.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from kafka import KafkaProducer
-import json
-
-producer = KafkaProducer(bootstrap_servers=['120.27.147.4:9092'],
- value_serializer=lambda m: json.dumps(m).encode('ascii'))
-
-print(producer.config)
-
-message = {"name": "John", "age": 30}
-producer.send('test-topic', message)
-producer.flush() # 确保所有消息都已发送
diff --git a/bigdata/raw_action.py b/bigdata/raw_action.py
new file mode 100644
index 0000000..ee20b72
--- /dev/null
+++ b/bigdata/raw_action.py
@@ -0,0 +1,112 @@
+import json
+from lib.util import *
+import redis
+from lib.odps import *
+import time
+from lib.log import *
+
+service_name = "raw_action"
+log_dir = '.'
+logger = Logger(service_name, log_dir=log_dir, print_terminal=True)
+
+
+class S:
+ def __init__(self):
+ self.odps_db = get_odps_db()
+ self.redis_cli = redis.Redis(
+ host="172.31.37.66",
+ port=6379,
+ password="redis_HtfNQJ",
+ )
+ self.bulk = list()
+ self.ut = int(time.time())
+
+ def __del__(self):
+ self.redis_cli.close()
+
+ def flush(self):
+ if len(self.bulk) <= 0:
+ return
+
+ tomorrow_zero_time = get_today_zero_time() + 86400
+ inserts = list()
+ ym = ""
+ day = ""
+ while len(self.bulk) > 0:
+ action = self.bulk.pop()
+ ct = safe_get_int(action, "t")
+ if ct >= tomorrow_zero_time:
+ continue
+ dt = datetime.datetime.fromtimestamp(ct)
+
+ new_ym = "%d%02d" % (dt.year, dt.month)
+ new_day = "%02d" % dt.day
+ if ym == "" and day == "":
+ ym = new_ym
+ day = new_day
+ if new_ym != ym or new_day != day:
+ break
+
+ data = [
+ str(ct),
+ safe_get_str(action, "app"),
+ str(safe_get_int(action, "mid")),
+ safe_get_str(action, "oid"),
+ safe_get_str(action, "type"),
+ safe_get_str(action, "stype"),
+ safe_get_str(action, "from"),
+ safe_get_str(action, "ip"),
+ safe_get_str(action, "opt"),
+ ]
+ inserts.append(data)
+ partition = "ym=%s,day=%s" % (ym, day)
+ self.odps_db.write_table(
+ "actionlog", inserts,
+ partition=partition,
+ create_partition=True
+ )
+ self.ut = int(time.time())
+ logger.Info("insert: {}, left: {}".format(len(inserts), len(self.bulk)))
+
+ def loop(self):
+ key = "action"
+ while True:
+ time_now = int(time.time())
+ if len(self.bulk) >= 10000 or time_now - self.ut >= 60:
+ self.flush()
+
+ try:
+ # 从列表左侧弹出元素
+ item = self.redis_cli.lpop(key)
+ if not item:
+ logger.Info("no data, sleep...")
+ time.sleep(0.5)
+ continue
+ msg_str = item.decode("utf-8")
+ msg = json.loads(msg_str)
+ action_str = safe_get_str(msg, "message")
+ action = json.loads(action_str)
+ self.bulk.append(action)
+ if len(self.bulk) % 100 == 0:
+ logger.Info("len(bulk): {}".format(len(self.bulk)))
+ except Exception as e:
+ logger.Error("panic: {}".format(str(e)))
+
+ # 等待一段时间再检查
+ # time.sleep(1)
+
+
+s = S()
+s.loop()
+#
+# lis = [1, 2, 3]
+# while len(lis) > 0:
+# print(lis.pop())
+# print(lis)
+#
+# dt = datetime.datetime.fromtimestamp(int(time.time()))
+#
+# new_ym = "%d%02d" % (dt.year, dt.month)
+# new_day = "%02d" % dt.day
+#
+# print(new_ym, new_day)
diff --git a/cronjob/share_url/check_wx_share_url.py b/cronjob/share_url/check_wx_share_url.py
index fb7133c..289f86d 100644
--- a/cronjob/share_url/check_wx_share_url.py
+++ b/cronjob/share_url/check_wx_share_url.py
@@ -6,8 +6,19 @@ log_dir = "."
logger = Logger(service_name, log_dir=log_dir, print_terminal=True)
+def get_rank_host_cnt(rank):
+ if 0 <= rank <= 30:
+ return 30
+ elif 30 < rank <= 100:
+ return 10
+ elif 100 < rank <= 300:
+ return 3
+ else:
+ return 1
+
+
def check_wx_url(url):
- api_url = "http://wx.rrbay.com/pro/wxUrlCheck2.ashx?key=9dab4264f077aa3697d346f7ac1f5270&url=%s" % url
+ api_url = "http://wx.rrbay.com/pro/wxUrlCheck2.ashx?key=9dab4264f077aa3697d346f7ac1f5270&url=https://%s&mode=authkey1" % url
res = requests.get(api_url)
r = json.loads(res.text)
return r
@@ -15,15 +26,50 @@ def check_wx_url(url):
class S:
def __init__(self):
+ self.col_streamer = MongoDB(
+ host="mongodb://root:Wishpal2024@dds-bp1da1ddd62bede41.mongodb.rds.aliyuncs.com:3717,dds-bp1da1ddd62bede42.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-77304659",
+ port=3717,
+ db="streamer",
+ collection="streamer"
+ )
self.col_share_url = MongoDB(
host="mongodb://root:Wishpal2024@dds-bp1da1ddd62bede41.mongodb.rds.aliyuncs.com:3717,dds-bp1da1ddd62bede42.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-77304659",
port=3717,
db="share",
collection="share_url"
)
+ self.col_streamer_share_url = MongoDB(
+ host="mongodb://root:Wishpal2024@dds-bp1da1ddd62bede41.mongodb.rds.aliyuncs.com:3717,dds-bp1da1ddd62bede42.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-77304659",
+ port=3717,
+ db="share",
+ collection="streamer_share_url"
+ )
+ self.mysql_db_bi = Mysql(
+ "172.31.37.71", 3306, "bi", "root", "Wishpal@2023"
+ )
def __del__(self):
+ self.col_streamer.close()
self.col_share_url.close()
+ self.col_streamer_share_url.close()
+ self.mysql_db_bi.close()
+
+ def get_streamer_ranks(self):
+ sql = '''
+ select * from vas_cur_streamer_income order by income desc
+ '''
+ rows = list(self.mysql_db_bi.query(sql))
+ return rows
+
+ def get_domain_host_map(self):
+ domain_host_map = dict()
+ docs = self.col_share_url.find({})
+ for doc in docs:
+ domain = safe_get_str(doc, "domain")
+ if domain not in domain_host_map.keys():
+ domain_host_map[domain] = list()
+ domain_host_map[domain].append(doc)
+ return domain_host_map
def proc(self):
try:
@@ -40,6 +86,8 @@ class S:
code = safe_get_str(res, "Code")
if code == "002":
return
+ if code == "101":
+ msg = safe_get_str(res, "Msg")
# 更新db
query = {
@@ -59,6 +107,14 @@ class S:
s = S()
-while True:
- s.proc()
- time.sleep(21)
+# while True:
+# s.proc()
+# time.sleep(21)
+# print(check_wx_url("https://kx0jjwssu14s007.tiefen.club"))
+# ranks = s.get_streamer_ranks()
+# for rank in ranks:
+# print(rank)
+
+
+m = s.get_domain_host_map()
+print(m)
diff --git a/cronjob/share_url/streamer_share_url.py b/cronjob/share_url/streamer_share_url.py
new file mode 100644
index 0000000..8980cea
--- /dev/null
+++ b/cronjob/share_url/streamer_share_url.py
@@ -0,0 +1,4 @@
+from lib.all import *
+
+class S:
+ def __init__(self):
\ No newline at end of file
diff --git a/lib/odps.py b/lib/odps.py
new file mode 100644
index 0000000..b4d6237
--- /dev/null
+++ b/lib/odps.py
@@ -0,0 +1,8 @@
+from odps import ODPS
+
+odps_access_id = 'LTAI5tMp5o4u6Twgm6hL9EQV'
+odps_secret_key = 'O7xAsKMnnWHwrlfvka30v6yr13Qxa3'
+
+
+def get_odps_db(project="tiefen_bigdata"):
+ return ODPS(odps_access_id, odps_secret_key, project)
diff --git a/share/add_records.py b/share/add_records.py
new file mode 100644
index 0000000..aca2790
--- /dev/null
+++ b/share/add_records.py
@@ -0,0 +1,104 @@
+from lib.all import *
+from cloudflare_manager import *
+from namesilo_manager import *
+import ningx_proxy_manager as npm
+import string
+import random
+
+cf_manager = CloudflareManager()
+ns_manager = NameSiloMgr()
+
+service_name = 'log'
+log_dir = '.'
+logger = Logger(service_name, log_dir=log_dir)
+
+
+def generate_random_string(length):
+ letters = string.ascii_lowercase + string.digits
+ return ''.join(random.choice(letters) for _ in range(length))
+
+
+def proc():
+ # 获取所有cloudflare zone
+ cf_zones_resp = json.loads(cf_manager.zone_list().json())
+ cf_zones = safe_get_list(cf_zones_resp, "result")
+ cf_domain_zone_map = dict()
+ for cf_zone in cf_zones:
+ domain = safe_get_str(cf_zone, "name")
+ cf_domain_zone_map[domain] = cf_zone
+ # for k, v in cf_domain_zone_map.items():
+ # print(k, v)
+
+ # 获取nginx证书
+ ng_cert_map = npm.get_all_cert_map()
+ # for k, v in ng_cert_map.items():
+ # print(k, v)
+
+ col_share_url = MongoDB(
+ host="mongodb://root:Wishpal2024@dds-bp1da1ddd62bede41.mongodb.rds.aliyuncs.com:3717,dds-bp1da1ddd62bede42.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-77304659",
+ port=3717,
+ db="share",
+ collection="share_url"
+ )
+
+ for domain, cf_zone in cf_domain_zone_map.items():
+ # 添加cf域名解析
+ zone_id = safe_get_str(cf_zone, "id")
+ if len(zone_id) <= 0:
+ continue
+ # print(zone_id)
+
+ # 获取域名对应的证书id
+ cert = safe_get_dict(ng_cert_map, domain)
+ cert_id = safe_get_int(cert, "id")
+ # print(zone_id, cert_id)
+
+ # 分享域名
+ share_l2_names = list()
+ for i in range(50):
+ random_str = generate_random_string(random.randint(8, 12))
+ share_l2_names.append(random_str)
+
+ # 要添加nginx域名解析的域名
+ need_add_nginx_anal_l2_names = list()
+ for l2_name in share_l2_names:
+ try:
+ cf_add_record_ret = json.loads(cf_manager.add_record(zone_id, "47.242.233.23", l2_name, "A").json())
+ ret_id = safe_get_str(cf_add_record_ret, "id")
+ if len(ret_id) <= 0:
+ logger.Error("cf_add_record fail, domain: {}, l2_name: {}, ret: {}".format(domain, l2_name, cf_add_record_ret))
+ continue
+ need_add_nginx_anal_l2_names.append(l2_name)
+ except Exception as e:
+ logger.Error("cf_add_record panic, domain: {}, l2_name: {}, err: {}".format(domain, l2_name, str(e)))
+
+ # 添加nginx域名解析
+ need_add_nginx_anal_domain_names = list()
+ for l2_name in need_add_nginx_anal_l2_names:
+ need_add_nginx_anal_domain_names.append("{}.{}".format(l2_name, domain))
+ batch_add_records_ret = npm.batch_add_records(need_add_nginx_anal_domain_names, "172.17.219.45", 3001, cert_id)
+ logger.Info("batch_add_records ok, len: {}, domains: {}, ret: {}".format(
+ len(need_add_nginx_anal_domain_names), need_add_nginx_anal_domain_names, batch_add_records_ret
+ ))
+
+ # 添加mongodb
+ docs = list()
+ for domain_name in need_add_nginx_anal_domain_names:
+ doc = {
+ "_id": domain_name,
+ "ct": int(time.time()),
+ "ut": 0,
+ "status": "000",
+ "api_res": "",
+ "use_cnt": 0,
+ "domain": domain,
+ "l2_name": domain_name[:domain_name.find(".")],
+ }
+ docs.append(doc)
+ mongo_ret = col_share_url.insert_many(docs)
+ logger.Info("len(insert_ids): {}, ids: {}".format(len(mongo_ret.inserted_ids), mongo_ret.inserted_ids))
+
+ col_share_url.close()
+
+
+proc()
diff --git a/share/add_wx_share_url.py b/share/add_wx_share_url.py
index 1d8e16c..756e555 100644
--- a/share/add_wx_share_url.py
+++ b/share/add_wx_share_url.py
@@ -9,6 +9,13 @@ from lib.all import *
MiZhiBo_Top_Domain = "mizhibo.live"
MiZhiBo_Cert_Id = 12
+MiZhiBo_AK = "LTAI5t9GQLk8D63FPZFKiXMH"
+MiZhiBo_Secret = "QPgrEowuYKEYD0vp8fnW0Egri8lu04"
+
+TieFenClub_Top_Domain = "tiefen.club"
+TieFenClub_Cert_Id = 15
+TieFenClub_AK = "LTAI5tMp5o4u6Twgm6hL9EQV"
+TieFenClub_Secret = "O7xAsKMnnWHwrlfvka30v6yr13Qxa3"
service_name = 'add_wx_share_url'
log_dir = '.'
@@ -80,12 +87,12 @@ def proc(cnt, top_dm):
)
for i in range(cnt):
- l2_host = generate_random_string(19)
+ l2_host = generate_random_string(random.randint(15, 20))
# 添加域名解析
add_domain_record(
- "LTAI5t9GQLk8D63FPZFKiXMH",
- "QPgrEowuYKEYD0vp8fnW0Egri8lu04",
+ TieFenClub_AK,
+ TieFenClub_Secret,
"cn-hangzhou",
top_dm,
l2_host,
@@ -95,7 +102,7 @@ def proc(cnt, top_dm):
# 添加nginx
dm = l2_host + "." + top_dm
- res = add_wx_share_url_to_nginx(dm, "172.16.0.183", 3003, MiZhiBo_Cert_Id)
+ res = add_wx_share_url_to_nginx(dm, "172.16.0.183", 3003, TieFenClub_Cert_Id)
logger.Info(res)
# 添加db
@@ -115,4 +122,4 @@ def proc(cnt, top_dm):
col_share_url.close()
-proc(99, MiZhiBo_Top_Domain)
+proc(2, TieFenClub_Top_Domain)
diff --git a/share/cloudflare_manager.py b/share/cloudflare_manager.py
new file mode 100644
index 0000000..101c234
--- /dev/null
+++ b/share/cloudflare_manager.py
@@ -0,0 +1,45 @@
+from lib.all import *
+import cloudflare
+
+
+class CloudflareManager:
+ def __init__(self):
+ self.cf = cloudflare.Cloudflare(
+ api_email="chengdewangyue@outlook.com",
+ api_key="d03a3857ee796d8b8e584b8311127b334cc27"
+ )
+
+ def __del__(self):
+ self.cf.close()
+
+ def zone_list(self):
+ ret = self.cf.zones.list(
+ account={"id": "722b58c5ced87e7bfba175acb9a2a9d6"},
+ per_page=1000
+ )
+ return ret
+
+ def create_zone(self, domain):
+ ret = self.cf.zones.create(
+ account={"id": "722b58c5ced87e7bfba175acb9a2a9d6"},
+ name=domain
+ )
+ return ret
+
+ def add_record(self, zone_id, content, name, typ):
+ ret = self.cf.dns.records.create(
+ zone_id=zone_id,
+ content=content,
+ name=name,
+ type=typ,
+ proxied=False,
+ ttl=60
+ )
+ return ret
+
+
+# cfm = CloudflareManager()
+# ret = cfm.add_record("60abfd3b47de6e0830b413b9fa6e9e1c", "47.242.233.23", "95s35e8s", "A")
+# print(ret.json())
+# ret = cfm.zone_list().json()
+# print(ret)
\ No newline at end of file
diff --git a/share/gen_domains.py b/share/gen_domains.py
new file mode 100644
index 0000000..baff911
--- /dev/null
+++ b/share/gen_domains.py
@@ -0,0 +1,25 @@
+import random
+
+random.seed()
+
+letters = "acdefghijklmnopqrstuvwxyz"
+digits = "13567890"
+
+base_domains = ["tiefen{}.top", "tiefen{}.click"]
+
+idx = 0
+for base_dm in base_domains:
+ for digit in digits:
+ for letter in letters:
+ idx += 1
+ random_letter1 = letters[random.randint(0, len(letters) - 1)]
+ random_letter2 = letters[random.randint(0, len(letters) - 1)]
+ ran = random.randint(0, 2)
+ if ran == 0:
+ dm = base_dm.format(digit + letter + random_letter1)
+ else:
+ dm = base_dm.format(digit + letter + random_letter1 + random_letter2)
+ print(dm)
+
+ if idx >= 70:
+ break
diff --git a/share/namesilo_manager.py b/share/namesilo_manager.py
new file mode 100644
index 0000000..ce0de48
--- /dev/null
+++ b/share/namesilo_manager.py
@@ -0,0 +1,89 @@
+import requests
+
+from lib.all import *
+from namesilo.core import NameSilo
+
+namesilo_api_key = "8a5bd1e9d44a52f15897f03a2"
+
+
+class NameSiloMgr:
+ def __init__(self):
+ self.client = NameSilo(token=namesilo_api_key, sandbox=False)
+
+ def delete_dns_record(self, domain, record_id):
+ url = "https://www.namesilo.com/api/dnsDeleteRecord?version=1&type=json&key={}&domain={}&rrid={}".format(
+ namesilo_api_key, domain, record_id
+ )
+ response = requests.get(url)
+ res = json.loads(response.text)
+ return res
+
+ def list_registered_nameservers(self, domain):
+ url = "https://www.namesilo.com/api/listRegisteredNameServers?version=1&type=json&key={}&domain={}".format(
+ namesilo_api_key, domain
+ )
+ response = requests.get(url)
+ res = json.loads(response.text)
+ return res
+
+ def delete_registered_nameserver(self, domain, cur_host):
+ url = "https://www.namesilo.com/api/deleteRegisteredNameServer?version=1&type=json&key={}&domain={}¤t_host={}".format(
+ namesilo_api_key, domain, cur_host
+ )
+ response = requests.get(url)
+ res = json.loads(response.text)
+ return res
+
+ def change_nameservers(self, domain, ns_list):
+ url = "https://www.namesilo.com/api/changeNameServers?version=1&type=json&key={}&domain={}".format(
+ namesilo_api_key, domain
+ )
+ if len(ns_list) >= 13:
+ ns_list = ns_list[:13]
+ idx = 0
+ for ns in ns_list:
+ idx += 1
+ url += "&ns{}={}".format(idx, ns)
+ # print(url)
+ response = requests.get(url)
+ res = json.loads(response.text)
+ return res
+
+ def del_all_domain_dns_record(self):
+ all_records = list()
+ for item in self.client.list_domains():
+ # print(type(item), item)
+ domain = safe_get_str(item, "#text")
+ try:
+ records = self.client.list_dns_records(domain)
+ if isinstance(records, list):
+ for record in records:
+ record_new = record
+ record_new["domain"] = domain
+ all_records.append(record_new)
+ elif isinstance(records, dict):
+ record_new = records
+ record_new["domain"] = domain
+ all_records.append(record_new)
+ else:
+ print("valid", records)
+
+ except Exception as e:
+ print(str(e))
+
+ for r in all_records:
+ domain = safe_get_str(r, "domain")
+ record_id = safe_get_str(r, "record_id")
+ ret = self.delete_dns_record(domain, record_id)
+ print(domain, record_id, ret)
+
+ # def change_all_domain_nameservers(self):
+ # for item in self.client.list_domains():
+ # # print(type(item), item)
+ # domain = safe_get_str(item, "#text")
+ # ret = self.change_nameservers(domain)
+ # print(domain, ret)
+
+#
+# s = NameSiloMgr()
+# s.change_nameservers("xxxx.aa", ["1111111111111111111.cc", "222222222222.cc"])
diff --git a/share/ningx_proxy_manager.py b/share/ningx_proxy_manager.py
new file mode 100644
index 0000000..14581f3
--- /dev/null
+++ b/share/ningx_proxy_manager.py
@@ -0,0 +1,116 @@
+import json
+
+from lib.all import *
+
+
+def get_all_cert_map():
+ headers = {
+ 'Accept': 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,ko;q=0.8,ja;q=0.7,en;q=0.6',
+ 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcGkiLCJzY29wZSI6WyJ1c2VyIl0sImF0dHJzIjp7ImlkIjoxfSwiZXhwaXJlc0luIjoiMWQiLCJqdGkiOiJndVVDWnNjbmE1TzljdzFoIiwiaWF0IjoxNzMzOTc2OTU5LCJleHAiOjE3MzQwNjMzNTl9.TWcVzTMVR1wgphBYYfuH7BhOkrL8vqolzLBvgRU9f5KvkWOWLeF2g0P69YefqQHc32NH6YB81PWUlr_ZFQeeMnGDmcPGk0HvzZawMau44GKCB7iADFpGwWhrQvxYQuvm_f6KeYvLoOJsfTketHu_YoFNlPBhgRJ83uyLzmgd8w2-gdgvWuxHPbDkIO_k3eyw5rqSxjS6lNlo7SlyBCSW3FTgRcOAhOWI0uf87s-RwTHpZxLTDje6QH4PKYMUOJCzhojoxl5PxgDerA5ru0M13bdTAnBGMYjYHP_2X7Xa9DgwZ0yMxDLLIhnrntXQzKFEjv79alehPZe6ENQTHJvNBQ',
+ 'Connection': 'keep-alive',
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Referer': 'http://47.242.233.23:81/nginx/certificates',
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
+ }
+
+ params = {
+ 'expand': 'owner',
+ }
+
+ response = requests.get('http://47.242.233.23:81/api/nginx/certificates', params=params, headers=headers, verify=False)
+ res = json.loads(response.text)
+
+ cert_map = dict()
+ for cert in res:
+ domain_names = safe_get_list(cert, "domain_names")
+ for domain_name in domain_names:
+ dmn = domain_name.replace("*.", "")
+ cert_map[dmn] = cert
+
+ return cert_map
+
+
+def batch_apply_cert(domain_names):
+ headers = {
+ 'Accept': 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,ko;q=0.8,ja;q=0.7,en;q=0.6',
+ 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcGkiLCJzY29wZSI6WyJ1c2VyIl0sImF0dHJzIjp7ImlkIjoxfSwiZXhwaXJlc0luIjoiMWQiLCJqdGkiOiJndVVDWnNjbmE1TzljdzFoIiwiaWF0IjoxNzMzOTc2OTU5LCJleHAiOjE3MzQwNjMzNTl9.TWcVzTMVR1wgphBYYfuH7BhOkrL8vqolzLBvgRU9f5KvkWOWLeF2g0P69YefqQHc32NH6YB81PWUlr_ZFQeeMnGDmcPGk0HvzZawMau44GKCB7iADFpGwWhrQvxYQuvm_f6KeYvLoOJsfTketHu_YoFNlPBhgRJ83uyLzmgd8w2-gdgvWuxHPbDkIO_k3eyw5rqSxjS6lNlo7SlyBCSW3FTgRcOAhOWI0uf87s-RwTHpZxLTDje6QH4PKYMUOJCzhojoxl5PxgDerA5ru0M13bdTAnBGMYjYHP_2X7Xa9DgwZ0yMxDLLIhnrntXQzKFEjv79alehPZe6ENQTHJvNBQ',
+ 'Connection': 'keep-alive',
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Origin': 'http://47.242.233.23:81',
+ 'Referer': 'http://47.242.233.23:81/nginx/certificates',
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
+ }
+
+ json_data = {
+ 'domain_names': domain_names,
+ 'meta': {
+ 'letsencrypt_email': 'jueweijue@gmail.com',
+ 'dns_challenge': True,
+ 'dns_provider': 'cloudflare',
+ 'dns_provider_credentials': '# Cloudflare API token\r\ndns_cloudflare_api_token=OYrExEPmDzx5lYnFrg9c8qU05k-3SgjVe3Us6NoL',
+ 'letsencrypt_agree': True,
+ },
+ 'provider': 'letsencrypt',
+ }
+
+ response = requests.post('http://47.242.233.23:81/api/nginx/certificates', headers=headers, json=json_data, verify=False)
+ res = json.loads(response.text)
+ return res
+
+
+def batch_add_records(domain_names, forward_host, forward_port, cert_id):
+ headers = {
+ 'Accept': 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,ko;q=0.8,ja;q=0.7,en;q=0.6',
+ 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcGkiLCJzY29wZSI6WyJ1c2VyIl0sImF0dHJzIjp7ImlkIjoxfSwiZXhwaXJlc0luIjoiMWQiLCJqdGkiOiI3U05KaHVLOWR0YjdmRExDIiwiaWF0IjoxNzMzOTgyMTMyLCJleHAiOjE3MzQwNjg1MzJ9.mhHrgOATwgRQQ0GI3opDw-qck_TV3c7Ka4TEkDi0ORO3e8iKcEsELd3zfgOzEV5oLHWoGUcOpOn2LPSp4GLMqzbmDE4PWQ4xsAbgT-LCSaN3NRTGGo4XwMkmAYIRrPRIWTqlaR2FwXPYVJocVNbKm5TWJF57dmjFQPrikAxZEJfXewpGPSCF6qnSlCQeFK_lx1um_XIkLxnBLnGy3KsGMhcOtgJ4wT8DRiyd2htYztcv-4TFzhyDsc2U2ge6OfXhPVTHILEPPiCXSgBPjlEx63ilG2w6vaUam1cafRIOgDEqhVT730NmhZVSD8hmRym8t8IPf_6fMgf3Mlv7GrcEyw',
+ 'Connection': 'keep-alive',
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Origin': 'http://47.242.233.23:81',
+ 'Referer': 'http://47.242.233.23:81/nginx/proxy',
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
+ }
+
+ json_data = {
+ 'domain_names': domain_names,
+ 'forward_scheme': 'http',
+ 'forward_host': forward_host,
+ 'forward_port': forward_port,
+ 'allow_websocket_upgrade': True,
+ 'access_list_id': '0',
+ 'certificate_id': cert_id,
+ 'ssl_forced': True,
+ 'meta': {
+ 'letsencrypt_agree': False,
+ 'dns_challenge': False,
+ },
+ 'advanced_config': '',
+ 'locations': [],
+ 'block_exploits': False,
+ 'caching_enabled': False,
+ 'http2_support': False,
+ 'hsts_enabled': False,
+ 'hsts_subdomains': False,
+ }
+ response = requests.post('http://47.242.233.23:81/api/nginx/proxy-hosts', headers=headers, json=json_data, verify=False)
+ res = json.loads(response.text)
+ return res
+
+# cert_map = get_all_cert_map()
+# print(cert_map["*.tiefen888.top"])
+
+#
+# dms = list()
+# ns_domains = ns_manager.client.list_domains()
+# for nsdm in ns_domains:
+# dm = "*." + safe_get_str(nsdm, "#text")
+# if dm in cert_map.keys():
+# print(dm)
+# continue
+# dms.append(dm)
+#
+# print(apply_cert(dms))
+
+#
+# print(cert_map)
diff --git a/share/oversea_websites.py b/share/oversea_websites.py
new file mode 100644
index 0000000..23a486d
--- /dev/null
+++ b/share/oversea_websites.py
@@ -0,0 +1,65 @@
+from cloudflare_manager import *
+from namesilo_manager import *
+
+cf_manager = CloudflareManager()
+ns_manager = NameSiloMgr()
+
+# 需要重新设置nameserver的域名
+# 已成功激活的域名
+# 需要添加并激活的域名
+
+# cloudflare 中已存在的域名
+list_df_res = json.loads(cf_manager.zone_list().json())
+list_websites = safe_get_list(list_df_res, "result")
+cf_domain_stat_map = dict()
+for web in list_websites:
+ domain = safe_get_str(web, "name")
+ cf_domain_stat_map[domain] = web
+
+ns_domains = ns_manager.client.list_domains()
+idxx = 0
+for ns_domain in ns_domains:
+ idxx += 1
+ domain = safe_get_str(ns_domain, "#text")
+
+ cf_stat = safe_get_dict(cf_domain_stat_map, domain)
+ status = safe_get_str(cf_stat, "status")
+ print(idxx, domain, status)
+ if status == "active":
+ continue
+ if len(status) > 0:
+ continue
+
+ # 如果不在cloudflare里面,在cloudflare创建zone
+ if domain not in cf_domain_stat_map.keys():
+ cf_stat = json.loads(cf_manager.create_zone(domain).json())
+
+ # 从namesilo删除域名解析
+ all_ns_dns_records = list()
+ try:
+ ns_dns_records = ns_manager.client.list_dns_records(domain)
+ if isinstance(ns_dns_records, list):
+ for record in ns_dns_records:
+ record_new = record
+ record_new["domain"] = domain
+ all_ns_dns_records.append(record_new)
+ elif isinstance(ns_dns_records, dict):
+ record_new = ns_dns_records
+ record_new["domain"] = domain
+ all_ns_dns_records.append(record_new)
+ else:
+ print(idxx, domain, "invalid", ns_dns_records)
+ except Exception as e:
+ print(idxx, domain, "invalid", str(e))
+
+ for r in all_ns_dns_records:
+ domain = safe_get_str(r, "domain")
+ record_id = safe_get_str(r, "record_id")
+ ret = ns_manager.delete_dns_record(domain, record_id)
+ print(idxx, domain, record_id, ret)
+
+ # 把namesilo nameserver替换成 cf的nameservers
+ cf_nameservers = safe_get_list(cf_stat, "name_servers")
+ print(idxx, domain, cf_nameservers)
+ chane_nss_ret = ns_manager.change_nameservers(domain, cf_nameservers)
+ print(idxx, domain, cf_nameservers, chane_nss_ret)
diff --git a/ttt/wss.py b/ttt/wss.py
new file mode 100644
index 0000000..e0d6349
--- /dev/null
+++ b/ttt/wss.py
@@ -0,0 +1,41 @@
+import asyncio
+import websockets
+
+
+async def websocket_client(uri):
+ """
+ A simple WebSocket client that connects to a specified URI,
+ sends a message, receives data, and prints status codes.
+ """
+ try:
+ async with websockets.connect(uri) as websocket:
+ print(f"WebSocket connection established. Status code: {websocket.response.status_code}")
+
+ message = "Hello from client!"
+ await websocket.send(message)
+ print(f"Sent message: {message}")
+
+ try:
+ async for message in websocket: # Iterate through incoming messages
+ print(f"Received message: {message}")
+ except websockets.exceptions.ConnectionClosedError as e:
+ print(f"Connection closed with code {e.code} and reason: {e.reason}")
+ except Exception as e:
+ print(f"An unexpected error occurred: {e}")
+
+ except websockets.exceptions.InvalidStatusCode as e:
+ print(f"Connection failed with status code {e.status_code} and reason: {str(e)}")
+ except OSError as e:
+ print(f"OSError: {e}") # Handle potential OS errors like connection refused
+ except Exception as e:
+ print(f"An unexpected error occurred during connection: {e}")
+
+
+async def main():
+ uri = "wss://wsdebug.tiefen.fun/ws" # Example WebSocket echo server
+ # uri = "wss://your_websocket_server_url" # Replace with your server URL if needed. Note 'wss' for secure connections.
+ await websocket_client(uri)
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/ttt/x.py b/ttt/x.py
index 8b3e93c..3749e77 100644
--- a/ttt/x.py
+++ b/ttt/x.py
@@ -1,9 +1,43 @@
-from lib.all import *
+import requests
-st = get_today_zero_time() - 86400 * 7
-et = st + 86400
+cookies = {
+ 'mid': '43',
+ 'token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJtaWQiOjQzLCJ0b2tlbl91dWlkIjoxODY2MDU1MDA0MTU1MDQzODQwfQ.NJRWK6o23nhPjnFCZz20N0gnjuLW8OD3rc7xRymAnzk',
+}
-print(
- get_time_str_by_ts(st),
- get_time_str_by_ts(et)
-)
+headers = {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9,ko;q=0.8,ja;q=0.7,en;q=0.6',
+ 'content-type': 'application/json',
+ # 'cookie': 'mid=43; token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJtaWQiOjQzLCJ0b2tlbl91dWlkIjoxODY2MDU1MDA0MTU1MDQzODQwfQ.NJRWK6o23nhPjnFCZz20N0gnjuLW8OD3rc7xRymAnzk',
+ 'origin': 'https://testapp.tiefen.fun',
+ 'priority': 'u=1, i',
+ 'referer': 'https://testapp.tiefen.fun/login',
+ 'sec-ch-ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"macOS"',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'same-origin',
+ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
+ 'x-req-source-tf': 'wittgenstein',
+}
+
+json_data = {
+ 'b_mid': 43,
+ 'b_ch': 'h5',
+ 'b_ts': 1734078412314,
+ 'b_token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJtaWQiOjQzLCJ0b2tlbl91dWlkIjoxODY2MDU1MDA0MTU1MDQzODQwfQ.NJRWK6o23nhPjnFCZz20N0gnjuLW8OD3rc7xRymAnzk',
+ 'b_did': 'Mozilla/5.0 (Macintosh; Intel Ma',
+ 'mobile_phone': 'D1dT7zvxB3HvyHqqB6fzTU/pl1G++EmgJZPcSWkMpJxUa2VtL1Szg+rlFP4ytbsCIh/FLhncOffT4r/N4Z4AZw==',
+ 'region_code': '86',
+ 'password': 'dec61c167c886f5382b0d317eeab5008',
+}
+
+response = requests.post('https://testapp.tiefen.fun/api/login/login_by_pswd', cookies=cookies, headers=headers, json=json_data)
+print(response.headers)
+
+# Note: json_data will not be serialized by requests
+# exactly as it was in the original request.
+#data = '{"b_mid":43,"b_ch":"h5","b_ts":1734078412314,"b_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJtaWQiOjQzLCJ0b2tlbl91dWlkIjoxODY2MDU1MDA0MTU1MDQzODQwfQ.NJRWK6o23nhPjnFCZz20N0gnjuLW8OD3rc7xRymAnzk","b_did":"Mozilla/5.0 (Macintosh; Intel Ma","mobile_phone":"D1dT7zvxB3HvyHqqB6fzTU/pl1G++EmgJZPcSWkMpJxUa2VtL1Szg+rlFP4ytbsCIh/FLhncOffT4r/N4Z4AZw==","region_code":"86","password":"dec61c167c886f5382b0d317eeab5008"}'
+#response = requests.post('https://testapp.tiefen.fun/api/login/login_by_pswd', cookies=cookies, headers=headers, data=data)
diff --git a/vas/income_list.py b/vas/income_list.py
index f639708..8c3ddfa 100644
--- a/vas/income_list.py
+++ b/vas/income_list.py
@@ -255,7 +255,7 @@ class S:
ch_list_db.append(ch)
ch_list = ch_list_income(ch_list_db)
- csv_w = Csv("4104838_11月_主播收益_.csv", ["时间", "钻石变化", "描述"])
+ csv_w = Csv("352039_11月_主播收益_.csv", ["时间", "钻石变化", "描述"])
for ch in ch_list:
d = [
get_time_str_by_ts(ch.ct), ch.change, ch.desc,
@@ -265,7 +265,7 @@ class S:
s = S()
s.proc(
- 954725,
+ 31476,
get_ts_by_str("2024-11-01 00:00:00"),
get_ts_by_str("2024-12-01 00:00:00"),
)