xigua haokan
const requestpromise = require("request-promise"); const crypto = require('crypto'); function md5(str) { const hash = crypto.createHash('md5'); hash.update(str); return hash.digest('hex'); } async function searchXiGuaVideo(kw) { const url = `https://www.ixigua.com/search/${kw}/?logTag=594535e3690f17a88cdb&tab_name=search&fss=input` const htmlTxt = await getHtml(url) const startStr = 'window._SSR_HYDRATED_DATA=' const endStr = '</script></body></html>' const startInd = htmlTxt.lastIndexOf(startStr) + startStr.length const endInd = htmlTxt.lastIndexOf(endStr) const encodedString = htmlTxt.substring(startInd, endInd).replace('undefined', '""').replace(/undefined/g, '""').replace(/\r\n/g, '').replace(/\r/g, '').replace(/\n/g, '') const json_data = JSON.parse(encodedString) const data = json_data['complexSearch']['data'][0]['data'] const group_id = data["group_id"] return group_id } async function getXiGuaVideoPlayUrl(kw) { const vid = await searchXiGuaVideo(encodeURI(kw)) console.log(5555555, vid) const url = `https://m.ixigua.com/douyin/share/video/${vid}?aweme_type=107&schema_type=1&utm_source=copy&utm_campaign=client_share&utm_medium=android&app=aweme` const htmlTxt = await getHtml(url) const startStr = '<script id="RENDER_DATA" type="application/json">' const endStr = '</script></body></html>' const startInd = htmlTxt.lastIndexOf(startStr) + startStr.length const endInd = htmlTxt.lastIndexOf(endStr) console.log(startInd, endInd) const encodedString = htmlTxt.substring(startInd, endInd) const decodedString = decodeURIComponent(encodedString) const json_data = JSON.parse(decodedString) const data = json_data["app"]["videoInfoRes"]["item_list"][0] const video_url = data["video"]["play_addr"]["url_list"][0].replace("playwm", "play") console.log(video_url) } async function searchHaoKanVideo(kw) { const l = Date.now() const kwEncode = encodeURIComponent(kw) const s = [1, kwEncode, 10, l, 1].join("_") const sign = md5(s) const url = `https://haokan.baidu.com/haokan/ui-search/pc/search/video?pn=1&rn=10&type=video&query=${kwEncode}&sign=${sign}&version=1×tamp=${l}` const htmlTxt = await getHtml(url) const json_data = JSON.parse(htmlTxt) const vid = json_data["data"]["list"][0]['vid'] return vid } async function getHaoKanVideoPlayUrl(kw) { const vid = await searchHaoKanVideo(kw) const htmlTxt = await getHtml(`https://haokan.baidu.com/v?_format=json&vid=${vid}`) console.log(htmlTxt) const json_data = JSON.parse(htmlTxt) const video_data = json_data["data"]["apiData"]["curVideoMeta"] const video_url = video_data["playurl"] console.log(video_url) } function getHtml(htmlurl) { //信源地址 var options = { uri: htmlurl, method: 'GET', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0', 'cookie': 'ttwid=1%7CJZMT9e0PXopa24Dk5ol9iMhVs9jk_pztYB-l1Mn2_98%7C1717031970%7C225e65f731edce7d524da6efcf6b46a0ab52f78333e54f0a1bb7afc4b7abdeb0' }, timeout: 1200 //设置http请求超时时间 }; return requestpromise(options).then((res) => { return res; }).catch((err) => { console.log(err.message); return { "error_code": '-1', "reason": "网络异常或者请求超时" } }); }; //getXiGuaVideoPlayUrl('诺言郭有才') getHaoKanVideoPlayUrl('成语一帆风顺')