この記事はプログラミング学習の研究のみを目的としており、他の目的には使用できません。
何が起こっているのかわかりませんが、
まず、入力された短縮リンクを URL デコードし、デコードされた文字列を「decodeUrl」変数に格納します。
次に、Bilibiliサイトから取得した動画情報を格納するHashMap型データ「data」を作成します。
HttpUtil クラスの「getGetLocationtoutiao」メソッドを呼び出してショートリンクに対応するリダイレクトリンクを取得し、「location」変数に格納します。
"location" 変数にキー名 "location" のキーと値のペアが含まれているかどうかを確認します。存在する場合は、リダイレクト リンクが正常に取得されたことを意味し、リダイレクト リンクは "redirctUrl" 変数に格納されます。
HashMap タイプのデータ「ヘッダー」を作成して、HTTP リクエストのヘッダー情報を保存し、User-Agent、Accept などのいくつかの共通ヘッダー情報を設定します。
HttpUtilクラスの「doGetAndHead」メソッドを呼び出し、GETリクエストを送信して応答内容を取得し、応答内容を「body」変数に格納します。
応答コンテンツを処理し、「;(function())」を「@」に置き換えて、その後の正規表現一致の使用を容易にします。
正規表現を使用して、応答内容の「window.INITIAL_STATE=」と「;(function())」の間の内容を照合し、「initialStr」変数に格納します。
public Map bilibili(String shortUrl) throws Exception { byte[] decode = URLDecoder.decode(shortUrl.getBytes()); String decodeUrl = 新しい String(decode); HashMap<String, String> データ = new HashMap<>(); Map<String, String> location = HttpUtil.getGetLocationtoutiao(decodeUrl); if (location.containsKey("location")) { String redirctUrl = location.get("location"); HashMap<String, String> ヘッダー = new HashMap<>(); //headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46"); headers.put("user-agent", "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/90.0.4430.91 Mobile Safari/537.36"); headers.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v =b3;q=0.7"); headers.put("accept-encoding", "gzip, deflate, br"); 文字列本体 = HttpUtil.doGetAndHead(redirctUrl, ヘッダー); String s = body.replaceAll(";\\(function\\(\\)", "@"); StringInitialReg = "window.__INITIAL_STATE__=([^@]+)"; パターンInitialP = Pattern.compile(初期Reg); マッチャーinitialM = initialP。 if (initialM.find()) { 文字列initialStr = initialM.group(1); JSONObject jo = JSONObject.parseObject(initialStr); if (jo. jo = jo.getJSONObject("ビデオ"); if(jo.containsKey("viewInfo")){ jo = jo.getJSONObject("viewInfo"); if (jo.containsKey("title")) { String title = jo.getString("title"); data.put("desc", title); if (jo.containsKey("pic")) { String pic = jo.getString("pic") ; 文字列カバー = URLDecoder.decodeForPath(pic, Charset.defaultCharset()); data.put("カバー", toHttps(カバー)); } String ; マッチャー m = p。 } String playInfoReg = "var options = ([^;]+)"; パターン p = Pattern.compile(playInfoReg); マッチャー m = p.matcher(s); if(m.find()){ 文字列グループ = m.group(1); JSONObject jo = JSONObject.parseObject(group); if(jo.containsKey("readyVideoUrl")){ String videoUrl = jo.getString("readyVideoUrl"); data.put("videoUrl",toHttps(videoUrl)); String playInfoReg = "window.__playinfo__=([ ^ <]+); パターン p = Pattern.compile(playInfoReg); if (m.find()) { String videoInfo = m.group(1); JSONObject jo = JSONObject.parseObject(videoInfo); if (jo.containsKey("データ")) { jo = jo.getJSONObject("データ"); if (jo.containsKey("dash")) { jo = jo.getJSONObject("dash"); if (jo.containsKey("video")) { JSONArray ビデオ = jo.getJSONArray("video"); if (videos.size() > 0) { JSONObject videoJo = videos.getJSONObject(0); StringbaseUrl = videoJo.getString("baseUrl"); data.put("ビデオURL", ベースURL); data.put("リファラー", redirctUrl); if ( StringUtils.isNotBlank (data.get ( "videoUrl " ))) { データ を返します 。 null を返し ます。 }
その他のプラットフォーム ソース コードのネットワーク ディスク アドレス:
リンク: https://pan.baidu.com/s/1S-I6Pvv31iwNgzVTZVSLwA
抽出コード: rwtk 皆さんのコミュニケーションを歓迎します