# 自動傳訊息
## 簡介
這兩段程式碼都是用來自動發送消息的,其中第一段是用來透過 Instagram 自動發送 Direct Messages (DM),第二段是用來透過 Gmail 自動發送郵件。
## Code
### Code by Instagram
```python!
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# Instagram 登入資訊
USERNAME = "mattwu0918@gmail.com" # 替換為你的 Instagram 用戶名
PASSWORD = "********" # 替換為你的 Instagram 密碼
FRIENDS = ["b.y.h_._", "last_but_the_least", "pisces0223___", "eric.kuan.fu", "keng_ting_hsu", "hcyqfanpu", "xyz._0122", "_forgotthepass_", "_wyh_qf", "susan_1026_", "liang1120_", "ttyl.17_", "louiswuuuu", "nina__06.13","yixin1649"] # 摯友用戶名列表
MESSAGE = "要不要出來玩!這是一個測試消息。我正在嘗試用程式群發訊息" # 要發送的消息
# 啟動 WebDriver
driver = webdriver.Chrome()
driver.get("https://www.instagram.com/")
# 等待頁面加載
time.sleep(5)
# 點擊 "用 Facebook 登入"
fb_login_button = driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[1]/div[5]/button/div/div[2]')
fb_login_button.click()
time.sleep(5)
# 登入
driver.find_element(By.ID, "email").send_keys(USERNAME)
driver.find_element(By.ID, "pass").send_keys(PASSWORD)
driver.find_element(By.ID, "pass").send_keys(Keys.RETURN)
time.sleep(20)
# 確保登入成功
if "challenge" in driver.current_url:
print("需要進行驗證,請手動完成驗證。")
time.sleep(30)
# 發送消息給每位摯友
for friend in FRIENDS:
# 打開 DM (Direct Message) 頁面
driver.get(f"https://www.instagram.com/direct/new/")
time.sleep(5)
# 點即訊息
users = driver.find_element(By.CSS_SELECTOR, "[aria-label='新訊息']")
users.click()
time.sleep(2)
# 搜尋摯友
search_box = driver.find_element(By.CSS_SELECTOR, "[name='queryBox']")
search_box.send_keys(friend)
time.sleep(2)
# 點選摯友
user = driver.find_element(By.CSS_SELECTOR, "[type = 'checkbox' ]")
user.click()
time.sleep(2)
# 下一步
next_button = driver.find_element(By.XPATH, "//*[text()='聊天']")
next_button.click()
time.sleep(5)
# 發送消息
message_box = driver.find_element(By.CSS_SELECTOR, "[aria-describedby = '訊息']")
message_box.send_keys(MESSAGE)
message_box.send_keys(Keys.RETURN)
time.sleep(2)
print("消息已發送完成!")
time.sleep(500)
driver.quit()
```
### Code by gmail
```cpp=
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# Instagram 登入資訊
USERNAME = input("你的gmail帳號") # 替換為你的 Instagram 用戶名
PASSWORD = input("你的gmail密碼") # 替換為你的 Instagram 密碼
topic = input("要傳送的標題")
MESSAGE = input("要傳送的訊息") # 要發送的消息
first = input("開頭前綴")
address = input("Gmail帳號後綴")
grade_start = input("前三位數字從哪開始")
grade_end = input("前三位數字到哪結束")
id_start = input("後三位數字從哪開始")
id_end = input("後三位數字從哪結束")
grade_len = len(id_start)
# 啟動 WebDriver
driver = webdriver.Chrome()
driver.get("https://mail.google.com/")
# 等待頁面加載
time.sleep(5)
# 登入
driver.find_element(By.ID, "identifierId").send_keys(USERNAME)
driver.find_element(By.ID, "identifierId").send_keys(Keys.RETURN)
time.sleep(10)
driver.find_element(By.NAME, "Passwd").send_keys(PASSWORD)
driver.find_element(By.NAME, "Passwd").send_keys(Keys.RETURN)
time.sleep(20)
# 確保登入成功
if "challenge" in driver.current_url:
print("需要進行驗證,請手動完成驗證。")
time.sleep(30)
# 發送消息給每位摯友
# 打開 DM (Direct Message) 頁面
compose=driver.find_element(By.CSS_SELECTOR, "div.T-I.T-I-KE.L3")
compose.click()
time.sleep(5)
# 輸入收件人
for student_grade in range(int(grade_start),int(grade_end)+1) :
for student_id in range(int(id_start), int(id_end)+1):
gmail_out = student_grade * (10**grade_len) + student_id
print(gmail_out)
to_field = driver.find_element(By.CSS_SELECTOR, "input[aria-label='收件者']")
to_field.send_keys(f"{first}{gmail_out}{address}")
to_field.send_keys(Keys.ENTER)
to_field.send_keys(" ")
time.sleep(5)
# 輸入主題
subject_field = driver.find_element(By.NAME, "subjectbox")
subject_field.send_keys(topic)
time.sleep(5)
# 輸入訊息內容
message_body = driver.find_element(By.CSS_SELECTOR, ".Am.Al.editable.LW-avf.tS-tW")
message_body.send_keys(MESSAGE)
time.sleep(5)
# 點擊發送按鈕
send_button = driver.find_element(By.CLASS_NAME, "T-I.J-J5-Ji.aoO.v7.T-I-atl.L3")
send_button.click()
time.sleep(5)
print("消息已發送完成!")
time.sleep(500)
driver.quit()
```
### fastpi
```python=
from fastapi import FastAPI, Form
from fastapi.responses import HTMLResponse
from pydantic import BaseModel
from fastapi.templating import Jinja2Templates
from fastapi.requests import Request
from fastapi.middleware.cors import CORSMiddleware # 新增這一行
import uvicorn
import subprocess
import os
app = FastAPI()
# 添加 CORS 支援
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 或者限制為您的前端域名,例如 "https://your-netlify-site.netlify.app"
allow_methods=["*"],
allow_headers=["*"],
)
# 設置範本目錄
base_dir = os.path.dirname(__file__)
templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "templates"))
# 檢查範本文件是否存在
template_path = os.path.join(os.path.dirname(__file__), "templates", "index.html")
if os.path.exists(template_path):
print("Template file exists")
else:
print("Template file does not exist")
class EmailRequest(BaseModel):
username: str
password: str
topic: str
message: str
first: str
address: str
grade_start: str
grade_end: str
id_start: str
id_end: str
@app.get("/", response_class=HTMLResponse)
async def send_email_form(request: Request):
print("Handling GET request for /send-email")
return templates.TemplateResponse("index.html", {"request": request})
@app.post("/send-email")
async def send_email(
username: str = Form(...),
password: str = Form(...),
topic: str = Form(...),
message: str = Form(...),
first: str = Form(...),
address: str = Form(...),
grade_start: str = Form(...),
grade_end: str = Form(...),
id_start: str = Form(...),
id_end: str = Form(...)
):
email_info_path = os.path.join(base_dir, "email_info.txt")
with open("email_info.txt", "w") as f:
f.write(f"{username}\n")
f.write(f"{password}\n")
f.write(f"{topic}\n")
f.write(f"{message}\n")
f.write(f"{first}\n")
f.write(f"{address}\n")
f.write(f"{grade_start}\n")
f.write(f"{grade_end}\n")
f.write(f"{id_start}\n")
f.write(f"{id_end}\n")
# 動態生成 text.py 路徑
script_path = os.path.join(base_dir, "text.py")
result = subprocess.run(["python", script_path], capture_output=True, text=True)
# 打印執行結果到伺服器日誌
print("stdout:", result.stdout)
print("stderr:", result.stderr)
return {"status": "Email sending initiated", "stdout": result.stdout, "stderr": result.stderr}
try:
if __name__ == "__main__":
port = int(os.getenv("PORT", 8000))
uvicorn.run(app, host="0.0.0.443", port=port)
except Exception as e:
print(f"An error occurred: {e}")
```
### html
```html=
<!DOCTYPE html>
<html>
<head>
<title>Send Email</title>
</head>
<body>
<h1>Send Email</h1>
<form action="https://auto-send-email-pjrj.onrender.com/send-email" method="POST">
<label for="username">Gmail 帳號:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">Gmail 密碼:</label>
<input type="password" id="password" name="password" required><br>
<label for="topic">標題:</label>
<input type="text" id="topic" name="topic" required><br>
<label for="message">訊息:</label>
<textarea id="message" name="message" required></textarea><br>
<label for="first">開頭前綴:</label>
<input type="text" id="first" name="first"><br>
<label for="address">Gmail 帳號後綴:</label>
<input type="text" id="address" name="address"><br>
<label for="grade_start">前一半數字從哪開始:</label>
<input type="text" id="grade_start" name="grade_start"><br>
<label for="grade_end">前一半數字到哪結束:</label>
<input type="text" id="grade_end" name="grade_end"><br>
<label for="id_start">後一半數字從哪開始:</label>
<input type="text" id="id_start" name="id_start"><br>
<label for="id_end">後一半數字到哪結束:</label>
<input type="text" id="id_end" name="id_end"><br>
<input type="submit" value="發送"><br>
<p>Creater: Matt Wu</p>
<p>IG: <a href="https://www.instagram.com/matt.wu.56679" target="_blank">@mattwu56679</a> for search help</p>
</form>
</body>
</html>
```