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"), )