金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 联合成整录制,进度间通讯

联合成整录制,进度间通讯

发布时间:2019-11-06 08:03编辑:编程浏览(170)

     

    前段时间发觉有的网址,能够解析各大录制网站的vip。留心想了想,那也总算爬虫呀,爬的是摄像数据。

    参照文档:

    c# 进度间同步达成进度之间通信的二种方法

    Directory .GetDirectories(路径);   获取子目录,重返string数组

    合并.ts文件

    命令行:“copy /b  F:f*.ts  E:fnew.ts”。

    实施该命令后,F:f目录下的全方位TS文件就被统百分之十一个new.ts文件了(你原本的那堆文件如故存在卡塔尔国。

    此处运用copy命令的文书合併功用拓宽ts文件的相会,copy前边的 /b  参数表示把公文按二进制格式来统生龙活虎,假使不加那一个参数,则会把目的当成文本文件来统生机勃勃,并在文件内增添没有必要的记号,那会引致播放出错,所以必得加 /b 参数。

    动用SendMessage向另生机勃勃历程发送WM_COPYDATA消息

    2. Directory 类,目录(文件夹)

    编排脚本,下载.ts文件

    from urllib import request
    import urllib
    from time import sleep
    import socket
    
    class CatchVideo(object):
        def __init__(self):
            self.headers = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"
            self.url = ""
    
        def set_url(self, i):
            if i < 1000:
                self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%03d.ts" % i
            else:
                self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%04d.ts" % i
    
        # 获取并下载ts文件
        def dl_ts(self, i):
            rq = request.Request(self.url)
            rq.add_header('User-Agent', self.headers)
            response = request.urlopen(rq)
            resread = response.read()
            with open(str(i)+".ts", "wb") as f:
                f.write(resread)
            response.close()# 关闭urlopen方法,防止被ban
    
        def start_work(self):
            for i in range(0, 1563+1):
                self.set_url(i)
                try:
                    self.dl_ts(i)
                    print(str(i) + ".ts  success")
                    sleep(1)
                except urllib.error.URLError as e:
                    print(e.reason)
                    break
                except socket.timeout as e2:
                    print(e2.reason)
                    self.dl_ts(i)
    
    
    if __name__ == '__main__':
        catch_video = CatchVideo()
        socket.setdefaulttimeout(20)
        catch_video.start_work()
    

     

    运转进度中,现身了五回报错,分别是:

    • urllib.error.URLError :[WinError 10054]  远程主机强迫关闭了二个共处的连年
    • socket.timeout     read读取超时

    清除办法:

      1.增加response.close,关闭urlopen方法。

      2.增添time.sleep,有风流倜傥秒缓冲时间

      3.设置socket.setdefaulttimeout,给socket预先流出缓冲时间

    Get端:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    using System.Windows.Interop;
    
    namespace GetTest
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            IntPtr hwnd;
            public MainWindow()
            {
                InitializeComponent();
                this.Title = "接受窗口";
    
                this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
                this.Closed += new EventHandler(MainWindow_Closed);
            }
    
            void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                //窗口加载完毕才可用,否则会报错。
                hwnd = new WindowInteropHelper(this).Handle;
                HwndSource source = HwndSource.FromHwnd(hwnd);
                if (source != null) source.AddHook(WndProc);
            }
    
            void MainWindow_Closed(object sender, EventArgs e)
            {
                try
                {
                    HwndSource.FromHwnd(hwnd).RemoveHook(WndProc);
                }
                catch (Exception)
                {
    
                    throw;
                }
    
            }
    
            const int WM_COPYDATA = 0x004A;//WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。
            //Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。
            //其中,WM_COPYDATA对应的十六进制数为0x004A
            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
    
            //wpf用此方法
            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                if (msg == WM_COPYDATA)
                {
                    COPYDATASTRUCT cdata = new COPYDATASTRUCT();
                    Type mytype = cdata.GetType();
                    cdata = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, mytype);
                    this.textBox1.Text = cdata.lpData;
                }
                return IntPtr.Zero;
            }
    
            //WinFrom用此方法
            /* protected override void DefWndProc(ref Message m)
            {
                switch (m.Msg)
                {
                case WM_COPYDATA:
                    COPYDATASTRUCT cdata = new COPYDATASTRUCT();
                    Type mytype = cdata.GetType();
                    cdata = (COPYDATASTRUCT)m.GetLParam(mytype);
                    this.textBox1.Text = cdata.lpData;
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;
                }
            } */
        }
    }
    

     

    搜索录制文件

    照旧是早先特别页面,在Other中,我们开采了有的意想不到的事物。

    图片 1

    查一下,m3u8是个啥东西。

    m3u8是苹果公司生产大器晚成种录像播放规范,是m3u的生机勃勃种,可是编码情势是utf-8,是豆蔻年华种文件检索格式,将录制切割成一小段一小段的ts格式的摄像文件,然后存在服务器中(今后为了减小I/o访谈次数,日常存在服务器的内部存款和储蓄器中卡塔 尔(阿拉伯语:قطر‎,通过m3u8分析出来路线,然后去乞求。

    那下就清楚了,那正是大家要找的事物。

    点击Response,查看那些.m3u8的文书。观看开采,.ts后缀的文当地点是有规律的。大家只须求下载全数的.ts后缀文件,然后把它们构成成三个文书就能够。

    Send端:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    
    namespace SentTest
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.Title = "发送窗口";
            }
    
            const int WM_COPYDATA = 0x004A;
    
            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
    
            [DllImport("User32.dll")]
            public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);
            [DllImport("User32.dll")]
            public static extern int FindWindow(string lpClassName, string lpWindowName);
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                String strSent = "需要发送的信息";
    
                int WINDOW_HANDLE = FindWindow(null, "接收窗口");
                if (WINDOW_HANDLE != 0)
                {
                    byte[] arr = System.Text.Encoding.Default.GetBytes(strSent);
                    int len = arr.Length;
                    COPYDATASTRUCT cdata;
                    cdata.dwData = (IntPtr)100;
                    cdata.lpData = strSent;
                    cdata.cData = len + 1;
                    SendMessage(WINDOW_HANDLE, WM_COPYDATA, 0, ref cdata);
                }
            }
        }
    }
    

    Directory .Delete(路径);  删去目录

    参照博客:

     

     

     

    复制文件:File.Copy(源文件,目的文件);

     首先接收叁个录像网址,小编选的是 影片大全 ,然后选取播出不久的录制“大器晚成出好戏” 。

    Directory .GetParent(路径);      拿到上拔尖目录

    立异代码,参预多进度

    修改了start_work方法和主进度:

        def start_work(self, i):
            self.set_url(i)
            try:
                self.dl_ts(i)
                print(str(i) + ".ts  success")
                sleep(1)
            except urllib.error.URLError as e:
                print(e.reason)
                self.dl_ts(i)
            except socket.timeout as e2:
                print(e2.reason)
                self.dl_ts(i)
    
    
    if __name__ == '__main__':
        catch_video = CatchVideo()
        socket.setdefaulttimeout(20)# 设置socket层超时时间20秒
        I = 0
        while I < 1563+1:
            # 5个进程并发运行
            p_l = [Process(target=catch_video.start_work, args=(i,)) for i in range(I, I+5)]
            for p in p_l:
                p.start()
            for p in p_l:
                p.join()
            I = I + 5
    

     

     

    这里安装了5个经过同一时间运行,太多少间隔程主机缘屏绝恳求。

     

    OK,那样就能够非常快下载了。隔了几天终于想起来还会有个电影没看,哈哈 ^_^

     

     

     

     

    细分文件:File.Move(源文件路线,指标路线);

    还设反常

    事实上运营进度中,脚本实行效能略低。之后会到场十六线程,继续校勘,扩张运维作用。

     

     

    △3.FileInfo 类

    解析页面

    自己用的是chrome浏览器,F12进去查看。采用NetWork的Doc,开采宗旨部分的数目是从那些网址拿到的。

    图片 2

     

    在地方栏输入这几个链接,跳转到了录制来自的广播页面。

    自然,在此个页面就足以平昔看看录制了,不过我们要把摄像下载下来。

    1. File类:文件

    赢得子目录:DirectoryInfo[] dr = d.GetDirectories();

    收获目录全名:                                                       d.FullName;

    Directory .CreateDirectory(路径);  创制目录

    Directory .GetFiles(路径);       获取子文件!名!,重返string数组,string[] s = Directory .GetFiles(路径);

    创造文件:FileInfo f = new FileInfo(路径); FileStream s = f.Create(); s.Close();

    Directory .Exists(路径);  目录是还是不是留存

    取名空间:using system .IO;

    本文由金沙国际官网发布于编程,转载请注明出处:联合成整录制,进度间通讯

    关键词: