節點網站(B站每日自動簽到)

什麼是函數?剛剛考完數學沒多久的我,腦力裡立馬想到的是自變量、因變量、函數值,也就是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/document/group/message-types-and-data-format
# 註意機器人的關鍵詞
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服務上雲與靜態資源CDNRedis服務上雲,前文也提到瞭,這裡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.com/fc/yaml/readme這裡我選擇Gitee倉庫進行部署,但是需要進行倉庫第三方應用的授權點擊前往授權,跳轉到gitee的站點進行OAuth授權請求,點擊同意授權阿裡用戶在第一次使用FC函數計算時,需要對角色策略進行添加的,我這裡已經使用過FC瞭,若提示需要添加策略,按照提示點擊添加即可。其他高級配置,需要根據業務進行修改,這裡註意地域的選定,後續的其他彈性資源都會在此地域下,我這裡選擇本地杭州。完成配置後點擊創建,代碼已經新建上傳到我的Gitee倉庫瞭。這裡提供的s.yaml可以作為配置的參考,後續根據所部署的業務去修改yaml3.應用部署上線應用創建完成,首次自動進行部署,這裡部署狀態可以看到正在部署查看部署日志,如果部署出現錯誤也可以從日志信息中查詢報錯。部署經歷瞭前置環境、資源同步、資源檢查、執行部署這四個步驟後,我們的電商應用就完成瞭部署首次部署完成,也是最新latest的一次部署版本,可以通過部署歷史自由的進行回滾4.訪問部署上線的電商應用訪問測試的域名,就可以看到我們上線的litemall電商系統,進入電商應用的後臺管理litemall電商系統是一個開源的前後端分離帶微信小程序的電商系統,具有電商平臺基礎的會員管理、商城管理、商品管理、推廣管理、系統管理、配置管理、統計報表。litemall電商系統,需要配置最小開發環境有以下:MySQLJDK1.8或以上MavenNodejs5.更換業務域名訪問同樣,當我們正常上線瞭FC的業務時,Serverless用的是默認訪問地址函數計算上線提供的域名是以..http://fc.aliyuncs.com//proxy///[action?queries]為默認的,若是正常業務訪問我們必然要修改訪問的域名。進入到函數計算FC的首頁,點擊高級功能下的域名管理,這裡可以看到我們上線電商應用時的默認域名已經路由信息我們選擇添加自定義域名輸入域名的名稱,也就是購買備案的域名下的自定義二級域名點擊路由配置,選擇服務名稱,這裡是我們部署的電商系統litemall,選擇函數名稱與版本拷貝公網CNAME地址,後續在DNS域名管理處添加解析進入到域名管理下,添加一條記錄,記錄類型選擇CNAME,輸入主機記錄,將剛剛拷貝的公網CNAME地址粘到記錄值,點擊添加即可回到函數計算FC,在最後點擊創建即可,回到主頁看到我們新綁定的域名最後,拿手機訪問我自定義配置的公網地址電商服務正常上線,公網地址正常訪問主頁商品的詳情購買頁面最後Serverless相對其他方案來說,也是非常容易上手並高效的技術方案。上面的部署測試,其實還有很多需要改進的地方,例如第二個農產品電商上雲項目,真正可靠的雲上業務還需要負載均衡、高可用多地容災、安全等其他雲產品的引入,我想把案例的重點放在Serverless服務器無感化上,本人也使用過不少阿裡雲的技術產品,深知對底層基礎設施運維難度。雖然這幾個月學習生活比較繁忙,但是還是對社區的各種活動非常感興趣,也想做一些更好的測試。這次的Serverless無論是對個人用戶,還是企業用戶。都是一種非常不錯的選擇,彈性資源與按需付費,更加節省資源與Money,更加優雅!原文鏈接:http://click.aliyun.com/m/1000350415/本文為阿裡雲原創內容,未經允許不得轉載。


本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.xiaosb.com/beian/51533/