分类 编程/笔记 下的文章

引用百科来简单介绍一下Go语言:

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

我什么要学习Go语言

  1. 支持编译
  2. 相比C、C++更简单一些
  3. 效率比脚本语言高

Go语言的特性

有一句叫“只做一件事,并且把它做好”

  1. 自动垃圾回收
  2. 更丰富的内置类型
  3. 函数多返回值
  4. 错误处理
  5. 匿名函数和闭包
  6. 类型和接口
  7. 并发编程
  8. 反射
  9. 语言交互性

重新开始

重新开始,从Hello World到应用,一点一点的学。

6_0.jpg

TkinterPython的标准GUI库。Python使用Tkinter可以快速的创建GUI应用程序。

下面我们来通过一个简单的例子来用用它

#coding=utf-8
#Python3环境
import tkinter

def button():
    print('被点了')

if __name__ == '__main__':
    root = tkinter.Tk()
    root.title('测试窗口')
    root.geometry('300x250') #设置窗口大小(宽x高)
    root.resizable(False,False) #禁止调整窗口大小(宽x高)
    tkinter.Button(root,text='点我,点我',bg='#66ccff',command=button).pack()
    #bg:按钮背景色
    #command:按钮绑定事件
    root.mainloop() #窗口循环事件

638_0.png

某个同学拿去开老师玩笑,用这个搞了一段音频,后来他走的很安详。

