整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          用html代碼編寫的免費軟件下載和安裝教程

          一個好的編輯器我們可以方便的開發項目,編寫代碼,配置和管理我們的項目。所以我們開始編寫html代碼之前需要搭建開發環境。

          基于html項目的開發和代碼編寫現在網上有很多編輯器,也有免費的,也有收費的編輯器。基于在Windows系統環境下開發和編寫html代碼最簡單的編輯器就是Windows自帶的記事本,我們可以使用記事本編輯html代碼。

          使用記事本編寫html的步驟是首先新建一個文本文檔,按照html的語法規則編寫相關的代碼和保存文件,然后把文件的后綴名改為.html,使用電腦上的瀏覽器打開就可以查看我們代碼的運行結果。

          雖然記事本也能編寫html代碼,但是效率不高也不方便,所以我們使用專業的編輯器來開發項目,編寫代碼和管理項目。

          常用html代碼編寫的免費軟件有HBuilderX,vs code,Sublime Text 等等。

          HBuilderX官網下載地址:

          https://www.dcloud.io/hbuilderx.html

          vs code的官網下載地址:

          https://code.visualstudio.com/

          Sublime Text官網下載地址:

          http://www.sublimetext.com/

          我們以后的教程都使用HBuilderX,所以下面為了同學們的學習方便,對HBuilderX的下載和安裝做詳細的教程。


          一,下載

          首先訪問HBuilderX的官網網址:

          https://www.dcloud.io/hbuilderx.html

          打開上面的HBuilderX下載網址后點擊頁面上download,在彈出的對話框里選擇適合自己電腦的HBuilderX版本下載。

          在Windows10環境下下載后的文件是一個壓縮的.zip文件。



          二,安裝

          鼠標右擊下載下來的壓縮文件進行解壓。

          解壓完成后是一個名為HBuilderX的文件夾。

          解壓完成后鼠標雙擊HBuilderX文件夾:

          雙擊運行名為HBuilderX.exe的應用程序文件即可啟動HBuilderX編輯器:

          因為HBuilderX是一個綠色軟件所以沒有桌面快捷方式和開始菜單快速啟動程序,我們可以右擊HBuilderX.exe文件創建桌面快捷方式。



          小百科:

          綠色軟件指一類小型軟件,多數為免費軟件,最大特點是軟件無需安裝便可使用,可存放于閃存中,移除后也不會將任何記錄留在本機計算機上。通俗點講綠色軟件就是指不用安裝,下載直接可以使用的軟件。綠色軟件不會在注冊表中留下注冊表鍵值,所以相對一般的軟件來說,綠色軟件對系統的影響幾乎沒有,所以是很好的一種軟件類型。



          三,新建項目

          HBuilderX編輯器初次啟動時的默認界面是下圖所示:

          按照下圖所示可以創建一個新的名為demo1空白項目:

          名為demo1的空白項目創建成功后的界面如下圖所示:

          接下來在剛我們新建的demo1項目下創建名為helloworld的html文件

          鼠標右擊創建的demo1項目選擇新建在選擇.html文件:

          在彈出的對話框里填入html文件的名稱:

          編寫一段代碼:

          運行:

          在瀏覽器上觀察效果:




          好了,到這里html的開發環境搭建和HBuilderX的安裝教程結束了。

          下面再給大家教一下怎樣修改HBuilderX的主題風格,HBuilderX自身提供了修改軟件主題的功能,使用者可以自身需求和喜好修改HBuilderX的風格。在喜歡自己喜歡的環境下做開發也是令人羨慕的一件事。

          按照一下步驟可以修改HBuilderX的主題,默認主題是綠柔,我們可以改成雅黑,雅藍或者自定義主題:

          雅黑主題:

          雅藍主題:


          好了本節全部內容全部結束了,希望我準備的內容對你有所幫助

          你的支持是我的最大動力,若覺得我的教程還可以對你有幫助為我點贊加關注!謝謝!

          迎搜索我的公眾號:小道黑客


          每天分享更多黑客技能,工具及體系化視頻教程


          這里最近參與CIS大會,看到一款自動化滲透工具 Ary,特點是匯聚了各種可以調用的工具。


          介紹



          工具地址 https://github.com/TeraSecTeam/ary

          POC收集 https://github.com/TeraSecTeam/poc-collection

          Ary是一個集各種滲透工具于一體的工具,不過看起來還是一個開發中的版本,試用了一遍,感覺還不錯。

          注意需要使用centos,好像ubuntu會報一些錯誤。


          文件結構介紹


          ├── ary #二進制文件

          ├── configs #配置文件夾

          ├── input

          ├── log #日志記錄

          ├── output #輸出目錄

          ├── pocs #poc文件夾,可以用自己的POC或者網上的poc

          ├── README.md 使用說明

          └── streams #執行流所在文件夾,自己定義組合


          核心功能介紹



          信息收集

          1. 空間搜索引擎收集
          2. 爬蟲類工具收集
          3. 爬蟲類+存儲類收集

          工具聯動

          1. 爬蟲類+掃描類工具(Poc驗證)
          2. 存儲類+掃描類(Poc驗證)
          3. 工具聯動自定義+自動化


          安裝



          1.安裝所有的工具引擎,執行命令后,將會自動下載第三方的滲透工具,如xray。也可以預先不下載,在執行命令的時候如果缺少某個第三方工具會自動下載。

          ./ary --vulnscan --engine all --update -v

          ./ary --assertscan --engine all --update -v

          2.chrome 的安裝(爬蟲需要)

          配置yum谷歌的源:

          vi /etc/yum.repos.d/google.repo

          將下面這段粘貼進文件

          [google]
          name=Google-x86_64
          baseurl=http://dl.google.com/linux/rpm/stable/x86_64
          enabled=1
          gpgcheck=0
          gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

          配置完之后,執行以下bash命令,安裝google-chrome

          yum update

          yum install google-chrome-stable

          google-chrome --version


          配置文件



          默認加載配置為帶有settings.ini的文件configs/example.settings.ini文件為配置示例,可以修改其內容,如加入網絡搜索引擎的token


          1.目錄設置

          可以設置各輸入和輸出目錄


          2.第三方工具來源


          xray下載地址及下載輸出位置


          3.信息收集來源


          包含rad,crawlergo,gospider等信息收集工具



          4.空間搜索引擎配置


          主要是配置fofa,shodan,censys的token或API key



          使用體驗


          1.網絡空間搜索

          支持shodan、fofa、censys等空間搜索引擎,使用相關搜索需要在配置文件configs/example.settings.ini中配置相應的token。

          相關命令

          ./ary --netsearch --engine shodan --keyword dedecms -v --limit 10

          ./ary --netsearch --engine shodan --keyword "tomcat country:"US"" -v --limit 10

          ./ary --netsearch --engine fofa --keyword redis -v --limit 10

          ./ary --netsearch --engine fofa --keyword "protocol=socks4 && banner="0x5a"" -v --limit 10

          ./ary --netsearch --engine censys --keyword redis -v --limit 1000


          如使用shodan進行搜索

          配置token(需要自己注冊shodan的賬號,獲取token)

          cd configs[root@centos configs]# vim example.settings.ini

          搜索dedecms框架, 限制10條

          [root@centos kk]# ./ary --netsearch --engine shodan --keyword dedecms -v --limit 10


          結果如下



          搜索結果默認保存在sqlite中,在配置文件中配置,公開版默認配置sqlite



          使用sqlite3工具 SQLiteStudio查看,可看到結果已保存到本地data.db中



          采用shodan語法搜索, 搜索國家為美國的tomcat


          [root@centos kk]# ./ary --netsearch --engine shodan --keyword "tomcat country:"US"" -v --limit 10


          使用fofa基本語法搜索

          [root@centos kk]# ./ary --netsearch --engine fofa --keyword redis -v --limit 10


          根據特征搜索sock4代理,關鍵詞為

          protocol=socks4 && banner="0x5a"

          ./ary --netsearch --engine fofa --keyword "protocol=socks4 && banner="0x5a"" -v --limit 10

          結果


          評論

          censys的結果不精確,沒有相應的端口

          推薦shodan和fofa


          2.資產掃描


          基于在線靶場測試http://testhtml5.vulnweb.com


          基于ARL資產掃描

          ARL是freebuf能力中心開源的一套資產掃描系統(https://github.com/TophantTechnology/ARL),提供docker版,有前端界面,基于ARL可以方便進行資產掃描和可視化


          這里采用ARL 資產偵查燈塔系統

          (https://hub.docker.com/r/tophant/arl/tags?page=1&ordering=last_updated)

          直接使用docker版本的ARL,登錄進去后改密碼


          在配置文件里配置ARL


          ARL token在登錄后可以從cookie獲取

          打開F12查看cookie

          PS: 在啟動docker的時候可以配置固定token,


          如果需要一直使用建議進行配置 之后在配置文件的[assertscan]中進行相應配置


          通過ary調用ARL進行資產掃描

          ARL:

          ./ary --assertscan --engine arl --input指定文件

          ./ary --assertscan --engine arl --url指定url,可指定多個url,url之間用逗號隔開

          資產掃描相關命令

          # 啟動一個任務

          # 查找子域名

          ./ary --assertscan --engine arl --url www.aaa.com -v --condition subdomain

          ./ary --assertscan --engine arl --url www.aaa.com,www.bbb.com -v --condition subdomain

          # 查找子域名 指定文件

          ./ary --assertscan --engine arl --input targets.txt -v --condition subdomain

          # 查找子域名 指定輸出文件名

          ./ary --assertscan --engine arl --url www.aaa.com -v --condition subdomain --output arl.csv

          # 查找端口

          ./ary --assertscan --engine arl --input targets.txt -v --condition portscan

          # 獲取任務結果

          ./ary --assertscan --engine arl -v --fetch-result --keyword 5fd321f0a4a557000fb2a574

          # 獲取任務結果 - 加載文件

          ./ary --assertscan --engine arl -v --fetch-result --input arl.csv


          掃描測試

          ./ary --assertscan --engine arl --url http://testhtml5.vulnweb.com -v --condition subdomain

          登錄ARL后臺,x.x.x.x:5003, 輸入賬號密碼,可以看到在ARL中已經啟動了任務

          獲取掃描完畢的結果

          [root@centos kk]# ./ary --assertscan --engine arl -v --fetch-result --keyword 5ff67b77ac258f000ccf4de2

          或者直接把文件作為輸入

          [root@centos kk]# ./ary --assertscan --engine arl -v --fetch-result --input output/arl_1_2021-01-07T03\:09\:43Z.txt.csv


          端口掃描

          ./ary --assertscan --engine arl --input vulnweb.com -v --condition portscan

          端口掃描僅限于top100,不太好用,不能指定端口


          3.爬蟲類

          ./ary --assertscan --engine rad --url http://testphp.vulnweb.com/ -v

          ./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v

          ./ary --assertscan --engine crawlergo --url http://testphp.vulnweb.com/ -v


          使用rad進行爬取

          [root@centos kk]# ./ary --assertscan --engine rad --url http://testphp.vulnweb.com/ -v

          如果沒有rad,會自動下載并開始爬取

          rad配置文件rad_config.yml在當前目錄生成爬取過程

          保存結果在

          output/rad_1_2021-01-07T06:47:23Z.txt


          使用gospider進行爬取

          ./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v

          如果沒有gospider,會自動下載并開始爬取

          結果保存在output/gospider文件夾下

          2021-01-07 06:50:00,846 - [assertscan#143] - HIGHLIGHT - saved to output/gospider

          gospider比rad在參數上更加詳細


          使用crawlgo進行爬取

          如果沒有crawlgo,會自動下載并開始爬取

          [root@centos kk]# ./ary --assertscan --engine crawlergo --url http://testphp.vulnweb.com/ -vCrawlgo的也比較詳細,但是速度較gospider和rad慢

          結果保存在output文件夾下

          2021-01-07 06:57:40,600 - [assertscan#165] - HIGHLIGHT - saved to output/crawlergo_1_2021-01-07T06:56:05Z.txt


          4.漏洞掃描


          # 對目標進行掃描

          ./ary --vulnscan --url http://testphp.vulnweb.com/ --engine xray -v

          # 對目標進行被動掃描(rad+xray)

          ./ary --vulnscan --engine xray --url http://testphp.vulnweb.com/ -v --passive

          # 對文件中的目標進行被動掃描

          ./ary --vulnscan --engine xray --input target.txt -v --passive

          # 讀取數據庫中的數據進掃描

          ./ary --vulnscan --engine xray --keyword tomcat -v

          ./ary --vulnscan --engine xray --keyword tomcat -v --crawl


          直接調用xray進行掃描

          ./ary --vulnscan --url http://testphp.vulnweb.com/ --engine xray -v

          如果沒有xray,會自動下載并開始爬取

          xray的配置文件config.yaml默認在當前文件夾生成

          下載完后保存在在thirdpartys文件夾下

          xray結果以json格式保存在output目錄下


          調用xray進行被動掃描

          ./ary --vulnscan --engine xray --url http://testphp.vulnweb.com/ -v --passive

          效果不好,可能是使用姿勢不對,待進一步探索


          xray+gospider分開跑

          效果不錯

          在兩個終端中運行程序:

          運行xray, xray在7778端口監聽,被動掃描模式

          ./ary --vulnscan --engine xray --port 7778 --background -v

          運行gospider,將流量轉發到7778端口給xray進行掃描,使用xray對go spider的內容進行掃描

          ./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v --passive --port 7778

          效果如下


          xray+rad分開跑

          運行rad,將流量轉發到7778給xray掃描,效果不錯


          xray+crawelgo分開跑

          運行crawelgo,掃描的數量多一點,但是相對來說慢一點

          5.POC使用

          PoC 漏洞驗證

          POC可自行在POC收集 https://github.com/TeraSecTeam/poc-collection項目中尋找

          ./ary --pocscan --input redis.txt --poc redis -v

          ./ary --pocscan --url xx.xx.xx.xx --poc ./pocs/redis -v

          ./ary --pocscan --poc tomcat --keyword tomcat -v

          ./ary --pocscan --keyword redis --poc redis -v

          ./ary --pocscan --keyword redis --poc redis -v --limit 1 --dumppcap redis

          ./ary --pocscan --keyword thinkphp --poc thinkphp_rce2 -v --limit 20 --dumppcap thinkphp

          # 寫到數據庫

          ./ary --pocscan --url xx.xx.xx.xx --poc redis -v --limit 2 --upload

          redis POC 效果


          針對單個網站打poc

          [root@centos kk]# ./ary --pocscan --url 122.xx.xx.xx --poc redis -v

          針對數據庫中的關鍵詞打POC

          [root@centos kk]# ./ary --pocscan --keyword redis --poc redis -v


          對數據包詳細分析

          執行流嘗試使用錄包功能,錄包之后為pcap格式,可以用wireshark打開


          6.Stream模塊使用

          使用這個模塊可以自定義過程。


          使用steam進行POC驗證

          自定義過程的配置在./streams/streams.yaml

          ./ary -v --stream --input streams.yaml --keyword "redis 未授權訪問漏洞"

          可以看到名稱為redis 未授權訪問漏洞,故在命令行中輸入該關鍵詞`--keyword "redis 未授權訪問漏洞"`

          將會使用shodan進行redis搜集,并且使用pocs目錄下的redis.py POC進行利用嘗試


          效果如下


          使用stream進行漏洞挖掘

          也可以進行漏洞掃描,指定xray引擎,非passive方式掃描,


          關鍵詞為test testphp.vulnweb.com


          ./ary -v --stream --input streams.yaml --keyword "test testphp.vulnweb.com"


          即可進行xray掃描


          效果 如下


          Trouble shooting

          1、API報錯


          2021-01-07 02:28:23,382 - [netsearch#217] - DEBUG - fofa mail : hxxxxxl@163.com, secret : 238ebxxxxxxxxxxxxxxxxxx2440

          2021-01-07 02:28:23,387 - [database#28] - DEBUG - using database : sqlite

          2021-01-07 02:28:23,396 - [netsearch#249] - DEBUG - https://fofa.so/api/v1/search/all?email=hxxxxxl@163.com&key=238ebxxxxxxxxxxxxxxxxxx2440&qbase64=aXA9IjguOC144Ljgi&size=1

          2021-01-07 02:28:24,597 - [netsearch#253] - ERROR - 401 Unauthorized, make sure 1.email and apikey is correct 2.FOFA coin is enough.


          解決方法: 注冊賬號,獲取token,并在配置文件中填入相應的token


          2、端口被占用


          解決方法

          [root@centos kk]# ./ary --kill --engine xray --port 7777 -v

          總結

          - 快速的資產收集和工具聯動操作


          - 在獲取某個POC和框架信息的情況下,可以快速聚合所需要的網站并且調用需要的工具進行掃描


          - 適用于平時進行漏洞挖掘


          - 數據庫的使用可以發揮更多的想象力,其他版本在數據方面應該會更友好


          - 體驗下來,公開版適用于滲透測試前中期的自動化工作,輔助在測試中更快地尋找到突破點


          作者:掙扎的小小

          來源:https://www.freebuf.com/sectool/260698.html

          、項目概述

          1.項目背景

          有一天,我突然想找點事做,想起一直想學但是沒有學的C語言,就決定來學一下。可是怎么學呢?看書的話太無聊,報班學呢又快吃土了沒錢,不如去B站看看?果然,關鍵字C語言搜索,出現了很多C語言的講課視頻:

          B站C語言講課視頻節選


          B站https://www.bilibili.com/是一個很神奇的地方,簡直就是一個無所不有的寶庫,幾乎可以滿足你一切的需求和視覺欲。不管你是想看動畫、番劇 ,還是游戲、鬼畜 ,亦或科技和各類教學視頻 ,只要你能想到的,基本上都可以在B站找到。對于程序猿或即將成為程序猿的人來說,B站上的編程學習資源是學不完的,可是B站沒有提供下載的功能,如果想保存下載在需要的時候看,那就是一個麻煩了。我也遇到了這個問題,于是研究怎么可以實現一鍵下載視頻,最終用Python這門神奇的語言實現了。

          當然了,項目實現之后,不是想學習編程、而是想看其他類別視頻的小伙伴也可以用這款工具進行下載了。


          2.環境配置

          這次項目不需要太多的環境配置,最主要的是有ffmpeg(一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序)并設置環境變量就可以了。ffmpeg主要是用于將下載下來的視頻和音頻進行合并形成完整的視頻。

          下載ffmpeg

          可點擊https://download.csdn.net/download/CUFEECR/12234789或進入官網http://ffmpeg.org/download.html進行下載,并解壓到你想保存的目錄。

          設置環境變量:

          (1)復制ffmpeg的bin路徑,如xxx\ffmpeg-20190921-ba24b24-win64-shared\bin

          (2)此電腦右鍵點擊屬性,進入控制面板\系統和安全\系統

          (3)點擊高級系統設置→進入系統屬性彈窗→點擊環境變量→進入環境變量彈窗→選擇系統變量下的Path→點擊編輯點擊→進入編輯環境變量彈窗

          (4)點擊新建→粘貼之前復制的bin路徑

          (5)點擊確定,逐步保存退出

          動態操作示例如下:


          ffmpeg 設置環境變量

          除了ffmpeg,還需要安裝pyinstaller庫用于程序打包。可用以下命令進行安裝:

          pip install pyinstaller

          如果遇到安裝失敗或下載速度較慢,可換源:

          pip install pyinstaller -i https://pypi.doubanio.com/simple/

          二、項目實施

          1.導入需要的庫

          import json
          import os
          import re
          import shutil
          import ssl
          import time
          import requests
          from concurrent.futures import ThreadPoolExecutor
          from lxml import etree

          導入的庫包括用于爬取和解析網頁的庫,還包括創建線程池的庫和進行其他處理的庫,大多數都是Python自帶的,如有未安裝的庫,可使用pip install xxx命令進行安裝。

          2.設置請求參數

          # 設置請求頭等參數,防止被反爬
          headers = {
              'Accept': '*/*',
              'Accept-Language': 'en-US,en;q=0.5',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
          }
          params = {
              'from': 'search',
              'seid': '9698329271136034665'
          }

          設置請求頭等參數,減少被反爬的可能。

          3.基本處理

          def re_video_info(text, pattern):
              '''利用正則表達式匹配出視頻信息并轉化成json'''
              match = re.search(pattern, text)
              return json.loads(match.group(1))
          
          
          def create_folder(aid):
              '''創建文件夾'''
              if not os.path.exists(aid):
                  os.mkdir(aid)
          
          
          def remove_move_file(aid):
              '''刪除和移動文件'''
              file_list = os.listdir('./')
              for file in file_list:
                  # 移除臨時文件
                  if file.endswith('_video.mp4'):
                      os.remove(file)
                      pass
                  elif file.endswith('_audio.mp4'):
                      os.remove(file)
                      pass
                  # 保存最終的視頻文件
                  elif file.endswith('.mp4'):
                      if os.path.exists(aid + '/' + file):
                          os.remove(aid + '/' + file)
                      shutil.move(file, aid)

          主要包括兩方面的基本處理,為正式爬取下載做準備:

          • 利用正則表達式提取信息
            通過requests庫請求得到請求后的網頁,屬于文本,通過正則表達式提取得到關于將要下載的視頻的有用信息,便于后一步處理。
          • 文件處理
            將下載視頻完成后的相關文件進行處理,包括刪除生成的臨時的音視頻分離的文件和移動最終視頻文件到指定文件夾。

          4.下載視頻

          def download_video_batch(referer_url, video_url, audio_url, video_name, index):
              '''批量下載系列視頻'''
              # 更新請求頭
              headers.update({"Referer": referer_url})
              # 獲取文件名
              short_name = video_name.split('/')[2]
              print("%d.\t視頻下載開始:%s" % (index, short_name))
              # 下載并保存視頻
              video_content = requests.get(video_url, headers=headers)
              print('%d.\t%s\t視頻大小:' % (index, short_name),
                    round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
              received_video = 0
              with open('%s_video.mp4' % video_name, 'ab') as output:
                  headers['Range'] = 'bytes=' + str(received_video) + '-'
                  response = requests.get(video_url, headers=headers)
                  output.write(response.content)
              # 下載并保存音頻
              audio_content = requests.get(audio_url, headers=headers)
              print('%d.\t%s\t音頻大小:' % (index, short_name),
                    round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
              received_audio = 0
              with open('%s_audio.mp4' % video_name, 'ab') as output:
                  headers['Range'] = 'bytes=' + str(received_audio) + '-'
                  response = requests.get(audio_url, headers=headers)
                  output.write(response.content)
                  received_audio += len(response.content)
              return video_name, index
          
          
          def download_video_single(referer_url, video_url, audio_url, video_name):
              '''單個視頻下載'''
              # 更新請求頭
              headers.update({"Referer": referer_url})
              print("視頻下載開始:%s" % video_name)
              # 下載并保存視頻
              video_content = requests.get(video_url, headers=headers)
              print('%s\t視頻大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
              received_video = 0
              with open('%s_video.mp4' % video_name, 'ab') as output:
                  headers['Range'] = 'bytes=' + str(received_video) + '-'
                  response = requests.get(video_url, headers=headers)
                  output.write(response.content)
              # 下載并保存音頻
              audio_content = requests.get(audio_url, headers=headers)
              print('%s\t音頻大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
              received_audio = 0
              with open('%s_audio.mp4' % video_name, 'ab') as output:
                  headers['Range'] = 'bytes=' + str(received_audio) + '-'
                  response = requests.get(audio_url, headers=headers)
                  output.write(response.content)
                  received_audio += len(response.content)
              print("視頻下載結束:%s" % video_name)
              video_audio_merge_single(video_name)

          這部分包括系列視頻的批量下載和單個視頻的下載,兩者的大體實現原理近似,但是由于兩個函數的參數有差別,因此分別實現。在具體的實現中,首先更新請求頭,請求視頻鏈接并保存視頻(無聲音),再請求音頻鏈接并保存音頻,在這個過程中得到相應的視頻和音頻文件的大小。

          5.視頻和音頻合并成完整的視頻

          def video_audio_merge_batch(result):
              '''使用ffmpeg批量視頻音頻合并'''
              video_name = result.result()[0]
              index = result.result()[1]
              import subprocess
              video_final = video_name.replace('video', 'video_final')
              command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
                  video_name, video_name, video_final)
              subprocess.Popen(command, shell=True)
              print("%d.\t視頻下載結束:%s" % (index, video_name.split('/')[2]))
          
          
          def video_audio_merge_single(video_name):
              '''使用ffmpeg單個視頻音頻合并'''
              print("視頻合成開始:%s" % video_name)
              import subprocess
              command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
                  video_name, video_name, video_name)
              subprocess.Popen(command, shell=True)
              print("視頻合成結束:%s" % video_name)

          這個過程也是批量和單個分開,大致原理差不多,都是調用subprogress模塊來生成子進程,Popen類來執行shell命令,由于已經將ffmpeg加入環境變量,所以shell命令可以直接調用ffmpeg來合并音視頻。

          6.3種下載方式的分別實現

          def batch_download():
              '''使用多線程批量下載視頻'''
              # 提示輸入需要下載的系列視頻對應的id
              aid = input('請輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av91748877?p=1中id為91748877),默認為91748877\t')
              if aid:
                  pass
              else:
                  aid = '91748877'
              # 提示選擇清晰度
              quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
              if quality == '2':
                  pass
              elif quality == '3':
                  pass
              else:
                  quality = '1'
              acc_quality = int(quality) - 1
              # ssl模塊,處理https請求失敗問題,生成證書上下文
              ssl._create_default_https_context = ssl._create_unverified_context
              # 獲取視頻主題
              url = 'https://www.bilibili.com/video/av{}?p=1'.format(aid)
              html = etree.HTML(requests.get(url, params=params, headers=headers).text)
              title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
              print('您即將下載的視頻系列是:', title)
              # 創建臨時文件夾
              create_folder('video')
              create_folder('video_final')
              # 定義一個線程池,大小為3
              pool = ThreadPoolExecutor(3)
              # 通過api獲取視頻信息
              res_json = requests.get('https://api.bilibili.com/x/player/pagelist?aid={}'.format(aid)).json()
              video_name_list = res_json['data']
              print('共下載視頻{}個'.format(len(video_name_list)))
              for i, video_content in enumerate(video_name_list):
                  video_name = ('./video/' + video_content['part']).replace(" ", "-")
                  origin_video_url = 'https://www.bilibili.com/video/av{}'.format(aid) + '?p=%d' % (i + 1)
                  # 請求視頻,獲取信息
                  res = requests.get(origin_video_url, headers=headers)
                  # 解析出視頻詳情的json
                  video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
                  video_info = {}
                  # 獲取視頻品質
                  quality = video_info_temp['data']['accept_description'][acc_quality]
                  # 獲取視頻時長
                  video_info['duration'] = video_info_temp['data']['dash']['duration']
                  # 獲取視頻鏈接
                  video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
                  # 獲取音頻鏈接
                  audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
                  # 計算視頻時長
                  video_time = int(video_info.get('duration', 0))
                  video_minute = video_time // 60
                  video_second = video_time % 60
                  print('{}.\t當前視頻清晰度為{},時長{}分{}秒'.format(i + 1, quality, video_minute, video_second))
                  # 將任務加入線程池,并在任務完成后回調完成視頻音頻合并
                  pool.submit(download_video_batch, origin_video_url, video_url, audio_url, video_name, i + 1).add_done_callback(
                      video_audio_merge_batch)
              pool.shutdown(wait=True)
              time.sleep(5)
              # 整理視頻信息
              if os.path.exists(title):
                  shutil.rmtree(title)
              os.rename('video_final', title)
              try:
                  shutil.rmtree('video')
              except:
                  shutil.rmtree('video')
          
          
          def multiple_download():
              '''批量下載多個獨立視頻'''
              # 提示輸入所有aid
              aid_str = input(
                  '請輸入要下載的所有視頻id,id之間用空格分開\n舉例:有5個鏈接https://www.bilibili.com/video/av89592082、https://www.bilibili.com/video/av68716174、https://www.bilibili.com/video/av87216317、\nhttps://www.bilibili.com/video/av83200644和https://www.bilibili.com/video/av88252843,則輸入89592082 68716174 87216317 83200644 88252843\n默認為89592082 68716174 87216317 83200644 88252843\t')
              if aid_str:
                  pass
              else:
                  aid_str = '89592082 68716174 87216317 83200644 88252843'
              if os.path.exists(aid_str):
                  shutil.rmtree(aid_str)
              aids = aid_str.split(' ')
              # 提示選擇視頻質量
              quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
              if quality == '2':
                  pass
              elif quality == '3':
                  pass
              else:
                  quality = '1'
              acc_quality = int(quality) - 1
              # 創建文件夾
              create_folder(aid_str)
              # 創建線程池,執行多任務
              pool = ThreadPoolExecutor(3)
              for aid in aids:
                  # 將任務加入線程池
                  pool.submit(single_download, aid, acc_quality)
              pool.shutdown(wait=True)
              time.sleep(5)
              # 刪除臨時文件,移動文件
              remove_move_file(aid_str)
          
          
          def single_download(aid, acc_quality):
              '''單個視頻實現下載'''
              # 請求視頻鏈接,獲取信息
              origin_video_url = 'https://www.bilibili.com/video/av' + aid
              res = requests.get(origin_video_url, headers=headers)
              html = etree.HTML(res.text)
              title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
              print('您當前正在下載:', title)
              video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
              video_info = {}
              # 獲取視頻質量
              quality = video_info_temp['data']['accept_description'][acc_quality]
              # 獲取視頻時長
              video_info['duration'] = video_info_temp['data']['dash']['duration']
              # 獲取視頻鏈接
              video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
              # 獲取音頻鏈接
              audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
              # 計算視頻時長
              video_time = int(video_info.get('duration', 0))
              video_minute = video_time // 60
              video_second = video_time % 60
              print('當前視頻清晰度為{},時長{}分{}秒'.format(quality, video_minute, video_second))
              # 調用函數下載保存視頻
              download_video_single(origin_video_url, video_url, audio_url, title)
          
          
          def single_input():
              '''單個文件下載,獲取參數'''
              # 獲取視頻aid
              aid = input('請輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av89592082中id為89592082),默認為89592082\t')
              if aid:
                  pass
              else:
                  aid = '89592082'
                  # 提示選擇視頻質量
              quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
              if quality == '2':
                  pass
              elif quality == '3':
                  pass
              else:
                  quality = '1'
              acc_quality = int(quality) - 1
              # 調用函數進行下載
              single_download(aid, acc_quality)

          在一般情形下,下載的需求包含3種情況:

          (1)單個視頻的下載:
          只有一個視頻,沒有和它屬于同一個系列的其他視頻,如下圖


          單個視頻下載


          此時,除了右下方的相關推薦中的視頻,沒有其他視頻,右上方只有彈幕列表、沒有視頻列表。為了代碼的復用,將單個視頻下載時提示用戶輸入需求的代碼單獨提取出來作為single_input(),下載的函數另外作為single_download(aid, acc_quality)函數實現,在該函數中:
          通過視頻鏈接如https://www.bilibili.com/video/av89592082解析網頁,得到相應的字符串并轉化成json,如下:


          視頻信息json轉化


          字符串json格式化可使用https://www.sojson.com/editor.html進行在線轉化。
          獲取到視頻的標題、根據輸入確定的視頻質量、持續時長、視頻鏈接和音頻鏈接,并調用download_video_single()函數下載該視頻。

          (2)多個視頻的下載:
          這里,多個視頻之間是沒有關系的,多個視頻的下載實際上是先獲取到所有的aid,并進行循環,對每個視頻鏈接傳入參數調用單個視頻下載的函數即可。同時設立線程池,大小為3,既不會對資源有太大的要求,也能實現多任務、提高下載效率。

          (3)系列視頻的下載
          此時,多個視頻屬于同一系列,如https://www.bilibili.com/video/av91748877是一個課程系列,如下:


          系列視頻


          顯然,此時右上方有視頻列表,標明了有65個子視頻,每個視頻用p標識,如第2個視頻就是https://www.bilibili.com/video/av91748877?p=2。對于所有視頻,先獲取到視頻的相關信息,再加入進程池進行下載,并在任務結束之后回調函數video_audio_merge_batch()合并音視頻,并進行文件整理。

          7.主函數

          def main():
              '''主函數,提示用戶進行三種下載模式的選擇'''
              download_choice = input('請輸入您需要下載的類型:\n1代表下載單個視頻,2代表批量下載系列視頻,3代表批量下載多個不同視頻,默認下載單個視頻\t')
              # 批量下載系列視頻
              if download_choice == '2':
                  batch_download()
              # 批量下載多個單個視頻
              elif download_choice == '3':
                  multiple_download()
              # 下載單個視頻
              else:
                  single_input()
          
          
          if __name__ == '__main__':
              '''調用主函數'''
              main()

          主函數中實現3種下載方式對應的函數的分別調用。

          三、項目分析和說明

          1.結果測試

          對3種方式進行測試的效果如下:

          項目測試一:單個視頻測試


          項目測試二:系列視頻測試


          項目測試三:多個不同視頻測試


          3種下載情景的測試效果均較好,下載速度也能與一般的下載速度相媲美。
          代碼可點擊https://download.csdn.net/download/CUFEECR/12243122https://github.com/corleytd/Python_Crawling/blob/master/bilibili_downloader_1.py進行下載。


          改進說明

          B站網站也一直在變化,所以對于下載可能也會有一些變化,所以將改進的地方在下面列舉出來:

          (1)網址參數變化
          舉例說明:
          這段時間發現B站一個視頻系列的鏈接變成https://www.bilibili.com/video/BV1x7411M74h?p=65,即是無規律的字符串(可能是經過某種算法編碼或加密得到的),現在從鏈接中不能得到視頻(系列)的aid,這時候可以借助瀏覽器工具抓包查看數據來找到該視頻的aid,如下:

          B站視頻aid轉bvid


          在左側尋找stat開頭的請求,后邊的參數即為aid,該請求api的完整鏈接為https://api.bilibili.com/x/web-interface/archive/stat?aid=91748877,所以可以直接在該鏈接中獲取aid,也可以查看該請求的具體內容,可以看到第一個數據就是aid,我們也可以看到隨機字符串就是bvid,可能是建立了aid和bvid的一一映射,找到aid就可以正常下載了。

          2.軟件打包

          在命令行中,使路徑位于代碼所在路徑運行

          pyinstaller bilibili_downloader_1.py

          打印

          136 INFO: PyInstaller: 3.6
          137 INFO: Python: 3.7.4
          138 INFO: Platform: Windows-10-10.0.18362-SP0
          140 INFO: wrote xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.spec
          205 INFO: UPX is not available.
          209 INFO: Extending PYTHONPATH with paths
          ['xxxx\\Bili_Video_Batch_Download',
           'xxxx\\Bili_Video_Batch_Download']
          210 INFO: checking Analysis
          211 INFO: Building Analysis because Analysis-00.toc is non existent
          211 INFO: Initializing module dependency graph...
          218 INFO: Caching module graph hooks...
          247 INFO: Analyzing base_library.zip ...
          5499 INFO: Caching module dependency graph...
          5673 INFO: running Analysis Analysis-00.toc
          5702 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
            required by xxx\python\python37\python.exe
          6231 INFO: Analyzing xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.py
          7237 INFO: Processing pre-safe import module hook   urllib3.packages.six.moves
          10126 INFO: Processing pre-safe import module hook   six.moves
          14287 INFO: Processing module hooks...
          14288 INFO: Loading module hook "hook-certifi.py"...
          14296 INFO: Loading module hook "hook-cryptography.py"...
          14936 INFO: Loading module hook "hook-encodings.py"...
          15093 INFO: Loading module hook "hook-lxml.etree.py"...
          15097 INFO: Loading module hook "hook-pydoc.py"...
          15099 INFO: Loading module hook "hook-xml.py"...
          15330 INFO: Looking for ctypes DLLs
          15334 INFO: Analyzing run-time hooks ...
          15339 INFO: Including run-time hook 'pyi_rth_multiprocessing.py'
          15344 INFO: Including run-time hook 'pyi_rth_certifi.py'
          15355 INFO: Looking for dynamic libraries
          15736 INFO: Looking for eggs
          15737 INFO: Using Python library xxx\python\python37\python37.dll
          15757 INFO: Found binding redirects:
          []
          15776 INFO: Warnings written to xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_1\war
          n-bilibili_downloader_1.txt
          15942 INFO: Graph cross-reference written to xxxx\Bili_Video_Batch_Download\build\bilibili_dow
          nloader_1\xref-bilibili_downloader_1.html
          15967 INFO: checking PYZ
          15968 INFO: Building PYZ because PYZ-00.toc is non existent
          15968 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
          r_1\PYZ-00.pyz
          16944 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
          r_1\PYZ-00.pyz completed successfully.
          16980 INFO: checking PKG
          16981 INFO: Building PKG because PKG-00.toc is non existent
          16981 INFO: Building PKG (CArchive) PKG-00.pkg
          17030 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
          17034 INFO: Bootloader xxx\python\python37\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
          17034 INFO: checking EXE
          17035 INFO: Building EXE because EXE-00.toc is non existent
          17035 INFO: Building EXE from EXE-00.toc
          17037 INFO: Appending archive to EXE xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_
          1\bilibili_downloader_1.exe
          17046 INFO: Building EXE from EXE-00.toc completed successfully.
          17053 INFO: checking COLLECT
          17053 INFO: Building COLLECT because COLLECT-00.toc is non existent
          17055 INFO: Building COLLECT COLLECT-00.toc

          出現INFO: Building EXE from EXE-00.toc completed successfully. 即打包成功。在當前路徑下找到distbuild目錄下的bilibili_downloader_1目錄下的bilibili_downloader_1.exe,即是打包后的軟件。點擊打開即可進行選擇和輸入,開始下載相應視頻。測試示例如下:

          項目打包下載測試


          bilibili_downloader_1.exe的同級目錄下可以看到下載保存的視頻。


          3.改進分析

          該項目是小編進行B站視頻下載的首次嘗試,難免有很多不足,在實現的過程中和后期的總結中,可以看出還存在一些問題:

          • 還不能下載B站上的所有視頻,目前局限于各種普通視頻教程,不能下載直播視頻、大會員番劇等,可以在后期進一步優化;
          • 代碼過于繁瑣,有不少功能類似的重復代碼,可以進一步簡化、提高代碼的復用性;
          • 沒有采取適當的措施應對B站的反爬,可能會因為請求過多而無法正常下載。
            可以在后期進行優化,使整個程序更加健壯。

          4.合法性說明

          • 本項目的出發點是方便地下載B站上的學習視頻,可以更好地學習各類教程,這對程序猿來說也是一種福利,但是絕不用與其他商業目的,所有讀者可以參考執行思路和程序代碼,但不能用于惡意和非法目的(惡意頻繁下載視頻、非法盈利等),如有違者請自行負責。
          • 本項目在實施的過程中可能參考了其他大佬的實現思路,如有侵犯他人利益,請聯系更改或刪除。
          • 本項目是B站視頻批量下載系列的第一篇,有很多尚待改進的地方,后期會繼續更新,歡迎各位讀者交流指正,以期不斷改進。

          上一篇:HTML 符號
          下一篇:HTML5的表單設計
          主站蜘蛛池模板: 麻豆一区二区三区蜜桃免费| 国产成人精品久久一区二区三区av | 中文字幕一区二区三区四区| 91精品一区二区三区在线观看| 少妇一夜三次一区二区| 精品日本一区二区三区在线观看| 无码国产精品一区二区免费3p| 亚洲色一区二区三区四区| 日韩精品一区二区三区在线观看 | 波多野结衣AV一区二区三区中文| 精品一区二区三人妻视频| 一区二区三区电影在线观看| 消息称老熟妇乱视频一区二区| 91国偷自产一区二区三区| 精品成人一区二区三区免费视频| 国产一区二区三区小向美奈子| 国产日韩一区二区三区在线观看| 精品久久久久久无码中文字幕一区 | 麻豆aⅴ精品无码一区二区| 无码精品人妻一区二区三区AV| 91在线一区二区| 狠狠色婷婷久久一区二区| 精品日韩一区二区三区视频| 麻豆天美国产一区在线播放| 中文字幕日本一区| 在线观看日本亚洲一区| 亚洲AV本道一区二区三区四区| 国产品无码一区二区三区在线| 乱中年女人伦av一区二区| 亚洲乱码av中文一区二区| 久久精品亚洲一区二区三区浴池| 国产乱码精品一区二区三区四川人| 精品午夜福利无人区乱码一区| 中文字幕aⅴ人妻一区二区| 亚洲制服丝袜一区二区三区| 久久精品免费一区二区三区| 久久精品国产第一区二区| 国产日韩精品一区二区三区| 日韩一区二区a片免费观看| 中文字幕一区视频| 无码人妻精品一区二区|