通过node.js+python实现蓝奏云上传服务

4/21/2022 nodejspython

# 1. cookie获取

首先是cookie,这个想必大家都知道,我们登录一个网站后,再次访问如果不需要输入密码的话,那么就是cookie的帮助了.所以我们如果需要上传文件,那么就需要使用cookie.

# 1.2 获取

既然cookie这么重要,那么应该怎么获取呢?大多数的网站,都是通过客户端发送账号密码到服务器,然后服务器返回set-cookie,之后客户端根据set-cookie设置cookie,之后每次访问该网站的时候,都会把cookie传入.这样就不需要输入账号密码登录了. 但是这里有人会问,为什么有的网站登录一段时间后就需要重新登录呢?这里就需要说到cookie的时效性了,cookie大多数的网站都不是永久登录的,可能是浏览器关闭就失效,可能是1天失效,还有可能是30天等等. 这里简单看一下php的setcookie函数

setcookie(name,value,expire,path,domain,secure)
1
参数 描述
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的有效期。
path 可选。规定 cookie 的服务器路径。
domain 可选。规定 cookie 的域名。
secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

所以,cookie获取不是一次性就可以的,需要根据时间来获取.那么应该怎么获取呢? 目前其实就三种方法:

  1. 自己登录然后打开f12,选择Network,刷新网页,然后找到网站的请求(一般第一个),找到request headers内的cookie,然后就可以使用了.
  2. 通过逆向,获取账号密码加密的参数,之后模拟请求获取cookie
  3. 通过puppeteer/playwright/selenium等库模拟登录获取cookie

目前其实应该就这三种方法,其中1最简单,但是麻烦.2最方便但是难,所以我们选择3. 通过模拟浏览器进行cookie的获取.这里我们使用的是puppeteer. 如果只是单纯使用puppeteer模块的话,是不行的,这应该是会对浏览器指纹进行判断,所以我们这里要用到的是puppeteer-extra这个库. 通过puppeteer-extra这个库,我们可以让浏览器像正常的浏览器一样使用.之后再登录即可.

然后蓝奏云登录有一个滑动验证,这里也有两个方法可以通过,一个是模拟滑动,一个是通过JavaScript滑动,我比较倾向于模拟滑动.

const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async ()=>{
    let browser = await puppeteer.launch({
        headless: false,
        args: [
            `--proxy-server=127.0.0.1:7890`,
            "--disable-gpu",
            "--no-sandbox",
            "--disable-setuid-sandbox",
        ],
    })
    let page = await browser.newPage();
    await page.goto('https://pc.woozooo.com/');
    await page.waitForTimeout(1000);
    await page.click(".y6");
    await page.waitForTimeout(1000);
    await page.type("#username", "123");
    await page.type(".pwd", "123");
    await page.waitForTimeout(1000);
    const btn = await page.$('.nc_iconfont.btn_slide');
    let box = await btn.boundingBox();
    await page.mouse.move(box.x+5, box.y+5)
    await page.mouse.down()
    await page.mouse.move(box.x+70, box.y+3, {steps: 30})
    await page.mouse.move(box.x+150, box.y+5, {steps: 30})
    await page.mouse.move(box.x+250, box.y+2, {steps: 30})
    await page.mouse.up()
    await page.waitForTimeout(1000);
    await page.click("#s3");
    await page.waitForTimeout(1000);
    console.log(await page.cookies())
    console.log(await page.title());
    await browser.close();
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 1.3 使用

我们可以将cookie保存到文件中,然后通过python的with open读取该文件,然后发送请求即可.

# 2. 上传

上传这里我使用的是python,其实只用node.js也可以,或者只用python. 我们要用到的一个是requests库,一个是requests_toolbelt库,其中requests_toolbelt库是为了对文件进行处理,可以通过post将数据传递到服务器上.

import requests
from requests_toolbelt import MultipartEncoder
1
2
url = "https://pc.woozooo.com/fileup.php"
headers = {
    "accept": "*/*",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
    "cache-control": "no-cache",
    "pragma": "no-cache",
    "referer": "https://pc.woozooo.com",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
}
1
2
3
4
5
6
7
8
9
10

url为蓝奏云上传文件到服务器的php网址,我们只需要向它传值即可.

m = MultipartEncoder(
    fields={
        "task": "1",
        "ve": "2",
        "id": "WU_FILE_5",
        "name": "名字",
        "type": "application/pdf",
        "lastModifiedDate": "Fri Mar 18 2022 22:31:14 GMT+0800 (中国标准时间)",
        "size": "42671023",
        "folder_id_bb_n": "-1",
        "upload_file": ("文件名", open("文件名", 'rb'), 'application/octet-stream'),
    }
)
headers['Content-Type'] = m.content_type
res = requests.post(url, headers=headers, proxies=proxies, data=m)
print(res.text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

这样,我们就可以将文件上传到蓝奏云服务器上了,但是node.js和python怎么整合到一块使用呢?