Hi!
Long time no see,guys!
公众号已经由原来的计算机天堂改名为码农小猪,今后公众号内会写一些我自己的编程经验,与大家共同学习,共同进步!
最近在写一个自己的API,准备把一些小功能结合起来,成为一个小工具,API网站等基本功能写完后会分享出来
回到正题,有天我在 surf the internet 时,发现了QQ的一个接口,GET请求就会返回QQ的信息,但是并不是json格式的数据不能直接引用,所以就产生了写一个API接口的想法,下面开工
接口如下
https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?g_tk=1518561325&uins=后面跟QQ号
返回的结果是(这里用我马哥QQ10001做为示范)
portraitCallBack({"10001":["http://qlogo2.store.qq.com/qzone/10001/10001/100",25349,-1,9,0,1,"pony",0]})
这里用的是Python的一个轻量级的WEB框架:Flask,百度大把说明,就不做介绍了
先写出整体框架
# -*- coding: utf-8 -*-import requests,refrom flask import Flask,requestfrom flask_restful import Api, Resourceapp = Flask(__name__)api = Api(app)app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))#作用是返回数据时不对中文进行ascii编码class QQApi(Resource):#定义一个QQApi类 def __init__(self): self.url = 'https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?g_tk=1518561325&uins={}' def get(self):#绑定 HTTP GET METHOD pass# 设置路由api.add_resource(QQApi, '/qqapi')if __name__ == '__main__': app.run(debug=False)
在上面的get方法里首先用requests库get请求url,用正则表达式提取出我们需要的,比如昵称和头像链接
res = requests.get(self.url.format(qq)).content.decode('gb2312')#self.url就是上面那个链接 res = re.findall('portraitCallBack(.*)',res)[0] imgurl = re.findall('":."(.*?)",',res)#头像链接 name = re.findall(',"(.*?)",0.}.',res)#昵称
然后判断提取的信息是否为空,然后返回不同信息,如下:
if imgurl and name: imgurl = imgurl[0] name = name[0] data = { 'code':'200', 'imgurl':imgurl, 'name':name } return dataelse: return {'code':'103','msg':'获取信息失败'}
就此,API基本完成了,但是在实际运行中,如果QQ小于5位ui、大于十位或者不为数字会出现各种各样的错误,所以必须对传递过来的QQ参数首先加以判断:
qq = request.args.get('qq')if qq == ''#判断是否为空 return {'code': '101', 'msg': 'QQ不可为空'}elif len(qq)<5 or len(qq)>10:#判断QQ位数 return {'code': '104', 'msg': 'QQ错误'}elif not qq.isdigit():#判断是否为数字 return {'code': '105', 'msg': 'QQ只能为数字'}
最后再统一加个异常处理,防止其他情况出现
def get(self):#绑定 HTTP GET METHOD try: qq = request.args.get('qq') if qq == '': vreturn {'code': '101', 'msg': 'QQ不可为空'} elif len(qq)<5 or len(qq)>10: return {'code': '104', 'msg': 'QQ错误'} elif not qq.isdigit(): return {'code': '105', 'msg': 'QQ只能为数字'} res = requests.get(self.url.format(qq)).content.decode('gb2312') res = re.findall('portraitCallBack(.*)',res)[0] imgurl = re.findall('":."(.*?)",',res) name = re.findall(',"(.*?)",0.}.',res) if imgurl and name: imgurl = imgurl[0] name = name[0] data = { 'code':'200', 'imgurl':imgurl, 'name':name } return data else: return {'code':'103','msg':'获取信息失败'} except Exception as e: return {'code':'102','msg':e}
最终代码为
# -*- coding: utf-8 -*-import requests,refrom flask import Flask,requestfrom flask_restful import Api, Resourceapp = Flask(__name__)#Flask类只有一个必须指定的参数,即程序主模块或者包的名字,__name__是系统变量,该变量指的是本py文件的文件名api = Api(app)app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))#作用是返回数据时不对中文进行ascii编码class QQApi(Resource):#定义一个QQApi类 def __init__(self): self.url = 'https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?g_tk=1518561325&uins={}' def get(self):#绑定 HTTP GET METHOD try: qq = request.args.get('qq') if qq == '': vreturn {'code': '101', 'msg': 'QQ不可为空'} elif len(qq)<5 or len(qq)>10: return {'code': '104', 'msg': 'QQ错误'} elif not qq.isdigit(): return {'code': '105', 'msg': 'QQ只能为数字'} res = requests.get(self.url.format(qq)).content.decode('gb2312') res = re.findall('portraitCallBack(.*)',res)[0] imgurl = re.findall('":."(.*?)",',res) name = re.findall(',"(.*?)",0.}.',res) if imgurl and name: imgurl = imgurl[0] name = name[0] data = { 'code':'200', 'imgurl':imgurl, 'name':name } return data else: return {'code':'103','msg':'获取信息失败'} except Exception as e: return {'code':'102','msg':e}# 设置路由api.add_resource(QQApi, '/qqapi')if __name__ == '__main__': app.run(debug=False)
如果你也在学习编程,请向公众号发送群号,进到交流群里一起加油!