{ "cells": [ { "cell_type": "markdown", "id": "e6dcc663-e0ed-4ea3-b442-11f229f4af94", "metadata": {}, "source": [ "## 新增体测单位" ] }, { "cell_type": "code", "execution_count": null, "id": "360f0a97-d73d-43f3-9f7a-0f9582103c82", "metadata": { "tags": [] }, "outputs": [], "source": [ "import pymongo\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"place\"]\n", "\n", "place_id = 345321\n", "place_code = \"14\"\n", "dw_name = \"中国石化镇海炼化公司\"\n", "dw_jc = \"中国石化镇海炼化公司\"\n", "myquery = { \"id\": place_id }\n", "num = mycol.count_documents(myquery)\n", "if num>0:\n", " print(num)\n", "else:\n", " mydict = { \"id\":place_id,\"name\": dw_name, \"code\": place_code }\n", " x = mycol.insert_one(mydict) " ] }, { "cell_type": "markdown", "id": "dcfbd41f-ca70-4f15-9153-60e6aaac27e8", "metadata": {}, "source": [ "## 生成手机验证码" ] }, { "cell_type": "code", "execution_count": 7, "id": "6ce2cbc7-435a-461c-bdb8-abd9a6962fbc", "metadata": { "execution": { "iopub.execute_input": "2024-09-30T09:30:45.697441Z", "iopub.status.busy": "2024-09-30T09:30:45.696598Z", "iopub.status.idle": "2024-09-30T09:30:45.721527Z", "shell.execute_reply": "2024-09-30T09:30:45.720414Z", "shell.execute_reply.started": "2024-09-30T09:30:45.697358Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ok\n" ] } ], "source": [ "import openpyxl\n", "import os,sys,shutil\n", "import json\n", "import math\n", "import glob\n", "import random\n", "from pathlib import Path\n", "import pymongo\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "\n", "place_id = 496534\n", "place_code = \"12\"\n", "dw_name = \"天宫院社区\"\n", "dw_jc = \"天宫院社区\"\n", "fi_path = '/home/songyi/python/mycrm/flask/pdf/files'\n", "fls = glob.glob(f'{fi_path}/{str(place_id)}/*.pdf')\n", "\n", "code_list = []\n", "for i in range(10): # 0~9\n", " code_list.append(str(i))\n", "list1 = []\n", "mycol = mydb[\"pdf\"]\n", "query1 = { \"place_id\": place_id }\n", "list2 = []\n", "mydoc = mycol.find(query1,{ \"code\": 1, \"_id\": 0 })\n", "\n", "for x in mydoc:\n", " list2.append(x['code'])\n", "\n", "i = 0\n", "while i < len(fls):\n", " code = random.sample(code_list,3) #随机取3位数\n", " code_num = ''.join(code) \n", " if place_code+code_num not in list1 and place_code+code_num not in list2:\n", " list1.append(place_code+code_num)\n", " i +=1\n", "i = 0\n", "list2= []\n", "for fn in fls:\n", " dict2 = {}\n", " fi_name =Path(fn).stem.split('-')[0]\n", " #fi_name =Path(fn).stem\n", " code = int(fi_name)\n", " dxm = list1[i]\n", " dict2 = {'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n", " list2.append(dict2)\n", " i +=1\n", "#x = mycol.insert_many(list2)\n", "#print('ok') " ] }, { "cell_type": "markdown", "id": "ad9e943a-bb3a-4d58-93ef-cc442a80effa", "metadata": {}, "source": [ "## 批量发送短信(测试)" ] }, { "cell_type": "code", "execution_count": 10, "id": "5f665c0f-8d30-4759-b7f8-fb7e13b98efa", "metadata": { "execution": { "iopub.execute_input": "2024-09-30T09:42:48.068065Z", "iopub.status.busy": "2024-09-30T09:42:48.067381Z", "iopub.status.idle": "2024-09-30T09:42:48.099230Z", "shell.execute_reply": "2024-09-30T09:42:48.098146Z", "shell.execute_reply.started": "2024-09-30T09:42:48.067999Z" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 13488820384 0014-舒浩轩.pdf 12429\n", "2 18612703139 0025-李嘉睿.pdf 12637\n", "3 13522895654 0003-杨宾.pdf 12432\n", "4 13718367043 0012-杨玉芬.pdf 12896\n", "5 15210713283 0005-王红柳.pdf 12628\n", "6 15101087817 0024-茅晴晴.pdf 12489\n", "7 18810111978 0008-段丽阳.pdf 12073\n", "8 15224991657 0026-郑慧敏.pdf 12467\n", "9 15210713283 0006-高天蕴.pdf 12748\n", "10 15010699019 0021-董润华.pdf 12609\n", "11 13671026339 0013-王柱明.pdf 12749\n", "12 15551006319 0029-林景平.pdf 12324\n", "13 13522895654 0004-武馨怡.pdf 12762\n", "14 18660799298 0023-程军妮.pdf 12745\n", "15 18233207289 0019-张傲楠.pdf 12672\n", "16 13910932179 0017-朱芷祁.pdf 12621\n", "17 18210661187 0011-张耀聪.pdf 12728\n", "18 18232370815 0020-尹晓晴.pdf 12890\n", "19 13426267482 0018-卢浥尘.pdf 12951\n", "20 13552494958 0031-魏丽.pdf 12267\n", "21 13681380585 0007-刘颖.pdf 12532\n", "22 13311183808 0016-张玉后.pdf 12681\n", "23 18210661187 0001-李雪莉.pdf 12531\n", "24 17665174761 0027-郑文结.pdf 12502\n", "25 15588818169 0022-刘小云.pdf 12758\n", "26 13011189787 0028-潘妍.pdf 12314\n", "27 13770726975 0030-宋元宵.pdf 12634\n", "28 18210661187 0002-张进刚.pdf 12419\n", "29 13671271202 0010-范文兰.pdf 12132\n", "30 18810111978 0009-段宇辰.pdf 12901\n", "31 13581907290 0015-罗靖卓.pdf 12130\n" ] } ], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "import json\n", "import pymongo\n", "import time\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"pdf\"]\n", "\n", "dw_jc = \"天宫院社区\"\n", "filename = 'data/天宫院社区240922.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "#place_id = 571315\n", "myquery = { \"place_id\": place_id}\n", "for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n", " code = int(x['fn'].split('-')[0])\n", " if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n", " dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n", " else:\n", " print(code,'no phone')\n", "#print(dict2)\n", "i=1\n", "#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n", "for k, v in dict2.items():\n", " phone = '+86'+v['phone']\n", " yzm = v['code']\n", " try: \n", " secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n", " secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n", " cred = credential.Credential(secretId, secretKey) \n", " httpProfile = HttpProfile()\n", " httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n", " httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n", " httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n", " clientProfile = ClientProfile()\n", " clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n", " clientProfile.language = \"en-US\"\n", " clientProfile.httpProfile = httpProfile\n", " client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n", " req = models.SendSmsRequest()\n", " req.SmsSdkAppId = \"1400140089\"\n", " req.SignName = \"坤铭教育\"\n", " req.TemplateId = \"1875765\" \n", " req.TemplateParamSet = [dw_jc,yzm]\n", " req.PhoneNumberSet = [phone]\n", " req.SessionContext = \"\"\n", " req.ExtendCode = \"\"\n", " req.SenderId = \"\"\n", " #resp = client.SendSms(req)\n", " #dict3 = json.loads(resp.to_json_string(indent=2))\n", "\n", " #print(v['phone'],dict3['SendStatusSet'][0][\"Message\"])\n", " print(i,v['phone'],v['name'], v['code'])\n", " i+=1\n", " except TencentCloudSDKException as err:\n", " print(v['phone'],err)" ] }, { "cell_type": "markdown", "id": "b9a157f4-4772-413e-82f4-ecb7d2af8529", "metadata": {}, "source": [ "## 批量发送短信" ] }, { "cell_type": "code", "execution_count": 11, "id": "4b2b5d76-665f-4dfe-bbd3-5c80abd8c3e3", "metadata": { "execution": { "iopub.execute_input": "2024-09-30T09:43:30.193404Z", "iopub.status.busy": "2024-09-30T09:43:30.192651Z", "iopub.status.idle": "2024-09-30T09:51:21.935881Z", "shell.execute_reply": "2024-09-30T09:51:21.933878Z", "shell.execute_reply.started": "2024-09-30T09:43:30.193333Z" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13488820384 12429 send success\n", "18612703139 12637 send success\n", "13522895654 12432 send success\n", "13718367043 12896 send success\n", "15210713283 12628 send success\n", "15101087817 12489 send success\n", "18810111978 12073 send success\n", "15224991657 12467 send success\n", "15210713283 12748 send success\n", "15010699019 12609 send success\n", "13671026339 12749 send success\n", "15551006319 12324 send success\n", "13522895654 12762 send success\n", "18660799298 12745 send success\n", "18233207289 12672 send success\n", "13910932179 12621 send success\n", "18210661187 12728 send success\n", "18232370815 12890 send success\n", "13426267482 12951 send success\n", "13552494958 12267 send success\n", "13681380585 12532 send success\n", "13311183808 12681 send success\n", "18210661187 12531 send success\n", "17665174761 12502 send success\n", "15588818169 12758 send success\n", "13011189787 12314 send success\n", "13770726975 12634 send success\n", "18210661187 12419 send success\n", "13671271202 12132 send success\n", "18810111978 12901 send success\n", "13581907290 12130 send success\n" ] } ], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "import json\n", "import pymongo\n", "import time\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"pdf\"]\n", "\n", "dw_jc = \"天宫院社区测试者\"\n", "filename = 'data/天宫院社区240922.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "place_id = 496534\n", "myquery = { \"place_id\": place_id }\n", "for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n", " code = int(x['fn'].split('-')[0])\n", " if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n", " dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n", " else:\n", " print('no phone')\n", "#print(dict2)\n", "#dw_jc = \"北体体质康健班测试者\"\n", "#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n", "for k, v in dict2.items():\n", " phone = '+86'+v['phone']\n", " yzm = v['code']\n", " try: \n", " secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n", " secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n", " cred = credential.Credential(secretId, secretKey) \n", " httpProfile = HttpProfile()\n", " httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n", " httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n", " httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n", " clientProfile = ClientProfile()\n", " clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n", " clientProfile.language = \"en-US\"\n", " clientProfile.httpProfile = httpProfile\n", " client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n", " req = models.SendSmsRequest()\n", " req.SmsSdkAppId = \"1400140089\"\n", " req.SignName = \"坤铭教育\"\n", " req.TemplateId = \"1875765\" \n", " req.TemplateParamSet = [dw_jc,yzm]\n", " req.PhoneNumberSet = [phone]\n", " req.SessionContext = \"\"\n", " req.ExtendCode = \"\"\n", " req.SenderId = \"\"\n", " resp = client.SendSms(req)\n", " dict3 = json.loads(resp.to_json_string(indent=2))\n", " print(v['phone'], v['code'],dict3['SendStatusSet'][0][\"Message\"])\n", " time.sleep(15)\n", " except TencentCloudSDKException as err:\n", " print(v['phone'],err)" ] }, { "cell_type": "code", "execution_count": null, "id": "df637ce6-7c35-404a-af43-2a5a66b49ba0", "metadata": {}, "outputs": [], "source": [ "dict1 = json.loads(resp.to_json_string(indent=2))\n", "print(dict1['SendStatusSet'][0][\"Message\"])" ] }, { "cell_type": "markdown", "id": "feb02430-8946-4ed2-a99b-7f5106257c8b", "metadata": {}, "source": [ "## 单个发送短信" ] }, { "cell_type": "code", "execution_count": null, "id": "25a269c3-758f-4e79-ae6d-a6e6f161d64b", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "import json\n", "import pymongo\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"pdf\"]\n", "\n", "dw_jc = \"天宫院社区测试者\"\n", "filename = 'data/天宫院社区240922.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "place_id = 496534\n", "myquery = { \"place_id\": place_id }\n", "for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n", " code = int(x['fn'].split('-')[0])\n", " if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n", " dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n", " else:\n", " print('no phone')\n", "\n", "phone = '+86'+'18854609676'\n", "yzm = '13306'\n", "try: \n", " secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n", " secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n", " cred = credential.Credential(secretId, secretKey) \n", " httpProfile = HttpProfile()\n", " httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n", " httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n", " httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n", " clientProfile = ClientProfile()\n", " clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n", " clientProfile.language = \"en-US\"\n", " clientProfile.httpProfile = httpProfile\n", " client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n", " req = models.SendSmsRequest()\n", " req.SmsSdkAppId = \"1400140089\"\n", " req.SignName = \"坤铭教育\"\n", " req.TemplateId = \"1875765\" \n", " req.TemplateParamSet = [dw_jc,yzm]\n", " req.PhoneNumberSet = [phone]\n", " req.SessionContext = \"\"\n", " req.ExtendCode = \"\"\n", " req.SenderId = \"\"\n", " resp = client.SendSms(req)\n", " dict3 = json.loads(resp.to_json_string(indent=2))\n", "\n", " print(phone,dict3['SendStatusSet'][0][\"Message\"])\n", "except TencentCloudSDKException as err:\n", " print(v['phone'],err)" ] }, { "cell_type": "code", "execution_count": null, "id": "b1e90a59-0b09-4786-99a5-036b69f793ae", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "import json\n", "import pymongo\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"pdf\"]\n", "\n", "filename = 'data/中安联合.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "place_id = 624770\n", "myquery = { \"place_id\": place_id,\"code\":\"051067\" }\n", "for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n", " code = int(x['fn'].split('-')[0])\n", " if str(code) in dict1.keys():\n", " dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code']}\n", " else:\n", " print('no phone')\n", "print(dict2)" ] }, { "cell_type": "markdown", "id": "458f1022-ceb9-49f9-b699-3fcc81658335", "metadata": {}, "source": [ "## 统计短信发送状态" ] }, { "cell_type": "code", "execution_count": null, "id": "411e89ed-8bb2-478b-b180-52188f800adc", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "import json\n", "import pymongo\n", "\n", "\n", "try: \n", " secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n", " secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n", " cred = credential.Credential(secretId, secretKey) \n", " httpProfile = HttpProfile()\n", " httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n", " httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n", " httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n", " clientProfile = ClientProfile()\n", " clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n", " clientProfile.language = \"en-US\"\n", " clientProfile.httpProfile = httpProfile\n", " client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n", " req = models.SendStatusStatisticsRequest()\n", " req.SmsSdkAppId = \"1400140089\"\n", " \n", " # 拉取最大条数,最多100条\n", " req.Limit = 100\n", " # 偏移量 注:目前固定设置为0\n", " req.Offset = 0\n", " # 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时\n", " req.BeginTime = \"2023112700\"\n", " # 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时\n", " # 注:EndTime 必须大于 BeginTime\n", " req.EndTime = \"2023112723\"\n", "\n", "\n", " # 通过client对象调用SendStatusStatistics方法发起请求。注意请求方法名与请求对象是对应的。\n", " # 返回的resp是一个SendStatusStatisticsResponse类的实例,与请求对象对应。\n", " resp = client.SendStatusStatistics(req)\n", "\n", "\n", " # 输出json格式的字符串回包\n", " print(resp.to_json_string(indent=2))\n", "\n", "\n", "except TencentCloudSDKException as err:\n", " print(err)\n" ] }, { "cell_type": "markdown", "id": "51c61809-e6a3-489e-bac7-f439b673dcd3", "metadata": {}, "source": [ "## 拉取短信下发状态" ] }, { "cell_type": "code", "execution_count": null, "id": "50183bba-2f9d-4003-98a7-0ecda96670ef", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tencentcloud.common import credential\n", "from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n", "from tencentcloud.sms.v20210111 import sms_client, models\n", "from tencentcloud.common.profile.client_profile import ClientProfile\n", "from tencentcloud.common.profile.http_profile import HttpProfile\n", "\n", "\n", "\n", "try: \n", " secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n", " secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n", " cred = credential.Credential(secretId, secretKey) \n", " httpProfile = HttpProfile()\n", " httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n", " httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n", " httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n", " clientProfile = ClientProfile()\n", " clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n", " clientProfile.language = \"en-US\"\n", " clientProfile.httpProfile = httpProfile\n", " client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n", " req = models.PullSmsSendStatusRequest()\n", " req.SmsSdkAppId = \"1400140089\"\n", " req.Limit = 100\n", " resp = client.PullSmsSendStatus(req)\n", " # 输出json格式的字符串回包\n", " print(resp.to_json_string(indent=2))\n", "\n", "\n", "except TencentCloudSDKException as err:\n", " print(err)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c3b4d384-9f83-4c91-98aa-0bb1f0e1d4ed", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }