下次不用找了,all language code

本文介绍了Windows SharePoint Services支持的语言、区域设置与时区等国际化配置选项,涵盖了可用作网站语言的多种语言及其对应的ID,并列举了可设置的区域格式和时区。

语言 ID

语言 ID 决定网站中网页文本(例如“网站设置”页上的文本)使用的语言。创建网站时可用的语言取决于在服务器或服务器场中安装的语言模板包。基于 Windows SharePoint Services 的网站可用以下语言创建。

ID语言ID语言
1025阿拉伯语1041日语
1028繁体中文1042朝鲜语
1029捷克语1043荷兰语
1030丹麦语1044挪威语
1031德语1045波兰语
1032希腊语1046葡萄牙语 - 巴西
1033英语1049俄语
1034西班牙语1053瑞典语
1035芬兰语1054泰语
1036法语1055土耳其语
1037希伯来语2052简体中文
1038匈牙利语2070葡萄牙语
1040意大利语3076汉语 - 香港

Windows SharePoint Services 还支持用下列语言输入和显示文本,但不能用这些语言创建网站。

ID语言ID语言
1026保加利亚语1048罗马尼亚语
1050克罗地亚语2074塞尔维亚语
1061爱沙尼亚语1051斯洛伐克语
1081印度印地语1060斯洛文尼亚语
1062拉脱维亚语1058乌克兰语
1063立陶宛语  

区域设置 ID

区域设置 ID 控制网站的编号、排序、日历和时间格式。可以使用“区域设置”网页更改网站的区域设置。基于 Windows SharePoint Services 的网站可设置为以下区域设置 ID。

ID区域设置ID区域设置
1078南非荷兰语1037希伯来语
1052阿尔巴尼亚语1081印地语
5121阿拉伯语(阿尔及利亚)1038匈牙利语
15361阿拉伯语(巴林)1039冰岛语
3073阿拉伯语(埃及)1057印度尼西亚语
2049阿拉伯语(伊拉克)1040意大利语(意大利)
11265阿拉伯语(约旦)2064意大利语(瑞士)
13313阿拉伯语(科威特)1041日语
12289阿拉伯语(黎巴嫩)1099卡纳达语
4097阿拉伯语(利比亚)1087哈萨克语
6145阿拉伯语(摩洛哥)1111孔卡尼语
8193阿拉伯语(阿曼)1042朝鲜语
16385阿拉伯语(卡塔尔)1088吉尔吉斯语(西里尔文)
1025阿拉伯语(沙特阿拉伯)1062拉脱维亚语
10241阿拉伯语(叙利亚)1063立陶宛语
7169阿拉伯语(突尼斯)1071马其顿语(FYROM)
14337阿拉伯语(阿拉伯联合酋长国)2110马来语(文莱达鲁萨兰国)
9217阿拉伯语(也门)1086马来语(马来西亚)
1067亚美尼亚语1102马拉地语
2092阿塞拜疆语(西里尔文)1104蒙古语(西里尔文)
1068阿塞拜疆语(拉丁语系)1044挪威语(博克马尔语)
1069巴斯克语2068挪威语(尼诺斯克语)
1059白俄罗斯语1045波兰语
1026保加利亚语1046葡萄牙语(巴西)
1027加泰罗尼亚语2070葡萄牙语(葡萄牙)
3076汉语(香港)1094旁遮普语
5124汉语(澳门)1048罗马尼亚语
2052汉语(中华人民共和国)1049俄语
4100汉语(新加坡)1103梵语
1028汉语(台湾)3098塞尔维亚语(西里尔文)
1050克罗地亚语2074塞尔维亚语(拉丁语系)
1029捷克语1051斯洛伐克语
1030丹麦语1060斯洛文尼亚语
1125马尔代夫语11274西班牙语(阿根廷)
2067荷兰语(比利时)16394西班牙语(玻利维亚)
1043荷兰语(荷兰)13322西班牙语(智利)
3081英语(澳大利亚)9226西班牙语(哥伦比亚)
10249英语(伯利兹)5130西班牙语(哥斯达黎加)
4105英语(加拿大)7178西班牙语(多米尼加共和国)
9225英语(加勒比海)12298西班牙语(厄瓜多尔)
6153英语(爱尔兰)17418西班牙语(萨尔瓦多)
8201英语(牙买加)4106西班牙语(危地马拉)
5129英语(新西兰)18442西班牙语(洪都拉斯)
13321英语(菲律宾)2058西班牙语(墨西哥)
7177英语(南非)19466西班牙语(尼加拉瓜)
11273英语(特立尼达岛)6154西班牙语(巴拿马)
2057英语(英国)15370西班牙语(巴拉圭)
1033英语(美国)10250西班牙语(秘鲁)
12297英语(津巴布韦)20490西班牙语(波多黎各)
1061爱沙尼亚语3082西班牙语(西班牙)
1080法罗语1034西班牙语(传统风格)
1065波斯语14346西班牙语(乌拉圭)
1035芬兰语8202西班牙语(委内瑞拉)
2060法语(比利时)1089斯瓦希里语
3084法语(加拿大)1053瑞典语
1036法语(法国)2077瑞典语(芬兰)
5132法语(卢森堡)1114古叙利亚语
6156法语(摩纳哥)1097泰米尔语
4108法语(瑞士)1092鞑靼语
1110加利西亚语1098泰卢固语
1079格鲁吉亚语1054泰语
3079德语(奥地利)1055土耳其语
1031德语(德国)1058乌克兰语
5127德语(列支敦士登)1056乌尔都语
4103德语(卢森堡)2115乌兹别克语(西里尔文)
2055德语(瑞士)1091乌兹别克语(拉丁语系)
1032希腊语1066越南语
1095古吉拉特语  

