吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7562|回复: 15
收起左侧

[Python 原创] [Python] tk & json 做的GUI 人人影视下载资源解析

[复制链接]
bluerabbit 发表于 2019-8-10 15:54
本帖最后由 bluerabbit 于 2019-11-19 13:08 编辑

这几天在学tkinter,看到论坛里的这个帖子 https://www.52pojie.cn/thread-1003791-1-1.html,学习了一下觉得有可以改进的地方,于是自己动手写了一个,其中的api还是借鉴原帖
好了,不多说了,直接上code,大家发现有什么不足请指出来,一起提高

11.19 : 今天翻出刚学 tkinter 时写的这个程序,觉得好幼稚,于是重新改写了一遍。

[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'人人影视下载资源解析'

from tkinter import *
import tkinter.messagebox as messagebox
import requests
import json
import pyperclip

class YYets:

    def __init__(self, master):
        self.master = master
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'}
        self.api_search = 'http://pc.zmzapi.com/index.php?g=api/pv3&m=index&client=5&accesskey=519f9cab85c8059d17544947k361a827&a=search&uid=&token=&page=1&limit=30&k='
        self.api_get = 'http://pc.zmzapi.com/index.php?g=api/pv3&m=index&client=5&accesskey=519f9cab85c8059d17544947k361a827&a=resource&uid=undefined&token=undefined&id='
        self.listboxes = {}
        self.initWidgets()
    
    def initWidgets(self):
        #影剧搜索框、影剧搜索结果提示
        frame = Frame(self.master)
        frame.pack(expand=True, fill=BOTH, padx=10, pady=10, side=TOP)
        self.entry = Entry(frame, width=30, font=('simkai', 12), foreground='red')
        self.entry.pack(expand=True, fill=X, padx=0, pady=0, side=LEFT)
        self.entry.bind('<Return>', self.searchDrama)
        self.entry.insert(0, '关键词')
        self.entry.selection_range(0, END)
        self.entry.focus_set()
        self.sr = StringVar()
        Label(frame, textvariable=self.sr, background='green', foreground='white', font=('simkai', 12), width=16, justify=CENTER).pack(expand=True, fill=X, padx=30, pady=0, side=LEFT)
        #影剧搜索详细结果
        frame = Frame(self.master)
        frame.pack(expand=True, fill=BOTH, padx=10, pady=0, side=TOP)
        self.srlist = StringVar()
        listbox = Listbox(frame, listvariable=self.srlist, background='lightgreen', font=('simkai', 12), exportselection=False)
        listbox.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        listbox.bind('<Double-Button-1>', self.chooseDrama)
        listbox.bind('<Return>', self.chooseDrama)
        scrollbar = Scrollbar(frame)
        scrollbar.pack(fill=Y, padx=0, pady=0, side=RIGHT)
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)
        self.listboxes['drama'] = listbox
        #影剧季集title
        self.videotitle = StringVar()
        Label(self.master, textvariable=self.videotitle, background='green', foreground='white', font=('simkai', 12), justify=CENTER).pack(expand=True, fill=X, padx=10, pady=10, side=TOP)
        #季、集、资源选择
        topframe = Frame(self.master)
        topframe.pack(expand=True, fill=BOTH, padx=10, pady=0, side=TOP)
        #季
        frame = Frame(topframe)
        frame.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        self.seasonlist = StringVar()
        listbox = Listbox(frame, listvariable=self.seasonlist, background='lightgreen', font=('simkai', 10), width=10, exportselection=False)
        listbox.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        listbox.bind('<Double-Button-1>', self.chooseSeason)
        listbox.bind('<Return>', self.chooseSeason)
        scrollbar = Scrollbar(frame)
        scrollbar.pack(fill=Y, padx=0, pady=0, side=RIGHT)
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)
        self.listboxes['season'] = listbox
        #集
        frame = Frame(topframe)
        frame.pack(expand=True, fill=BOTH, padx=10, pady=0, side=LEFT)
        self.episodelist = StringVar()
        listbox = Listbox(frame, listvariable=self.episodelist, background='lightgreen', font=('simkai', 10), width=10, exportselection=False)
        listbox.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        listbox.bind('<Double-Button-1>', self.chooseEpisode)
        listbox.bind('<Return>', self.chooseEpisode)
        scrollbar = Scrollbar(frame)
        scrollbar.pack(fill=Y, padx=0, pady=0, side=RIGHT)
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)
        self.listboxes['episode'] = listbox
        #资源
        frame = Frame(topframe)
        frame.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        self.srclist = StringVar()
        listbox = Listbox(frame, listvariable=self.srclist, background='lightgreen', font=('simkai', 10), width=50, height=14, exportselection=False)
        listbox.bind('<Double-Button-1>', self.copySrc)
        listbox.bind('<Return>', self.copySrc)
        scrollbar = Scrollbar(frame)
        scrollbar.pack(fill=Y, padx=0, pady=0, side=RIGHT)
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)
        scrollbar = Scrollbar(frame, orient=HORIZONTAL)
        scrollbar.pack(fill=X, padx=0, pady=0, side=BOTTOM)
        listbox.config(xscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.xview)
        listbox.pack(expand=True, fill=BOTH, padx=0, pady=0, side=LEFT)
        self.listboxes['src'] = listbox
        #空白
        frame = Frame(self.master)
        frame.pack(expand=True, fill=BOTH, padx=10, pady=5, side=BOTTOM)

    def searchDrama(self, event):
        if self.entry.get() == '':
            messagebox.showwarning(sys._getframe().f_code.co_name, '关键词缺失')
        else:
            self.sr.set('')
            self.srlist.set('')
            self.videotitle.set('')
            self.seasonlist.set('')
            self.episodelist.set('')
            self.srclist.set('')
            try:
                response = requests.get(self.api_search+self.entry.get(), headers=self.headers)
                if response.status_code != 200:
                    response.raise_for_status()
            except Exception as e:
                messagebox.showwarning('影视', e)
            else:
                result = json.loads(response.text)
                self.ids = list(map(lambda i: result['data'][i]['id'], range(len(result['data']))))
                self.sr.set('查询结果:%d项' % len(result['data']))
                self.srlist.set(list(map(lambda i: '%d.[%s].%s (%s)' % (i, result['data'][i]['channel_cn'], result['data'][i]['cnname'], result['data'][i]['enname']), range(len(result['data'])))))
                #如果列表中只有一项,则自动选中
                if self.listboxes['drama'].size() == 1:
                    self.listboxes['drama'].selection_set(0)
                    self.chooseDrama()

    def chooseDrama(self, event='<Double-Button-1>'):
        try:
            drama_chosen = self.listboxes['drama'].get(ACTIVE)
        except:
            messagebox.showwarning(sys._getframe().f_code.co_name, '未选择影剧')
        else:
            self.seasonlist.set('')
            self.episodelist.set('')
            self.srclist.set('')
            drama_id = self.ids[int(drama_chosen[:drama_chosen.index('.')])]
            self.drama = drama_chosen[drama_chosen.index('.')+1:]
            self.videotitle.set(self.drama)
            try:
                response_drama = requests.get(self.api_get+str(drama_id), headers=self.headers)
                if response_drama.status_code != 200:
                    response_drama.raise_for_status()
            except Exception as e:
                messagebox.showwarning(sys._getframe().f_code.co_name, e)
            else:
                self.parseDrama(response_drama)

    def parseDrama(self, response_drama):
        result_drama = json.loads(response_drama.text)
        if result_drama['info'] in ['暂无资源', '资源关闭']:
            messagebox.showwarning(sys._getframe().f_code.co_name, result_drama['info'])
            return
        season_names = []
        episode_names = []
        self.season_episodes = {}
        self.src = {}
        try:
            for list in result_drama['data']['list']:
                episodes = list['episodes']
                if episodes:
                    #正常情况,episodes是一个列表
                    #特殊情况,"episodes": null,则跳过
                    season_name = list['season_name']
                    season_names.append(season_name)
                    for j in range(len(episodes)):
                        episode_name = episodes[j]['episode_name']
                        episode_names.append(episode_name)
                        self.src[season_name+episode_name] = []
                        files = episodes[j]['files']
                        for fileformat in files:
                            if fileformat == 'yyets':
                                src_address = files[fileformat]['name']
                                self.src[season_name+episode_name].append(src_address)
                            else:
                                for filesrc in files[fileformat]:
                                    src_address = filesrc['address']
                                    src_passwd = filesrc['passwd']
                                    if src_passwd:
                                        self.src[season_name+episode_name].append(src_address + '   pw: ' + src_passwd)
                                    else:
                                        self.src[season_name+episode_name].append(src_address)
                    self.season_episodes[season_name] = episode_names
            self.seasonlist.set(season_names)
            #如果列表中只有一项,则自动选中
            if self.listboxes['season'].size() == 1:
                self.listboxes['season'].selection_set(0)
                self.chooseSeason()
        except Exception as e:
            messagebox.showwarning(sys._getframe().f_code.co_name, e)

    def chooseSeason(self, event='<Double-Button-1>'):
        try:
            self.season_chosen = self.listboxes['season'].get(ACTIVE)
        except:
            messagebox.showwarning(sys._getframe().f_code.co_name, '未选择“季”')
        else:
            self.episodelist.set('')
            self.srclist.set('')
            self.videotitle.set(self.drama + '.' + self.season_chosen)
            self.episodelist.set(self.season_episodes[self.season_chosen])
            #如果列表中只有一项,则自动选中
            if self.listboxes['episode'].size() == 1:
                self.listboxes['episode'].selection_set(0)
                self.chooseEpisode()

    def chooseEpisode(self, event='<Double-Button-1>'):
        try:
            episode_chosen = self.listboxes['episode'].get(ACTIVE)
        except:
            messagebox.showwarning(sys._getframe().f_code.co_name, '未选择“集”')
        else:
            self.srclist.set('')
            self.videotitle.set(self.drama + '.' + self.season_chosen + '.' + episode_chosen)
            if self.src[self.season_chosen+episode_chosen]:
                self.srclist.set(self.src[self.season_chosen+episode_chosen])
            else:
                self.srclist.set('not found')

    def copySrc(self, event='<Double-Button-1>'):
        try:
            src_chosen = self.listboxes['src'].get(ACTIVE)
        except:
            messagebox.showwarning(sys._getframe().f_code.co_name, '未选择资源')
        else:
            pyperclip.copy(src_chosen)
            messagebox.showinfo(sys._getframe().f_code.co_name, '%s\n\n已复制至剪贴板' % src_chosen)

