最近在用python写一个自动更新ip的小程序,记录下其中遇到的一些问题,
巩固一下知识。
(1) 写明程序的基本信息,比如时间,地点,文件名等
(2) 可以设置一个DEBUG模式
DEBUG = False
if DEBUG:
...
else:
...
邮件系统
import smtplib
import poplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formatadder
#邮箱基本信息 这里以163邮箱为例
smtp_server = 'smtp.163.com'
pop_server = 'pop.163.com'
email_account = 'xxxx@163.com'
email_password = 'xxxxx' #这个是邮箱授权码,并非登录密码
def _format_addr(s):
"""
格式邮件地址信息
"""
#解析字符串中的名字和地址
name,addr = parseaddr(s)
#将名字编码成utf-8的格式,因为名字追踪可能有汉字,然后将其与地址一起格式化成为规范的模式
return formataddr(Header(name,'utf-8').encode(),addr)
def send_emails(user_list):
"""
发送邮件,用smtp协议
"""
from_addr = email_account
password = email_password
#连接服务器,有两种方式
#1. server = smtplib.SMTP(smtp.server,25) 这种方式不安全
#2.
server = smtplib.SMTP_SSL(smtp_server,465)
server.connect(smtp_server,465)
#登录邮箱服务器
server.login(from_addr,password)
#注意,在发邮件的时候,可能会发生一些错误,不如
#451 MI:DMC 当前连接发送的邮件数量超出限制。请控制每次连接中投递的邮件数量;
#遇到这种情况,可以查明是哪种错误,然后再解决它
#邮件内容
msg = MIMEText('text','plain','utf-8')#这里plain表示纯文本
msg['From'] = _format_addr('name<%s>'%from_addr)
msg['To'] = _fromat_addr('<%s>'%to_adr)
msg['Subject'] = Header('title').encode('utf-8')#邮件主题
#如果没有上述信息,邮件可能发不出去了,或者可能被当做垃圾邮件
#发送邮件
server.sendmail(from_addr,[to_addr],msg.as_string))#这里是以字符串的格式发送的邮件内容
#退出邮件
server.quit()
def receive_mail():
"""
收邮件,用pop协议
"""
address = email_account
password = email_password
#连接POP3邮件服务器
server = poplib.POP3(pop3_server)
#登录邮箱
server.user(address)
server.pass_(password)
#list()返回所有邮件的编号,其中mails是一个列表,包含了所有的邮件
resp,mails,octets = server.list()
#retr()读取邮件信息
#这里需要注意的是,邮件的编号是从1开始的,和数组不同
#lines是一个列表,包含了邮件的所有行
resp,lines,octets = server.retr(len(mails))
#邮件内容是二进制格式,不是字符串格式
#下面读取邮件内容,并且在每一行后面加上一个换行符'\r\n'
msg_contents_bytes = b''
for line in lines:
msg_contents_bytes += (line+b'\r\n')
msg_contents = msg_contents_bytes.decode('utf-8')
server.quit()
base64编码
base64编码将3个字节的***二进制***数据转换成4个字节的文本数据,如果最后转换成的字符串长度不是4的倍数,则添加\x00,然后添加与\x00等个数的’=‘。
>>> import base64
>>> base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'
由于标准的base64编码后可能出现字符+和/,在url中就不能直接作为参数,所以又有一种’url safe’的base64编码,其实就是把字符+和/分别变成-和_
>>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd++//'
>>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
b'i\xb7\x1d\xfb\xef\xff'
由于=字符也可能出现在base64编码中,但=用在url、cookie里面会造成歧义,所以很多base64编码后会把=去掉,但解码的时候,需要加上=,是的base64编码的长度永远是4的倍数。
检查ip是否可用
https://ipcheck.need.sh
上面的网站可以用来检查ip是否可用
通过浏览器的开发者工具里的网络调试,可以得到检查后的json内容,其对应的地址为
‘https://ipcheck.need.sh/api_v2.php?ip=%s’ % ip
对程序进行调试
在python中,设置断点进行debug,这时候,可以选择Console->Show Python Prompt
datetime
now_string=datetime.strftime(datetime.now(),"%Y-%m-%d %H:%M:%S")#将时间元组转换成字符串
datetime.strptime(now_string,’%Y-%m-%d_%H-%M-%S’)#将时间字符串转换成时间元组
上面的格式大小写不能变,但是年月日,时分秒的顺序可以变。