HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
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
}