您好,登錄后才能下訂單哦!
小編給大家分享一下java+selenium如何實(shí)現(xiàn)網(wǎng)易云音樂(lè)刷累計(jì)聽(tīng)歌數(shù)功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
背景
應(yīng)該是在去年的時(shí)候,刷知乎看到一個(gè)問(wèn)題,大概是說(shuō)怎么刷網(wǎng)易云音樂(lè)個(gè)人累計(jì)聽(tīng)歌數(shù),然后有一個(gè)高贊回答,貼了一段js代碼,直接在瀏覽器console執(zhí)行就可以了。當(dāng)時(shí)試了下,直接一下子刷了有好幾萬(wàn)。悲劇的是,第二天又回到原來(lái)的樣子了,很明顯這種方式被網(wǎng)易云音樂(lè)發(fā)現(xiàn)封掉了。而且后續(xù)網(wǎng)易云還針對(duì)累計(jì)聽(tīng)歌數(shù)加了一些限制,每天最多增加300首。今天帶來(lái)一種通過(guò)java+selenium的方式,自動(dòng)播放歌曲,來(lái)達(dá)到刷累計(jì)聽(tīng)歌數(shù)的效果。另外借助這個(gè)demo,對(duì)selenium的使用更加熟悉,也算是爬蟲(chóng)應(yīng)用中一些有趣的東西了。
思路
登錄,有以下兩種方式可以選擇:
a. 模擬web端的登錄過(guò)程。優(yōu)點(diǎn):這種方式更加通用,便于動(dòng)態(tài)切換賬號(hào)。缺點(diǎn):比直接使用cookie稍微麻煩一些,并且有一定幾率會(huì)出現(xiàn)圖形驗(yàn)證碼,需要考慮這種情況。
b. 設(shè)置cookie。優(yōu)點(diǎn):不用處理登錄過(guò)程,比較簡(jiǎn)單方便,在cookie的過(guò)期時(shí)間比較長(zhǎng)情況下還是比較方便的,不用頻繁切換。缺點(diǎn):切換賬號(hào)比較麻煩,不能達(dá)到自動(dòng)化。我這里選擇的該方式。
播放:上一個(gè)步驟中登錄成功后,直接打開(kāi)歌單列表頁(yè)面。如下圖
,在歌單列表頁(yè)面可以看到。有3個(gè)地方是可以點(diǎn)擊播放的,我最先想到是最下面一個(gè)播放按鈕,然后一直保持底部播放組件的顯示,實(shí)時(shí)獲取播放的動(dòng)態(tài)。嘗試通過(guò)模擬點(diǎn)擊播放按鈕,始終不成功,最終點(diǎn)擊最上面的播放按鈕可以播放的。
獲取播放動(dòng)態(tài):為了確定播放是否在正常進(jìn)行,可以通過(guò)實(shí)時(shí)獲取個(gè)人home頁(yè)面的累計(jì)聽(tīng)歌數(shù)相關(guān)信息,用于監(jiān)控,由于已經(jīng)有一個(gè)頁(yè)面在播放歌曲了,為了不影響原有播放歌曲的頁(yè)面,可以打開(kāi)一個(gè)新的tab頁(yè)來(lái)獲取個(gè)人home頁(yè)面,打開(kāi)新的table頁(yè),這里采用js的方式window.open('about:blank')
。
最終都會(huì)看到如下類(lèi)似如下格式日志,那就說(shuō)明成功了:
2019-03-26 09:25:10,406 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-00:00 / 00:00---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572 2019-03-26 09:25:16,817 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:00 / 07:19---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572 2019-03-26 09:25:23,157 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:06 / 07:19---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572 2019-03-26 09:25:29,394 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:13 / 07:19---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572 2019-03-26 09:25:35,592 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:19 / 07:19---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572 2019-03-26 09:25:41,974 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:25 / 07:19---當(dāng)前播放第1首歌曲, 累計(jì)聽(tīng)歌:20572
完整代碼
package com.github.wycm; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by wycm */ public class Music163 { private static Logger logger = LoggerFactory.getLogger(Music163.class); //拷貝登錄成功的瀏覽器原始cookie private final static String RAW_COOKIES = "cookie1=value1; cookie2=value2"; private final static String CHROME_DRIVER_PATH = "/Users/wangyang/Downloads/chromedriver"; //歌曲列表id private static String startId = "22336453"; private static String userId = null; private static Set<String> playListSet = new HashSet<>(); private static Pattern pattern = Pattern.compile("<span class=\"j-flag time\"><em>(.*?)</em>(.*?)</span>"); private static Pattern songName = Pattern.compile("class=\"f-thide name fc1 f-fl\" title=\"(.*?)\""); private static ChromeOptions chromeOptions = new ChromeOptions(); private static WebDriver driver = null; static { System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH); chromeOptions.addArguments("--no-sandbox"); } public static void main(String[] args) throws InterruptedException { while (true){ try { driver = new ChromeDriver(chromeOptions); playListSet.add(startId); invoke(); } catch (Exception e){ logger.error(e.getMessage(), e); } finally { driver.quit(); } Thread.sleep(1000 * 10); } } /** * 初始化cookies */ private static void initCookies(){ Arrays.stream(RAW_COOKIES.split("; ")).forEach(rawCookie -> { String[] ss = rawCookie.split("="); Cookie cookie = new Cookie.Builder(ss[0], ss[1]).domain(".163.com").build(); driver.manage().addCookie(cookie); }); } private static void invoke() throws InterruptedException { driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS); String s = null; driver.get("http://music.163.com/"); initCookies(); driver.get("http://music.163.com/"); s = driver.getPageSource(); userId = group(s, "userId:(\\d+)", 1); driver.get("https://music.163.com/#/playlist?id=" + startId); driver.switchTo().frame("contentFrame"); WebElement element = driver.findElement(By.cssSelector("[id=content-operation]>a:first-child")); element.click(); ((JavascriptExecutor) driver).executeScript("window.open('about:blank')"); ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); driver.switchTo().window(tabs.get(0)); driver.switchTo().defaultContent(); int i = 0; String lastSongName = ""; int count = 0; while (true){ if(i > Integer.MAX_VALUE - 2){ break; } i++; s = driver.getPageSource(); driver.switchTo().window(tabs.get(1)); //switches to new tab String songs = null; try{ driver.get("https://music.163.com/user/home?id=" + userId); driver.switchTo().frame("contentFrame"); songs = group(driver.getPageSource(), "累積聽(tīng)歌(\\d+)首", 1); } catch (TimeoutException e){ logger.error(e.getMessage(), e); } driver.switchTo().window(tabs.get(0)); Matcher matcher = pattern.matcher(s); Matcher songNameMatcher = songName.matcher(s); if (matcher.find() && songNameMatcher.find()){ String songNameStr = songNameMatcher.group(1); if (!songNameStr.equals(lastSongName)){ count++; lastSongName = songNameStr; } logger.info(songNameStr + "-" + matcher.group(1) + matcher.group(2) + "---當(dāng)前播放第" + count + "首歌曲, 累計(jì)聽(tīng)歌:" + songs); } else { logger.info("解析歌曲播放記錄或歌曲名失敗"); } Thread.sleep(1000 * 30); } } public static String group(String str, String regex, int index) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); return matcher.find() ? matcher.group(index) : ""; } }
運(yùn)行注意事項(xiàng)
修改自己相關(guān)chromedriver路徑配置
登錄自己的web端網(wǎng)易云音樂(lè):https://music.163.com/
復(fù)制自己登錄成功的原始cookies,至代碼中的RAW_COOKIES字段
切換歌單,如果默認(rèn)的歌單播放完成后,可以搜索一些沒(méi)有播放過(guò)的歌單,類(lèi)似https://music.163.com/#/playlist?id=22336453
的url,提取出id,直接替換代碼中的startId字段。
以上是“java+selenium如何實(shí)現(xiàn)網(wǎng)易云音樂(lè)刷累計(jì)聽(tīng)歌數(shù)功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。