---
# System prepended metadata

title: 2023-8-6開發日誌
tags: [Line-bot, '開發日程:2023-08', '開發日程:2023']

---

# 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}")

```
但是我抓到的都是很糊的縮圖 畢竟網址開頭都一樣
![](https://hackmd.io/_uploads/H1XCWonj3.png)
![image alt](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRupnZE0NrroI3jp1wKa3qD29nMLRVbFn9fMOIAdCQ5asQIwaJKbLKGTXLqKg&s)就很糊

---

所以就要嘗試著抓原圖
看了很久都者不到有什麼適合爬的

後來在建中DC問了大佬幫我找到方法

3. 二次爬蟲
    ![](https://hackmd.io/_uploads/rkRU7sns2.png)
    ![](https://hackmd.io/_uploads/Hkiw7onj3.png)

但還沒有完全寫出來