构造一个自己的115客户端

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()#主函数

总结

实际上这些功能都是网页版网盘的功能,离线任务添加、删除离线任务、视频在线播放、一些小文件的下载,但是大些的文件无法下载,大文件下载在客户端进行了加密处理,还是得用客户端下载

老魏的公众号,会发布一些自己的爬虫心得和爬虫案例,欢迎大家一起来交流
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值