1. 程式人生 > >從零開始微信機器人(三):表情機器人的製作

從零開始微信機器人(三):表情機器人的製作

本篇的誕生來自於一朋友製作的表情機器人。當時覺得十分有趣,也希望加入到群聊機器人中,因此就向他討要了原始碼並製作了表情功能。在此我也再次感謝吳毅凡同學的協助!

準備工作

由於需要讀取網頁內容,本文中由於我個人偏好使用xpath來選擇網頁中元素,使用了lxml包,安裝的話需要:

pip install lxml
pip install beautifulsoup4

使用鬥圖啦搜尋表情

由於鬥圖啦是明文傳輸資料搜尋的,我們可以簡單地通過

res = requests.get('https://www.doutula.com/search', {'keyword': keyword
})

來獲取關鍵詞keyword的搜尋結果頁面。

本例中我使用xpath來選擇元素,其具體教程你可以檢視這裡。如果你想使用BeautifulSoup,可以檢視這裡

html = etree.HTML(res.text)
url = 'http:' + random.choice(html.xpath('//div[@class="image-container"][1]//img[contains(@class, "img-responsive")]/@data-original'))

其中//div[@class="image-container"][1]選擇了頁面中的第一個image-container元素,如果你觀察鬥圖啦搜尋介面,你會發現它分為上下兩部分:上面是表情的搜尋結果,下半部分則是文章的搜尋結果,這樣我們就僅挑選了上半部分的表情搜尋結果。而//img[contains(@class, "img-responsive")]/@data-original'部分則選擇了所有class裡包含img-responsive的img元素,也就是我們要的圖片本身,仔細觀察元素本身你會發現圖片連結就在其中的data-original屬性下(但是需要加上http協議)。

Chrome的審查元素功能可以幫助你快速判斷自己編寫的xpath能否準確選出你想要的元素,也能夠檢視元素本身。

儲存圖片

因為wxpy自動將gif檔案判斷作為表情傳送,我們可以利用這一點把表情作為表情(而非圖片)傳送到聊天中。

首先我們使用了臨時檔案:

from tempfile import NamedTemporaryFile

通過request獲取圖片資訊,然後寫入到一個臨時檔案中。

res = requests.get(url, allow_redirects=False)
tmp = NamedTemporaryFile()
tmp.write(res.content
) tmp.flush()

上傳圖片並作為表情傳送

wxpy提供了上傳檔案的通道,而上傳後的檔案就可以免去重新上傳直接傳送。

media_id = bot.upload_file(tmp.name)
tmp.close()
msg.reply_image('.gif', media_id=media_id)

在這裡,用我們前文提到的方法,使用.gif來進行表情的傳送。

如果你想直接傳送圖片,可以簡單地講.gif引數去除:

msg.reply_image('', media_id=media_id)

wxpy的作者表示將在之後的版本中更新圖片傳送的介面以將圖片傳送和表情傳送分開,我相信這一設計會是更加優秀的。