最近接了个小需求,有点意思,写个博客~
需求内容:我们有一个游戏抖音号,需要对发私信给我们的用户自动回复一个激活码字符串
功能很简单,但是面对抖音这个第三接口文档写的一坨翔且找不到技术客服的大公司,还是死了不少脑细胞。
(备注:没有后端开发经验的朋友,这篇文章可以略过了,因为需要自己写监听接口以及部署和配置nginx)
~
~
闲话不多说了,先讲流程:
首先,这个功能只支持验证过的企业抖音号,so~ 个人抖音号就不要想了,
另外你最好有一个云服务器和一个可以用的域名以及https证书。
以上东西准备好,先登录抖音开放平台:抖音开放平台地址
然后创建个账号或者用抖音号去登录。
然后点击管理中心,去创建一个应用:
内容随便填吧,审核还是比较宽松的,但是务必填写真实有效。
###
创建完之后,预计1-3个工作日审核,审核通过后你就能看到你的应用了。
###
点击详情,进入查看,以下是我的应用详情:
注意互动管理中的获取并管理评论和私信,这个权限状态是已通过,没通过的要申请下等带审核。
###
然后你要做的就是根据client_key和client_secret获取open_id和access_token。
https://open.douyin.com/platform/oauth/connect?client_key=aw7k41dqsr8udns2&response_type=code&scope=video.comment,im,aweme.share,user_info,video.create,video.delete,video.data,video.list,enterprise.im,enterprise.data&redirect_uri=http://baidu.com&state=aHR0cDovL3oxLWNvbnNvbGU2LWxsQmxhY23t=
把上面这个链接内容改一下,第一个client_key换成你的应用,redirect_url改成你创建应用时的那个(一定要是可以访问的域名),可以在基础信息里面看授权域回调,state我们这随便填个长点字符串就好了,具体功能见抖音开发文档。
链接修改完后复制到浏览器打开(出于保密,我的url里信息都是虚拟的,你们不要尝试)
打开后是一个二维码页面:
###
用你的企业抖音号扫码授权,授权成功会重定向到一个新的页面,千万不要关闭!!!这个页面的url会附带上一个code参数,记得复制保存,后面用的上。
###
接下来我们拿着这个code值去获取open_id和access_token。
代码直接给你贴上,把三个参数替换成你应用的值:
import requests
client_key = 'awkjaslkdjv7dns2'
client_secret = 'oiahsdoihi32j0jdo2jd23jjd02'
code = 'askjdhioh23oijisdfkjasd'
headers = {"Content-Type": "application/json",
"Accept": "application/json", }
# 获取access_token
def get_access_token():
data = {"client_key": client_key, # 应用唯一标识
"client_secret": client_secret, # 应用唯一标识对应的密钥
"code": code, # 扫码后获取的授权码
"grant_type": "authorization_code", # 默认"authorization_code"即可
}
url = "https://open.douyin.com/oauth/access_token/"
res = requests.get(url=url, headers=headers, params=data)
print(res.json())
if __name__ == '__main__':
get_access_token()
返回值案例:
{"data":{"access_token":"act.11913a0bf8c24c154544887291833618d0sZuFLjrTfdzWFKdQ0wRv85xG6YEX","captcha":"","desc_url":"","description":"","error_code":0,"expires_in":1296000,"open_id":"b715c9c8-2897-4788-8591-72fb598f0195","refresh_expires_in":2592000,"refresh_token":"rft.64e06c379c3f5bad3e42f918ced40671MiV8ZKf60HzuvjjiQfsyJbktfOZ3","scope":"video.comment,im,aweme.share,user_info,video.create,video.delete,video.data,video.list,enterprise.im,enterprise.data"},"message":"success"}
取出access_token和open_id的值,复制 留有大用!
###
接下来返回抖音开放平台,从管理中心进入应用的详情。
监听接口配置好(接口代码待会附上),验证通过后,Webhooks里的订阅时间全部拉满就行了
关于这个监听接口,我简单说下:
抖音开放平台第一次会给你这个监听url发送一个post请求来验证是否可用,然后验证通过后才算配置完成。
开放平台发送的验证请求示例(具体去抖音开放文档看):
{
"event": "verify_webhook",
"client_key": "",
"content": {
"challenge": 12345
}
}
当你收到开放平台 POST 验证请求时,你需要解析出 challenge 值,并立即返回该 challenge 值作为响应。
{
"challenge": 12345
}
我这边监听接口的代码如下:(接口服务部署以及nginx配置域名你们自己去百度吧)
from flask import Flask, request
app = Flask(__name__)
# 处理中文编码
app.config['JSON_AS_ASCII'] = False
# 跨域支持
def after_request(resp):
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
app.after_request(after_request)
# 抖音监听接口
@app.route("/ceshi", methods=["GET", "POST"])
def getMsg_ceshi():
try:
if request.method == "POST":
json_data = request.get_json()
event = json_data.get("event")
# 验证
if event == "verify_webhook":
CHALLENGE = json_data.get("content").get("challenge")
return {"challenge": CHALLENGE}
# 接收私信
elif event == "receive_msg":
from_user_id = json_data.get("from_user_id")
to_user_id = json_data.get("to_user_id")
client_key = json_data.get("client_key")
message_type = json_data.get("content").get("message_type")
message_info = json_data.get("content").get("text")
try:
# 将用户消息存入数据库(我就省略不写了)
pass
except BaseException as e:
print("插入失败:", e)
else:
return {"respCode": '204', "data": "", "message": "未知事件类型,暂不处理"}
else:
return {"respCode": '203', "data": "", "message": "不支持get请求"}
except:
return {"respCode": '503', "data": "", "message": "处理失败"}
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8008, debug=True)
关于这个接口的功能我简单说下,
当你在Webhooks配置监听url时,他会发送一个验证请求,所以event=='verify_webhook'代表在响应这个验证。
验证通过后,你就能收到别人给你的企业抖音号发送私信了,此时event=='receive_msg',这个时候你要做的就是把内容存到mysql数据库,以便后面使用。
然后,接下来的事就简单了,去数据实时读取这些私信然后一一回复,
回复功能的代码我也贴出来:
import requests
import json
open_id = "0f8a8952-4f85-46ba-9b1c-ff3bbfd23a31"
access_token = "act.298f6a0edb2b95a8ee1d0d123scd4b0fVRCiHmYgEIt2i3yYGr7GuTZ0XGKp"
headers = {"Content-Type": "application/json",
"Accept": "application/json", }
# 发送私信给用户
def seed_message_info(to_user_id):
params = {"open_id": open_id,
"access_token": access_token,
}
data = {"to_user_id": to_user_id, # 用户唯一标识,用户发私信给你,你的接听接口会收到这个值
"message_type": "text", # 默认文本类型
"persona_id": "", # 客服id,传则走客服会话,否则为普通会话
"content": '{"text":"哎呀,卧槽"}',
"client_msg_id": ""
}
url = "https://open.douyin.com/enterprise/im/message/send/"
res = requests.post(url=url, headers=headers, params=params, data=json.dumps(data))
print(res.text)
if __name__ == '__main__':
seed_message_info("223cacdd-4afd-40ac-9cfa-b1c94b158834")
哎呀,腰身背疼,剩下的自己悟吧,不写了