关于后端:Serverless实战B站每日自动签到传统单节点网站的Serverless上云

36次阅读

共计 11238 个字符,预计需要花费 29 分钟才能阅读完成。

简介:Serverless 好哇!这里将针对集体与生产两个利用方向的测评 应用 Serverless 实现主动获取每日 B 站的经验值,让你更快冲到 LV6!你的业务站点还是一台服务器 All in One 吗?基于 Serverless 与阿里云产品的农产品电商网站上云!什么是函数?刚刚考完数学没多久的我,脑力里立马想到的是自变量、因变量、函数值,也就是 y =f(x)。当然,在计算机里,函数 function 往往指的是一段被定义好的代码程序,咱们能够通过传参调用这个定义好的函数,实现咱们所须要的性能。那么,明天的函数计算 FC 又是什么?云计算时代的当下,容器化技术与各种工具倒退的 DevOps,曾经把开发与运维的工作进行了新的兼顾,开发人员在实现代码的编写后,无需思考环境,间接提交到各种流水线就能够实现测试、开发、部署,我的项目构建微服务,由容器实现环境的封装。然而往往咱们最终还是须要投入精力到业务上线的集群,是公有云环境还是私有云?是裸金属服务器还是云实例 ECS?是自购还是租用?

   当然,DevOps 的落地,服务器 \ 集群的运维,这些都是须要投入大量的资源与精力,DevOps 是一条捷径,但不是惟一的前途。因而函数计算 FC 的呈现,带来了无服务 Serverless 的架构,让开发者在开发和部署的时候,不在有部署服务简单的感觉,对服务器的无感召,能够使开发者真正的关注在本人的代码上。阿里云 Serverless 函数式极简编程可专一于业务翻新,无洽购和部署老本、提供监控报警等齐备的可观测能力。函数计算是事件驱动的全托管计算服务,真正的无需去思考服务器的运维治理,只须要实现开发的代码进行上传,函数计算会通过角色策略去布局计算资源,弹性的形式执行函数,最初高效的执行部署。优雅!

 Serverless 将会有那些实用场景?是集体?还是生产?那么这次我将部署两种不同方向的利用对 Serverless 进行测评 一、告诉零碎与 Webhook,Trigger 触发与 Chat 机器人。许多零碎中波及到的 push 类性能,例如邮件、短信、Webhook。当然 Webhook 的能力不只是信息告诉,不过这里所指的告诉性能必然是须要基础设施也就是服务器来撑持运行,如果将这些性能间接由 Serverless 来操作,咱们便无需领取运维一台服务器,节俭了大量的工作与费用。同样,咱们能够利用 Serverless 事件驱动模型实现定时主动触发工作,主动签到主动发送。二、其次当然是 Web 类的利用。基于各类 Web 框架的利用部署,构建基于 Java、Python、PHP 等语言的站点,Serverless 很容易实现如 wordpress 这样的博客利用的上线。配合其余云产品,Codeup、OSS、RDS 等,更能实现高可用高性能的 Web 利用,如官网提供的 Kod 云盘零碎。一、应用 Serverless 实现 B 站每日登陆签到       作为一个老 b 站用户,b 站等级无疑是妥妥的 ” 名片 ”,当然我早已是六级大佬的一员了。b 站降级所需的经验值是要害,登陆、投币、观看都会积攒教训。为了能够疾速降级,这次我将应用阿里云 Serverless,实现每日 b 站的登陆教训 Get,观看视频教训 Get,观看直播银瓜子 Get(白嫖的直播送礼道具),并且配合钉钉机器人,实现 Webhook 的音讯推送。1. 创立 Serverless 服务及函数 进入函数计算 FC 控制台,抉择【服务及函数】,点击【创立服务】

  在【创立服务】的页面中,输出服务名称,并抉择启用日志性能,日志更能能够帮忙咱们更好的排查谬误这里我当然须要标注服务的性能,即实现 bilibili 的日常登陆签到。

 进入【创立函数】页面,抉择【应用规范 Runtime 从零创立】配置函数名称,抉择运行环境为 Python3,并且抉择从文件夹上传代码。留神,这里如果有依赖包须要提前下载到代码包下,我这里须要用到 requests 包,在本地须要执行 pip install -t . < 模块名称 >。不过后续也能够在控制台处执行下载命令这里的 Python 性能实现的脚本是定时触发类的,因而咱们抉择申请处理程序类型为【处理事件申请】

 下方配置触发器,抉择定时触发器,输出名称,抉择【指定工夫】,我这里抉择的是每日的 23 点进行脚本的运行 

