溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript復(fù)原B站頭圖實(shí)例分析

發(fā)布時(shí)間:2022-08-17 10:11:00 來源:億速云 閱讀:161 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“JavaScript復(fù)原B站頭圖實(shí)例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JavaScript復(fù)原B站頭圖實(shí)例分析”吧!

如何抓取B站的請求

自動(dòng)的前提是手動(dòng),所以我們要先了解如何手動(dòng)操作才可以更換個(gè)人空間頭圖(此功能需要B站的大會(huì)員),打開B站你的個(gè)人空間,點(diǎn)擊頭圖右上角的這個(gè)區(qū)域更換皮膚

JavaScript復(fù)原B站頭圖實(shí)例分析

在網(wǎng)頁底部會(huì)彈出更換頭圖的操作面板,上傳任意圖片作為頭圖的功能只有大會(huì)員才有。

JavaScript復(fù)原B站頭圖實(shí)例分析

接下來常規(guī)操作,我們按下F12打開調(diào)試面板,切換到network標(biāo)簽,此時(shí)我們上傳一張圖片,就可以抓取到這個(gè)上傳頭圖的接口了

https://space.bilibili.com/ajax/topphoto/uploadTopPhotov2

JavaScript復(fù)原B站頭圖實(shí)例分析

點(diǎn)擊鼠標(biāo)右鍵,選擇Copy -> Copy as Node.js fetch

JavaScript復(fù)原B站頭圖實(shí)例分析

打開VSCode粘貼

fetch("https://space.bilibili.com/ajax/topphoto/uploadTopPhotov2", { "headers": {  "accept": "application/json, text/plain, */*",  "accept-language": "zh-CN,zh;q=0.9",  "content-type": "application/x-www-form-urlencoded",  "sec-ch-ua": "\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\"",  "sec-ch-ua-mobile": "?0",  "sec-ch-ua-platform": "\"macOS\"",  "sec-fetch-dest": "empty",  "sec-fetch-mode": "cors",  "sec-fetch-site": "same-origin",  "cookie": "",  "Referer": "https://space.bilibili.com/422646817",  "Referrer-Policy": "no-referrer-when-downgrade"  },  "body": "topphoto=xxxxxx&csrf=xxxxxx",  "method": "POST"});

然后我們新建一個(gè)nodejs的項(xiàng)目,安裝一下node-fetch

//如果你的環(huán)境支持ESModule,那么使用importimport fetch from 'node-fetch';
//如果是用require導(dǎo)入
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

現(xiàn)在你已經(jīng)可以把剛才的上傳圖片的操作通過代碼完成了,那么這一堆參數(shù)里,我們需要注意哪些呢?

  • cookie

用戶身份校驗(yàn)的參數(shù),我們主要會(huì)用到bili_jct,SESSDATADedeUserID, DedeUserID__ckMd5

  • body

topphoto為圖片base64編碼的數(shù)據(jù),csrf就是bili_jct

如果是自己用,那么你只需要生成圖片并轉(zhuǎn)為base64編碼后通過topphoto參數(shù)提交給B站接口就可以了

在nodejs里生成圖片

在網(wǎng)頁里生成圖片大概率你知道要用canvas,比如我在碼上掘金里寫的這個(gè)demo。代碼片段

其實(shí)在node環(huán)境里生成圖片,也有一個(gè)canvas的庫可以用。

npm install canvas

這個(gè)庫在不同的系統(tǒng)下還需要安裝不同的底層繪制庫。

# MacOS X`brew install pkg-config cairo pango libpng jpeg giflib librsvg`
# Linux`sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev`

因?yàn)槲也挥脀indows,所以windows的小伙伴自己去看官方的安裝說明吧github.com/Automattic/…

使用這個(gè)庫繪圖的API設(shè)計(jì)和網(wǎng)頁canvas基本相同。

//導(dǎo)入canvas庫里的三個(gè)方法const { createCanvas, loadImage ,registerFont } = require('canvas');
//B站頭圖的建議尺寸是2560x400
const canvasSize = {w:2560,h:400};
//創(chuàng)建畫布const canvas = createCanvas(canvasSize.w, canvasSize.h);
//獲得畫布的繪制對象
const ctx = canvas.getContext('2d');
async function painting(){ 
    //添加背景圖 
    const bgImage = await loadImage('bg.jpg'); 
    //將圖片繪制到畫布的0,0坐標(biāo),并設(shè)置寬和高 
    ctx.drawImage(bgImage, 0, 0, canvasSize.w, canvasSize.h); 
}
painting();

有了背景圖,現(xiàn)在我們加入文字

//注冊字體
registerFont('digit.ttf', { family: 'digit' });
//設(shè)置文字顏色和字號,字體
ctx.fillStyle = "#e6433a";
ctx.font = '97px digit';
let txt = "HELLO"
//計(jì)算文字尺寸
let size = ctx.measureText(txt);
//將文字繪制到指定坐標(biāo)
ctx.fillText(txt, 0, 0);

何同學(xué)頭圖里的文字是有垂直方向上的傾斜的,這個(gè)在canvas中也可以實(shí)現(xiàn)

//設(shè)置接下來傾斜的原點(diǎn)為文字的左上角ctx.translate(txt_x, txt_y);
/*
transform(a,b,c,d,e,f)a 水平縮放繪圖b 水平傾斜繪圖c 垂直傾斜繪圖d 垂直縮放繪圖e 水平移動(dòng)繪圖f 垂直移動(dòng)繪圖
*/
ctx.transform(1,-0.3,0,1,0,0);

