使用python语言和flask框架给微信公众号返回图片消息
首先,需要在微信公众平台中开发者中心的“基本配置”中设置服务器配置,填写服务器地址、Token等信息,并将Token和服务器地址保存在代码中,如下所示:
import hashlib
from flask import Flask, request, make_response
app = Flask(__name__)
# 设置Token和服务器地址
TOKEN = 'your_token'
SERVER_URL = 'http://your_server_url/'
@app.route('/', methods=['GET', 'POST'])
def wechat_auth():
if request.method == 'GET':
# 验证服务器地址的有效性
signature = request.args.get('signature')
timestamp = request.args.get('timestamp')
nonce = request.args.get('nonce')
echostr = request.args.get('echostr')
token = TOKEN
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
if hashcode == signature:
return echostr
else:
return ''
else:
# 处理用户发送的消息
xml_recv = request.stream.read()
msg = xmltodict.parse(xml_recv)['xml']
# TODO: 处理消息
return ''
然后,在处理用户发送的消息时,如果用户发送了图片消息,可以通过微信公众平台提供的素材管理接口,获取图片素材,并将其返回给用户。具体步骤如下:
- 在公众平台中获取access_token,用于调用素材管理接口。
import requests
# 获取access_token
def get_access_token():
url = 'https://api.weixin.qq.com/cgi-bin/token'
params = {
'grant_type': 'client_credential',
'appid': 'your_appid',
'secret': 'your_secret'
}
response = requests.get(url, params=params)
access_token = response.json().get('access_token')
return access_token
- 调用素材管理接口,获取用户发送的图片素材。
import json
# 获取图片素材
def get_image_media(media_id):
access_token = get_access_token()
url = 'https://api.weixin.qq.com/cgi-bin/media/get'
params = {
'access_token': access_token,
'media_id': media_id
}
response = requests.get(url, params=params)
return response.content
- 将获取到的图片素材返回给用户。
# 处理消息
if msg['MsgType'] == 'image':
media_id = msg['MediaId']
image_data = get_image_media(media_id)
response = make_response(image_data)
response.headers['Content-Type'] = 'image/jpeg'
return response
完整代码如下:
import hashlib
import requests
import xmltodict
from flask import Flask, request, make_response
app = Flask(__name__)
# 设置Token和服务器地址
TOKEN = 'your_token'
SERVER_URL = 'http://your_server_url/'
# 获取access_token
def get_access_token():
url = 'https://api.weixin.qq.com/cgi-bin/token'
params = {
'grant_type': 'client_credential',
'appid': 'your_appid',
'secret': 'your_secret'
}
response = requests.get(url, params=params)
access_token = response.json().get('access_token')
return access_token
# 获取图片素材
def get_image_media(media_id):
access_token = get_access_token()
url = 'https://api.weixin.qq.com/cgi-bin/media/get'
params = {
'access_token': access_token,
'media_id': media_id
}
response = requests.get(url, params=params)
return response.content
@app.route('/', methods=['GET', 'POST'])
def wechat_auth():
if request.method == 'GET':
# 验证服务器地址的有效性
signature = request.args.get('signature')
timestamp = request.args.get('timestamp')
nonce = request.args.get('nonce')
echostr = request.args.get('echostr')
token = TOKEN
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
if hashcode == signature:
return echostr
else:
return ''
else:
# 处理用户发送的消息
xml_recv = request.stream.read()
msg = xmltodict.parse(xml_recv)['xml']
if msg['MsgType'] == 'image':
media_id = msg['MediaId']
image_data = get_image_media(media_id)
response = make_response(image_data)
response.headers['Content-Type'] = 'image/jpeg'
return response
else:
return ''
if __name__ == '__main__':
app.run()
原文地址: https://www.cveoy.top/t/topic/zG8 著作权归作者所有。请勿转载和采集!