时区

基于 Windows SharePoint Services 的网站可以设置为 Microsoft Windows Server 2003 承认的任何时区。

代码时区代码时区
39(GMT-12:00) 埃尼威托克,夸贾林岛59(GMT+02:00) 赫尔辛基,里加,塔林
16(GMT-11:00) 中途岛, 萨摩亚群岛27(GMT+02:00) 耶路撒冷 26 (GMT+03:00) 巴格达
15(GMT-10:00) 夏威夷74(GMT+03:00) 科威特,利雅得
14(GMT-09:00) 阿拉斯加51(GMT+03:00) 莫斯科,圣彼得堡,伏尔加格勒
13(GMT-08:00) 太平洋时间(美国和加拿大): 蒂华纳56(GMT+03:00) 内罗毕
38(GMT-07:00) 亚利桑那25(GMT+03:30) 德黑兰
12(GMT-07:00) 山区时间(美国和加拿大)24(GMT+04:00) 阿布扎比,马斯喀特
55(GMT-06:00) 中美洲54(GMT+04:00) 巴库,第比利斯,埃里温 48 (GMT+04:30) 喀布尔
11(GMT-06:00) 中部时间(美国和加拿大)58(GMT+05:00) 叶卡捷琳堡
37(GMT-06:00) 墨西哥城47(GMT+05:00) 伊斯兰堡,卡拉奇,塔什干
36(GMT-06:00) 萨斯喀彻温省23(GMT+05:30) 加尔各答,马德拉斯,孟买,新德里
35(GMT-05:00) 波哥大,利马,基多62(GMT+05:45) 加德满都 46 (GMT+06:00) 阿拉木图,新西伯利亚
10(GMT-05:00) 东部时间(美国和加拿大)71(GMT+06:00) 阿斯塔纳,达卡
34(GMT-05:00) 印地安纳(东部)66(GMT+06:00) 科特
9(GMT-04:00) 大西洋时间(加拿大)61(GMT+06:30) 仰光
33(GMT-04:00) 加拉加斯,拉巴斯22(GMT+07:00) 曼谷,河内,雅加达
65(GMT-04:00) 圣地亚哥64(GMT+07:00) 克拉斯诺亚尔斯克
28(GMT-03:30) 纽芬兰 8 (GMT-03:00) 巴西利亚45(GMT+08:00) 北京,重庆,香港,乌鲁木齐
32(GMT-03:00) 布宜诺斯艾利斯,乔治敦63(GMT+08:00) 伊尔库次克,乌兰巴托
60(GMT-03:00) 格陵兰21(GMT+08:00) 吉隆坡,新加坡
30(GMT-02:00) 中大西洋73(GMT+08:00) 珀斯 75 (GMT+08:00) 台北
29(GMT-01:00) 亚速尔群岛20(GMT+09:00) 大坂,扎幌,东京 72 (GMT+09:00) 汉城
53(GMT-01:00) 佛得角群岛70(GMT+09:00) 雅库茨克 19 (GMT+09:30) 阿德莱德
31(GMT) 卡萨布兰卡,蒙罗维亚44(GMT+09:30) 达尔文
2(GMT) 格林威治;都柏林,爱丁堡,里斯本,伦敦18(GMT+10:00) 布里斯班
4(GMT+01:00) 阿姆斯特丹,柏林,伯尔尼,罗马,斯德哥尔摩,维也纳76(GMT+10:00) 堪培拉,墨尔本,悉尼
6(GMT+01:00) 贝尔格莱德,布拉迪斯拉发,布达佩斯,卢布尔雅那,布拉格43(GMT+10:00) 关岛,莫尔兹比港
3(GMT+01:00) 布鲁塞尔,哥本哈根,马德里,巴黎42(GMT+10:00) 霍巴特
57(GMT+01:00) 萨拉热窝,斯科普里,索非亚,维尔纽斯,华沙,萨格勒布68(GMT+10:00) 符拉迪沃斯托克(海参崴)
69(GMT+01:00) 中非西部41(GMT+11:00) 马加丹,所罗门群岛,新喀里多尼亚
7(GMT+02:00) 雅典,伊斯坦布尔,明斯克17(GMT+12:00) 奥克兰,惠灵顿
5(GMT+02:00) 布加勒斯特40(GMT+12:00) 斐济,勘察加半岛,马绍尔群岛
49(GMT+02:00) 开罗67(GMT+13:00) 努库阿洛法
50(GMT+02:00) 哈拉雷,比勒陀利亚  

