公众号平台配置
微信公众号官方平台 https://mp.weixin.qq.com
—设置IP白名单
—服务器配置
—获取AppID和AppSecret
—测试是否可获取access_token
1.get_access_token.py脚本
import requests
res=requests.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=填写AppID&secret=填写AppSecret")
print res.text
2.在服务器命令行执行该脚本
python get_access_token.py
3.access_token返回结果
{"access_token":"ACCESS_TOKEN","expires_in":7200}
- 得到返回结果说明服务器和微信服务器通信正常
服务器端部署
环境准备
1.安装python3.7
将install_python.sh脚本文件保存在服务器端然后执行该文件
#!/bin/bash
#-*- coding:utf-8 -*-
#安装c编译器
yum install gcc
#安装依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
#下载Python-3.7.0.tgz
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
#解压Python-3.7.0.tgz
tar -zxvf Python-3.7.0.tgz
#创建文件夹存放python
mkdir /usr/local/python3
#执行配置文件,编译,编译安装
cd Python-3.7.0
./configure --prefix=/usr/local/python3
make && make install
#建立软连接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
#安装完成提示
echo '[提示] 已安装'
echo '[python版本]'
python -V
echo '----------------'
2.安装werobot依赖包
pip3 install werobot
项目文件
werobot框架开发文档https://werobot.readthedocs.io/zh_CN/latest/start.html
—客服机器人
运行文件robot.py
#-*-encoding:utf-8-*-
import werobot
from werobot.replies import *
import json
import os
import random
robot=werobot.WeRoBot(token='wxgzh') # 微信公众号平台自定义的token
robot.config["APP_ID"] = "wxebfdd936d9598ef9" # 填写AppID
robot.config["APP_SECRET"]="896e570f7b712a6ac44d3554fb633ce0" # 填写App_Secret
#自动创建数据文件
if not os.path.exists('reply.json'):
f = open('reply.json', 'w', encoding='utf-8')
json.dump({'': ''}, fp=f, ensure_ascii=False)
f.close()
@robot.text
def process_words(message):
with open('reply.json','r',encoding='utf-8') as f:
dic_data=json.load(f)
for key in dic_data.keys():
if key in message.content:
return dic_data[key]
else:
other_reply=random.choice(['你说的是什么意思呀!','你慢点说嘛,人家有点听不懂了...'])
return other_reply
if __name__ == '__main__':
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()
关键字定义文件set_key_reply.py
import json
import os
#自动创建数据文件
if not os.path.exists('reply.json'):
f = open('reply.json', 'w', encoding='utf-8')
json.dump({'hello': '你好'}, fp=f, ensure_ascii=False)
f.close()
#查看已定义回复内容
def all_key_reply():
with open('reply.json', 'r', encoding='utf-8') as f:
dic_data=json.load(fp=f)
print("================================")
print("[关键字] [回复内容]")
for k,v in dic_data.items():
if isinstance(v,list):
print(k+"\t\t\t"+"; ".join(v))
elif isinstance(v,str):
print(k+"\t\t\t"+v)
else:
print('存在错误数据!')
print("================================")
#增加自定义回复内容
def add_key_reply(key,reply_content):
if isinstance(key,str) and isinstance(reply_content,str):
with open('reply.json', 'r', encoding='utf-8') as f:
dic_data = json.load(fp=f)
dic_data.setdefault(key,reply_content)
with open('reply.json','w',encoding='utf-8') as f:
json.dump(dic_data,fp=f,ensure_ascii=False)
print('关键字添加成功!')
#删除自定义回复内容
def delete_key_reply(key):
if isinstance(key,str):
try:
with open('reply.json', 'r', encoding='utf-8') as f:
dic_data = json.load(fp=f)
dic_data.pop(key)
with open('reply.json', 'w', encoding='utf-8') as f:
json.dump(dic_data, fp=f, ensure_ascii=False)
print('关键字删除成功!')
except KeyError:
print('删除的关键字不存在!')
#修改自定义回复内容
def change_key_reply(key,new_reply_content):
if isinstance(key,str) and isinstance(new_reply_content,str):
try:
with open('reply.json', 'r', encoding='utf-8') as f:
dic_data = json.load(fp=f)
dic_data[key]=new_reply_content
with open('reply.json', 'w', encoding='utf-8') as f:
json.dump(dic_data, fp=f, ensure_ascii=False)
print('修改成功!')
except KeyError:
print('修改的关键字不存在!')
print('========自定义回复内容管理========')
print('1.查看全部关键字回复内容')
print('2.增加自定义回复内容')
print('3.删除自定义回复内容')
print('4.修改自定义回复内容')
while True:
buttton=input('>>')
if buttton == '1':
all_key_reply()
elif buttton == '2':
key=input('请输入添加的关键字:')
reply_content=input('请输入相应的回复内容:')
add_key_reply(key,reply_content)
elif buttton == '3':
key=input('请输入要删除的关键字:')
delete_key_reply(key)
elif buttton == '4':
key=input('请输入修改的关键字:')
new_reply_content=input('请输入回复的内容:')
change_key_reply(key,new_reply_content)
else:
print('输入有误!')
—美妆公众号机器人
#-*-encoding:utf-8-*-
import werobot
import requests
import datetime
import random
import os
import re
import json
import urllib
import sqlite3
from urllib import request
import urllib3
from aip import *
from werobot.replies import *
import time
#趣玩屋公众号
# robot=werobot.WeRoBot(token='wxgzh')
# robot.config["APP_ID"] = "wxebfdd936d9598ef9"
# robot.config["APP_SECRET"]="896e570f7b712a6ac44d3554fb633ce0"
#超美的说
robot=werobot.WeRoBot(token='wxgzh')
robot.config["APP_ID"] = "wxc8a30722cb6fadeb"
robot.config["APP_SECRET"]="c4502ffdb4270657b1efb719e5e8a592"
BUTTON_iw=False
chat_bot=False
client=robot.client
#被关注后自动回复
@robot.subscribe
def subscribed():
return '终于等到你,还好我没放弃~欢迎来到“超美的说”,我是美貌而不骄傲,疯狂而不单调的可爱酱^∨^希望这个奇妙的号能帮助你成为更好的自己。小提示:可以通过回复"菜单"来查看功能列表哦!😘'
@robot.handler
def hello(message):
return "请回复“菜单”来获取功能菜单!"
#💌 🎈 📰
@robot.filter('菜单')
def menu():
menu = "💄美妆区\n" \
"==================>>>\n" \
"💝 冬日美妆套装\n" \
"👗 个性化推荐\n" \
"\n\n" \
"🎀生活区\n" \
"================>>\n" \
"🎈 校园生活\n" \
"📖 散文杂记\n" \
"📝 书评影评\n" \
"📙 中英互译\n" \
"🖼 图片转文字\n" \
"🔮 星座运势\n" \
"🤖 聊天机器人\n\n" \
"💡服务区\n" \
"==============>\n" \
'<a href="http://jwgl.hxut.edu.cn/xtgl/login_slogin.html">⛵ 华夏学院教学管理平台</a>\n' \
'<a href="http://chaxun.neea.edu.cn/">🔎 四六级查询</a>\n\n' \
"[回复相应的名称进行操作]\n" \
"----------------------------------------------\n" \
'<a href="http://mp.weixin.qq.com/mp/homepage?__biz=MzIxMDkzMjE2Nw==&hid=11&sn=ff430704edc5d2c9f2b34144825c71d3&scene=18#wechat_redirect">专栏目录 </a>' \
'<a href="https://mp.weixin.qq.com/s/sod-7oBGb9CN2QoGYfQTaQ">团队介绍 </a>' \
'<a href="https://mp.weixin.qq.com/s/ivkCMPdN8x2u7WKXvt2D4g">联系我们 </a>'
return menu
@robot.filter('冬日美妆套装')
def tips():
content='冬日美妆套装推荐☃\n' \
'-----------------------------------------\n' \
'🔥<a href="https://item.jd.hk/33441992693.html">Van Cleef & Arpels梵克雅宝男士香水女士香水 梦幻精灵冬日玫瑰雪玫瑰</a>\n\n' \
'🔥<a href="https://item.jd.com/59339410681.html">珍肤美新品面霜凡士林保湿乳冬日补水保湿按压式面霜护肤霜</a>\n\n' \
'🔥<a href="http://item.jd.com/59095030448.html">珍肤美(ZHENFUMEI)面霜凡士林保湿乳冬日补水佳选保湿按压式面霜护肤霜</a>\n\n' \
'🔥<a href="https://item.jd.com/57848127316.html">香奈儿(Chanel)女士口红ROUGE COCO FLASH新款唇膏可可小姐口红丝绒水 丝绒系列</a>\n\n' \
'🔥<a href="https://item.jd.com/40007544452.html">HOLD LIVE迷雾灵眸眼影盘 百搭四色哑光偏光红棕酒红豆沙干玫瑰色 </a>\n'
return content
#获取位置信息
@robot.location
def tips(message):
print(message.label,message.location,message.scale)
return '你发送了位置信息!'
#中英互译
@robot.filter('中英互译')
def tips():
return '请回复"翻译+翻译的内容"来进行翻译!'
@robot.text
def translate(message):
if message.content[0:2]=='翻译':
key=message.content[2:]
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400"}
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
formdata = {
'i':key ,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15524830090893',
'sign': 'd8979fb7afc76769a60f79aaa8144f9b',
'ts': '1552483009089',
'bv': 'b29c6752f164c8fcea4f9be208d13ec3',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
'typoResult': 'false'
}
data = urllib.parse.urlencode(formdata).encode()
req = request.Request(url, data=data, headers=header)
resp = request.urlopen(req).read().decode()
pat = r'"tgt":"(.*?)"'
result = re.findall(pat, resp)
return '【翻译结果】'+result[0]
#图片转文字
def upload_image(message):
now_time=time.localtime()
str_now_time=time.strftime("%Y%m%d_%H%M%S",now_time)
img=requests.get(message.img).content
with open(f'{str_now_time}.jpg','wb') as f:
f.write(img)
f=open(f'{str_now_time}.jpg','rb')
client.upload_permanent_media('image',f)
f.close()
@robot.filter('图片转文字')
def tips():
global BUTTON_iw
BUTTON_iw=True
return '请发送需要转换成文字的图片!'
@robot.image
def image_to_word(message):
global BUTTON_iw
if BUTTON_iw==True:
upload_image(message)
line='=======图片转换结果========\n'
cilent = AipOcr(appId="16678637", secretKey="4E4kUEyQvqnRqWTccPfjFWDspuXIyrga", apiKey="2UsI44XqxiquPPjxtHENUPgk")
with open('image_cache.jpg', "rb") as f:
image = f.read()
data=cilent.basicAccurate(image)
for i in range(len(data['words_result'])):
line += data['words_result'][i]['words']+'\n'
BUTTON_iw=False
return line
#星座运势
@robot.text
def tips(message):
if message.content=='星座运势':
return '请回复"星座名"来获取星座运势'
@robot.text
def constellation(message):
xz=message.content
if xz[-1]=='座':
return today_xzys(xz)
def today_xzys(xz):
if xz in('白羊座','白羊'):
req_var = 'aries'
elif xz in('金牛座','金牛'):
req_var = 'taurus'
elif xz in('双子座','双子'):
req_var = 'gemini'
elif xz in('巨蟹座','巨蟹'):
req_var = 'cancer'
elif xz in('狮子座','狮子'):
req_var = 'leo'
elif xz in('处女座','处女'):
req_var = 'virgo'
elif xz in('天秤座','天秤'):
req_var = 'libra'
elif xz in('天蝎座','天蝎'):
req_var = 'scorpio'
elif xz in('射手座','射手'):
req_var = 'sagittarius'
elif xz in('摩羯座','摩羯'):
req_var = 'capricorn'
elif xz in('水瓶座','水瓶'):
req_var = 'aquarius'
elif xz in('双鱼座','双鱼'):
req_var = 'pisces'
else:
return '不存在这个星座哦!\n请发送星座名来获取星座今日运势,例如“摩羯座”或“摩羯”'
ui = " {} 📅 {}\n" \
"——————————————————\n" \
"🎈 综合运势:{}\n" \
"💖 爱情运势:{}\n" \
"🎓 事业学业:{}\n" \
"💰 财富运势:{}\n" \
"🍀 健康指数:{}\n" \
"🤝 商谈指数:{}\n" \
"🌈 幸运颜色:{}\n" \
"✍ 幸运数字:{}\n" \
"✡ 速配星座:{}\n" \
"[爱情运势] {}\n" \
"[事业学业] {}\n" \
"[财富运势] {}\n" \
"[健康运势] {}\n" \
"🔮 短评:{}"
get_url = 'http://www.xzw.com/fortune/{}/'.format(req_var)
res = requests.get(get_url)
if res.status_code == 200:
html = res.text
xzname = re.findall('<h4>(.*?)今日运势<small>', html)[0]
c_date = re.findall('今日运势<small>(.*?)</small>', html)[0]
zh_fortune = re.findall('综合运势:</label><span class="star_m star_blue"><em style=" width:(.*?)px;">', html)[0]
aq_fortune = re.findall('爱情运势:</label><span class="star_m star_blue"><em style=" width:(.*?)px;">', html)[0]
sy_fortune = re.findall('事业学业:</label><span class="star_m star_blue"><em style=" width:(.*?)px;">', html)[0]
cf_fortune = re.findall('财富运势:</label><span class="star_m star_blue"><em style=" width:(.*?)px;">', html)[0]
jk_percent = re.findall('健康指数:</label>(.*?)</li>', html)[0]
st_percent = re.findall('商谈指数:</label>(.*?)</li>', html)[0]
xy_color = re.findall('幸运颜色:</label>(.*?)</li>', html)[0]
xy_sum = re.findall('幸运数字:</label>(.*?)</li>', html)[0]
sp_xingzuo = re.findall('速配星座:</label>(.*?)</li>', html)[0]
aq_fortune_word=re.findall('爱情运势</strong><span>(.*?)</span>',html)[0]
sy_fortune_word=re.findall('事业学业</strong><span>(.*?)</span>',html)[0]
cf_fortune_word=re.findall('财富运势</strong><span>(.*?)</span>',html)[0]
jk_fortune_word=re.findall('健康运势</strong><span>(.*?)</span>',html)[0]
zh_assess = re.findall('综合运势</strong><span>(.*?)</span>', html)[0]
result = ui.format(xzname, c_date, (int(zh_fortune) // 16) * '⭐', (int(aq_fortune) // 16) * '⭐',
(int(sy_fortune) // 16) * '⭐', (int(cf_fortune) // 16) * '⭐', jk_percent, st_percent,
xy_color, xy_sum, sp_xingzuo,aq_fortune_word,sy_fortune_word,cf_fortune_word,jk_fortune_word, zh_assess)
return result
else:
return '服务器发生了错误...'
#个性化推荐
@robot.text
def tips(message):
if message.content=='个性化推荐':
return '请发送一张您的自拍照,要求:\n1.像素清晰\n2.露出全脸\n3.没有化妆'
@robot.image
def zdy(message):
upload_image(message)
time.sleep(2)
return '【根据图片为您私人定制化的美妆套装如下】:\n' \
'1.<a href="https://item.jd.com/1097069.html">珀莱雅化妆品护肤品套装 水漾肌密补水五件套(洗面奶+爽肤水+乳液+精华+面膜/面霜)</a>\n' \
'2.<a href="https://item.jd.com/1097069.html">兰蔻(LANCOME)小黑瓶护肤系列 五件套装(日晚霜+精华+眼膜霜+大眼精华)送礼盒</a>\n' \
'3.<a href="https://item.jd.com/1097069.html">自然堂弹嫩套装官方旗舰店正品紧致抗皱滋养护肤组合化妆品礼盒补水保湿 五件套(洁颜霜+气色液+乳液+V脸精华+抗皱眼霜)</a>\n'
#机器人陪聊
@robot.filter('聊天机器人')
def tips1():
return '请回复"聊天"来开启机器人陪聊,若想关闭机器人请回复"不聊了"'
@robot.text
def tips2(message):
global chat_bot
if message.content=='聊天':
chat_bot=True
return '我终于可以说话啦!'
elif message.content=='不聊了':
chat_bot=False
return '记得下次找我聊天哟!'
@robot.text
def robot_reply(message):
if chat_bot==True:
now_time = time.localtime()
str_now_time = time.strftime("%Y-%m-%d %H:%M:%S", now_time)
res=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(message.content)))
reply_words=re.findall('"content":"(.*?)"',res.text)[0]
with open("chat_record.txt","a+",encoding="utf-8") as f:
f.write(f"[时间]:{str_now_time} [消息]:{message.content} [机器人回复]:{reply_words}\n")
print(f"[时间]:{str_now_time} [消息]:{message.content} [机器人回复]:{reply_words}")
return reply_words
#自定义关键字回复
#自动创建数据文件
if not os.path.exists('reply.json'):
f = open('reply.json', 'w', encoding='utf-8')
json.dump({'': ''}, fp=f, ensure_ascii=False)
f.close()
@robot.text
def process_words(message):
with open('reply.json','r',encoding='utf-8') as f:
dic_data=json.load(f)
for key in dic_data.keys():
if key in message.content:
return dic_data[key]
# else:
# other_reply=random.choice(['你说的是什么意思呀!','你慢点说嘛,人家有点听不懂了...'])
# return other_reply
#发送公众号二维码
@robot.filter('二维码')
def send_image(message):
reply=ImageReply(message=message,media_id='1C9xnwRkSQ8Fw7FXIdMqafKDL9bBbWG4F6JlTofFshY')
return reply
#联系我们
@robot.filter('联系我们')
def about_us(message):
reply = ArticlesReply(message=message)
article = Article(
title="联系我们",
description="点击查看更多详情",
img="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574068345406&di=7fbd885a7b77ccf3586d394e1c5d039b&imgtype=0&src=http%3A%2F%2Fdpic.tiankong.com%2Fwl%2F0a%2FQJ8918221404.jpg",
url="https://mp.weixin.qq.com/s/ivkCMPdN8x2u7WKXvt2D4g"
)
reply.add_article(article)
return reply
#团队介绍
@robot.filter('团队介绍')
def about_us(message):
reply = ArticlesReply(message=message)
article = Article(
title="团队介绍",
description="点击查看更多详情",
img="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574663199&di=7eee59d92f0f2366cb01a537f6087104&imgtype=jpg&er=1&src=http%3A%2F%2Fku.90sjimg.com%2Felement_origin_min_pic%2F18%2F03%2F11%2F497947e187c85b4f9c3e78fb012d467a.jpg%21%2Ffwfh%2F804x740%2Fquality%2F90%2Funsharp%2Ftrue%2Fcompress%2Ftrue",
url="https://mp.weixin.qq.com/s/sod-7oBGb9CN2QoGYfQTaQ"
)
reply.add_article(article)
return reply
#获取媒体文件ID
@robot.text
def get_media(message):
if message.content[2:4]=='素材':
# start = int(re.findall('(.*?)to', message.content)[0])
# count = int(re.findall('素材.*?to(.*?)', message.content)[0])
if message.content[0:4]=='图片素材':
dic_data=client.get_media_list('image', 1, 5)
result=""
for i in range(len(dic_data['item'])):
result=result+'【素材名】'+dic_data['item'][i]['name']+'\n'+'【上传时间】'+datetime.datetime.fromtimestamp(dic_data['item'][i]['update_time']).strftime("%y-%m-%d %H-%M-%S")+'\n'+'【素材ID】'+dic_data['item'][i]['media_id']+'\n------------------------------------------\n'
return result
elif message.content[0:4]=='视频素材':
dic_data=client.get_media_list('video',1, 2)
result=""
for i in range(len(dic_data['item'])):
result=result+'【素材名】'+dic_data['item'][i]['name']+'\n'+'【上传时间】'+datetime.datetime.fromtimestamp(dic_data['item'][i]['update_time']).strftime("%y-%m-%d %H-%M-%S")+'\n'+'【素材ID】'+dic_data['item'][i]['media_id']+'\n------------------------------------------\n'
return result
elif message.content[0:4]=='声音素材':
dic_data=client.get_media_list('voice',1, 5)
result=""
for i in range(len(dic_data['item'])):
result=result+'【素材名】'+dic_data['item'][i]['name']+'\n'+'【上传时间】'+datetime.datetime.fromtimestamp(dic_data['item'][i]['update_time']).strftime("%y-%m-%d %H-%M-%S")+'\n'+'【素材ID】'+dic_data['item'][i]['media_id']+'\n------------------------------------------\n'
return result
if __name__ == '__main__':
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()