#coding=utf-8
#百度语音合成 by blog.chutian.bid
import requests,json,sys
class baidutoaudio:
    def __init__(self,appKey,appSecret,Cuid):
        self.ak = appKey
        self.sk = appSecret
        self.cuid = Cuid
        self.token = self.gettoken(appKey,appSecret)
        return
    def utf8(self): #UTF8环境
        reload(sys)
        sys.setdefaultencoding('utf-8')
    def getapi(self,url):
        data = requests.get(url)
        return data.text
    def writeauido(self,url,file): #写音频
        data = requests.get(url)
        f = open(file, 'w+')
        f.write(data.content)
        f.close()
    def gettoken(self,ak,sk): #获取鉴权
        data = self.getapi('https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk)
        if(data.find('error_description') == -1):
            data = json.loads(data)
            return data['access_token']
        else:
            data = json.loads(data)
            print data['error_description']
            return 'ERROR'
    def getsay(self,tex,spd,pit,vol,per,file): #写音频并返回链接
        #tex:合成用文本 spd:语速 pit:音调 vol:音量 per:发音人选择
        #0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
        url = 'http://tsn.baidu.com/text2audio'
        url += '?tex='
        url += str(tex)
        url += '&tok='
        url += self.token
        url += '&cuid='
        url += str(self.cuid)
        url += '&ctp=1&lan=zh'
        url += '&spd='
        url += str(spd)
        url += '&vol='
        url += str(vol)
        url += '&per='
        url += str(per)
        self.writeauido(url,file)
        return url
if __name__ == '__main__':
    appKey = 'You AK'#AK
    appSecret = 'You SK'#SK
    cuid = '1'#用户ID
    say = baidutoaudio(appKey,appSecret,cuid)
    say.utf8()
    print say.getsay(raw_input('Say:'),5,6,12,4,'say.mp3')

安装模块:

apt install python-opencv python-flask
(自动处理依赖关系)

源码:

1.easycamera

#coding=utf-8
#摄像头模块
import cv2
class easycamera:
    def __init__(self,cameraid): #初始化
        self.cap = cv2.VideoCapture(cameraid)
    def setimage(self,height,width): #设置图像高度宽度
        self.cap.set(3,width)
        self.cap.set(4,height)
    def getimage(self,format = '.jpg'): #读取图像
        ret,image = self.cap.read()
        ret,image = cv2.imencode(format,image)
        return image.tobytes()
    def writeimage(self,filename): #写图像
        ret,image = self.cap.read()
        ret,image = cv2.imencode(format,image)
        f = open(file,'w')
        f.write(image.tobytes())
        f.close()
    def getcamerainfo(self): #获取图像高度宽度
        return {'width':self.cap.get(3),'height':self.cap.get(4)}

2.server

#coding=utf-8
#服务器模块
from flask import Flask,Response
from camera import easycamera

app = Flask(__name__)
def getimage(id): #产生流
    image = easycamera(id)
    image.setimage(720,1280)
    while True:
        data = image.getimage()
        yield('--frame\r\n Content-Type: image/jpeg\r\n\r\n' + data + b'\r\n\r\n')

@app.route('/')
def index(): #主页,简单的html拼凑
    return '<html><body><h1>Web Camera</h1><img src="/getcamera"></body></html>'

@app.route('/getcamera') #取图像
def getcamera():
    return Response(getimage(0),mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=80, debug=True)

解析:

mimetype='multipart/x-mixed-replace; boundary=frame'

游览器报文,请参考这篇文章,在这里是服务器向游览器发送图片流。

yield

类似于return,但与return不同的是,return执行后就不再执行return后的代码了,而yield返回后会继续执行后面的代码,在上面的代码中,不断的返回图片数据(流),请参考这篇文章。

效果:

有一定的延迟,帧数还是算流畅的。

412_0.png

写这个是为了下载纪录片用的。

比如这个页面:舌尖上的中国第二季

它会抓取这个页面的所有视频链接并输出到txt文件。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests,re,os
#取网页内容
def gethtml(url):
    data = requests.get(url)
    return data.text
#正则匹配部分
def reurlstart(url):
    #os.remove('getcntv.txt')
    info = []
    text = gethtml(url)
    #央视的视频链接一般为 http://tv.cctv.com/年/月/日/乱七八糟.shtml
    #正则匹配式:[a-zA-z]+://tv.cctv.com/[0-9]*/[0-9]*/[0-9]*/.*"
    data = re.findall(r'[a-zA-z]+://tv.cctv.com/[0-9]*/[0-9]*/[0-9]*/.*"',text,re.I)
    for i in data:
        i = i.split('"')
            if i[0] != url:
                #这里要进行一次分割,因为原链接是 视频链接 + " + html
                info.append(i[0])
    #得到的数组有重复的链接,所以要去重
        dellist(info)
#去除重复链接
def dellist(list):
    list2 = []
    for i in list:
        if i not in list2:
            print i
            wfile(i)
                list2.append(i)
    return list2
#写文件
def wfile(text):
    f = open('getcntv.txt','a+')
    f.write(text + '\n')
    f.close()

a = raw_input('URL:')
reurlstart(a)

374_0.png

1.安装pyOpenSSL库

pip install pyOpenSSL
(仅pip)

2.修改原有代码

端口改为443,在原有参数上加上ssl_context=('证书路径','私钥路径')即可

app.run(host='0.0.0.0',port=443,ssl_context=('/root/certificate.crt', '/root/private.key'))

yeelink经常登不上,然后各种500,所以换个平台:乐为物联。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
import os
import time
import random
apikey = 'youapikey'
#id=网关名 name=设备标识 value=数据
def updata(id,name,value):
    url = "http://www.lewei50.com/api/V1/gateway/UpdateSensors/"+ id
    head = {'userkey': apikey}
    #, 'content-type': 'application/json'}
    date = '[ {"Name":"'+ name  #超级睿智的拼json数据,老早以前写的。
    date = date + '","Value":'+ str(value) +' }]'
    d = requests.post(url,headers=head,data=date)
    return d.text
def getRAMinfo():
    p = os.popen('free')
    i = 0
    while 1:
        i = i + 1
        line = p.readline()
        if i==2:
            return(line.split()[1:4])#对 free 命令返回的结果进行解析,分割。
def ram():
    RAM_stats = getRAMinfo()
    RAM_free = round(int(RAM_stats[2]) / 1000,1)
    return str(RAM_free)
if __name__ == '__main__':
    sj = ram()
    updata('web','free',sj)
    time.sleep(11) #平台接口限制10秒传一次

非常非常简单的写了一下,没有错误判断,就Post提交一下。

图灵机器人:http://www.tuling123.com/

Api文档:https://www.kancloud.cn/turing/web_api/522992

#coding=utf-8
import requests,json,sys
print '213小助手 v1.0'
apikey = 'Your Api Key'
def getsay(say):
    url = "http://openapi.tuling123.com/openapi/api/v2"
    date = '{"reqType":0,"perception": {"inputText": {"text": "'+ say
    date = date + '"},"selfInfo": {"location": {"city": "Your City",}}},"userInf$
    d = requests.post(url,data=date) #拼json数据,然后提交
    return d.text
def printout(say):
    say = json.loads(say)
    return info['results'][0]['values']['text'] #取机器人返回的信息,关于返回的内容可以看Api文档,这里只是简单的取一下text
while(1):
    com = raw_input('说:')
    if(com == '退出'):
        sys.exit(0) #退出
    else:
        print '213答:',
        print printout(getsay(com))