货币 ID

基于 Windows SharePoint Services 的网站可以设置为使用以下货币。

ID货币ID货币
51211,254 .ج.د (阿拉伯地区-阿尔及利亚)4106Q1,254 (危地马拉)
153611,254 .ب.د (阿拉伯地区-巴林)18442L. 1254 (洪都拉斯)
30731,254 .م.ج (阿拉伯地区-埃及)3076HK$1,254 (香港)
20491,254 .ع.د (阿拉伯地区-伊拉克)10381 254 Ft (匈牙利)
112651,254 .ا.د (阿拉伯地区-约旦)1081रु 1,254 (印度)
133131,254 .ك.د (阿拉伯地区-科威特)6153IR£1,254 (爱尔兰)
122891,254 .ل.ل (阿拉伯地区-黎巴嫩)1037₪1,254 (以色列)
40971,254 .ل.د (阿拉伯地区-利比亚)1041¥1,254 (日本)
61451,254 .م.د (阿拉伯地区-摩洛哥)1042₩1,254 (韩国)
81931,254 .ع.ر (阿拉伯地区-阿曼)2058$1,254 (墨西哥)
163851,254 .ق.ر (阿拉伯地区-卡塔尔)5129$1,254 (新西兰)
10251,254 .س.ر (阿拉伯地区-沙特阿拉伯)19466C$ 1254 (尼加拉瓜)
102411,254 .س.ل (阿拉伯地区-叙利亚)1044kr 1 254 (挪威)
71691,254 .ت.د (阿拉伯地区-突尼斯)1056Rs 1,254 (巴基斯坦)
143371,254 .إ.د (阿拉伯地区-阿拉伯联合酋长国)6154B/. 1,254 (巴拿马)
92171,254 .ي.ر (阿拉伯地区-也门)15370Gs 1.254 (巴拉圭)
11274$ 1.254 (阿根廷)2052¥1,254 (中国)
3081$1,254 (澳大利亚)10250S/. 1,254 (秘鲁)
3079öS 1.254 (奥地利)10451 254 zł (波兰)
16394$b 1.254 (玻利维亚)10491 254р. (俄罗斯)
1046R$ 1.254 (巴西)4100$1,254 (新加坡)
30841 254 $ (加拿大)10511 254 Sk (斯洛伐克)
4105$1,254 (加拿大)10601.254 SIT (斯洛文尼亚)
13322$ 1.254 (智利)7177R 1,254 (南非)
9226$ 1.254 (哥伦比亚)10531.254 kr (瑞典)
5130C1.254 (哥斯达黎加)2055SFr. 1'254 (瑞士)
10291 254 Kč (捷克共和国)1028NT$1,254 (台湾)
1030kr 1.254 (丹麦)1054฿1,254 (泰国)
7178RD$1,254 (多米尼加共和国)10551.254 TL (土耳其)
17418C1254 (萨尔瓦多)2057£1,254 (英国)
-21,254 € (欧盟)1033$1,254 (美国)
-1€ 1,254 (欧盟)14346$U 1.254 (乌拉圭)
10651,254 ريال (波斯语)8202Bs 1.254 (委内瑞拉)
10321.254 Δρχ (希腊)10661,254 ₫ (越南语)

 