if __name__ == '__main__':
    root = Tk()
    root.resizable(width=False, height=False)
    root.title('人人影视下载资源解析')
YYets(root)
    root.update_idletasks()
    width, height = (root.winfo_width(), root.winfo_height())
    screenwidth, screenheight = (root.winfo_screenwidth(), root.winfo_screenheight())
    size_loc = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2-30)
    root.geometry(size_loc)
    root.mainloop()


yyets.jpg

gui_yyets.rar (2.72 KB, 下载次数: 223)

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
ymhld + 1 + 1 用心讨论,共获提升!
npuxin + 1 谢谢@Thanks!
liuhu1210 + 1 + 1 谢谢@Thanks!
tuziang + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

anyedefeng 发表于 2020-1-19 16:13
感谢大佬开源,代码风格和UI交互风格实在是太赞了,向大佬学习。
在实际使用中我发现了一些bug和一些不方便的地方,并且自己做了修正,以下是我修正后的代码:
https://www.52pojie.cn/thread-1092904-1-1.html
ymhld 发表于 2020-1-20 14:52
  File "人人影视解析.py", line 232
    root.update_idletasks()
    ^
IndentationError: unexpected indent
叼烟的声音 发表于 2019-8-10 16:09
jiangyu_2006 发表于 2019-8-10 16:41
学习了,谢谢楼主分享
爱吃香蕉的男生 发表于 2019-8-10 17:40
先收藏看看
dujuan 发表于 2019-8-10 17:42
感谢分享,收藏学习
凯咪 发表于 2019-8-10 18:40
感谢大佬开源
ad53063 发表于 2019-11-18 20:30
这个方法好的。立即下一个试试效果。
wwel 发表于 2019-11-22 09:34
下一个试试看,谢
npuxin 发表于 2019-11-24 16:56
怎么打开???
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表