一、Python发邮件
发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。
1. 用到的模块
smtplib:是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。
email:简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。
举个简单的例子,当你登录邮箱,写好邮件后点击发送,这部分是由 SMTP 接管;而写邮件、添加附件是由 email 模块控制。
2. 前置需要(以163邮箱为例)
在使用脚本发邮件之前,我们需要打开自己邮箱的 SMTP 功能
3. 简易代码
脚本分为三个步骤:
1.设置好服务器端信息
2.邮件主体信息
3.登录发送
另外在处理文本时,我们需要使用 MIMEText 类。
代码如下
import smtplib
from email.mime.text import MIMEText
#设置服务器所需信息
#163邮箱服务器地址
mail_host = 'smtp.163.com'
#163用户名
mail_user = '192*****82'
#密码(部分邮箱为授权码)
mail_pass = '7******x'
#邮件发送方邮箱地址
sender = 'py*****21@163.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['19*****82@qq.com']
#设置email信息
#邮件内容设置
message = MIMEText('content','plain','utf-8')
#邮件主题
message['Subject'] = 'title'
#发送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
#登录并发送邮件
try:
smtpObj = smtplib.SMTP()
#连接到服务器
smtpObj.connect(mail_host,25)
#登录到服务器
smtpObj.login(mail_user,mail_pass)
#发送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error',e) #打印错误
我们将上述代码封装成函数
存放在一个新文件命名为mail.py
就可以直接调用了
调用代码
import mail
mail.sendMail('您的程序已经运行完成,请去宝塔面板查看日志结果')
import smtplib
from email.mime.text import MIMEText
def sendMail(msg):
#设置服务器所需信息
#163邮箱服务器地址
mail_host = 'smtp.163.com'
#163用户名
mail_user = 'py******21'
#密码(部分邮箱为授权码)
mail_pass = 'O*****BL'
#邮件发送方邮箱地址
sender = 'p*****21@163.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['19*****82@qq.com']
#设置email信息
#邮件内容设置
message = MIMEText(msg,'plain','utf-8')
#邮件主题
message['Subject'] = '程序完成情况'
#发送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
#登录并发送邮件
try:
smtpObj = smtplib.SMTP()
#连接到服务器
smtpObj.connect(mail_host,25)
#登录到服务器
smtpObj.login(mail_user,mail_pass)
#发送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error',e) #打印错误
二、Python脚本部署在宝塔面板
1. 安装Python项目管理器
宝塔面板-软件商店-搜索-python
2. 新建python脚本
根据个人喜好在宝塔面板根目录下新建存放python文件的目录,命名为pythonpart,名称随意
创建完后点击新建一个空白文件。名字设置为requirements.txt。多一个字少一个字母多一个空格都不行
创建完成后选择同样的方式,创建一个hello.py文件,输入如下代码,打印一个hello world
# -*- coding: UTF-8 -*-
if __name__ == "__main__":
for i in range(100)
print("hello world")
3. 在Python项目管理器中新建项目
项目名称---------: 根据喜好自定义
路径------------: 选择刚刚创建的pythonpart文件夹
Python版本-------: 默认
框架------------: python
启动方式---------: python
启动文件文件夹----: 选择要运行的hello.py文件
端口------------: 输入项目端口,没有端口留空
是否安装模块依赖--: 使用某python库的话勾选
4. 运行项目
点击“确定”的绿色按钮,就可以实现对python项目的运行。
tip:由于我们的项目运行即停,所以是肯定是提示创建失败的,
因为很短的时间内即可完成项目的运行,只有那些要花费很长时间的项目才会提醒项目创建成功。
但是这些对我们创建项目并没有什么影响。
由于我们创建的hello world项目运行太快,
我们需要去宝塔ssh终端去运行项目,
可以看到我们已经成功打印出来了hello world!
至此我们已经完成了对python项目在云服务器的运行。
5. 添加模块
比如我想用某python库里面的东西,
我们这时候不是使用pip去Linux环境下安装(当然你非要这样的话),
我们可以先在创建项目的时候,选中是否安装模块依赖,
然后在点击你创建项目的那条里面的“模块”按钮,
输入您要创建的库名字
(我这里安装time库直接输入time,直接点击添加,不用输入版本号,即可完成安装)
安装成功后直接import即可
6. 到这里我们完成了python项目在宝塔面板上的部署
三、Bilibili自动获取经验脚本
1. 脚本功能
登录签到
视频观看
5次投币(需消耗5个币)
分享视频(不会发在个人空间动态里)
以上每天经验共65点经验。
2. 前置条件
获取B站个人Cookie
1、浏览器登入哔哩网站
2、访问 http://api.bilibili.com/x/space/myinfo
3、F12看到cookie的值粘贴即可
3. 代码如下
# -*- coding: utf-8 -*-
# date:2021/12/13
import requests
import json
import time
import random
import mail
# 填写cookie即可运行
'''
1、浏览器登入哔哩网站
2、访问 http://api.bilibili.com/x/space/myinfo
3、F12看到cookie的值粘贴即可
'''
cookies = ""
coin_operated = 1 # (投币开关,0不投币,1投币)
# cookie转字典
def extract_cookies(cookies):
global csrf
cookies = dict([l.split("=", 1) for l in cookies.split("; ")])
csrf = cookies['bili_jct']
return cookies
# 银币数
def getCoin():
cookie = extract_cookies(cookies)
url = "http://account.bilibili.com/site/getCoin"
r = requests.get(url, cookies=cookie).text
j = json.loads(r)
money = j['data']['money']
return int(money)
# 个人信息
def getInfo():
global uid
url = "http://api.bilibili.com/x/space/myinfo"
cookie = extract_cookies(cookies)
j = requests.get(url, cookies=cookie).json()
username = j['data']['name']
uid = j['data']['mid']
level = j['data']['level']
current_exp = j['data']['level_exp']['current_exp']
next_exp = j['data']['level_exp']['next_exp']
sub_exp = int(next_exp) - int(current_exp)
if coin_operated:
days = int(int(sub_exp) / 65)
else:
days = int(int(sub_exp) / 15)
coin = getCoin()
msg = f"欢迎 {username}! 当前等级:" + str(level) + " ,当前经验:" + \
str(current_exp) + ",升级还差 " + str(sub_exp) + \
"经验,还需" + str(days) + "天," + "当前硬币数量:" + str(coin)
return current_exp, msg
# 推荐动态
def getActiveInfo():
url = "http://api.bilibili.com/x/web-interface/archive/related?aid=" + \
str(7)
cookie = extract_cookies(cookies)
r = requests.get(url, cookies=cookie).text
j = json.loads(r)
return j
# 推荐动态第二种方式
def getVideo():
random_page = random.randint(0, 167)
url = "http://api.bilibili.cn/recommend?page=" + str(random_page)
cookie = extract_cookies(cookies)
r = requests.get(url, cookies=cookie).text
j = json.loads(r)
return j
# 投币 分享5次
def Task():
coin_num = getCoin()
num = 5
if coin_num <= num:
num = coin_num
coin_count = 0
for i in range(0, 10):
j = getVideo()
list_len = len(j['list'])
random_list = random.randint(1, list_len-1)
bvid = j['list'][random_list]['bvid']
aid = j['list'][random_list]['aid']
print(str(i)+' ---- '+str(bvid)+' ---- '+str(aid))
toview(bvid)
time.sleep(3)
shareVideo(bvid)
time.sleep(3)
if coin_count < num:
coin_code = tocoin(bvid)
if coin_code == -99:
return
if coin_code == 1:
coin_count = coin_count+1
if coin_count == num:
break
print('----------------------')
# 观看视频【不会点赞投币】
def toview(bvid):
playedTime = random.randint(10, 100)
url = "https://api.bilibili.com/x/click-interface/web/heartbeat"
data = {
'bvid': bvid,
'played_time': playedTime,
'csrf': csrf
}
cookie = extract_cookies(cookies)
j = requests.post(url, data=data, cookies=cookie).json()
code = j['code']
if code == 0:
print('看视频成功!')
else:
print('看视频失败!')
# 分享视频
def shareVideo(bvid):
url = "https://api.bilibili.com/x/web-interface/share/add"
data = {
'bvid': bvid,
'csrf': csrf
}
cookie = extract_cookies(cookies)
# 需要请求头
header = {
"Content-Type": "application/x-www-form-urlencoded",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38",
}
r = requests.post(url, data=data, cookies=cookie, headers=header).text
j = json.loads(r)
code = j['code']
if code == 0:
print('分享成功!')
else:
print('分享失败!')
# 投币函数
def tocoin(bvid):
coinNum = getCoin()
if coinNum == 0:
print('太穷了,硬币不够!')
return -99
url = "http://api.bilibili.com/x/web-interface/coin/add"
data = {
'bvid': bvid,
'multiply': 1,
'select_like': 1,
'csrf': csrf
}
cookie = extract_cookies(cookies)
r = requests.post(url, data=data, cookies=cookie).text
j = json.loads(r)
code = j['code']
if code == 0:
print(str(bvid) + ' 投币成功!')
return 1
else:
print(str(bvid) + ' 投币失败!')
return 0
# 开启任务运行
def run():
exp1, msg = getInfo()
print(msg)
Task()
exp2, c = getInfo()
print(f'任务完成,获得经验{int(exp2) - int(exp1)}')
# 云函数使用
def main_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
print("Received context: " + str(context))
run()
return "------ end ------"
if __name__ == '__main__':
run()
mail.sendMail('您的程序已经运行完成,请去宝塔面板查看日志结果')
4. 结束语
上述代码中加入了刚刚写好的自动发邮件脚本
在程序运行完,就立马发一封邮件提醒我程序跑完了。我们先看一下效果