区域性名称

区域性代码

Windows Phone OS 7.0

Windows Phone OS 7.1

简体中文(中国)

zh-CN

红色 x绿色复选标记

繁体中文(台湾)

zh-TW

红色 x绿色复选标记

捷克语(捷克共和国)

cs-CZ

红色 x绿色复选标记

丹麦语(丹麦)

da-DK

红色 x绿色复选标记

荷兰语(荷兰)

nl-NL

红色 x绿色复选标记

英语(美国)

en-US

绿色复选标记绿色复选标记

英语(英国)

en-GB

绿色复选标记绿色复选标记

芬兰语(芬兰)

fi-FI

红色 x绿色复选标记

法语(法国)

fr-FR

绿色复选标记绿色复选标记

德语(德国)

de-DE

绿色复选标记绿色复选标记

希腊语(希腊)

el-GR

红色 x绿色复选标记

匈牙利语(匈牙利)

hu-HU

红色 x绿色复选标记

意大利语(意大利)

it-IT

绿色复选标记绿色复选标记

日语(日本)

ja-JP

红色 x绿色复选标记

朝鲜语(韩国)

ko-KR

红色 x绿色复选标记

挪威语(挪威)

nb-NO

红色 x绿色复选标记

波兰语(波兰)

pl-PL

红色 x绿色复选标记

葡萄牙语(巴西)

pt-BR

红色 x绿色复选标记

葡萄牙语(葡萄牙)

pt-PT

红色 x绿色复选标记

俄语(俄罗斯)

ru-RU

红色 x绿色复选标记

西班牙语(西班牙)

es-ES

绿色复选标记绿色复选标记

瑞典语(瑞典)

sv-SE

