File: C:/Users/fred/OneDrive/Desktop/tx0525.ipynb
{
"cells": [
{
"cell_type": "code",
"execution_count": 17,
"id": "84820888-e94b-47c7-bbfa-1c8d4290f24e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 6 å¼µ\n",
"š é»1A-2å2800 å©é¤ 6 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 4 å¼µ\n",
"š é»1A-2å2800 å©é¤ 4 å¼µ\n",
"š é»1A-2å2800 å©é¤ 4 å¼µ\n",
"š é»1A-2å2800 å©é¤ 4 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š é»1A-2å2800 å©é¤ 2 å¼µ\n",
"š ę©1A-1å2800 å©é¤ 1 å¼µ\n"
]
},
{
"ename": "TwilioRestException",
"evalue": "HTTP 429 error: Unable to create record: Account AC8a2a780795d52435623071de0c5b6626 exceeded the 9 daily messages limit",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTwilioRestException\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[17], line 97\u001b[0m\n\u001b[0;32m 94\u001b[0m last_hour_check \u001b[38;5;241m=\u001b[39m now \u001b[38;5;66;03m# ę“ę°ęé\u001b[39;00m\n\u001b[0;32m 96\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m---> 97\u001b[0m run_until(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2025-05-25 16:20\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"Cell \u001b[1;32mIn[17], line 88\u001b[0m, in \u001b[0;36mrun_until\u001b[1;34m(deadline_str)\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[0;32m 87\u001b[0m \u001b[38;5;66;03m#print(f\"\\nš {now.strftime('%Y-%m-%d %H:%M:%S')} - éå§ęŖ¢ę„\")\u001b[39;00m\n\u001b[1;32m---> 88\u001b[0m check_tickets() \u001b[38;5;66;03m# ä½ åę¬ēå½å¼\u001b[39;00m\n\u001b[0;32m 90\u001b[0m \u001b[38;5;66;03m# č„č¶
éäøå°ęļ¼å°åŗę示\u001b[39;00m\n\u001b[0;32m 91\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m now \u001b[38;5;241m-\u001b[39m last_hour_check \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m timedelta(hours\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m):\n",
"Cell \u001b[1;32mIn[17], line 64\u001b[0m, in \u001b[0;36mcheck_tickets\u001b[1;34m()\u001b[0m\n\u001b[0;32m 62\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mš \u001b[39m\u001b[38;5;132;01m{\u001b[39;00marea\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m å©é¤ \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mremaining_seats\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m å¼µ\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;28mprint\u001b[39m(result)\n\u001b[1;32m---> 64\u001b[0m send_sms(result)\n\u001b[0;32m 65\u001b[0m \u001b[38;5;66;03m#notify_desktop(result)\u001b[39;00m\n\u001b[0;32m 66\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 67\u001b[0m \n\u001b[0;32m 68\u001b[0m \u001b[38;5;66;03m#print(f\"ā ęę天å°ē”焨ļ¼{text}\")\u001b[39;00m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n",
"Cell \u001b[1;32mIn[17], line 24\u001b[0m, in \u001b[0;36msend_sms\u001b[1;34m(message)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msend_sms\u001b[39m(message): \n\u001b[1;32m---> 24\u001b[0m client\u001b[38;5;241m.\u001b[39mmessages\u001b[38;5;241m.\u001b[39mcreate(\n\u001b[0;32m 25\u001b[0m body\u001b[38;5;241m=\u001b[39mmessage,\n\u001b[0;32m 26\u001b[0m from_\u001b[38;5;241m=\u001b[39mTWILIO_PHONE_NUMBER,\n\u001b[0;32m 27\u001b[0m to\u001b[38;5;241m=\u001b[39mYOUR_PHONE_NUMBER\n\u001b[0;32m 28\u001b[0m )\n",
"File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\twilio\\rest\\api\\v2010\\account\\message\\__init__.py:589\u001b[0m, in \u001b[0;36mMessageList.create\u001b[1;34m(self, to, status_callback, application_sid, max_price, provide_feedback, attempt, validity_period, force_delivery, content_retention, address_retention, smart_encoded, persistent_action, traffic_type, shorten_urls, schedule_type, send_at, send_as_mms, content_variables, risk_check, from_, messaging_service_sid, body, media_url, content_sid)\u001b[0m\n\u001b[0;32m 585\u001b[0m headers[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mContent-Type\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/x-www-form-urlencoded\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 587\u001b[0m headers[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAccept\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/json\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m--> 589\u001b[0m payload \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_version\u001b[38;5;241m.\u001b[39mcreate(\n\u001b[0;32m 590\u001b[0m method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPOST\u001b[39m\u001b[38;5;124m\"\u001b[39m, uri\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_uri, data\u001b[38;5;241m=\u001b[39mdata, headers\u001b[38;5;241m=\u001b[39mheaders\n\u001b[0;32m 591\u001b[0m )\n\u001b[0;32m 593\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m MessageInstance(\n\u001b[0;32m 594\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_version, payload, account_sid\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_solution[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maccount_sid\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 595\u001b[0m )\n",
"File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\twilio\\base\\version.py:463\u001b[0m, in \u001b[0;36mVersion.create\u001b[1;34m(self, method, uri, params, data, headers, auth, timeout, allow_redirects)\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 451\u001b[0m \u001b[38;5;124;03mCreate a resource instance.\u001b[39;00m\n\u001b[0;32m 452\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 453\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrequest(\n\u001b[0;32m 454\u001b[0m method,\n\u001b[0;32m 455\u001b[0m uri,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 461\u001b[0m allow_redirects\u001b[38;5;241m=\u001b[39mallow_redirects,\n\u001b[0;32m 462\u001b[0m )\n\u001b[1;32m--> 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parse_create(method, uri, response)\n",
"File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\twilio\\base\\version.py:435\u001b[0m, in \u001b[0;36mVersion._parse_create\u001b[1;34m(self, method, uri, response)\u001b[0m\n\u001b[0;32m 431\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 432\u001b[0m \u001b[38;5;124;03mParse create response JSON\u001b[39;00m\n\u001b[0;32m 433\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 434\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m200\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m300\u001b[39m:\n\u001b[1;32m--> 435\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexception(method, uri, response, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnable to create record\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 437\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m json\u001b[38;5;241m.\u001b[39mloads(response\u001b[38;5;241m.\u001b[39mtext)\n",
"\u001b[1;31mTwilioRestException\u001b[0m: HTTP 429 error: Unable to create record: Account AC8a2a780795d52435623071de0c5b6626 exceeded the 9 daily messages limit"
]
}
],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup\n",
"import time\n",
"import smtplib\n",
"from email.mime.text import MIMEText\n",
"from twilio.rest import Client\n",
"#from plyer import notification # ę”é¢éē„\n",
"import re\n",
"from datetime import datetime\n",
"from datetime import datetime, timedelta\n",
"\n",
"\n",
"# Twilio åø³ę¶č³čØ\n",
"# Twilio åø³ę¶č³čØ\n",
"TWILIO_ACCOUNT_SID = \"AC8a2a780795d52435623071de0c5b6626\"\n",
"TWILIO_AUTH_TOKEN = \"b4a95a298841e743b921f4f7ce6d01c5\"\n",
"client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)\n",
"TWILIO_PHONE_NUMBER = \"+12403267359\"\n",
"YOUR_PHONE_NUMBER = \"+886906867137\"\n",
"\n",
"\n",
"\n",
"def send_sms(message): \n",
" client.messages.create(\n",
" body=message,\n",
" from_=TWILIO_PHONE_NUMBER,\n",
" to=YOUR_PHONE_NUMBER\n",
" )\n",
"\n",
"# š¹ ęå
å®ē„Øē¶²åļ¼č«ęęęØē焨åé é¢ļ¼ ęę天 19138 ęęå
19137\n",
"URL = \"https://tixcraft.com/ticket/area/25_jhope/19138\"\n",
"\n",
"# š¹ ē®ęØåŗ§ä½å稱\n",
"#TARGET_SEAT = 'ę©1A-2å2800' # ä¾ē
§ęØēéę±äæ®ę¹\n",
"TARGET_SEATS = ['ę©1A-2å2800', \"é»1A-1å2800\",'3800','ę©1A-1å2800','é»1A-2å2800']\n",
"\n",
"##################################################################éå\n",
"\n",
"def check_tickets():\n",
" headers = {\"User-Agent\": \"Mozilla/5.0\"}\n",
" response = requests.get(URL, headers=headers)\n",
"\n",
"\n",
" soup = BeautifulSoup(response.text, \"html.parser\")\n",
"\n",
" seats = soup.find_all([\"li\", \"a\"])\n",
" # ā
ē¶²ē«ęééē„ļ¼åŖåÆäøę¬”ļ¼\n",
" found = False\n",
"\n",
" for seat in seats:\n",
" text = \"\".join(seat.stripped_strings)\n",
"\n",
" for target_seat in TARGET_SEATS:\n",
" if target_seat in text:\n",
" found = True\n",
" if \"å©é¤\" in text or \"remaining\" in text:\n",
" area = text[:10]\n",
" match = text[10:]\n",
" match = re.search(r\"(\\d+)\\s*seat\\(s\\) remaining\", match)\n",
" if match:\n",
" remaining_seats = match.group(1)\n",
" result = f'š {area} å©é¤ {remaining_seats} å¼µ'\n",
" print(result)\n",
" send_sms(result)\n",
" #notify_desktop(result)\n",
" else:\n",
" \n",
" #print(f\"ā ęę天å°ē”焨ļ¼{text}\")\n",
" continue\n",
"\n",
" if not found:\n",
" print(\"š ē¶²ē«ęŖéę¾\")\n",
"\n",
"def run_until(deadline_str):\n",
" deadline = datetime.strptime(deadline_str, \"%Y-%m-%d %H:%M\")\n",
"\n",
" last_hour_check = datetime.now() # ēØä¾čæ½č¹¤äøäøåćę“é»ęéć\n",
" notified_opened = False # åÆéøļ¼ęÆå¦ē¼ééćē¶²ē«ęéäŗļ¼ć\n",
"\n",
" while True:\n",
" now = datetime.now()\n",
"\n",
" if now >= deadline:\n",
" print(\"ā¹ļø å°éęå®ęéļ¼åę¢å·č”\")\n",
" break\n",
"\n",
" #print(f\"\\nš {now.strftime('%Y-%m-%d %H:%M:%S')} - éå§ęŖ¢ę„\")\n",
" check_tickets() # ä½ åę¬ēå½å¼\n",
"\n",
" # č„č¶
éäøå°ęļ¼å°åŗę示\n",
" if now - last_hour_check >= timedelta(hours=1):\n",
" t1=datetime.now()\n",
" print(f\"\\n ā° {t1.strftime('%Y-%m-%d %H:%M:%S')} äøå°ęå
§ē”焨\")\n",
" last_hour_check = now # ę“ę°ęé\n",
"\n",
" time.sleep(1)\n",
"run_until(\"2025-05-25 16:20\")\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "80df7f08-71a6-4015-abc3-7b3b77c367b0",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# Twilio åø³ę¶č³čØ\n",
"TWILIO_ACCOUNT_SID = \"AC8a2a780795d52435623071de0c5b6626\"\n",
"TWILIO_AUTH_TOKEN = \"b4a95a298841e743b921f4f7ce6d01c5\"\n",
"client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)\n",
"TWILIO_PHONE_NUMBER = \"+12403267359\"\n",
"YOUR_PHONE_NUMBER = \"+886906867137\"\n",
"\n",
"send_sms('test')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "883608c2-e780-40fa-b572-10a9f93bf60a",
"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.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}