Python 脚本内容# –– coding: utf8 –
import requests
import json
import time
import re
import sys
import codecs
from bs4 import BeautifulSoup
from json.decoder import JSONDecodeError

B 站登陆 Cookie

cookie = “”

Webhook 地址

webhook = “https://oapi.dingtalk.com/robot/send?access_token=xxxx”

主动观看的 BV 号, 杰伦新专 - 最平凡的作品

bid = ‘BV1ua411p7iA’

uid=re.match(‘(?<=DedeUserID=).*?(?=;)’,cookie)
sid=re.match(‘(?<=sid=).*?(?=;)’,cookie)
csrf=re.match(‘(?<=bili_jct=).*’,cookie)

局部编码问题

sys.stdout = codecs.getwriter(“utf-8”)(sys.stdout.detach())

bv 转为 av

def bv_to_av(bv):

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}
r = requests.get('https://api.bilibili.com/x/web-interface/view', {'bvid': bv}, headers=headers)
response = decode_json(r)
try:
    return str(response['data']['aid'])
except (KeyError, TypeError):
    return '883409884'

json 解析

def decode_json(r):

try:
    response = r.json()
except JSONDecodeError:
    return -1
else:
    return response

自定义钉钉机器人推送

def pushinfo(info,specific):

定义推送内容,格局参考 https://open.dingtalk.com/doc…

留神机器人的关键词

data = {
 "msgtype": "text",
  "text": {
  "title":"Taoreset",
      "content": "【Taoreset-Serverless 推送】\n"+info+specific
 }

}

headers = {'content-type': 'application/json'} # 申请头
r = requests.post(webhook, headers=headers, data=json.dumps(data))
r.encoding = 'utf-8'
print (r.text)

阿 b 登录,得登陆教训

def login():

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
    print('登录胜利')
    return True
else:
    print('登录失败:'+msg)
    return False

获取用户信息

def get_user_info():

headers = {'Cookie':cookie}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo?jsonp=jsonp',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
    userInfo=['账号:'+str(rejson['data']['silence']),
    '硬币:'+str(rejson['data']['coins']),
    '教训:'+str(rejson['data']['level_exp']['current_exp'])+"/"+str(rejson['data']['level_exp']['next_exp']),
    '等级:'+str(rejson['data']['level']),
    '昵称:'+str(rejson['data']['name'])
    ]
    print(userInfo[0]) 
    print (userInfo[1])
    print(userInfo[2])
    print(userInfo[3])
    print(userInfo[4])
    return userInfo
else:
    print("用户信息获取失败:"+msg)
    return "用户信息获取失败:"+msg

直播签到,赚银瓜子儿

def do_sign():

