1. cookie获取
1.1 cookie
首先是cookie,这个想必大家都知道,我们登录一个网站后,再次访问如果不需要输入密码的话,那么就是cookie的帮助了.所以我们如果需要上传文件,那么就需要使用cookie.
1.2 获取
既然cookie这么重要,那么应该怎么获取呢?大多数的网站,都是通过客户端发送账号密码到服务器,然后服务器返回set-cookie,之后客户端根据set-cookie设置cookie,之后每次访问该网站的时候,都会把cookie传入.这样就不需要输入账号密码登录了.
但是这里有人会问,为什么有的网站登录一段时间后就需要重新登录呢?这里就需要说到cookie的时效性了,cookie大多数的网站都不是永久登录的,可能是浏览器关闭就失效,可能是1天失效,还有可能是30天等等.
这里简单看一下php的setcookie函数
1
| setcookie(name,value,expire,path,domain,secure)
|
参数 | 描述 |
---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。 |
path | 可选。规定 cookie 的服务器路径。 |
domain | 可选。规定 cookie 的域名。 |
secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 |
所以,cookie获取不是一次性就可以的,需要根据时间来获取.那么应该怎么获取呢?
目前其实就三种方法:
- 自己登录然后打开f12,选择Network,刷新网页,然后找到网站的请求(一般第一个),找到request headers内的cookie,然后就可以使用了.
- 通过逆向,获取账号密码加密的参数,之后模拟请求获取cookie
- 通过puppeteer/playwright/selenium等库模拟登录获取cookie
目前其实应该就这三种方法,其中1最简单,但是麻烦.2最方便但是难,所以我们选择3.
通过模拟浏览器进行cookie的获取.这里我们使用的是puppeteer.
如果只是单纯使用puppeteer模块的话,是不行的,这应该是会对浏览器指纹进行判断,所以我们这里要用到的是puppeteer-extra这个库.
通过puppeteer-extra这个库,我们可以让浏览器像正常的浏览器一样使用.之后再登录即可.
然后蓝奏云登录有一个滑动验证,这里也有两个方法可以通过,一个是模拟滑动,一个是通过JavaScript滑动,我比较倾向于模拟滑动.
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
| 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.3 使用
我们可以将cookie保存到文件中,然后通过python的with open读取该文件,然后发送请求即可.
2. 上传
上传这里我使用的是python,其实只用node.js也可以,或者只用python.
我们要用到的一个是requests库,一个是requests_toolbelt库,其中requests_toolbelt库是为了对文件进行处理,可以通过post将数据传递到服务器上.
1 2
| import requests from requests_toolbelt import MultipartEncoder
|
1 2 3 4 5 6 7 8 9 10
| 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", }
|
url为蓝奏云上传文件到服务器的php网址,我们只需要向它传值即可.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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)
|
这样,我们就可以将文件上传到蓝奏云服务器上了,但是node.js和python怎么整合到一块使用呢?