import requests import json import base64 import time import user import re from random import randint from PIL import Image from io import BytesIO from datetime import datetime from urllib.parse import unquote class GetTicket: def __init__(self): self.user = user #用户信息 self.tickets = {} #当天车票信息 self._REPEAT_SUBMIT_TOKEN = "" #全局重复提交令牌 self._key_check_isChange = "" #是否修改密钥 self._allEncStr = "" #加密串 self.session = requests.Session() ''' 获取cookie ''' def get_cookies(self): # 获取cookie url = "https://kyfw.12306.cn/otn/login/conf" self.session.get(url) url = "https://kyfw.12306.cn/otn/index12306/getLoginBanner" self.session.get(url) url = "https://kyfw.12306.cn/passport/web/auth/uamtk-static" self.session.get(url) ''' 获取登入二维码 ''' def get_qr_code(self): # 获取登入二维码 url = "https://kyfw.12306.cn/passport/web/create-qr64" headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "\"Windows\"", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "*/*", "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Referer": "https://kyfw.12306.cn/otn/leftTicket/init", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", } # 请求体数据 data = { "appid": "otn", "_json_att": "" } response = self.session.post(url, data=data, headers=headers) # 检查响应 if response.status_code == 200: try: # 解析 JSON 响应 response_data = json.loads(response.text) # 提取二维码图片的 Base64 编码数据 base64_image = response_data.get("image") if base64_image: # 解码 Base64 字符串并生成图像 image_data = base64.b64decode(base64_image) image = Image.open(BytesIO(image_data)) image.show() # 显示图片 # 保存图片到本地 image.save("qr_code.png") print("二维码已成功保存为 qr_code.png") print("请使用手机扫描二维码登录 12306 网站") return response_data.get("uuid") except Exception as e: print("获取二维码失败", e) ''' 检查二维码状态 ''' def check_qr_code(self, uuid): # 检查二维码状态 url = "https://kyfw.12306.cn/passport/web/checkqr" headers = {'Host': 'kyfw.12306.cn', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0', 'Accept': '*/*', 'Referer': 'https://kyfw.12306.cn/otn/resources/login.html', } data = { "uuid": uuid, 'appid': 'otn' } try_time = 0 while True: # 发起 POST 请求,传递 cookies response = self.session.post(url, data=data, headers=headers) if response.status_code == 200: # 解析 JSON 数据 response_data = response.json() print(response_data.get("result_message", "No result_message found")) # 检查扫码登录是否成功 if response_data.get("result_message") == "扫码登录成功": print("扫码登录成功") break else: print("扫码登录未成功,等待中...") try_time += 1 if try_time > 10: print("扫码登录失败,请重试") break time.sleep(1) # 每秒重试一次 else: print(f"请求失败,状态码: {response.status_code}") break # 如果请求失败,退出循环 ''' 获取登录令牌 ''' def get_login_token(self): # 获取登录令牌 # 模拟登录 url = "https://kyfw.12306.cn/login/userLogin" headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Dest": "document", "Referer": "https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6" } self.session.get(url, headers=headers) time.sleep(0.1) url = "https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin" self.session.get(url, headers=headers) time.sleep(0.1) # 获取登录令牌 url = "https://kyfw.12306.cn/passport/web/auth/uamtk" data = {'appid': 'otn'} time.sleep(0.1) headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "Content-Length": "9", "sec-ch-ua-platform": '"Windows"', "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Referer": "https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6" } response = self.session.post(url, data=data, headers=headers) if response.status_code == 200: # 解析 JSON 数据 response_data = response.json() if response_data.get("result_message") == "验证通过": print("第一步验证通过") newapptk = response_data.get("newapptk") url = "https://kyfw.12306.cn/otn/uamauthclient" headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "Content-Length": "52", "sec-ch-ua-platform": '"Windows"', "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "*/*", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6" } data = { 'tk': newapptk } time.sleep(0.1) response = self.session.post(url, data=data, headers=headers) if response.status_code == 200: # 解析 JSON 数据 response_data = response.json() if response_data.get("result_message") == "验证通过": print("第二步验证通过,获取登录令牌成功") else: print("第二步验证失败,请重试") else: print(f"第二步验证请求失败,状态码: {response.status_code}") else: print("第一步验证失败,请重试") else: print(f"第一步验证请求失败,状态码: {response.status_code}") ''' 登入请求 ''' def login(self): # 二维码登录 uuid = self.get_qr_code() self.check_qr_code(uuid) time.sleep(0.05) # 等待一秒,确保二维码图片已经保存到本地 # 获取登录令牌 self.get_login_token() ''' 检查登录状态 ''' def check_login_status(self): # 检查登录状态 url = "https://kyfw.12306.cn/otn/login/checkUser" headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "\"Windows\"", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "*/*", "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", } data = { "appid": "otn", "_json_att": "" } response = self.session.post(url, data=data, headers=headers) if response.status_code == 200: try: # 解析 JSON 响应 response_data = json.loads(response.text) # print(response_data) if response_data['data']['flag']: print("用户已登录") return 1 else: print("用户未登录") # 检查登入状态 return 0 # self.login() # self.check_login_status() except ValueError: print("响应不是合法的 JSON 格式:", response.text) else: print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 获取车票信息 ''' def get_ticket_info(self): # 获取车票信息 url = f'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={self.user.train_date}&leftTicketDTO.from_station={self.user.CITYCODE[self.user.start_station]}&leftTicketDTO.to_station={self.user.CITYCODE[self.user.end_station]}&purpose_codes=ADULT' print(url) headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "Cache-Control": "max-age=0", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site": "none", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-User": "?1", "Sec-Fetch-Dest": "document", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", } try: response = self.session.get(url,headers=headers) # 检查响应状态码 # 解析 JSON 数据 data = response.json() # 检查返回数据是否有效 if data.get("data") is None: print("未获取到车票信息") return None # 提取车票信息 train_info_list = data["data"]["result"] # 遍历车票信息,提取必要数据 # print(train_info_list) for train_info in train_info_list: info = train_info.split("|") self.tickets[info[3]] = { 'all_trainname': info[2], 'from_station_name': info[6], # 出发站 'to_station_name': info[7], # 到达站 'start_time': info[8], # 出发时间 'arrive_time': info[9], # 到达时间 'seat_types': info[11], # 座位类型 'left_ticket': info[12], # 剩余票数 'train_location': info[15], # 车次位置 'seat_discount_info': info[-3], # 座位优惠信息 'secret_str': info[0] # 加密的字符串 } print('获取车票信息成功') # print(self.tickets) return 1 except requests.exceptions.JSONDecodeError: print('获取内容失败,官方未出票') return 0 ''' 生成 _uab_collina Cookie 值。 ''' @staticmethod # 静态方法 def generate_uab_collina(): """ 生成 _uab_collina Cookie 值。 结构: - 13位当前毫秒时间戳 - 11位随机数字串 """ # 获取当前时间的毫秒时间戳 timestamp_ms = int(time.time() * 1000) timestamp_str = str(timestamp_ms) # 生成11位随机数字串 random_digits = ''.join([str(randint(0, 9)) for _ in range(11)]) # 拼接成最终的 Cookie 值 uab_collina = timestamp_str + random_digits return uab_collina ''' 创建订单 ''' def create_order(self, train, data=None): if not self.check_login_status(): return False # ... 原有headers配置 ... # 新增:强制更新关键Cookie self.session.cookies.set('_jc_save_fromDate', self.user.train_date, domain='kyfw.12306.cn') self.session.cookies.set('_uab_collina', self.generate_uab_collina(), domain='kyfw.12306.cn') # 创建订单 url = "https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest" self.session.headers = { "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "Windows", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", } data = { 'secretStr': unquote(self.tickets[train]['secret_str']), 'train_date': user.train_date, 'back_train_date': str(datetime.today().date()), 'tour_flag': 'dc', # dc 单程 wf 往返 'purpose_codes': 'ADULT', # 成人 'query_from_station_name': user.start_city, # 车站/城市信息字典[from_station] 'query_to_station_name': user.end_city, # 车站/城市信息字典[to_station] 'bed_level_info': '', 'seat_discount_info': self.tickets[train]['seat_discount_info'], 'undefined': '' } # 更新cookies self.session.cookies.set('_jc_save_fromStation', ''.join([f"%u{ord(c):04X}" for c in self.user.start_city + ","]) + self.user.CITYCODE[self.user.start_station], domain='kyfw.12306.cn') self.session.cookies.set('_jc_save_toStation', ''.join([f"%u{ord(c):04X}" for c in self.user.end_city + ","]) + self.user.CITYCODE[self.user.end_station], domain='kyfw.12306.cn') self.session.cookies.set('_jc_save_fromDate', self.user.train_date, domain='kyfw.12306.cn') self.session.cookies.set('_jc_save_toDate', str(datetime.today().date()), domain='kyfw.12306.cn') self.session.cookies.set('jc_save_wfdc_flag', 'dc', domain='kyfw.12306.cn') self.session.cookies.set('guidesStatus', 'off', domain='kyfw.12306.cn') self.session.cookies.set('highContrastMode', 'defaltMode', domain='kyfw.12306.cn') self.session.cookies.set('ursorStatus', 'off', domain='kyfw.12306.cn') del self.session.cookies['_passport_session'] del self.session.cookies['uamtk'] del self.session.cookies['BIGipServerportal'] uab_collina_value = self.generate_uab_collina() self.session.cookies.set('_uab_collina', uab_collina_value, domain='kyfw.12306.cn') response = self.session.post(url, data=data) if response.status_code == 200: if response.json().get("status"): print("创建订单成功!") else: print("创建订单失败!") else: print(f"请求失败,状态码: {response.status_code}") ''' 订单初始化 跳转界面提取界面token和key_check_isChange ''' def init_order(self): # 订单初始化 url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc" self.session.headers.update({ "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "Windows", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Referer": "https://kyfw.12306.cn/otn/confirmPassenger/initDc", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", }) data = { '_json_att': '' } # 更新cookies uab_collina_value = self.generate_uab_collina() self.session.cookies.update({'_uab_collina': uab_collina_value}) response = self.session.post(url, data=data) # print(response.text) if response.status_code == 200: try: self._REPEAT_SUBMIT_TOKEN = re.findall("var globalRepeatSubmitToken = '(.*?)'", response.text)[0] self._key_check_isChange = re.findall("'key_check_isChange':'(.*?)'", response.text)[0] except IndexError: print("提取数据失败!") else: print(f"请求失败,状态码: {response.status_code}") ''' 查询乘车人信息 ''' def check_passengers(self): # 查询乘车人信息 url = "https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs" self.session.headers.update({ "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "Windows", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", }) data = { "_json_att": "", 'REPEAT_SUBMIT_TOKEN': self._REPEAT_SUBMIT_TOKEN } response = self.session.post(url, data=data) if response.status_code == 200: try: response = response.json() print("乘车人信息查询成功") self._allEncStr = response['data']['normal_passengers'][0]['allEncStr'] except ValueError: print("响应不是合法的 JSON 格式:", response.text) else: print("乘车人信息查询失败!") print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 检查订单信息 ''' def check_order_info(self): # 检查订单信息 url = "https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo" data = { "cancel_flag": "2", # 订单状态,0为取消,2为未取消 "bed_level_order_num": "000000000000000000000000000000", # 床位级别订单号 "passengerTicketStr": f"{self.user.TICKET_CLASS},{self.user.GENDER},1,{self.user.NAME},1,{self.user.ID},{self.user.PHONE_NUMBER},N,{self._allEncStr}", # 乘客的票据信息,包含乘客的座位、身份证、票价等信息。 "oldPassengerStr": f"{self.user.NAME},1,{self.user.ID},1_", # 需要与 passengerTicketStr 保持一致 "tour_flag": "dc", # 票类型dc为单程票 "whatsSelect": "1", "sessionId": "", "sig": "", "scene": "nc_login", "_json_att": "", "REPEAT_SUBMIT_TOKEN": self._REPEAT_SUBMIT_TOKEN, } uab_collina_value = self.generate_uab_collina() self.session.cookies.update({'_uab_collina': uab_collina_value}) response = self.session.post(url, data=data) if response.status_code == 200: if response.json().get("status"): print("查询乘车人信息成功") else: print(response.json().get("data")) else: print("查询乘车人信息失败!") print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 提交订单 ''' def submit_order(self,train): # 提交订单 url = "https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount" self.session.headers.update({ "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "\"Windows\"", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", }) data = { "train_date": f"{datetime.strptime(user.train_date, "%Y-%m-%d").strftime("%a")} {self.user.month_dict[int(self.user.train_date[5:7])]} {self.user.train_date[-2:]} {self.user.train_date[:4]} 00:00:00 GMT+0800 (中国标准时间)", "train_no": self.tickets[train]["all_trainname"], "stationTrainCode": train, "seatType": self.user.TICKET_CLASS, "fromStationTelecode": self.user.CITYCODE[self.user.end_station], "toStationTelecode": self.user.CITYCODE[self.user.start_station], "leftTicket": self.tickets[train]["left_ticket"], "purpose_codes": "00", # 购买车票的用途,00表示普通购票 "train_location": self.tickets[train]['train_location'], "_json_att": "", "REPEAT_SUBMIT_TOKEN": self._REPEAT_SUBMIT_TOKEN } uab_collina_value = self.generate_uab_collina() self.session.cookies.update({'_uab_collina': uab_collina_value}) response = self.session.post(url, data=data) if response.status_code == 200: print("提交订单成功!") else: print("提交订单失败!") print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 确认订单 ''' def confirm_order(self, train, response=None): if response.status_code == 200: response = response.json() # 修正:同时判断status和submitStatus if response.get('status') and response.get('data', {}).get('submitStatus'): print("确认订单成功!") return True # 返回成功状态 else: error_msg = response.get('data', {}).get('errMsg', '未知错误') print(f"确认订单失败: {error_msg}") # 输出具体错误信息 return False # 返回失败状态 # 确认订单 url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue' self.session.headers.update({ "Host": "kyfw.12306.cn", "Connection": "keep-alive", "sec-ch-ua-platform": "Windows", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "application/json, text/javascript, */*; q=0.01", "sec-ch-ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "sec-ch-ua-mobile": "?0", "Origin": "https://kyfw.12306.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", }) data = { 'passengerTicketStr': f"{self.user.TICKET_CLASS},0,1,{self.user.NAME},1,{self.user.ID},{self.user.PHONE_NUMBER},N,{self._allEncStr}", 'oldPassengerStr': f"{self.user.NAME},1,{self.user.ID},1_", # 'randCode': '', 'purpose_codes': '00', 'key_check_isChange': self._key_check_isChange, 'leftTicketStr': self.tickets[train]["left_ticket"], 'train_location': self.tickets[train]['train_location'], # one_train[15] 'choose_seats': '1'+self.user.choose_seats, # # 选择坐席 ABCDEF 上中下铺 默认为空不选 'seatDetailType': '000', # 'is_jy': 'N', # 是否为境内预订 默认N 'is_cj': 'Y', # 是否为成人票 默认N 'encryptedData': '', 'whatsSelect': '1', 'roomType': '00', 'dwAll': 'N', # '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self._REPEAT_SUBMIT_TOKEN # 1.1.19获取 } print(data) uab_collina_value = self.generate_uab_collina() self.session.cookies.update({'_uab_collina': uab_collina_value}) response = self.session.post(url, data=data) print(response.text) if response.status_code == 200: response = response.json() if response['status']: print("确认订单成功!") else: data['randCode'] = '' uab_collina_value = self.generate_uab_collina() self.session.cookies.update({'_uab_collina': uab_collina_value}) response = self.session.post(url, data=data) if response['data']["submitStatus"]: print("确认订单成功!") print("确认订单失败!") else: print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 记录日志 ''' def base_log(self): # 记录日志 url = "https://kyfw.12306.cn/otn/basedata/log" data = {'type': 'dc', '_json_att': "", 'REPEAT_SUBMIT_TOKEN': self._REPEAT_SUBMIT_TOKEN } del self.session.cookies['_uab_collina'] response = self.session.post(url, data=data) if response.status_code == 200: print("记录日志成功!") else: print("记录日志失败!") print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}") ''' 排队出票 ''' def queue_order(self): # 排队等待 返回waittime(下次发送重复请求所需要的等待时间) 重复发送请求直到获取 requestID 和 orderID # 当前时间戳(毫秒) random = str(int(time.time() * 1000)) # 请求的 URL url = f"https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random={random}&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN={self._REPEAT_SUBMIT_TOKEN}" # print(url) self.session.headers.update({ 'Host': 'kyfw.12306.cn', 'Connection': 'keep-alive', 'sec-ch-ua-platform': '"Windows"', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'sec-ch-ua': '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' }) while True: response = self.session.get(url) # print(response.text) if response.status_code == 200: data = response.json() # 获取排队等待时间 wait_time = data['data'].get('waitTime') # 获取订单ID order_id = data['data'].get('orderId') # 如果订单ID已生成,退出循环 if order_id: print("出票成功!请在10分钟内去12306客户端支付!") return response.cookies, order_id # 如果订单ID为null,继续发送请求并等待相应的时间 print("当前没有订单ID,继续排队...") if wait_time == 4: time.sleep(2.95) # 等待3秒后再次请求 elif wait_time == -100: time.sleep(1) #等待1秒后再次请求 elif wait_time == -2: print("出票失败!") return None order_id = self.queue_order() return order_id else: print(f"请求失败,状态码: {response.status_code}") break ''' 订票完整流程 ''' def run(self): # 获取车票信息 while True: # time.sleep(0.1) #等待0.1秒 result = self.get_ticket_info() if not result: time.sleep(0.25) else: break try_time = 0 max_try_time = 5 while try_time < max_try_time: # 遍历车次 for train in self.user.TRAIN_ID_LIST: # 创建订单 self.create_order(train) # 订单初始化 self.init_order() # 获取乘车人信息 self.check_passengers() # 检查订单信息 self.check_order_info() # 提交订单 self.submit_order(train) # 确认订单 self.confirm_order(train) # 记录日志 self.base_log() # 排队出票 order_id = self.queue_order() if order_id: return 1 else: try_time += 1 return 0 二维码登录不要改,优化和修改错误抢票失败: 'NoneType' object has no attribute 'status_code'?
09-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值