公眾號(hào)的開(kāi)發(fā)說(shuō)難也不難,說(shuō)簡(jiǎn)單也不簡(jiǎn)單,但總體開(kāi)發(fā)成本:公眾號(hào)
< 小程序
< App
砸捏,屬于相對(duì)最容易也最快獲得回報(bào)的開(kāi)發(fā)方式了谬运。
這里介紹一種最快的方式,基于現(xiàn)有的框架快速實(shí)現(xiàn)公眾號(hào)后臺(tái)開(kāi)發(fā)垦藏,當(dāng)然前提是你已經(jīng)有了Python梆暖,Linux,Docker等基本功掂骏。
大致步驟
- 部署基于WeRobot的后端程序
- 公眾號(hào)后臺(tái)配置URL轰驳,Token等驗(yàn)證信息
所以流程并不復(fù)雜,注意上述的順序弟灼,一定要先部署级解,再配置公眾號(hào),因?yàn)楣娞?hào)后臺(tái)要驗(yàn)證Token信息(自定義的田绑,和你的服務(wù)器一致即可)
測(cè)試微信API的時(shí)候勤哗,由于驗(yàn)證都是在云端的,這非常不方便掩驱,有兩種方式可以解決:
- Frp內(nèi)網(wǎng)穿透
- 寶塔面板部署芒划,對(duì)于小白這個(gè)會(huì)更方便一些
- Docker部署
作者本人是用Docker Compose編排部署的,同樣比較快捷方便欧穴,不過(guò)不斷上傳重啟容器也非常耗時(shí)腊状,可以利用vscode的遠(yuǎn)程連接直接在云端編寫代碼并重啟容器。
如何重啟Docker Compose中的某一個(gè)容器呢苔可?
執(zhí)行docker-compose restart <service-name>
命令
sudo docker compose restart werobot
基于WeRoBot開(kāi)發(fā)微信后端
pip install werobot
建立一個(gè)main.py
import werobot
robot = werobot.WeRoBot(token='alien_wx_token')
@robot.text
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
robot.run(host="0.0.0.0", port=8080)
大功告成缴挖,一個(gè)最簡(jiǎn)單的微信公眾號(hào)后臺(tái)開(kāi)發(fā)就完成了。
當(dāng)用戶給你的公眾號(hào)發(fā)送任何消息的時(shí)候焚辅,你的公眾號(hào)都會(huì)發(fā)送Hello World
文案映屋。
當(dāng)然了,如果你的公眾號(hào)只能回復(fù)Hello World同蜻,那肯定會(huì)被粉絲罵"神經(jīng)病啊"棚点,對(duì)不對(duì),我們真正想要的是一個(gè)具有交互能力的湾蔓,甚至是文字版的App瘫析,基于微信生態(tài)強(qiáng)大的API,實(shí)現(xiàn)這些并不是問(wèn)題默责。
不過(guò)在開(kāi)發(fā)過(guò)程中贬循,直接在線上環(huán)境調(diào)試是不太好的,因?yàn)橐恍┱{(diào)試上的BUG很容易被微信誤以為是攻擊桃序,倒霉一點(diǎn)就會(huì)被限制接口調(diào)用杖虾。
筆者本人在使用某位朋友的支付寶支付調(diào)試的時(shí)候,因?yàn)榫€上頻繁調(diào)試BUG媒熊,就不幸讓其支付寶商戶平臺(tái)停止運(yùn)營(yíng)了3天才恢復(fù)奇适!
所以坟比,一定要使用公眾平臺(tái)測(cè)試賬號(hào)配合微信開(kāi)發(fā)者工具來(lái)開(kāi)發(fā)公眾號(hào)相關(guān)的功能。
開(kāi)發(fā)者工具
微信給我們提供了現(xiàn)有的測(cè)試賬號(hào)嚷往,且測(cè)試賬號(hào)是擁有公眾號(hào)開(kāi)發(fā)的所有權(quán)限的葛账,用它!
測(cè)試賬號(hào)的權(quán)限非常多,因?yàn)閭€(gè)人的【訂閱號(hào)】權(quán)限相對(duì)較少皮仁,面對(duì)企業(yè)的【服務(wù)號(hào)】權(quán)限與沙箱差不多是一致的注竿。
重點(diǎn)關(guān)注圖中重要的信息,URL填寫你的服務(wù)器地址魂贬,Token填寫你的服務(wù)器設(shè)置的Token巩割,這個(gè)值在兩端保存一致即可。
繼續(xù)編寫服務(wù)端代碼
創(chuàng)建菜單
client = robot.client
client.create_menu({
"button": [
{
"type": "click",
"name": "今日推薦",
"key": "KEY_TODAY_RECOMMEND"
},
{
"type": "click",
"name": "作者簡(jiǎn)介",
"key": "KEY_ABOUT_ME"
},
{
"name": "菜單",
"sub_button": [
{
"type": "view",
"name": "搜索",
"url": "http://www.soso.com/"
},
{
"type": "view",
"name": "視頻",
"url": "http://v.qq.com/"
},
{
"type": "click",
"name": "贊一下我們",
"key": "KEY_GOOD"
}
]
}
]
})
設(shè)置菜單的點(diǎn)擊事件:
@robot.key_click("KEY_TODAY_RECOMMEND")
def rec(message):
return '你點(diǎn)擊了“今日推薦”按鈕'
注意:個(gè)人賬號(hào)沒(méi)有自定義菜單權(quán)限付燥,需要使用測(cè)試號(hào)或者企業(yè)號(hào)宣谈,否則報(bào)錯(cuò):
48001: api unauthorized rid
根據(jù)用戶輸入回復(fù)對(duì)應(yīng)內(nèi)容
@robot.filter("講一個(gè)笑話")
def joke(message):
# reply = TextReply(message=message, content="笑不活了")
# data = ApiUtils.joke_data()
return "讓我給你講一個(gè)笑話,這簡(jiǎn)直就是一個(gè)天大的笑話键科!"
發(fā)送圖文鏈接
@robot.filter("2")
def blog(message):
reply = ArticlesReply(message=message)
article = Article(
title="我的博客",
description="我的個(gè)人博客",
img="https://12345.com/0.png",
url="https://www.12345.com/u/79a88a044955"
)
reply.add_article(article)
return reply
發(fā)送圖片
@robot.filter("3")
def send_image(message):
media_id = "這里是你上傳圖片到微信后臺(tái)生成的media_id"
# 返回圖片
if media_id:
reply = ImageReply(message=message, media_id=media_id)
return reply
else:
return "圖片不存在闻丑!"
上傳臨時(shí)圖片
res = client.upload_media("image", open("qrcode.jpg", "rb"))
上傳永久多媒體文件。
media_json = client.upload_permanent_media("image", open("qrcode.jpg", "rb"))
被關(guān)注時(shí)候回復(fù)用戶消息
# 被關(guān)注
@robot.subscribe
def subscribe(message):
return "謝謝您的關(guān)注勋颖!"
處理默認(rèn)消息
如果上面沒(méi)有可以處理的消息嗦嗡,那么最底部的handler將被觸發(fā):
@robot.text
def handle_other(message):
if message.content == "消息1":
return f'執(zhí)行:{message.content}'
if message.content == "消息2":
return f'執(zhí)行:{message.content}'
else:
return "謝謝你的關(guān)注!"
主要的就是這些了饭玲,當(dāng)然還有一些API侥祭,比如授權(quán),支付等等茄厘,這些功能用小程序?qū)崿F(xiàn)會(huì)更好矮冬,有時(shí)間再寫小程序相關(guān)的開(kāi)發(fā)。實(shí)在太忙了次哈,公眾號(hào)以及其他平臺(tái)都斷更將近一年胎署,謝謝你們的支持!