headers = {'Cookie':cookie}
response = requests.session().get('https://api.live.bilibili.com/sign/doSign',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']

if code == 0:
    print('直播签到胜利!') 
    return True
else:
    print("直播签到失败:"+msg)
    return False

看 BV 号视频,得观看教训

def watch():

    aid=bv_to_av(bid)
    headers = {'Cookie':cookie}
    response = requests.session().get('http://api.bilibili.com/x/web-interface/view?aid='+str(aid),headers=headers)
    rejson = json.loads(response.text)
    code = rejson['code']
    #print(response.text)
    if code == 0:
        cid = rejson['data']['cid']
        duration = rejson['data']['duration']
    else:
        print('视频信息解析失败')
        return False
    payload = {
        'aid': aid,
        'cid': cid,
        'jsonp': "jsonp",
        'mid': uid,
        'csrf': csrf,
        'played_time': 0,
        'pause': False,
        'realtime': duration,
        'dt': 7,
        'play_type': 1,
        'start_ts': int(time.time()),
    }
    response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
    rejson = json.loads(response.text)
    code = rejson['code']
    if code == 0:
        time.sleep(5)
        payload['played_time'] = duration - 1
        payload['play_type'] = 0
        payload['start_ts'] = int(time.time())
        response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
        rejson = json.loads(response.text)
        code = rejson['code']
        if code == 0:
            print(f"av{aid} 观看胜利")
            return True
    print(f"av{aid} 观看失败 {response}")
    return False

def main(*args):

if login():
    ui = get_user_info()
    desp='直播签到:'+str(do_sign())+'\n\n'+'观看视频:'+str(watch())+'\n\n'+ui[0]+'\n\n'+ui[1]+'\n\n'+ui[2]+'\n\n'+ui[3]+'\n\n'+ui[4]+'\n\n'
    pushinfo('哔哩哔哩签到胜利',desp)
else:
    pushinfo('哔哩哔哩签到失败','')

if name == ‘__main__’:

main() 2. 批改函数配置实现函数的创立后就进入了函数治理的界面。函数代码这里就显示了咱们上传的代码文件,所有代码执行的本地门路都在 /code 目录下。

如果有依赖模块提醒没有,在下方的控制台终端输出命令也能够实现模块装置下载,所有工作目录下的代码批改,实现后都须要点击部署代码进行部署上传。pip install -t . requests bs4

 其余须要批改一下函数的配置,点击【函数配置】,找到【环境信息】编辑,批改【申请处理程序】,批改函数入口为 < 要执行的代码文件名. 执行的函数名 >,我这里脚本的文件名为 bilibiliSignin.py,代码里的主函数为 main,因而函数入口就为 <bilibiliSignin.main>

 3. 实现函数功能测试抉择【测试函数】,即可立刻对函数进行触发,点击测试函数进行测试

实现测试后下方就会显示日志输入内容,不便查看后果和排错

  实现成果,定时触发 23 点准时实现签到,并由钉钉的机器人推送音讯

 欸嘿,大伙一起吧 Serverless 脚本跑起来,早日迎接 B 站六级会员!!!

 脚本参考 Github ,by sanshuifeibing 二、Serverless 农产品电商网站上云革新   这里我拿隔壁软件业余(俺是网络技术的)的一个大作业我的项目作为部署的案例。我的项目是非常简单并且性能繁多的,然而也是十分经典的前后端拆散我的项目,因为我开发不太会,我的项目具体技术就不献丑了。之前据说是有什么版权的,我就不放源代码了 hhhh   在革新之前,我置信是很多中小型公司业务的经典 AllinOne 构造,把业务波及到的所有服务中间件运行在一台服务器 / 虚拟机上,尽管当初看可能完完全全是实验室环境,然而理论看到的仍然有很多我的项目是这么做的。害处也不必多提,部署运维难、难以进行资源的扩容、后续革新简单、性能差没有利用高可用技术等等。。。

   Serverless 的农产品电商平台上云,我的项目比较简单,布局就在同一地区了。次要是将前端 HTML 页面与后端 Jar 包运行别离由两个独自的 Serverless 函数实现运行计算。其余撑持服务上云,别离用对应的云产品实现,这里 Redis 服务因为我本人 ECS 上有运行 redis 服务,就不再独自购买云数据库 Redis 版了,当然举荐应用阿里云的 Redis 云数据库产品。

 1.Serverless 服务创立进入函数计算控制台,抉择【服务及函数】,点击【创立服务】输出创立服务的名称与形容,开启日志性能,点击确定,实现服务的创立

 服务创立实现后,进入【服务详情】,找到【网络配置】,点击【编辑】抉择容许拜访 VPC,抉择自定义配置,抉择 VPC、vSwitch、平安组,这里须要和后续其余撑持的云产品(数据库等)放弃在同一 VPC 下。因而须要做好云上网络的布局,也要看一下产品是否在地区下有没有库存。

 2. 前端页面 Serverless 函数创立实现服务创立后,点击【创立函数】,进入函数的创立页面抉择【应用自定义运行时平滑迁徙 WebServer】,输出函数名称,抉择运行环境为【Nginx】,上传前端 html 代码与 nginx 的配置文件,抉择监听端口为 80,即为原 nginx 中间件的服务端口。

      实现函数创立后,进入到函数详情界面,能够在函数代码中对代码进行编辑批改,代码改变后须要点击部署代码从新上传。上述也提到了,这里须要将 Nginx 服务配置一起上传,其中须要拷贝一份 /etc/nginx/mime.types 文件到当下目录,防止 mime 文件类型映射谬误。这里放 nginx 要害配置,依据本人的业务状况批改,留神配置中端口监听须要与函数创立监听端口保持一致,同时网页代码的门路设置为 /codehttp {

include mime.types;  #留神引入此文件
keepalive_timeout  900;
server {
    listen       80;        
    server_name  localhost;
    location / {
        root   /code;
        index  index.html index.htm;
        proxy_set_header    Host $host; 
        proxy_set_header    X-Real-IP $remote_addr;  
        proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
   }
    location /users {proxy_pass http://serverless. 后端函数拜访地址.run;      

Nginx 反代传给后端的函数,地址在后续后端函数创立完能够拷贝

    }
    location /items {proxy_pass http://serverless. 后端函数拜访地址.run; 

Nginx 反代传给后端的函数,地址在后续后端函数创立完能够拷贝

  能够在调用日志查问相干日志

 当函数触发运行,Serverless 将会依据拜访申请主动起实例,在这里能够手动登陆实例,去进行中间件服务的日志、运行环境的一些查看与排错。

3. 后端 Serverless 函数创立   回到函数服务界面,再次点击【创立函数】,进入函数的创立页面抉择【应用自定义运行时平滑迁徙 WebServer】,输出函数名称,抉择运行环境为【Java】,上传打包好的 Jar 包文件。依据具体业务批改【启动命令】与【监听端口】。我这里须要监听业务端口为 8080,并且须要在运行时传入数据库连贯的参数,这里所配置的数据库源用户名明码连贯地址,在后续的云数据库 RDS 中会进行相干设置。

 后端函数创立实现后进入函数详情界面,其余性能与上述前端函数雷同,不再复述

 点击【触发器治理】,此处 HTTP 触发器提供了公网与内网拜访地址,咱们拷贝内网地址在前端中间件反代配置处填入此域名,实现拜访前端触发后端函数

 4. 云数据库 RDS MySQL Serverless 创立与迁徙导入   原有 Allinone 架构中没有做到数据库服务的独立与高可用,在此次云化部署,咱们将选用阿里云公测中的云数据库 Serverless 版本。RDS MySQL Serverless 提供了 CPU、内存的实时弹性能力,具备资源用量低、简略易用、弹性灵便和价格低廉等长处,正当优化应用老本,进一步降本增效。RDS MySQL Serverless 实例创立   进入云数据库 RDS 控制台,点击【创立实例】,开始创立实例的流程,在【根底资源】设置界面,抉择 Serverless 版,其余依据理论进行抉择  

 Serverless RDS 创立时【实例配置】须要留神网络 VPC 的设置,要与 Serverless 服务所设定的 VPC 统一,实现内网数据互通。确定订单后,期待实例创立实现即可

RDS 数据库用户设置实现实例创立,抉择治理实例。在左侧任务栏抉择【账号治理】,点击【创立账号】创立数据库账户供电商平台后端进行连贯。输出账户名、明码,抉择为一般账户,点击确定实现用户创立 

 RDS 业务数据库创立抉择左侧栏中【数据库治理】,抉择【创立数据库】输出农产品电商业务所需的库名,并且受权账户给前一步设置的用户,点击创立实现库的设置。

 RDS 服务连贯地址咱们的 Serverless 函数中所须要连贯库的地址,在 rds 实例中【数据库】连接处能够查到,不过须要提前设定白名单。

 咱们将内网地址进行拷贝,并且也实现了连贯用户、明码、库的配置,就能够配置到 Serverless 函数或者是后端代码中了

 RDS 业务数据库的导入复原   数据库的上云要害是数据内容的迁徙,这次部署的业务数据库很少又很小,因而应用简略的备份 SQL 脚本文件作为迁徙的形式。MySQL/Mariadb 的数据导出有多种形式,能够依据理论需要进行备份导出,当然大型业务库有专用的备份迁徙工具,这里不细说了。进入 DMS 数据管理服务,抉择【数据库开发】,在【数据变更】下点击【数据导入】。依据具体备份形式导入数据库,我这里抉择上传备份的 sql 脚本,提交申请开始导入数据

 数据导入实现,数据迁徙实现

   5.Redis 服务上云与动态资源 CDN   Redis 服务上云,前文也提到了,这里 Redis 服务因为我本人 ECS 上有运行 redis 服务,就不再独自购买云数据库 Redis 版了,ECS 也处于同一 VPC 之下,能够实现内网互通。当然举荐应用阿里云的 Redis 云数据库产品。

    动态资源的 CDN,包含 css\js\ 图片的减速,原有架构中曾经寄存在阿里的 CDN 服务上了,我这里就不多做改变了。6. 公网业务拜访域名配置   最初一步,用户最终拜访的是前端 Serverless 函数,如同阿里云给出的提醒,拜访默认的公网地址不会做任何中间件解析,而是间接下载首页 html 动态文件,因而咱们须要本人配置拜访域名。

    回到函数计算控制台,抉择【域名治理】,点击【增加自定义域名】输出自定的域名,配置路由,抉择对应函数的服务名称、函数名称、版本号 LATEST(最新) 将须要解析的 CNAME 值,拷贝

拷贝 CNAME 记录值,点击【云解析 DNS 控制台】,进入解析设置,点击【增加记录】抉择记录类型【CNAME】,输出主机头,填入拷贝的记录值,确认实现增加

 7. 农产品电商我的项目 Serverless 上云成果首页,拜访成果,前端函数无误

 农产品详情页拜访

  用户注册功能测试,数据库连贯与写入无误

 RDS 中数据已胜利写入

 用户登陆测试

 订单提交测试,后端函数无误

  三、应用 Serverless 利用模板疾速构建 litemall 电商利用零碎 1. 基于官网模板创立利用 Serverless 利用提供了大量的官网利用模板,咱们能够依据给出的模板来批改本人的业务,因而相熟模板的部署也很重要。进入到函数计算 FC 的控制台页面,点击【利用】,抉择【通过模板创立利用】,抉择【商城案例】

 通过详情查看部署模板的信息,以及查问源代码,点击立刻创立能够疾速体验 Serverless 利用的创立,本地部署能够通过 ServerlessDev 工具进行部署

 2. 对创立利用进行配置点击立刻创立后,咱们进行利用的初始化配置。部署类型有两种:1. 通过第三方代码仓库部署,2. 间接部署两者区别就是应用本人的仓库代码后续能够通过 push 更新我的项目公布,而间接部署须要手动配置。这里就能够看到,咱们的交付触发也是以 Git 仓库 push 提交为主,每次提交会主动触发部署。如是本人配置利用,须要依据业务配置 s.yaml 文件,参考:https://www.serverless-devs.c… 这里我抉择 Gitee 仓库进行部署,然而须要进行仓库第三方利用的受权

 点击返回受权,跳转到 gitee 的站点进行 OAuth 受权申请,点击批准受权

 阿里用户在第一次应用 FC 函数计算时,须要对角色策略进行增加的,我这里曾经应用过 FC 了,若提醒须要增加策略,依照提醒点击增加即可。

 其余高级配置,须要依据业务进行批改,这里留神地区的选定,后续的其余弹性资源都会在此地区下,我这里抉择本地杭州。

  实现配置后点击创立,代码曾经新建上传到我的 Gitee 仓库了。这里提供的 s.yaml 能够作为配置的参考,后续依据所部署的业务去批改 yaml

 3. 利用部署上线

利用创立实现,首次主动进行部署,这里部署状态能够看到正在部署

 查看部署日志,如果部署呈现谬误也能够从日志信息中查问报错。

部署经验了前置环境、资源同步、资源查看、执行部署这四个步骤后,咱们的电商利用就实现了部署 

 首次部署实现,也是最新 latest 的一次部署版本,能够通过部署历史自在的进行回滚 

 4. 拜访部署上线的电商利用拜访测试的域名,就能够看到咱们上线的 litemall 电商零碎,进入电商利用的后盾治理 

 litemall 电商零碎是一个开源的前后端拆散带微信小程序的电商零碎,具备电商平台根底的会员治理、商城治理、商品治理、推广治理、系统管理、配置管理、统计报表。

 litemall 电商零碎,须要配置最小开发环境有以下:MySQLJDK1.8 或以上 MavenNodejs

   5. 更换业务域名拜访同样,当咱们失常上线了 FC 的业务时,Serverless 用的是默认拜访地址函数计算上线提供的域名是以..fc.aliyuncs.com//proxy///[action?queries] 为默认的,若是失常业务拜访咱们必然要批改拜访的域名。

 进入到函数计算 FC 的首页,点击高级性能下的域名治理,这里能够看到咱们上线电商利用时的默认域名曾经路由信息咱们抉择增加自定义域名 

 输出域名的名称,也就是购买备案的域名下的自定义二级域名点击路由配置,抉择服务名称,这里是咱们部署的电商零碎 litemall,选择函数名称与版本拷贝公网 CNAME 地址,后续在 DNS 域名管理处增加解析

 进入到域名治理下,增加一条记录,记录类型抉择 CNAME,输出主机记录,将刚刚拷贝的公网 CNAME 地址粘到记录值,点击增加即可

 回到函数计算 FC,在最初点击创立即可,回到主页看到咱们新绑定的域名

 最初,拿手机拜访我自定义配置的公网地址电商服务失常上线,公网地址失常拜访主页 

 商品的详情购买页面

  最初 Serverless 绝对其余计划来说,也是非常容易上手并高效的技术计划。下面的部署测试,其实还有很多须要改良的中央,例如第二个农产品电商上云我的项目,真正牢靠的云上业务还须要负载平衡、高可用多地容灾、平安等其余云产品的引入,我想把案例的重点放在 Serverless 服务器无感召上,自己也应用过不少阿里云的技术产品,深知对底层基础设施运维难度。尽管这几个月学习生存比拟忙碌,然而还是对社区的各种流动十分感兴趣,也想做一些更好的测试。这次的 Serverless 无论是对个人用户,还是企业用户。都是一种十分不错的抉择,弹性资源与按需付费,更加节俭资源与 Money,更加优雅!原文链接:http://click.aliyun.com/m/100… 本文为阿里云原创内容,未经容许不得转载。

正文完
 0