接下來使用canvas.toDataURL("image/png")就可以將畫布轉(zhuǎn)換為base64編碼的數(shù)據(jù)了,這里需要注意一下,B站頭圖接口中的topphoto參數(shù)是不需要前面22個(gè)字符的圖片頭信息,所以我們還要截取一下

canvas.toDataURL("image/png").substring(22);

當(dāng)然,你現(xiàn)在并不能確定咱們生成的圖片是否正確,所以你也可以將圖片保存成本地文件先看看是不是對了

fs.writeFileSync("test.png",canvas.toBuffer());

獲得用戶最新的投稿計(jì)算日子

通過接口https://api.bilibili.com/x/space/arc/search可以抓取指定用戶的投稿視頻

//pn為頁數(shù),ps為每頁條數(shù),order=pubdate代表按發(fā)布時(shí)間返回?cái)?shù)據(jù)
fetch("https://api.bilibili.com/x/space/arc/search?mid="+DEDEUSERID+"&pn=1&ps=1&order=pubdate&jsonp=jsonp");

在每條視頻的信息里,created屬性代表了發(fā)布時(shí)間(單位:秒),我們需要計(jì)算一下這個(gè)時(shí)間和當(dāng)前系統(tǒng)的時(shí)間差并轉(zhuǎn)換為天為單位

//計(jì)算兩個(gè)日期相差的天數(shù)
const diffDays = (date, otherDate) => Math.ceil(Math.abs(date - otherDate) / (1000 * 60 * 60 * 24));

Github Action定時(shí)任務(wù)

Github ActionGithub提供的虛擬容器服務(wù),通俗點(diǎn)說就是免費(fèi)給你一臺(tái)云服務(wù)器,這個(gè)云服務(wù)器的系統(tǒng)是什么,具備哪些代碼運(yùn)行環(huán)境通通都可以根據(jù)配置自定義。我們通過github的工作流workflow來使用它,有趣的是,我們還可以給它設(shè)置定時(shí)任務(wù)來定期運(yùn)行我們的工作流,執(zhí)行我們寫好的代碼,生成圖片上傳一氣呵成!完全免費(fèi)!

打開終端/命令行,在git項(xiàng)目目錄下新建目錄并創(chuàng)建schedule.yml配置文件

mkdir .github
mkdir .github/workflows
touch .github/workflows/schedule.yml

schedule.yml配置

# 這個(gè)工作流的名稱
name: CI

# 工作流什么時(shí)候可以運(yùn)行
on:
  # Schedule就是定時(shí)任務(wù),由于服務(wù)在國外,所以時(shí)間需要減去8小時(shí)才是北京時(shí)間
  schedule:
    - cron: '0 16 * * *'
  # 也允許這個(gè)工作流在github aciton面板中手動(dòng)觸發(fā)
  workflow_dispatch:

# 工作流內(nèi)有哪些任務(wù)
jobs:
  # 此工作流包含一個(gè)任務(wù)名為build
  build:
    # 安裝最新的ubuntu系統(tǒng)
    runs-on: ubuntu-latest

    # 此任務(wù)重包含的子任務(wù)/步驟
    steps:
      # 拉取最新的代碼
      - uses: actions/checkout@v2

      # 安裝好Nodejs的運(yùn)行環(huán)境
      - name: Setup Node.js environment
        uses: actions/setup-node@v2.4.0

       # 安裝好node canvas必備的系統(tǒng)繪圖庫
      - name: Setup Basically Packages
        run:
          sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev

       # 安裝好我們自己項(xiàng)目的依賴包
      - name: Install NPM dependencies
        run: 
          npm install

       # 執(zhí)行我們自己的代碼
      - name: Run
        run:
          node index.js "${{secrets.BILI_JCT}}" "${{secrets.SESSDATA}}" "${{secrets.DEDEUSERID}}" "${{secrets.DEDEUSERID__CKMD5}}"

配置這樣就結(jié)束了,在北京時(shí)間每天的零點(diǎn)(美國時(shí)間16點(diǎn))就會(huì)自動(dòng)生成頭圖并上傳啦。

配置中的secrets.xxx是我們代碼運(yùn)行時(shí)攜帶的參數(shù),為了讓大家更方便的fork此開源倉庫,所以我將四個(gè)B站用戶身份所對應(yīng)的參數(shù)設(shè)置成了可自定義的。這種secrets的參數(shù)在接受自定義的同時(shí)還能保護(hù)其在Github不被泄露。

步驟1:

fork本倉庫

JavaScript復(fù)原B站頭圖實(shí)例分析

步驟2:

Chrome瀏覽器打開B站,進(jìn)入自己的個(gè)人空間,按下F12,切換到application標(biāo)簽

JavaScript復(fù)原B站頭圖實(shí)例分析

Cookie中找到這四個(gè)參數(shù),然后打開自己分支倉庫,點(diǎn)擊Settings,進(jìn)入Secrets,點(diǎn)擊New repository secret將四個(gè)參數(shù)一一配置好

JavaScript復(fù)原B站頭圖實(shí)例分析

步驟3:

手動(dòng)執(zhí)行一次工作流,以后就可以自動(dòng)定時(shí)運(yùn)行了!

JavaScript復(fù)原B站頭圖實(shí)例分析

到此,相信大家對“JavaScript復(fù)原B站頭圖實(shí)例分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI