# 2023-8-6
## LINEbot:
* 歌:我愛他
---
### 經過
1. event message text
上面應該是從某個網站抄下來的
就是一個會模仿講話的line bot
Flask就像是一個app負責處理line傳來的訊息
在line的webhook裡面設定從render複製過來的網址再加上```"callback"```(因該是為了防止混淆request的位置)
剩下的註解都是用chatgpt寫的
不然我也不會
```python=
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import *
import os
app = Flask(__name__)
line_bot_api = LineBotApi(os.environ['CHANNEL_ACCESS_TOKEN'])
handler = WebhookHandler(os.environ['CHANNEL_SECRET'])
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']#是用來驗證請求的有效性
body = request.get_data(as_text=True)#獲取 HTTP 請求的資料主體(body) 以文字格式解析 後續處理方便
app.logger.info("Request body: " + body)#請求的資料主體寫入 Flask 應用程式的日誌,方便後續查看
try:
handler.handle(body, signature)#資料主體和簽名傳handler處理 handler是WebhookHandler 物件 處理 LINE Bot 收到的事件。
except InvalidSignatureError:#簽名驗證異常
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
message = TextSendMessage(text=event.message.text)# 將回覆的文字訊息包裝成 TextSendMessage 物件
line_bot_api.reply_message(event.reply_token, message)# 使用 line_bot_api 回覆訊息給使用者
import os
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
```
---
因為我的目標是 如果開頭有梗圖支援四個字 就要去找梗圖
所以我要辨認訊息內容
本來是所以要寫:
```python=
if message.text.startswith("梗圖支援"):
...
```
---
但是我如果要有不一樣的回覆內容的話我也不能直接寫
```python=
line_bot_api.reply_message(event.reply_token,"蛤")
```
---
因為它的格式要求要是```text```這個資料型態
所以改成把reply_text當作是要回復的內容的變數
在經過
```python=
message = TextSendMessage(text=reply_text)
```
把它轉成text型態
而本來message的位置就用它本來的```event.message```
---
結果就是:
```python=
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import *
import os
app = Flask(__name__)
line_bot_api = LineBotApi(os.environ['CHANNEL_ACCESS_TOKEN'])
handler = WebhookHandler(os.environ['CHANNEL_SECRET'])
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']#是用來驗證請求的有效性
body = request.get_data(as_text=True)#獲取 HTTP 請求的資料主體(body) 以文字格式解析 後續處理方便
app.logger.info("Request body: " + body)#請求的資料主體寫入 Flask 應用程式的日誌,方便後續查看
try:
handler.handle(body, signature)#資料主體和簽名傳handler處理 handler是WebhookHandler 物件 處理 LINE Bot 收到的事件。
except InvalidSignatureError:#簽名驗證異常
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
if event.message.text.startswith("梗圖支援 "):
# 如果使用者傳來的訊息開頭是 "梗圖支援 ",則回覆 "蛤"
reply_text = "蛤"
elif event.message.text.startswith("語錄支援"):
reply_text = "還很笨"
else:
# 否則回覆使用者傳來的訊息內容
reply_text = event.message.text
# 將回覆的文字訊息包裝成 TextSendMessage 物件
message = TextSendMessage(text=reply_text)
# 使用 line_bot_api 回覆訊息給使用者
line_bot_api.reply_message(event.reply_token, message)
import os
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
```
2. 開始爬蟲
#### 動機
已經可以接受line端的指令了 接下來要做的就是在接到指令之後去爬蟲
這部分我找了下梗圖網站 覺得迷因倉庫的齊全度真的低(或是我不會用)
所以就想用估狗搜圖
一開始AI的建議是:
```python=
import requests
from bs4 import BeautifulSoup
def get_image_urls(search_query, num_images=10):
# 構造 Google 圖片搜尋的 URL
url = f"https://www.google.com/search?q={search_query}&tbm=isch"
# 偽裝為瀏覽器發送請求,避免被阻擋
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
# 發送請求並獲取回應內容
response = requests.get(url, headers=headers)
response.raise_for_status()
# 解析 HTML 頁面
soup = BeautifulSoup(response.content, "html.parser")
# 儲存圖片 URL 的列表
image_urls = []
# 遍歷所有 <img> 標籤
for img in soup.find_all("img"):
# 如果已經獲取到指定數量的圖片 URL,則停止遍歷
if len(image_urls) >= num_images:
break
# 提取圖片的 URL
img_url = img.get("src")
# 確保 URL 是有效的以 http 開頭
if img_url and img_url.startswith("http"):
# 將圖片 URL 加入列表
image_urls.append(img_url)
# 返回圖片 URL 的列表
return image_urls
if __name__ == "__main__":
# 設定搜尋關鍵字和要抓取的圖片數量
search_query = "請支援收銀"
num_images = 5
# 獲取圖片 URL 的列表
image_urls = get_image_urls(search_query, num_images)
# 列印出每個圖片的 URL
for idx, img_url in enumerate(image_urls, start=1):
print(f"Image {idx}: {img_url}")
```
但是我抓到的都是很糊的縮圖 畢竟網址開頭都一樣

就很糊
---
所以就要嘗試著抓原圖
看了很久都者不到有什麼適合爬的
後來在建中DC問了大佬幫我找到方法
3. 二次爬蟲


但還沒有完全寫出來