diff --git a/app/.env b/app/.env index 6ae0d6f..6071276 100644 --- a/app/.env +++ b/app/.env @@ -7,11 +7,11 @@ EIP_BASE_URL=https://smart.jdbox.xyz:58001 EIP_GATEWAY_MAC=00163E1A2F0E # 轮换默认参数(如不指定,请在请求体传递 cityhash) -EIP_DEFAULT_CITYHASH= -EIP_DEFAULT_NUM=10 +EIP_DEFAULT_CITYHASH=20c5485e25a2f55681fa38f3598b34a6876e60c3188e4b5174042e4e390a1808 +EIP_DEFAULT_NUM=1 # Redis 连接 -REDIS_URL=redis://localhost:6379/0 +REDIS_URL=redis://127.0.0.1:6379/5 # 日志级别 LOG_LEVEL=INFO \ No newline at end of file diff --git a/app/config.py b/app/config.py index 9919b0f..890d29d 100644 --- a/app/config.py +++ b/app/config.py @@ -2,8 +2,8 @@ import os from pydantic import BaseModel from dotenv import load_dotenv - -load_dotenv() +# 加载环境变量 - 从app目录下的.env文件 +load_dotenv('app/.env') class Settings(BaseModel): @@ -19,4 +19,436 @@ class Settings(BaseModel): settings = Settings() +client_infos={} +for i in range(230): + ip4 = 2+i + ip = '172.30.168.'+str(ip4) + client_infos[str(i+1)] = ip + + +city_dict = { + "上海": { + "上海": "f8a5e9b04178490cf8e71f5b273538aa75ef2c978ecac974a176d93af966ef53" + }, + "四川": { + "资阳": "902d065119a5f1826ea26e1c748325e03948fc716f8fda94f5350f11fb929c77", + "阿坝藏族羌族自治州": "820def821c8572fe8590624d840605c8e69db41577b8d7e85a3a2a98b580063f", + "雅安": "477fce41f300a2782ee7ab9f9d7adeca59db64a6087f9afac7ab72b2d558b27a", + "凉山彝族自治州": "c8c2bb88c71d70ed022dc7513e8a1e4bc9100ca76beb702a3397ba28e857e2db", + "广安": "fb97ee4fed88c5dec325c30bdd144ce61484630173a0faffba4157efd9dce73e", + "眉山": "081309c7c236a6444e2a1c2e0482c265c2f2cd867555cfdba4d3c43bf50156b2", + "达州": "475e46ceb4b3444de5a289a24e6a9261e1ed4c4e4881bcaa9f54d77211f2b770", + "乐山": "4e61e41d9f37eec9ee10c1dbe06d0ee4811b167aeed0b56fb8f0c4cdaaada187", + "宜宾": "a14269764eb749b59c13f3d53c74b1aa47c9dbbb56bb6e9cc5fa9a492a7f03df", + "甘孜藏族自治州": "093ab1e0119613935c5709a67af2b5722f61f807d49534a80e1b5d8e7b288dd4", + "成都": "69cb4668ba9bc5d70b80ea2b48eff549215126ce412a2287755b4f494c459ae1", + "泸州": "8a63941727e5f8f3dd1462bc938f3e8e7357fbf7327c11070a0f8cad2ad93806", + "绵阳": "988dd0008c5b1cda2c1a602226343742281d9d723c475ac7216e6c23a8e26c61", + "自贡": "0d9ecc66423452edd9d2fe9e9ec5fddae1ef1e5b0d6d6994164dca4aa85b7976", + "南充": "4a04a1900273abaddc0ac4cda52d50fa84816c30a50467c1fb85c294736c114e", + "广元": "ec51fd8fb1a1563ef8434599cbd9a7995d6bd72c94a4a4880811e6fbbfaa6085", + "德阳": "01c2d1acf783b5ac014f87dfe06d9a731c654d42aef402dc68965b9194ee7b2a", + "遂宁": "3e438d1e20398f676851302e40b9d1f2a086cc552bd81dcb7c661c6ce4f7a93d", + "内江": "f222ada64b15fd48922e0d27a517c21d3cacd4723004b14b76dffcb697af6f55", + "巴中": "aeaf6197d6c6d2f5279283c7dc471e509efe67fe34b9d1ecdae10b8d1d037fef", + "攀枝花": "94f422d28120b90268aa489437952d88592765d81214d32488dec64eb8da9401" + }, + "广东": { + "中山": "0cc0187bc0a343ecd70b45296210ae75fbcf2de169435d1ebb8162ac7e43a1ff", + "广州": "ef26cdf15454e2aaba125512dcb6b509f0a9c02e0807ac13d4b77cbff52fe05d", + "揭阳": "357581967dc2b4424f9713838937ddbb28de24087979969e58b52164141dd2e2", + "清远": "7de860dbd0737ce60177ab16ce7448e67303179928cae696d979922af14ea0e2", + "韶关": "cccaa03d2beff9078c26b26532c7c08a52d6d097252d994619bba7454d767093", + "云浮": "4ccdf8d5214f08ea9b1fd4f4e8caf198eebab00409d38994bbf8d14a3aadea38", + "梅州": "ce3ff2def5ed1768ca4fc783e032af802577e3d8ab54c003126cbea82c6e9a8c", + "汕头": "84e4ab89d632efa6fd5e9e9d2f9e48c042c48207092fd61f53e14adc1286c731", + "汕尾": "eb8625b5c32e0dd451e11f2ee99be1d06257e27255459617686d93b3240ac50d", + "珠海": "f74f2b15ea4ae3e5bdb11d2896384a148920af47f4b02a97b1ee9df9d7048079", + "东莞": "64e55d5c9494cdf13a1e94c1a7cd3bde927a8c18ee301fcf45ee87a6257c1633", + "惠州": "26d125d3f04748e748eccafa0c07d09212dd738ca540fb728b8202c8419f13b9", + "江门": "516e664c20bbc2ac4cbfe29994de2adb4085b955a09f3cbddb7d2affab892237", + "河源": "2a8dc5b6ce2f186bd987e616eea29600b06bf6fc65f6e2ba2b0d5e03b857366b", + "湛江": "e8a8a198f537af53045f0df2604454a2407e46d2ceeb96c47b4e0cfac16a3cdc", + "佛山": "625d17f7359cbcf47504ee30a2e30189faee9637a72ad321e497dbd9cd6420b1", + "深圳": "2bd4cdcb39010610777f48014f78016f39e8a0b29171e8b7035d0ae4e831ab8a", + "潮州": "fa204f0c04b172c5a4625df6ca911705a6e997a895372fa66b516d679b5bd892", + "肇庆": "f6eaff0e140de33e510b0285337e6d3c0371ef8e4aec042c111d70745f0047e8", + "茂名": "9b90d5d8c988589e091c5474b51d6363ef597bc93470d5d49ae37006e02e38ed", + "阳江": "5ee66061902cf489abb7049df1ae30c1ebec5af64d62bf71f37af52173a0c1a6" + }, + "海南": { + "三亚": "9277f60dbdb857135ae3c755479b8cad7752245df697d0a6b9fe6585cd4c3284", + "屯昌县": "d174862cd52af19f72f791f2e9d288e2a3148101623aa08f8b9e5f4bed2ae355", + "白沙黎族自治县": "5873aef16c8d6b272a3bb573a90b4790fae5b0a9b5622df1cea06fe0d7463cfd", + "陵水黎族自治县": "80c4b0eb9e4e131449379cdc58a51f3b6bb9b45847bca53383e74b569af5750f", + "万宁": "3b18a54cddf7a7387893b2995a8cfe3992724471f479e9fb55d4ac163169354e", + "澄迈县": "99951cd2fefe9678ac0bf8a181bac0c8cdc651fd6081c7395c35ce3e8da4bd24", + "琼海": "a35c20a52102cbcf3d9ad109d9dba0fcc2666f77c644aaa7eb5904b90def1dfd", + "昌江黎族自治县": "56d5cc921a9c34ec44615e3ac7898794440c884ff70fcd94b95ae8a68449b2f0", + "定安县": "47c9cffed65d04bcfe76d8ef1b8262b904d7f29c92b64778d796af2fa8a69791", + "琼中黎族苗族自治县": "c7e8553c8ba95acfe8879e64c4c2b0b28b0b16255a2890673a54ab2fcbfb3091", + "五指山": "b99723ccbc99c6ba0af20c865c96810a563ad78f9617a1b8e29239577f7b06f3", + "临高县": "6d6de688c55c2b167f9531118e4d698fce8e53ca89fdbd94b6743ad5ed519d45", + "乐东黎族自治县": "fb5661fd8ea061b4cfe539ba5deff2421b4aad6122e5cff9454312ad91deba7e", + "保亭黎族苗族自治县": "546f13ce15a4bec353a64fe285eb54e232d9f560716c8b74ac0cdc951d2889e9", + "儋州": "33e83af31b59b0ba980f2d5c282bdd90e78ff6e24780646640b0c86cda763425", + "文昌": "017358c21a8fca07fbd06f306af1a59d001685436ef8298859e8062312ac42de", + "海口": "8527af3a62cab64f98f40266a2dc1adde23d5a617b953a9b092cb30730eb1348", + "东方": "7af722bf9ec4e1aaa73f49bed272ec9fd9a637417c207a7b5712eb67d23d8c98" + }, + "湖北": { + "十堰": "85105a54a6480b4a97d6559aa1e83545453f2a7c7b0595433e800e00daf477f7", + "孝感": "b3ab968e65219b8100addd802dd0b9b6fda0169868a6081756b01aada8450be5", + "宜昌": "4c79e67cd6f616ab1710dc15f8ba7594be5bd758becd4bd8d681c9d717d31aa7", + "襄阳": "85767a31a443803091f92086a3fe12ccea5bded0694251635005602445fb9a99", + "天门": "91a4f75b283e9373507ef16645b23894157db8e9a3004427c506955a056406a6", + "潜江": "66c2f6b3ad6cb578652b925adcac5050d7db26d956faa394f09bb0f4fa08b92f", + "荆门": "51da574feb20dbc0ee7697585feeac4bddbe53933115519cd09ec3a4a29e183b", + "仙桃": "9f6bc74ead0ca6eb41eaa9eaa2ad4a0235b1f18e9cdc1dd4a2b2ad3ec630e047", + "荆州": "f5f1593b3aa0d7918b0b71a837ae082c6a359f86f19ed8bb9e70952068a3449d", + "黄冈": "94ae0e68351dc53dba8f21631a02c23d5b23b8cdb75272215d7ca82295383a32", + "黄石": "916441cdf755c27216c4bdcae294d190c2fc1e10fd2e9addd0a995ac92f460d2", + "咸宁": "83472e3684d2df1f3825dc02a606eed9b019cfd9f802abfeab4d3d85e12ad7be", + "恩施土家族苗族自治州": "ec4a7129c9f9d8976fd9207809d2fef1e1fbceda2939ace6d722d5b6cb90fe92", + "武汉": "f7fa6dd7e26bf54d2650eb58a8c74c8f248ead5bdfa25650e15132ae95f9c41f", + "神农架林区": "3401d987392220548e0bebf07a3ab37c1c214ab5b4e3d25dc9ff1677e714c885", + "鄂州": "5b46101880b4cd0f15300d215ee2acfa1d193443616b9201086809d0c9c66ee9", + "随州": "8db88373bb4a82aa0699ed2f9828bc71722611630d6576b1e147b2c79b2a959a" + }, + "福建": { + "三明": "9ed66af07e9f169860686e2cb7f2e15aca4b7bb1691de1d298e7193b41d9b155", + "南平": "5d2add4042142bb373d83a09e38ddc9f216cb18b7425685c9ec86e21040d54b8", + "福州": "7d8b79d62c74038751de9895bbd0b22fdaebd3a4e1f58ca8e7c6ce06f769f15e", + "莆田": "c0256c28f8293c6b4e5f78f8541326a58f8e623fd0062f294291c8680ced10a9", + "龙岩": "14fc7fa4ca25513cc50460f17ac2a42f932f55fcd95690f10788ace672d8bf7e", + "厦门": "99b4026bb98da7fde0add4234c9965c9334de7b7ecf01581639526a665dd0091", + "宁德": "320d9f5366a0c5021cc0cf849c91998f17c231fdb94e3bfb8cebcacd671a8437", + "泉州": "6f6ef82fc0b29fb8f7e228cb02c8985cd5c88f1ea9b75107821896d98a3db24a", + "漳州": "e0167e025b5a699e50b3fb4ec4c43d27bedad6e177cf394b51ac7717a05d9f96" + }, + "辽宁": { + "盘锦": "005925bfc67991e9b34a2cb760dc5a7df34f14c92ba2806cae9d671586061f9d", + "葫芦岛": "717f7afeb6e2182f23340f6de7752b879388cf57f025a06b4f164fa4a6c82fd3", + "阜新": "732f28fd60e511db1db85ae8e5f26c75e3be7f2ddee85c4007358188588f2899", + "锦州": "f6c89bfc5c82ae8debc8e83a14306feb19a6f47b0487bfcd5117b4998236b2bb", + "丹东": "4268488e4da0a244f5fe560337f9e1008712d2b4b870fb968187ac25703344ab", + "本溪": "80658a4556dbd03947ee01f3e47acdd2a03251f2b79715a6a645a21734ea0fbd", + "铁岭": "cdad8012d9a5b12a2b898c2c1350d42cb037618efe1a3e6270962e3333763618", + "沈阳": "21b8338af3a947b676e398e23535608d4abac51585f5169b1326543e99f2b16f", + "营口": "294766a3c4aac58af47306b34821b192d2b4ad2cfcb661d88563fe3ee544bd14", + "辽阳": "401a6a9bb2bad235da16475eca76eaa7dafd0f39d21ca27158497f9b653b89f6", + "鞍山": "2c3e4ee9675b08aa262d4ceeda4ff1b174e0c983baa0cbba15366fcac967f457", + "大连": "5c47af45660511fd9a03896189c4d424eb1c4acfee874944caa11ee9cb879fee", + "抚顺": "0b41e1b94381ca5fa24f516a5eb785135b2a2327761731278657867d5c2d84ee", + "朝阳": "3b544535da4d1a59f06c84c7a940c1f2f5a8b769d5287616660268c21f967cf9" + }, + "北京": { + "北京": "fc5b91e92919fa705d71dde222b3fb5e7da26bfa0489c9dc60c0a0117f692481" + }, + "吉林": { + "吉林市": "94fdf6d0a0701120800c12ddf2cc5a09f47d5f228e2089987c074df79187dd99", + "延边朝鲜族自治州": "86f823309a4e5336839280d878821040db3d107f73de91d9d2bc5ceac5af762a", + "白城": "bc41d34110c2989b29f7521133d605e7a8aa6e9edb488217c5c0d087603a753c", + "通化": "e0ce2af43685ba15e22660b8d487d712673545f61bc34283b203fef5f620fe8c", + "长春": "87b94e06fddb475f893643a6888240f77ff4c9446d153a65ac565505714c533b", + "四平": "6f3fba4383e19094a8bdb06ef3007da4ff05b17faa77309baadc9b6b90363395", + "松原": "a4002c19888160b7f7875e7d5727ad8a0c7323af8070f39dcf60895112ac1283", + "白山": "0cecee7c061cd8037717d5481aadd35c68ec0f4f1a8ee88138aecb19d8f33276", + "辽源": "6efe00a6073c78d6f77d318434bf06d2df6c1add418c14a2768aa3bd72711410" + }, + "新疆": { + "阿勒泰地区": "a4df561a2d85a8c3f9624deb2b7825ea7a6a8917f1b9c33f8637d82ead1cd657", + "伊犁哈萨克自治州": "ed140f77597b48b8ba22e239e005f34f56fd06693038bcf36e415446aeb5b8ff", + "北屯": "4a87e2df72699adc4a5fd6854ba05fc620d0168436bcdd1299caf22d41ed4df4", + "喀什地区": "cd844af6fb9288c40b4c9b59567e0d81f32d8c16c955fc26553d3ac0575efeb7", + "昌吉回族自治州": "f9babd2b7ccac45ca74bffd316be7b20b42c7fc26f5875256c1a8f0f4cb902de", + "阿拉尔": "1f345b7a58c83cfd7d74826eaf199983833452a68f3dce9fc69ddefc49e2d1ce", + "吐鲁番": "f2f31db4a10b527ad62dfe0f01ac3c383a15c2369a0503d69ee4a6d745990aa9", + "塔城地区": "672df7487dd18ef1a84ad17905e8a87ac7e477445d44e97484f75ad34da7195f", + "石河子": "828d503f3d3ece9d927167a1bdf07887ce6d49093d94b143d35cda83e93365b2", + "阿克苏地区": "c50c89e25ab7f493510d72d71ee28f4281b130c4720cd9aa232a76c733df5cf3", + "图木舒克": "25989991e09e1a906667406b1f30142fd93050b862f50c0d699297c2cf6d91a8", + "巴音郭楞蒙古自治州": "f486a6a0db1f6c0307f2c5295a675fb8158add2adb7973a3981fa1fd60000e13", + "五家渠": "e7e1e8a4f80fb623805d5526010b26a38b9304039a91aac0802b919918aca2be", + "克孜勒苏柯尔克孜自治州": "a6a6b1fa3ddb78820e113d70ec81e913bc87315637e2543bedd3a7d928379f01", + "博尔塔拉蒙古自治州": "c1d66a1666d57799f809cb02cd6a74bb65b1aa3b70fe21d38fcbce3025e45937", + "哈密": "c546ed2abfa04684697603ae256d4c7eb373935db996c021077f5669375687ac", + "乌鲁木齐": "08a4b89703cb47f718cc9c2505b7e5cb783a49e75db80a4052f60aebd8e40495", + "克拉玛依": "8d35daa05b16b6b0eca24db6f8d783621f500ccd728eed28a0548c599f5289bd", + "和田地区": "677860c2b64bacecd748cf261203de8b2d61be3fb584b2331d9c9551f225ef7f" + }, + "江西": { + "萍乡": "0843bcecb7af552fb816bc9db2f66ce70fecec9834961988b1807013d6f48618", + "赣州": "bf4f5193031c3a3abc76db98bb9aaabcdda63b7f4b6bbc2acbc2049153eefc49", + "九江": "f9d7d1453fb46ad290295fefc2857341d7f7085711d1cc6ccecb1ab67f0e80bc", + "南昌": "44ee84d6b4acec5d65d468f3b968e1dada861c0a1c4009fb769a813ea5357b83", + "吉安": "6babbd2339d53fe041556a775b3963e63f66153b7ac9ce3bd698f5334de84f91", + "新余": "13de0c850c7f51c3a215ecd30c6d4edf8bfd1b62c3354e87e05a60cbacf51523", + "景德镇": "7ec1d0f886b21747fe7a39f3fee2b6f1a462fefa78dbe126f12a502106edfe69", + "上饶": "7eb867dcd8b62172f075b2bbb7e87b31702e3eaa0f09dadbd004541ab486b59f", + "宜春": "77f7397a6a929a34600d4b517e012c4cd78098e30c89d85d7e88f7d786bcfd85", + "抚州": "ebc3b0f48cb638bebfaac264ed95c455102f5acd87e31dae5b1342d8f68b6df4", + "鹰潭": "321ec26a30f3597224596688b2dcbf11f68d006efb67c5fc99eaa204a802387f" + }, + "重庆": { + "重庆": "4b0b86dd5a879aad9c356fe23559fc0456894e0b1fd580c7cf12172ae4014bb6" + }, + "湖南": { + "益阳": "08397b1ba554e93dedaa897b474ea24f2965766fe880f6c00652756574287a19", + "邵阳": "6cf1b44b1b1148b16da681de21ad837dcdfb8b2aa732a43c5c54472a8cd10148", + "常德": "8c08c6f82360a0f996790f594feff5702aff398658e701f78c7d1457f0090d57", + "永州": "781f88f2079649d795d8663fb6037223a868f729c5b65b3b44ef9fd3b1b02e68", + "湘西土家族苗族自治州": "2dcae7c10849fe53081181e1d3e53023f85d4e37f489efb96cb71212268038ca", + "郴州": "bdb5cb91b4290e4c7655637ebfe73106d073dc73012231afcea22e8c70a71bd8", + "岳阳": "e33daa9c38379b67ec055303832254284e09d7c04fc7234d871e7a2766ae11b9", + "怀化": "20c5485e25a2f55681fa38f3598b34a6876e60c3188e4b5174042e4e390a1808", + "株洲": "495178dbf2b2a5cc37544d1e24c9780f78fa8344d89d6da8c828d21a5d2d1ad2", + "衡阳": "0e4a0624c63f52e856ba61874f0f4fa6b96328bc40f3483cbf784dc24412d009", + "娄底": "2f6242d5ea29e7e0ff9cd59f70abcb3054c0622992385abb72af71dbce9f2ece", + "张家界": "da3357fcafd57d479c70cccdee8a76048fd41b5adfce9126c68cb5cb6fbaff4b", + "湘潭": "c6c2657ef32f404227f07e0ce8f17bebfee4747661e499382442a1d16664ddf8", + "长沙": "8710a691dd8c48d594107b61ff1e0cc63ae03bdfb7951785e885a4f2e1ebc6b9" + }, + "贵州": { + "六盘水": "30daec188f07c554848f85edba10f30b6116af1fa762806567a306faafe98811", + "安顺": "0067f4bd5364b21053203955c4ce388aa2cc71ff8e433791592013949d2c268a", + "贵阳": "50e73ce253bd1a6ca03d9a6ddada0d5b8eaf3fd8f9b36379c5fa6805ca24c5fd", + "铜仁": "45915d452488c8172f8a75ca47ec6702a429554ce95215803673df84298f8ab8", + "黔东南苗族侗族自治州": "f1ab4230be39dffdc5dc9d225906c29136d354d2051c4d9515a656e433042f72", + "黔西南布依族苗族自治州": "3ad2fe7e6e5958189cf10cca222e0b0c9b4e63df1726e89a5d3541f351ea7dac", + "毕节": "7a0ce626537da17533822b9b193e7e52cc81a72e6635f94157a3e3dd9f43e7b3", + "遵义": "7dbb8806b7208fecbca03c7ec3ca9c1e5aa6fc41ba549fd559ef798e46fe6327", + "黔南布依族苗族自治州": "137a314334c8a599b270acf7595d5e91a9f1de6cf3f0d13c15bb9236e384bd8a" + }, + "陕西": { + "商洛": "e3f3a7aa8343f1cb7c2fef4fe9865cf516011eb1ec1697f47d9a8c0e1e042502", + "宝鸡": "dac72c01c94bd3d9f7301893d2627836f1640d797f16724ce33c8126ed5a4a53", + "铜川": "89b1576896695414a9332988d03991adcca146fbf93044639398981121254a50", + "汉中": "edc47e4ff952417449e460d84ceff7a775c478e246ad1ca8916d15818216293a", + "渭南": "34d236814dad0ce1ae984d3a197a7ae2e4881d5d7796efe11b111ec08f695074", + "西安": "10a949a9ea60c62b85398a426cad724b7a8cdd4b6c782e03849b76bbaccf2a2c", + "咸阳": "8da50c12630cbf3c45500ff886e3bc8f7992214f17dda97d1be1633d8322c680", + "安康": "5e19992fd60cbd22d13d237f7aadc46714e0b6b8d4a8f223796eafb9d04311c3", + "延安": "82dc5180aadc67e6897f9788111744111a4c14f9109275463cf7a796977f09da", + "榆林": "719c4c06424af87274cee1fab24f94b19010a9a5467b6cb1e39942265c275cbe" + }, + "黑龙江": { + "七台河": "58370ef051a7f4a3d5d40a3f505bb109420c2b347ba09b579b06c774cc3fbc3e", + "绥化": "4039556920151733b96d2237183fc48583d1b6625411e5276ebabba37d8fffb8", + "鹤岗": "da09eba79b16b8f4af4ece51bd391070ee8919d5865126b0c720904a5b0d1415", + "齐齐哈尔": "722f020d63c61dce7fda0a7bdd11b5ec96ad23646661d7f8495b2cbd6d66447d", + "佳木斯": "161144622f00c9832cd8ef648836f224bf3a33459296a668e7cfa2b2534c1531", + "双鸭山": "6099babcecf7a9c9c8d704b02670b59070675242a34e113020e542a6a7e83cda", + "哈尔滨": "6a2f940902bcf9c3e62e81be970ff1bd6e2a237d5ab0be0fe9bd17b3eb9175e6", + "大兴安岭地区": "89553c7802d23d535b7e6c124845a200e69ca51573f62c0be89af6720446ad7e", + "大庆": "da49875b6877c7e4d84a0d5e353dc6afb3ab502ad35f754aa2bb87c3f29cd6a5", + "鸡西": "a4894931403f940cb001a5f31a3eea8310fa7d581da1e7c23a1d239ffb1d5a9c", + "伊春": "be932c1f1e4804ec2855c7e5b7019f965b430a1dde74f14d363a65bb28a25b47", + "牡丹江": "686a8e5fe478b85f62d4c76f72d83468662a37388c176117d0c8d5ab4797d219", + "黑河": "acabeac9e6a7a6f2668bfb7cd2ef974890511d409ee6b3f92d62803a9df2fe63" + }, + "宁夏": { + "吴忠": "b2401bd669d3ef7047dacd0be84f099a09b57d91595cf02fde43675c4fe0b4ec", + "固原": "14b5e52ba02dc318a9673aa9000feec4b8d19abed7cb629a39d917763cb9b203", + "石嘴山": "b771f2884a95df3952a88529ecf8906337eeac7a70e1347cb27e20ef1b1de74e", + "银川": "60a5f061a47381709ae5463c13ec3ad17bcfeba930a82bc1bb84a0f9875b9ebf", + "中卫": "8431cda158d1c98ceabaa40fdaac4e915caf9d51b05257ed00a03ed7d4cea94a" + }, + "江苏": { + "南京": "ac7a6bd71272fecd3c2581cfc33c13c06990ed39a734fa151c854dcfaae8cd7b", + "苏州": "def92baf4c44a2a758c6bba8d4720942497441a057fea35e26563f9baa75c4a6", + "镇江": "6357bdb47e7baa15947c7825f0f02d2bb6c7858475a6f5445cf03506ac37dc78", + "泰州": "f873b74b459064838e58248d1d266ac3071a374a77719b5c8b64eb30366dc27a", + "盐城": "d01d03a7047f2ce60e4f278976784e1ada32cea72ad1b276573ede5455a14755", + "连云港": "7ba3e8eb85c3f93470d8d2ecce67f873a563b2934ad64ead2899d0b0269c4b60", + "宿迁": "fb14dd83b3e1bebe4854270310b7a43a94037ca537d030c57321641e0f2a8cc2", + "无锡": "915467a82c43b854da8194cc405143ecd0e4a1dd95aa7624437ed94d3fbadeca", + "扬州": "ff4185687c14630fceb95f2b5f1cb553fe39946279d2d452c28b020631f8faa3", + "淮安": "6998147cf1e33b0524cbef714ff3bbc128575880262f29b7e8466aab1d5891b1", + "南通": "f8af0c3ec1d5c2809e49817171d723e88612f0ce3b71f5aa9360ffc0d454a980", + "常州": "9324841f94e58e1352b1b56d49c017726d5f604d781690390d38040fe02404f5", + "徐州": "8daa7dee0b759894382e3eb1cf53dc567d4af482b5bf99a03c557bede52290b3" + }, + "云南": { + "昆明": "0cd882c20fadcb22c4f57ac445e40e8720564c42e9f344d461c27a33e15e7302", + "普洱": "398c2f0448b09d822aa12132903390cbb929d4d87ef578c77f978e98ff27f66f", + "临沧": "9ad1663c65e820a1d826306591f19544e9e49b450231029eb6a66a1841c361a9", + "丽江": "6b018596f498a4ea06ceac55ad0921efded19a608c92c7b893b671000498bf1e", + "昭通": "5515148d6a50997b367a88985abafd67af6c9181b8c444f478bbde343a96c6b8", + "曲靖": "3e650b4767b3580bb8fc45aaa583b37e0f28a40183203b4079f1f91834303120", + "红河哈尼族彝族自治州": "eb544e910b8d5ebed8e4c27c215e7b80a1c08e15742f31b8a70848a229f7cf9b", + "大理白族自治州": "511ca60b4d6cf0dd0ebf02f9a5e78bd6936a6fb20219da5b8f346e03cb419ebb", + "怒江傈僳族自治州": "01c0d12c36bd84290e6f00efa890e9e6e502fb888f2e3ad46f1de04ea3004939", + "保山": "49bb63acf8bab79f272025be7e1e7b56877c4e24096a9430831be0b34c6230ce", + "楚雄彝族自治州": "480775b883401f2ffb45a610f8e1d689b3e918d169164f4b68ca6c580c9c63cf", + "玉溪": "24289ebd3ef33888c9931a5259c0cbace80c4eb1d6d24cffb130aa64532ec666", + "西双版纳傣族自治州": "d1391a7c498fd9dbd861c388882268517aade395ae4674919f650eaed3e760cf", + "迪庆藏族自治州": "8c8b304abcf5bed5f0de2243f2bbef134b24810ce3383a004ff94766813e1415", + "德宏傣族景颇族自治州": "16dd42f4b8a5e5c8929e64a59015249c1e6728f5f6f1cc5376ebadd08b193c62", + "文山壮族苗族自治州": "6dafce691415eeb72b86b9529e6d05773cf7e94df13957d3df64b37267cc2fe8" + }, + "天津": { + "天津": "a7592e635f9ecdf5ec2c6264d74132d8984dab1542a7b69874328df8d6cbb9de" + }, + "山东": { + "泰安": "3025b7a8ef7642e4db1990c3a2df4fe1826983fba2bfb036c395498728c4fb84", + "济宁": "478d415c9656cd813bf46d89f28199980372f192723d815feb688a3c3dd3e02e", + "淄博": "31b9426133fe3964d31b77f9a60b3fb0f921878ad007941a3cd9f00fb641f6e2", + "烟台": "a0c8aa1904e744129d94859c4a770c0b877ed724405ebdf14fed50f400779b76", + "菏泽": "7010e97fce38f0a1ea4a38df513db182daed68888e18c7b95f6b72af99445be3", + "东营": "5747815b2e3b66dc9cdee10f3a0e2b0a06e7e52f9068b92928f6cd1b3edc4181", + "德州": "aea7168dec3a43d8c0bfa761aa0414858407c28d8dc4a9689b933026cd56e558", + "枣庄": "122564980cbc3615f8a713862bd945f4f3bb23e82224697ae88c33c492824311", + "聊城": "84281e52f5705d0334e53677c3d5163849704231aebe5073a42a2a984e911e05", + "临沂": "383149d5d21b8857937949b34a55036c842656dd49b308c357574b481e129e0b", + "滨州": "6195152f0ef054996154923162f3fb7c3dae08d4bd97c322233f36fb3d552d7c", + "潍坊": "2d779be33d220ddc6085b188e0fbc4c2397bb3c96c36f6a78d7ee9990e85c622", + "青岛": "e7f70b6b689a187c12f2c76ff94e38dcf0ae6a9a57dfd30d1501330c07fa7b2d", + "威海": "3f91b9a7661c746b1fff9b02dbdbbd0e283b53a5a60374681a358edc34d6a1c4", + "济南": "162cce80baae804917ab0deab913b20520a85758712a9dec24f143d0617e1288", + "日照": "48cfa55e1b8629546ee525668dc0bed9a3127d6b061a874e9a6ba14cf139a0d7" + }, + "河北": { + "沧州": "7e92f292147f124f01b0e02525396fb46f4e8e58f8f757ba46efe7ddb05266f4", + "石家庄": "29e410a42310a65dc858eb3edde06b3d5eb62a6822d861ff51c2af5703f4dadf", + "秦皇岛": "f9e54ddc5f122e9621aeaec9cc09089764feb41c4fa09883de8f0053fe0ec0ff", + "衡水": "7a87e60b8467486590114d7afee60e06db96f4a1e94b1c767466d84805c86da3", + "邯郸": "caa4b77aeaf88fe86fe89347bd9e3c7df7f45ca15dab5a89b25fdf175c094be9", + "张家口": "c54a64e21318cde713535712f9dc885a8770912c18b1162c6712a8daba7f6b51", + "承德": "2c44d1b61490017e9d559e9340031e9d8a3332948d7ce8ed57d97bd0ec570f12", + "廊坊": "d1abd4a7bdfe90578217e032908f66b648f955da5170ee3b29d5c3ac0aa8dfde", + "邢台": "09b867aaaa27966c5baa9e506f7ea2fdf2c7101e10133a8bd1a51d68c523c4ab", + "保定": "2d6f8cb78cfb37062aed2e372b790f1f8a0983d8c57c07442bf4a94dbd5c390e", + "唐山": "6d1fcf8cecef4360d0dce5bb748d29d886cbd77dc28a63c3889ae588ed6a745d" + }, + "河南": { + "新乡": "cef3d46ea594a50a5ce6bd7398b9d24670bf9c4b6d3557bc0826ae0665559f18", + "焦作": "0459d890ed89549bcf4853acfb1e34ecd3da4ac33f85f106b50a6b06c8ce68c1", + "许昌": "145bb2cb4d3e08b546e50b7e91cb3e200d57e183ab450b57dfb73a67603b4a52", + "鹤壁": "6ac368de2bea769ede9cf8faa7d08b3075b785addcdc1c07b8fc6ffd61e5c38d", + "安阳": "360d58a276ee7c82071075d5926a494886eb9e05637519db1350c8ddb32aa217", + "济源": "1a6f7e765a34e824ac4792602ce9737a2d99535db6f4f86dd9f310de9af4e8d8", + "漯河": "c7d8597a8473e8f4824dc8ac00ee406ed2d678e1db6dc3e4b2521b48886acfb1", + "郑州": "d04d3272b31a08c0d5b4e4cf67e44ab13278779cedb36a9d76a7a7c496607921", + "商丘": "1ce44841858aa9ffefe65156a6e4bb74975a5abe6c2ffb2e9d8034fc6da3dd6b", + "信阳": "d62ee5e45302c68e20bc470bba296ce5ae6aa8bc1a09b0839a47e4109a953b96", + "周口": "46845e2a41db7e8bf0e6f1d1f42ad76652d25956e81329cb0a8e9d7df3ccc51b", + "开封": "2435505ac5365e5913948eae254d46edb5b4f464b246499cb8688bde1089bfb8", + "濮阳": "873d0b32df02e4df984dda751ad22bcb62b1943031ce2a8ce48de7d98af8ba88", + "驻马店": "3a420ecc73a3708c0b29d9234a2fe6bf826ffc772cb24fda610be3fb0d47b2f7", + "三门峡": "795c7a18d6e77107a5e921b9ba51d47e4cdbb0133638b6e1b9b9af88afa75baf", + "平顶山": "b0032649138648dee28b02be9983795bffa29bab863e9ca485fe80961ee8abc4", + "洛阳": "572215ea307cbfefa5bf1e9a374c5d6a71345c1a51d381c301e5bef55968e29e", + "南阳": "2e46620b685d1cc887ca216bbe03713ebe2ba2baa9d73a824219b89f88a6cd88" + }, + "甘肃": { + "金昌": "9f1b31685d1a871e633649468379c7b4072037540ca7732c53d0195c7c5bb1ce", + "兰州": "4380e94169ed0ffe6cef4e21c948c9f019a0085f40037f0798f68e0f5f6fccac", + "武威": "7ed9793a78a5b6c90222f78315c77ab2c0b04a71a93f7022367fb3bc0da09b96", + "酒泉": "8113c9122286bd10eac8e89c3c1aa0f335cb53a9b33e1bf8762412b350b3cfe3", + "陇南": "3ccd3850f97058d8d2b0068dc6581f0e65e939e92c5c91718330bd634c712844", + "嘉峪关": "49cf4a71419c01cd9e62b08768bec2347be87d48b4e7bd7b85b161573f173820", + "天水": "f5d329369ffebfc892ea0344939ff9226fe6039b993bb5148cb518140e9f94b8", + "白银": "d818f779752d0b82dfd12eeccc7aedc757a8d15cbe5f5a05e266fcb267ff98a6", + "临夏回族自治州": "1f04b454f31658801344eac92a563e507952f59e0fac2d984ef5973e72aa390a", + "定西": "1c99cd710a13e38848b0695f020dd0cdaeef099cdc41d01ebea2d3ec896646ea", + "平凉": "95eb177e28a866eca52353abb2c81af25b43b05bccb804ad6f3f31a146a35582", + "庆阳": "1928732413c69cd4e5624f8ffd7f3b2f5158c0dbc54574404d5b4da6eafecc67", + "张掖": "a2aca4796e86c1dfde7ebb3d0db807bd76e41a6efddd73d64abaefb933bdba60", + "甘南藏族自治州": "16a10986a035316e3f52eeede4c4b8948d21f3a8d63f204bd0b057a00f57ff9c" + }, + "内蒙古": { + "鄂尔多斯": "35317092916e9667193f6d87b3e610a396da1e9e02c992dd80c2b18b012c33fc", + "乌兰察布": "093326b72938f2b2d636ad1a392aaab4978e61694aebaf7a88cb9fb85727165c", + "乌海": "08a57588cdd5003c223f67a9eea92634bcff7cd8b8b121c763ce010cbf13caf1", + "包头": "d4a291c95b66aec05e6a7c81cedd639354baa280dee07ed5af9b5750e7a4fea4", + "呼伦贝尔": "b64a71e92db203285da9cf8de095ba4c3159fa88670c33be2fa59d2797a18500", + "呼和浩特": "287e8d6fc15c71fe267865194e7ec8e14a8a0d1e8aa62e22bb19e8dc2fb6354c", + "巴彦淖尔": "debb9c9c4f109b8c5a9213e980632f708ff13eed666a6d73c546566fd0ebb815", + "赤峰": "18394066775092d3268febda26c5593d24a2b1e06120d5945c8f00dd9ec8ef58", + "阿拉善盟": "ce9a09c5026efa30e2d2852a8cba2136b999872d026c85ad981de77f4104dbf7", + "兴安盟": "2984bf0ffe5c6fff61138fe038bf6a8d1cc7ea582767012e722a978357312f9d", + "通辽": "d6114245103ec6f1c6a9fae406660aa8fa630dfcc10c38a6a2762fd1c8442f96", + "锡林郭勒盟": "61121b20c9652e616b72cb222e11495007f0991248cbc5b74fdba145bf0d7e22" + }, + "西藏": { + "阿里地区": "7c4ded71a672b171b2cdb0ece3a28ed6339dfb97fc2c7f4f1a4b658d75ceff22", + "山南": "b2382db47277f8ec8aa34d74d38b76c973d4dfe6aee72abb079826b0164bf10e", + "拉萨": "52e5ec9b88e072482f49aa8eebb9d0ece5e3ae51d70d2c71eddddff0c154f2c1", + "日喀则": "12bf81609e081e2ba8798debf4b8924e35cde201f284f7d419f837f808e0345f", + "昌都": "476f5f01d149d6f7fa5cffcc5846b3976cc3dd7774654ef04664956ce14be84e", + "林芝": "eaabf5146d073f8f9659d97538dc9f6b48d86aa472793ac3ad7817562db85b77", + "那曲": "a72f7c37053b9710def60d1d14e99a3f40d6f52d6093ac26283b4f38fcb7f5c9" + }, + "山西": { + "临汾": "be75cfd425cc9865b56e59bef1a18a1ebb42cfc4eeadfe1e54656618ec5d21d6", + "大同": "7d3c78dd39947de4b7454c6264242065b3a9d7f674db990ff1598bad38813c1e", + "晋中": "a5ca4557df12250ad590776f07d84153d5edbc1c4d6529740ad4bd6394d10e9a", + "阳泉": "2d93fad9848518a4f8d12dc3a28b8f121d79066a6c3053e95da3e2e88d0445da", + "吕梁": "65174e5170d8a1580c8bb6a20e5ce16f8ce9709991d3a4c8c9c1bde7b31e157a", + "太原": "52a8972972f33c7842eefadb048e2046ff6245703d54eeaa64354afa44e82b46", + "忻州": "13a944200fe1e5081c31072089ee4f011ae8fbc7619554cd06c9aca8b7e09381", + "晋城": "1d751d94e699f55fa9f72bfdd71f1f08eec6006b0581b1557787759767db8bb3", + "朔州": "3408f89a6ffbecc5ed21797a7c60d6496eb25e367f35835241e63c4fbf659395", + "运城": "f8091151e1758231a8d09d5154ba53559c25c317bd97521b55b770ee6e1bed68", + "长治": "441dd4291cafc1a39a71bb1f1a80e91ffa3aefb6843c78a1b30b1ce528aea3a6" + }, + "广西": { + "南宁": "0c3279290673cd0d8626b1ca4a56048651414f56be06e379f6c969e97e840f22", + "崇左": "fa2f4796e2498ec3b4ef42e873a243fa2698877443cdeb59c6a4de7cdc57b796", + "桂林": "397ffe1176f6fbc6995c6e5dc6bd10bea4fa9bda0ea77ef4b5621f521341fa01", + "河池": "722fb89a1e888d9aadb67d055be3f412e82e4d8e3b8904c14db23ccdc19e0449", + "防城港": "2e670c9c5d332a8d717d17acee789094d2b1c57978d9c969512965cb51f96294", + "北海": "a24753b01f3362ace753144a328367e82d2f8e642e6af38501802d36ec1fb9ba", + "来宾": "5933459cbec72c77d2d28df05a7cdb0d67a5a10fa45d67330d9b4a25596c3a11", + "玉林": "4e220c3c74d856927f83c2f703e31eed3f311a49870711bcec535ce55ede9bea", + "百色": "63bc50e406f4fd4473528647f57a2c5058dae1ddbf2f611ff7e23d4af4850c5d", + "钦州": "a152edec15ba77cc79dd900f7edd001d608e54a7720de17379d0b5664006113d", + "柳州": "521630c8b6d213e8c0395c3e89bb3bfdafcf1a2adb099800a17e4bf3e31296f2", + "梧州": "0ec47b6039f5523692835abf0f3447b3e45a75a5929ddecd102eb304c2ce44a6", + "贵港": "a96ca6d792beecfc3ff16d9f915b9cbbb9785df2ac6f8e2c4a7a3de12955d93e", + "贺州": "a27904a6b411af796345327b53f1b2172f2072ec7a965f4ed2e832b8370470e4" + }, + "安徽": { + "池州": "1fbbebf5e91217f53c75298927ce763887243c14d1567f7218ecfa5fba5c6d96", + "铜陵": "259452fe2bd5106b62ba9b09b62aa599dd8894fbbb886de889b5ab372c2909c6", + "马鞍山": "a486733631ad2d10a16fb1741780c4d5d830284357c7da9ae1b855bcce8d2209", + "宣城": "beae5eeaa5a02b19afbae9f03b088d3c5a4c1986c99d3f3deb9c2833fa1ec51e", + "蚌埠": "2eab90f937b71898e7697554140eeef83fe0b5301a6e992b234c791821be5b5b", + "阜阳": "33695ad43b73cc70f93d1313ae1dc0b254feeebffd3d3ace3c6d3b27487c1a59", + "亳州": "ce4db8b85e6e87fc099516d0c00ef12810899e01d6398f6d7dc5267110f6c5b2", + "六安": "25f79f127abbd4a4fbb03f49cf867af8914f7e538bec03bcc4252c765b51a83f", + "合肥": "f6a209bd0da8c0049c35d48deb56569f79f662a9202b814ce019055cb1b3bb5c", + "安庆": "ea574e08dd3132cfcd8ff10d61b7cd966e3c5dd35791704e5b4fbf18ceca35b3", + "淮南": "fc823a725f8d65c7f84ffb15a0ae47a587dbbc95d6aa8dff642573943d90c607", + "宿州": "4e0c060554c45b8de2e0665966bf3e12fb9ac865ab04664208160508d8ccaf2a", + "淮北": "5767c29a9bd74c6ac408abb53c93a14e79c9635e439bbc52c399d19745bf336f", + "滁州": "fdd9d1b2da2f8379173fb46ff753ef7a9a4a4d531132594fad1ef9e02f63beda", + "芜湖": "54562d4501486f3ea56d2e2d1e1db3aefdc9b32bc69ab35a7614575b428c89b7", + "黄山": "e1b50cab69f96fe95886cff325995051e87531a2efa3def15f164d4d8ee4f9f7" + }, + "浙江": { + "衢州": "07d6949c39f860eedb5c285bd844bdad572ab8a0001c53b29791955be7217394", + "嘉兴": "bc0b15239f293e635cb4047513d519ee9a604503be8c43bcb3dba974ea38a5dc", + "杭州": "f4e2e63dfcc978dbca62acfb7b4a1f3af049f91e80bde2aba47d2f1dfbeea2f6", + "绍兴": "2b87378e7ec09455a9f4298398343eb1de1ae844b9557fea1e51a91d3c1b4547", + "温州": "807deb1e7e56a8926342fc7a2b8dd0f4cfad0218fc14dbd2834613340bf87db1", + "湖州": "2f5efee3185269172ea9d5ff14e84106a3779801cd4dbf4b3b6b2779dbabd474", + "舟山": "75a9592dd3baeb59962b7ab7bb1f7ff77cf2d25f829a4dd024faf05cecb7f9e5", + "金华": "8f5a04e833a5ad0b1edf00ba9229a3b0d706eb3340c40ec8fb383e9949e6cdda", + "丽水": "edb6128328af61e4dda9cd4044f4f4f8008b29106ee7fea31ba20264a482c35e", + "台州": "80df907846f7b37e4af59437aa78c329b67e567c6a2fb33477e990d20cf5ed39", + "宁波": "b229917740b7dde6a3c135b9db485a3c335b1a936b809c7d87bf94df8cb1338b" + }, + "青海": { + "海东": "0b2cc305cd7ffaeed98ba63f1b5e2e7a6213b341968386e3eeb2245d488ebf6f", + "海北藏族自治州": "4650ae9e3b783adb2c32c5ad97fd97e26485bdcc75f51067f28ae268d9a7991b", + "海南藏族自治州": "f794591bfc7b15d45ee403da99429eed7991eadb08649687c8c30bbc1779e91c", + "海西蒙古族藏族自治州": "16b7c4f0594fbc8d44009e933118611075d0d49644c6fccb5fb10e35a83b4100", + "玉树藏族自治州": "ee0b3722c01ed1b47bece6b8069e2ca6c7a180914b56f06225efea4bf6dccd34", + "西宁": "6b34658a83583f2dddeea41b290ef9adf3e1cff4fbe8935b9286fe50e666634f", + "黄南藏族自治州": "e36454d6e6c9d8c6cdd968f5e5301715875b5d24bffdabb30f27cca843dc78d7", + "果洛藏族自治州": "aa222d78cb5ac4df5dede6fac079451169067ff38a3921897b771a0459c207a0" + } + } \ No newline at end of file diff --git a/app/eip_client.py b/app/eip_client.py index 6ea5a99..86f4090 100644 --- a/app/eip_client.py +++ b/app/eip_client.py @@ -1,3 +1,9 @@ +""" +EIP客户端模块 + +提供与EIP(Edge IP)服务交互的客户端功能,包括认证、设备管理、网关配置等操作。 +支持自动重试、token自动刷新等机制。 +""" import time from typing import Any, Dict, List, Optional @@ -9,45 +15,91 @@ from .config import settings class AuthResponse(BaseModel): - token: str - exp: Optional[int] = None # epoch seconds + """认证响应模型""" + token: str # 认证令牌 + exp: Optional[int] = None # 过期时间(epoch秒) class EipClient: + """EIP客户端类,用于与EIP服务进行交互""" + def __init__(self, base_url: str, username: str, password: str) -> None: - self.base_url = base_url.rstrip("/") + """ + 初始化EIP客户端 + + Args: + base_url: EIP服务的基础URL + username: 用户名 + password: 密码 + """ + self.base_url = base_url.rstrip("/") # 移除末尾的斜杠 self.username = username self.password = password - self._token: Optional[str] = None - self._token_exp: Optional[int] = None - self._client = httpx.Client(timeout=15.0) + self._token: Optional[str] = None # 当前认证令牌 + self._token_exp: Optional[int] = None # 令牌过期时间 + self._client = httpx.Client(timeout=15.0) # HTTP客户端,设置15秒超时 def _is_token_valid(self) -> bool: + """ + 检查当前令牌是否有效 + + Returns: + bool: 令牌是否有效(提前60秒刷新) + """ if not self._token or not self._token_exp: return False - # refresh 60s earlier + # 提前60秒刷新令牌,避免在请求时过期 return time.time() < (self._token_exp - 60) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def authenticate(self) -> AuthResponse: + """ + 进行用户认证,获取访问令牌 + + 支持多种令牌字段格式的兼容性处理,包括: + - token + - X-Token + - access_token + - 直接返回字符串token的情况 + + Returns: + AuthResponse: 包含令牌和过期时间的认证响应 + + Raises: + ValueError: 当响应中缺少令牌时 + """ url = f"{self.base_url}/client/auth" resp = self._client.post(url, json={"username": self.username, "password": self.password}) resp.raise_for_status() data = resp.json() - # 尝试从响应中提取 exp;如果没有,设置 1 小时后过期 + data_token = data.get("data") + + # 尝试从响应中提取过期时间;如果没有,设置1小时后过期 exp = data.get("exp") or int(time.time()) + 3600 + + # 尝试多种可能的令牌字段名 token = data.get("token") or data.get("X-Token") or data.get("access_token") if not token: - # 兼容后端直接返回字符串 token 的情况 - if isinstance(data, str) and data: - token = data + # 兼容后端直接返回字符串token的情况 + if isinstance(data_token, str) and data: + token = data_token else: raise ValueError("Auth response missing token") + + # 保存令牌和过期时间 self._token = token self._token_exp = exp return AuthResponse(token=token, exp=exp) def _get_headers(self) -> Dict[str, str]: + """ + 获取包含认证令牌的请求头 + + 如果令牌无效或即将过期,会自动重新认证 + + Returns: + Dict[str, str]: 包含认证令牌和Accept头的字典 + """ if not self._is_token_valid(): self.authenticate() assert self._token @@ -55,23 +107,51 @@ class EipClient: @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def list_cities(self) -> List[Dict[str, Any]]: + """ + 获取可用城市列表 + + Returns: + List[Dict[str, Any]]: 城市信息列表 + """ url = f"{self.base_url}/edge/city" resp = self._client.get(url, headers=self._get_headers()) resp.raise_for_status() data = resp.json() + # 兼容不同的响应格式:直接返回列表或包含data字段的对象 return data if isinstance(data, list) else data.get("data", []) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def list_devices(self, geo: str, offset: int, num: int) -> List[Dict[str, Any]]: + """ + 获取指定地理位置的设备列表 + + Args: + geo: 地理位置标识 + offset: 偏移量(分页) + num: 返回数量 + + Returns: + List[Dict[str, Any]]: 设备信息列表 + """ url = f"{self.base_url}/edge/device" payload = {"geo": geo, "offset": offset, "num": num} resp = self._client.post(url, headers=self._get_headers(), json=payload) resp.raise_for_status() data = resp.json() + # 兼容不同的响应格式:直接返回列表或包含data字段的对象 return data if isinstance(data, list) else data.get("data", []) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def gateway_config_get(self, macaddr: str) -> Dict[str, Any]: + """ + 获取网关配置信息 + + Args: + macaddr: 网关MAC地址 + + Returns: + Dict[str, Any]: 网关配置信息 + """ url = f"{self.base_url}/gateway/config/get" resp = self._client.post(url, headers=self._get_headers(), json={"macaddr": macaddr}) resp.raise_for_status() @@ -79,6 +159,16 @@ class EipClient: @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def gateway_config_set(self, macaddr: str, config: Dict[str, Any]) -> Dict[str, Any]: + """ + 设置网关配置信息 + + Args: + macaddr: 网关MAC地址 + config: 配置信息字典 + + Returns: + Dict[str, Any]: 设置结果 + """ url = f"{self.base_url}/gateway/config/set" payload = {"macaddr": macaddr, "config": config} resp = self._client.post(url, headers=self._get_headers(), json=payload) @@ -87,12 +177,21 @@ class EipClient: @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=0.5, min=0.5, max=2)) def gateway_status(self, macaddr: str) -> Dict[str, Any]: + """ + 获取网关状态信息 + + Args: + macaddr: 网关MAC地址 + + Returns: + Dict[str, Any]: 网关状态信息 + """ url = f"{self.base_url}/gateway/status" resp = self._client.post(url, headers=self._get_headers(), json={"macaddr": macaddr}) resp.raise_for_status() return resp.json() +# 创建全局单例客户端实例 client_singleton = EipClient(settings.eip_base_url, settings.eip_username, settings.eip_password) - diff --git a/app/rotation_service.py b/app/rotation_service.py index 53c2cce..abef2a9 100644 --- a/app/rotation_service.py +++ b/app/rotation_service.py @@ -1,77 +1,211 @@ +""" +IP轮换服务模块 + +提供IP地址轮换功能,包括: +- 从可用设备中选择未使用的IP +- 配置网关路由规则 +- 执行IP轮换操作 +- 查询当前状态和统计信息 + +使用Redis存储使用记录,支持按天统计IP使用情况。 +""" +import random from typing import Any, Dict, List, Optional, Tuple -from .config import settings +from .config import settings, city_dict, client_infos from .eip_client import client_singleton as eip from .redis_store import store_singleton as kv def _extract_device_ip_and_id(device: Dict[str, Any]) -> Tuple[Optional[str], Optional[str]]: - # 由于未知后端返回结构,尽可能容错地提取 + """ + 从设备信息中提取IP地址和边缘设备ID + + 由于后端返回结构可能不一致,使用多种字段名进行容错提取: + - IP字段:ip, public_ip, eip, addr, address + - ID字段:id, edge, mac, device_id + + Args: + device: 设备信息字典 + + Returns: + Tuple[Optional[str], Optional[str]]: (IP地址, 边缘设备ID) + """ + # 尝试多种可能的IP字段名 ip = ( - device.get("ip") - or device.get("public_ip") - or device.get("eip") - or device.get("addr") - or device.get("address") + device.get("public") ) - edge_id = device.get("id") or device.get("edge") or device.get("mac") or device.get("device_id") - # 若 edge 是数组或对象,尝试取可打印的第一项 - if isinstance(edge_id, list) and edge_id: - edge_id = edge_id[0] - if isinstance(edge_id, dict): - edge_id = edge_id.get("id") or edge_id.get("mac") or edge_id.get("edge") - return (str(ip) if ip else None, str(edge_id) if edge_id else None) + + macaddr = device.get("macaddr") + + + return (str(ip), str(macaddr)) def select_unused_ip(devices: List[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str]]: - for d in devices: + """ + 从设备列表中选择今天未使用的IP地址 + + 遍历设备列表,找到第一个今天未使用的IP地址和对应的边缘设备ID + + Args: + devices: 设备信息列表 + + Returns: + Tuple[Optional[str], Optional[str]]: (IP地址, 边缘设备ID),如果没找到则返回(None, None) + """ + for d in devices.get('edges'): ip, edge_id = _extract_device_ip_and_id(d) if not ip: - # 没有可识别的 IP,跳过 + # 没有可识别的IP,跳过此设备 continue if not kv.is_ip_used_today(ip): return ip, edge_id return None, None -def apply_gateway_route(edge_id: Optional[str], ip: str) -> Dict[str, Any]: - # 将选中的 edge 配置到网关规则中 +def apply_gateway_route(edge_id: Optional[str], ip: str, geo: str, client_id:str) -> Dict[str, Any]: + """ + 将选中的边缘设备配置到网关路由规则中 + + 创建路由规则并应用到指定的网关设备,实现IP轮换 + + Args: + edge_id: 边缘设备ID + ip: IP地址(用于日志记录,实际路由基于edge_id) + + Returns: + Dict[str, Any]: 网关配置设置结果 + """ + # 创建路由规则配置 rule = { - "table": 1, - "enable": True, - "edge": [edge_id] if edge_id else [], - "network": [], - "cityhash": settings.eip_default_cityhash or "", + "table": 1, # 路由表ID + "enable": True, # 启用规则 + "edge": [edge_id] if edge_id else [], # 边缘设备列表 + "network": [client_infos[client_id]], # 网络配置(当前为空) + "cityhash": geo or "", # 城市哈希值 } - config = {"id": 1, "rules": [rule]} + config = {"id": 1, "rules": [rule]} # 配置ID和规则列表 return eip.gateway_config_set(settings.eip_gateway_mac, config) -def rotate(cityhash: Optional[str] = None, num: Optional[int] = None) -> Dict[str, Any]: - geo = cityhash or settings.eip_default_cityhash - if not geo: - raise ValueError("cityhash 不能为空,请在请求中或环境变量中提供") - n = int(num or settings.eip_default_num or 10) + + +def rotate(client_id) -> Dict[str, Any]: + """ + 执行IP轮换操作 + + 从指定地理位置获取设备列表,选择未使用的IP进行轮换 + + Args: + cityhash: 城市哈希值,用于指定地理位置 + num: 获取设备数量,默认为配置值或10 + + Returns: + Dict[str, Any]: 轮换结果 + - changed: bool - 是否成功轮换 + - reason: str - 失败原因(当changed=False时) + - ip: str - 新的IP地址(当changed=True时) + - edge: str - 边缘设备ID(当changed=True时) + - status: dict - 网关状态信息(当changed=True时) + + Raises: + ValueError: 当cityhash为空时 + """ + # 确定地理位置参数 + geo = get_random_cityhash() + + # 确定获取设备数量 + n = 1 + + # 获取设备列表 devices = eip.list_devices(geo=geo, offset=0, num=n) + + # 选择未使用的IP ip, edge_id = select_unused_ip(devices) if not ip: return {"changed": False, "reason": "没有可用且今天未使用的 IP"} - _ = apply_gateway_route(edge_id=edge_id, ip=ip) - kv.add_used_ip_today(ip) - kv.set_current(ip=ip, edge_id=edge_id) + # 应用网关路由配置 + _ = apply_gateway_route(edge_id=edge_id, ip=ip, geo= geo,client_id=client_id) + + # 记录使用情况 + kv.add_used_ip_today(ip) # 标记IP为今天已使用 + kv.set_current(ip=ip, edge_id=edge_id) # 设置当前使用的IP和设备 + + # 获取网关状态 status = eip.gateway_status(settings.eip_gateway_mac) - return {"changed": True, "ip": ip, "edge": edge_id, "status": status} + + return {"changed": True, "ip": ip, "edge": edge_id, "status": status, "geo": geo} def status() -> Dict[str, Any]: + """ + 获取当前轮换服务状态 + + 返回当前使用的IP、今日使用统计和网关状态信息 + + Returns: + Dict[str, Any]: 状态信息 + - current: dict - 当前使用的IP和设备信息 + - used_today: int - 今日已使用的IP数量 + - gateway: dict - 网关状态信息(如果获取失败则为空字典) + """ + # 获取当前使用的IP和设备信息 cur = kv.get_current() + + # 获取今日使用统计 used_count = kv.get_used_count_today() + + # 获取网关状态(容错处理) gw = {} try: gw = eip.gateway_status(settings.eip_gateway_mac) except Exception: + # 网关状态获取失败时使用空字典 pass + return {"current": cur, "used_today": used_count, "gateway": gw} +def get_random_city() -> Dict[str, str]: + """ + 随机获取一个城市编码 + + 从所有可用的城市中随机选择一个,返回城市名称和对应的编码 + + Returns: + Dict[str, str]: 包含城市信息的字典 + - province: 省份名称 + - city: 城市名称 + - cityhash: 城市编码 + """ + # 收集所有城市信息 + all_cities = [] + for province, cities in city_dict.items(): + for city, cityhash in cities.items(): + all_cities.append({ + "province": province, + "city": city, + "cityhash": cityhash + }) + + # 随机选择一个城市 + if not all_cities: + raise ValueError("没有可用的城市数据") + + selected_city = random.choice(all_cities) + return selected_city + + +def get_random_cityhash() -> str: + """ + 随机获取一个城市编码(简化版本) + + Returns: + str: 随机城市编码 + """ + city_info = get_random_city() + return city_info["cityhash"] + + diff --git a/app/routers/proxy.py b/app/routers/proxy.py index 544e5c6..bb7a64e 100644 --- a/app/routers/proxy.py +++ b/app/routers/proxy.py @@ -19,9 +19,10 @@ def rotate( req: Optional[RotateRequest] = Body(...), ): # 优先级:Query > Form > JSON - effective_cityhash = req.cityhash - effective_num = req.num - result = rotate_impl(cityhash=effective_cityhash, num=effective_num) + client_id = req.id + # effective_cityhash = req.cityhash + # effective_num = req.num + result = rotate_impl(client_id=client_id) return result