115网盘登陆、添加离线、删除离线任务、在线播放
115网盘mac客户端真的越来越难用了,几次更新,每次更新都比上一次更难用,比如播放器播放不能用,每次关闭浏览器都会自动登出,每次都要重新登陆,于是,我打算自己写个客户端,根据自己常用的功能实现如下功能:
1、网盘登陆
#------------引入区------------
import requests
import qrcode
import time
res=requests.session()
#------------常数区------------
cookie='UM_distinctid=1785f5f8836165-02b80bbf2951d-161c4e3d-1fa400-1785f5f8837a81; USERSESSIONID=bd910984c2d1067aa56333a69d1101e71d34887853581613d35ff95c6f6bef51; 115_lang=zh; acw_tc=784e2ca316241988154938853e545b63d5f2c98637e2981b44e180cf8d151a'
h={
'Host': 'qrcodeapi.115.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
#------------函数区------------
def qco(s):#生成登陆二维码
qr = qrcode.QRCode(
version=7,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4
)
qr.add_data(s)
qr.make(fit=True)
img = qr.make_image()
img.show()
img.save("test.png")
def login():#登陆
url='https://qrcodeapi.115.com/api/1.0/web/1.0/token?'
s=res.get(url,headers=h).json()['data']
uid=s['uid']
qco(s['qrcode'])
xxx=input('扫码后回车继续')#用input做个简单的暂停
sign=s['sign']
stat=0
tim=str(s['time'])
logs(uid)
def logs(uid):#把登陆后的cookie存入cookie.txt
d= "account="+uid+"&app=web"
h2={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': cookie
}
url='https://passportapi.115.com/app/1.0/web/1.0/login/qrcode'
s=res.post(url,d,headers=h2).json()['data']['cookie']
w=open('cookie.txt','w')
w.write(cookie+' ; UID='+s['UID']+'; CID='+s['CID']+'; SEID='+s['SEID'])
if __name__ == '__main__':
login()#主函数
2、 获取网盘内视频播放地址,并调用IInA播放,以及小文件下载
#-------------引入模块---------
import requests
import easygui as g
import re
import os
import time
from pyaria2 import Aria2RPC
#------------常数区------------
rpc=Aria2RPC()
cookie=open('cookie.txt','r').read()
res=requests.session()
h={
'Connection': 'keep-alive' ,
'Accept': 'application/json, text/javascript, */*; q=0.01' ,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56' ,
'Origin': 'https://115.com' ,
'Sec-Fetch-Site': 'same-site' ,
'Sec-Fetch-Mode': 'cors' ,
'Sec-Fetch-Dest': 'empty' ,
'Referer': 'https://115.com/' ,
'Accept-Language': 'zh-CN,zh;q=0.9' ,
'Cookie': cookie ,}
#------------函数区--------------
def getlist(cid):#获取目录列表
url='https://aps.115.com/natsort/files.php?aid=1&cid='+cid+'&o=file_name&asc=1&offset=0&show_dir=1&limit=1150&code=&scid=&snap=0&natsort=1&record_open_time=1&source=&format=json&fc_mix=0&type=&star=&is_share=&suffix=&custom_order='
s=res.get(url,headers=h).json()['data']
dic={}
for i in s:
if 'fid' in i.keys():
name=i['n']
pci = i['pc']
dic.update({name:[pci,1]})
else:
ci=i['cid']
name=i['n']
dic.update({name:[ci,0]})
return dic
def downlaod(s,scookie):#使用aria2下载
ck=scookie.replace('Max-Age=1800,','')+' ; '+cookie
h2=['User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56' ,'Cookie: '+ck]
opin = { "header": h2,}
print(ck)
rpc.addUri([s],opin)
def play(s):#调用IINA播放
ss = '/Applications/IINA.app/Contents/MacOS/IINA '
cmd = ss + s
os.system(cmd)
def downloadfile(pkey):#获取小文件下载地址
ts=str(int(time.time()*1000))
url='https://webapi.115.com/files/download?pickcode='+pkey+'&_='+ts
s=res.get(url,headers=h)
print(s.json())
fl=s.json()['file_url']
scookie=s.headers['Set-Cookie']#.split(';')[0]
downlaod(fl,scookie)
def lists(dics):#从根目录开始获取目录
dic=getlist(dics)
cho=g.choicebox('','',choices=dic.keys())
if cho!=None:
if dic[cho][1]==1:
#downloadfile(dic[cho][0]) 调用下载
url='https://v.anxia.com/site/api/video/m3u8/'+dic[cho][0]+'.m3u8'
x=res.get(url,headers=h).text
s=re.findall('(http\S+)',x)[-1]
play(s)
lists(dics)
else:
lists(dic[cho][0])
else:
lists('0')
if __name__ == '__main__':
lists('0')#主函数
3、添加离线资源、查看离线任务列表、删除离线任务
import time
import requests
from urllib.parse import quote
import easygui as g
#------------常数区------------
res=requests.session()
cookie=open('cookie.txt','r').read()
h={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 115Browser/24.1.0.13',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': cookie,
}
uid=''#你自己的uid
#------------函数区------------
def getsign():
ts = str(int(time.time()*1000))
url='https://115.com/?ct=offline&ac=space&_='+ts
s=res.get(url,headers=h).json()['sign']
return s
sign=getsign()
def deltask(hash):#删除任务
ts = str(int(time.time()))
d='hash%5B0%5D='+hash+'&flag=0&uid='+uid+'&sign='+sign+'&time='+ts
url='https://115.com/web/lixian/?ct=lixian&ac=task_del'
s=res.post(url,d,headers=h).json()
print(s)
def lixianlist():#离线列表
ts = str(int(time.time()))
url='https://115.com/web/lixian/?ct=lixian&ac=task_lists'
d='page=1&page_row=100&uid='+uid+'&sign='+sign+'&time='+ts
s=res.post(url,d,headers=h).json()['tasks']
try:
dic={}
for i in s:
name=i['name']
has=i['info_hash']
dic.update({name:has})
return dic
except:
return {}
def lixian(path):#添加离线任务
ts=str(int(time.time()))
url='https://115.com/web/lixian/?ct=lixian&ac=add_task_url'
mag=quote(path)
d='url='+mag+'&savepath=&wp_path_id=&uid='+uid+'&sign='+sign+'&time='+ts
s=res.post(url,d,headers=h).json()
if s['state']==True:
g.msgbox('成功')
else:
g.msgbox(s['error_msg'])
def mai():
c=g.choicebox('','',choices=['添加离线','离线列表','删除离线'])
if c=='添加离线':
mag=g.enterbox('输入离线链接')
lixian(mag)
elif c=='离线列表':
x=lixianlist()
g.choicebox('','',choices=x.keys())
elif c=='删除离线':
dic = lixianlist()
cho = g.choicebox('', '', choices=dic.keys())
deltask(dic[cho])
else:
exit()
if __name__ == '__main__':
mai()#主函数
总结
实际上这些功能都是网页版网盘的功能,离线任务添加、删除离线任务、视频在线播放、一些小文件的下载,但是大些的文件无法下载,大文件下载在客户端进行了加密处理,还是得用客户端下载
老魏的公众号,会发布一些自己的爬虫心得和爬虫案例,欢迎大家一起来交流