已经学习Python两天了,总结一下学习成果。
初学Python,如果有写错的地方,还望各位大牛指出。
先列一列作品:
- Python socket 客户端测试程序
- EasyGUI 猜数游戏
- 看雪登录器
涉及到的知识点:
- 面向对象
- socket库
- httplib2库
- EasyGUI
小知识点:
导入模块
通过这种方式导入模块中的全部内容。
from socket import *
import easygui as g
取随机数(0~10)
import random
rNum = random.randrange(0,10) #产生随机数
通过前后文本来取出中间文本
比如 AA广告SS
前面文本是AA , 后面文本是SS,中间文本就是广告
GetMiddleStr('AA广告SS','AA','SS') == 广告 此表达式成立
def GetMiddleStr(content,startStr,endStr):
startIndex = content.index(startStr)
if startIndex>=0:
startIndex +=len(startStr)
endIndex = content.index(endStr)
return content[startIndex:endIndex]
md5
pasword为要求md5的字符串
import hashlib
pasword = 'hello'
m=hashlib.md5() #获取md5对象
m.update(pasword.encode())
md5=m.hexdigest()
类的一些东西
类成员函数的self参数:这个参数相当于C++的this指针。
被__包围的函数是类的私有函数。 其他的函数默认为公有函数。
EasyGUI
easygui 是一个非常简单的PythonGUI界面库,正如它名字中说的一样easy。
感谢小甲鱼的翻译文档:http://bbs.fishc.com/thread-46069-1-1.html
# Easy GUI demo
# 无名侠
# 2015.7.3
# 猜数字游戏。
import easygui as g
import random
g.msgbox('欢迎使用 猜数游戏~',ok_button='戳进来!')
rNum = random.randrange(0,10) #产生随机数
while 1:
inNum = g.integerbox(msg='孩纸,输入你心仪的数字吧~',lowerbound=0,upperbound=10)
if inNum==rNum:
g.msgbox('哇哇,好厉害,好厉害!')
break
pass
g.msgbox('孩纸 你还需要努力哦~')
pass
Httplib2
这是一个非常强大的Http库,我昨天用这个库写了一个看雪论坛的登录器。
# Python 看雪用户信息查询
# 无名侠
# www.pandaos.net
# 2015.7.3
import httplib2
import hashlib
import urllib
def GetMiddleStr(content,startStr,endStr):
startIndex = content.index(startStr)
if startIndex>=0:
startIndex +=len(startStr)
endIndex = content.index(endStr)
return content[startIndex:endIndex]
def md5_pas(pasword):
'这个函数用于计算密码的md5值'
m=hashlib.md5() #获取md5对象
m.update(pasword.encode())
md5=m.hexdigest()
return md5
class Pediy:
'看雪协议类'
securitytoken=''
cookies=''
username=''
def __init__(self):
#获取securitytoken的值
h=httplib2.Http()
response,context = h.request("http://bbs.pediy.com/index.php", "GET")
self.cookies=response['set-cookie']
self.securitytoken=GetMiddleStr(context.decode(),'var SESSIONURL = "s=','&";')
if self.securitytoken=='':
print('初始化失败!无法获取securitytoken')
def Login(self,username,password):
#登陆看雪 成功返回用户名
md5pas=md5_pas(password)
data={'vb_login_username':username,'cookieuser':'1','s':self.securitytoken,'securitytoken':'guest','do':'login',
'vb_login_md5password':md5pas,'vb_login_md5password_utf=':md5pas,'vb_login_password':''
}
headers={'Content-type': 'application/x-www-form-urlencoded','Cookie':self.cookies}
h=httplib2.Http()
resp,context = h.request("http://bbs.pediy.com/login.php?do=login","POST",headers=headers,body=urllib.parse.urlencode(data));
context=context.decode()
if context.find('登录错误')!=-1:
#print(context)
print('登陆失败!账号或密码错误!')
return False
#更新Cookies
self.cookies=resp['set-cookie']
print(resp)
return True
print('看雪Python版')
u=Pediy()
uname=input('前输入你的看雪用户名:')
pas=input('请输入你在看雪的密码:')
if not u.Login(uname,pas):
print('登陆失败')
else:
print('登陆成功')
涉及到的所有知识点已经在前面呈现过啦。
疑问:httplib2 请求后返回的协议头字典里面怎么只有一条Cookies?
socket库
socket库是Python自带的一个库非常好用哈,符合规范,上手很快。
作为一名想用Python做利刃的Geeker,不掌握socket是不行的。 今天我好想试试原始套接字/icmp等。
#coding=utf-8
# Python Socket 程序
# 无名侠
# 2015.7.3
from socket import *
import time
HOST = input('请输入服务器ip:') #ip
PORT = int(input('请输入目标端口:')) #端口
BUFSIZE = 1024 #缓冲区大小
sock = socket(AF_INET,SOCK_STREAM) #创建套接字
print('正在为你搭桥连接.......')
start = time.time()
try:
sock.connect((HOST,PORT))
except IOError:
print('无法连接服务器:'+HOST)
exit()
print('已经连接 连接用时:'+str(int(time.time()-start))+'\n')
start=time.time()
while 1:
data = input('> ')
if not data:
break
sock.send(data.encode())
data=sock.recv(BUFSIZE).decode();
if not data:
continue
print('\n')
print(data)
sock.close();
print ('已经断开连接! 连接时长:'+str(int(time.time()-start))+'\n')