前一段时间不知道为什么(闲的没事干)搞了一个微信公众号,之前好像搞过一个公众号,但因为长时间不发任何消息被腾讯给销号了,之前的微信公众号都有留言功能,现在新开的都没有了,感觉亏了一个亿……

注册公众号的时候想用dogcraft这个名称作为微信公众号的微信号,但是腾讯说这个名称被占用了……被谁占用了?原来是被我自己占用了…… 原来微信公众号的微信号和普通用户的公众号是不能重复的……

安排微信公众号的开发框架有很多,但目前自己最熟悉的就是python,最后就选择了python语言的werobot搞一下了。

首先阅读了werobot的文档第一眼看上去内容十分丰富,然而又看了一下微信的API接口权限,基本上全是未获得,需要微信认证才能用……微信认证又不对个人开放……没办法了,只能针对现有的功能整了一个简单的机器人。目前实现了主要有三个功能,名称存储与修改、jrrp复刻和返回随机图片这三个功能(还有一个就是累计关注人数统计与最初关注时间记录)。这三个功能都依赖数据库的支撑,对与数据库,我就会一种redis而且在服务器上有现成安排好的已经再用的redis,于是就直接安排了。

未获得
未获得

werobot框架的基本使用方式

werbot的hello world


import werobot

robot = werobot.WeRoBot(token='tokenhere')

@robot.handler
def hello(message):
    return 'Hello World!'

# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()

成功运行之后,在公众号管理后台设置好回调地址以及token就行了,无论发送什么信息,都会回复Hello World!

注意:一定要在werobot启动之后再到公众号后台设置回调地址,否则会报错,导致回调地址无法设置。

名称管理

第一个实现的功能是名称管理,即可以记录用户的自定义昵称并在返回给用户的文字消息的第一行显示出来。

这个功能实现的基础是微信公众号的openID功能,腾讯的文档是这样说的

openID是加密后的微信号,每个用户对每个公众号的OpenID是唯一的

每一个关注公众号的用户都会用一个OpenID,这个OpenID自然可以作为后台数据库中记录不同用户数据的索引。

OpenID与用户名的对应关系可以用redis里的hash数据结构来存储,其中OpenID作为键,用户的名称作为值。


def Get_dname(did):
#获得OpenID对应的用户名,如果不存在则返回OpenID的后五位作为默认名称
    if (r.hexists("dogname",did)):
        return r.hget("dogname",did)
    else:
        return did[::-1][0:5]


def Dog_set_name(Dog_id,dname):
#设置名称,新建与修改对redis来说命令都是一样的,根据旧值是否存在返回不同值用以组织不同的文字描述。
    if (r.hexists("dogname",Dog_id)):
        r.hset("dogname",Dog_id,dname)
        return True
    else:
        r.hset("dogname",Dog_id,dname)
        return False

通过添加文字过滤器的方式获取用户发送的文字信息,在处理用户输入前先行获取用户基本信息,使用split对用户的输入进行分割,判断名称后面有没有跟着其他字符来区分改名指令与查询现行名称。

为防止用户进行超量输入或者向数据库里面塞一些奇奇怪怪的东西,对用户所输入的用户名的长度进行限制。


@robot.text
def hello(message):
    dog_wang=message.content
    dog_id=message.source
    dog_name=Get_dname(dog_id)
    dog_wang_sp=str(dog_wang).split()
    if (dog_wang_sp[0]=='.name'):
        if len(dog_wang_sp)>=2:
            new_dog_name=dog_wang_sp[1]
            Dog_set_name(dog_id,new_dog_name[0:15])
            res_dog="[{}]成功改为{}".format(dog_name,new_dog_name[0:15])
            pass
        else:
            res_dog="现在的昵称为:{}".format(dog_name)
        return res_dog

jrrp功能复刻

jrrp功能十分简单,生成一个0-100的随机整数就完了,重点在于每天生成一个而且在北京时间0点进行刷新,一种思路就是在0点是给所有的用户生成一个随机数,然后存在数据库了,这样的缺点很大,如果用户今天不来查看jrrp那生成的随机数不就浪费了?而且用户很多集中生成会造成服务器负荷过大。现在有了redis,可以利用redis的超时过期时间功能来解决。仅在用户当日第一次查询的时候生成随机数,然后存在一个过期时间在晚上12点的键值对里,如果用户当日再次查询jrrp,直接返回上次的随机数就好了。不同用户设置不同的键值对可以针对不同用户或情景设置不同的过期时间,所用的jrrp随机数据安排到一个固定过期时间的hash里显得有些死板与不灵活……


def Get_dog_jrrp(dogid):
    p_dogid='jrrp_'+dogid
    dog_rp=r.get(p_dogid)#如果数据库里面有就直接返回
    if dog_rp==None:
        dog_new_rp=random.randint(0,100)
        dog_rp_time=time.localtime()#计算过期时间
        dog_hour=23-int(dog_rp_time.tm_hour)
        dog_min=60-int(dog_rp_time.tm_min)
        dog_ex=(dog_hour*60+dog_min)*60
        r.set(p_dogid,dog_new_rp,ex=dog_ex)
        dog_rp=dog_new_rp
    dog_res='{}/100'.format(int(dog_rp))
    return dog_res

处理jrrp命令与处理name一样

@robot.text
def hello(message):
    dog_wang=message.content
    dog_id=message.source
    dog_name=Get_dname(dog_id)
    dog_wang_sp=str(dog_wang).split()
    if (dog_wang_sp[0]=='.jrrp'):
        dog_jrrp=Get_dog_jrrp(dog_id)
        re_dog='[{}]\n'.format(dog_name)+dog_jrrp
        return re_dog

今天先写到这了……

最后放一下二维码,公众号里没发什么新东西,都是网站上的存货

二维码
二维码