#coding=utf-8
from bs4 import BeautifulSoup
import wx
import re
import urllib.request
import urllib.parse
import ssl
import wx
import io
import json
import http.cookiejar
import requests
import datetime
import os
import time
import win32api
class GETHTTP(wx.Frame):
download_path = os.getcwd() + "\download"
def __init__(self, parent, title):
super(GETHTTP, self).__init__(parent, title=title, size=(600, 600),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
panel = wx.Panel(self)
#self.SetMaxClientSize((600,600))
vbox = wx.BoxSizer(wx.VERTICAL)
exeName = win32api.GetModuleFileName(win32api.GetModuleHandle(None))
self.icon = wx.Icon(exeName, wx.BITMAP_TYPE_ICO)
self.SetIcon(self.icon)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.l1 = wx.StaticText(panel, -1, "微吼ID:")
hbox1.Add(self.l1,wx.ALIGN_CENTER| wx.ALL , 5)
self.t1 = wx.TextCtrl(panel, value="349644211")#349644211,259006896
hbox1.Add(self.t1, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
self.passtxt = wx.StaticText(panel, -1, "播放密码:")
hbox1.Add(self.passtxt,wx.ALIGN_CENTER| wx.ALL , 5)
self.passwd = wx.TextCtrl(panel,value = "weaver2018")
hbox1.Add(self.passwd,1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL,5 )
self.button = wx.Button(panel, -1, "确定")
hbox1.Add(self.button, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
self.button.Bind(wx.EVT_BUTTON, self.Onbind)
vbox.Add(hbox1)
hbox2 =
wx.BoxSizer(wx.HORIZONTAL)
self.filenamestaic = wx.StaticText(panel, -1, "文件保存名:")
hbox2.Add(self.filenamestaic, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
self.filename = wx.TextCtrl(panel)
hbox2.Add(self.filename, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
vbox.Add(hbox2)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
self.resultTc = wx.TextCtrl(panel,size = (600,600),style= wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_PROCESS_ENTER)
hbox3.Add(self.resultTc, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
vbox.Add(hbox3)
panel.SetSizer(vbox)
self.Center()
self.Show()
self.Fit()
def Onbind(self,event):
if(self.filename.Value == ""):
self.echo("请输入文件名称")
return ""
btn = event.GetEventObject()
label = btn.GetLabel()
id = self.t1.Value
try :
html = self.getHtml("http://live.vhall.com/"+id)
index = html.find("'streamname':'")
streamname = ""
if index == -1:
result = self.getLogin(id)
if result == "0" :
return
else:
streamname = self.getSteanme(result)
else:
streamname = self.getSteanme(html)
self.echo("地址流获取成功:"+streamname+"\n开始下载:")
tsurl = self.GetTsUrl(streamname)
self.dowTs(tsurl)
except :
self.echo("终止")
def dow(self,url):
res = requests.get(url, timeout=2)
with open(self.download_path + "\\" + url.split("/")[-1], 'ab') as f
:
self.echo(url.split("/")[-1] + "-下载完成")
f.write(res.content)
f.flush()
def dowTs(self,tsurl):
for url in tsurl:
self.dow(url)
#jobs = [gevent.spawn(self.dow, url) for url in tsurl]
# gevent.joinall(jobs, timeout=2)
'''res = requests.get(pd_url, timeout=5)
# self.echo(filename)
with open(self.download_path + "\\" + filename, 'ab') as f:
print(c_fule_name + "-下载完成,共有" + length + "片段")
f.write(res.content)
f.flush()'''
def getSteanme(self,str):
start = str.rfind("'streamname':'")
end = str.rfind("msg_url")
str = str[start:end]
str = str[str.find("//"):str.rfind("m3u8")]
return "http:" + str + "m3u8"
def getHtml (self,url):
html = urllib.request.urlopen(url).read()
html = html.decode("utf-8")
return html
def echo(self,str):
self.resultTc.AppendText(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S-') + str + "\n")
def getLogin(self,id):
domain = "http://live.vhall.com/"
joinbypass = domain + "webinar/joinbypass"
headers = {
'User-Agent' : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36 Maxthon/5.1.3.2000",
'Referer' : "http://live.vhall.com/259006896",
'Content-Type' : "application/x-www-form-urlencoded; charset=UTF-8"
}
values = {
"webinar_id" : id,
"password" : self.passwd.Value
}
session = requests.Session()
resp = session.post(joinbypass, data=values, headers = headers).content.decode("utf-8")
obj = json.loads(resp)
code = obj['code']
if code == "1005":
self.echo("密码错误")
elif code == "1010":
url = domain + id
html = session.get(url).content.decode("utf-8")
return html
else:
self.echo("程序错误")
return "0"
def GetTsUrl(self,url):
tsurl = []
filename = self.filename.Value
+ ".ts"
try:
os.remove(self.download_path+"/"+filename)
except:
pass
if not os.path.exists(self.download_path):
os.mkdir(self.download_path)
all_content = requests.get(url).text # 获取M3U8的文件内容
file_line = all_content.split("\n") # 读取文件里的每一行
# 通过判断文件头来确定是否是M3U8文件
if file_line[0] != "#EXTM3U":
raise BaseException("非M3U8的链接")
else:
unknow = True # 用来判断是否找到了下载的地址
length = str(int((len(file_line)-6)/2))
for index, line in enumerate(file_line):
if "EXTINF" in line:
unknow = False
# 拼出ts片段的URL
domain = url.rsplit("/", 1)[0]
domain = domain[0:domain.rfind("//")]
if(file_line[index + 1].find("/") == 0):
pd_url = domain + file_line[index + 1]
else:
pd_url = url.rsplit("/", 1)[0] + "/" + file_line[index + 1]
#c_fule_name = str(file_line[index + 1]).split("/")[-1]
tsurl.append(pd_url)
# self.dowTs(pd_url, c_fule_name, filename, length)
if unknow:
raise BaseException("未找到对应的下载链接")
else:
return tsurl
app = wx.App()
GETHTTP(None, "微吼播放地址查询器")
app.MainLoop()